From e50ff0e16fb5a4a6b11b94cb31de8e01d73cb7ec Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Sun, 26 Apr 2026 19:34:03 +0800 Subject: [PATCH] chore: update static media asset paths --- .../{226.6548e7b4.css => 226.05f9240b.css} | 0 ...26.6548e7b4.css.gz => 226.05f9240b.css.gz} | Bin 1723 -> 1723 bytes .../{428.8044ed41.css => 428.09003661.css} | 0 ...28.8044ed41.css.gz => 428.09003661.css.gz} | Bin 4026 -> 4026 bytes .../css/{51.1dd65d6c.css => 51.9f054b72.css} | 0 ...{51.1dd65d6c.css.gz => 51.9f054b72.css.gz} | Bin 1796 -> 1796 bytes .../{577.953080b6.css => 577.e5953cea.css} | 0 ...77.953080b6.css.gz => 577.e5953cea.css.gz} | Bin 11335 -> 11335 bytes .../{604.6b8baf9e.css => 604.f98ea32d.css} | 0 ...04.6b8baf9e.css.gz => 604.f98ea32d.css.gz} | Bin 2503 -> 2503 bytes .../{718.d0974d1c.css => 718.8a9bac1a.css} | 0 ...18.d0974d1c.css.gz => 718.8a9bac1a.css.gz} | Bin 8627 -> 8627 bytes .../{728.6b8baf9e.css => 728.f98ea32d.css} | 0 ...28.6b8baf9e.css.gz => 728.f98ea32d.css.gz} | Bin 2503 -> 2503 bytes frontend-dist/css/740.a94dbb46.css.gz | Bin 5880 -> 5880 bytes .../css/{82.91351de4.css => 82.9088467b.css} | 0 ...{82.91351de4.css.gz => 82.9088467b.css.gz} | Bin 13153 -> 13153 bytes .../{833.95983fa6.css => 833.3c02d330.css} | 0 ...33.95983fa6.css.gz => 833.3c02d330.css.gz} | Bin 4320 -> 4320 bytes .../{862.d86e6635.css => 862.57a3b1c1.css} | 0 ...62.d86e6635.css.gz => 862.57a3b1c1.css.gz} | Bin 2233 -> 2233 bytes .../{916.129684a5.css => 916.6f089bea.css} | 0 ...16.129684a5.css.gz => 916.6f089bea.css.gz} | Bin 9241 -> 9241 bytes .../{917.8529ad1e.css => 917.939d7cec.css} | 0 ...17.8529ad1e.css.gz => 917.939d7cec.css.gz} | Bin 1836 -> 1836 bytes .../{app.75711fde.css => app.0cd6595e.css} | 0 ...pp.75711fde.css.gz => app.0cd6595e.css.gz} | Bin 3981 -> 3981 bytes .../css/chunk-vendors.f9cd4701.css.gz | Bin 9747 -> 9747 bytes frontend-dist/index.html | 2 +- frontend-dist/index.html.gz | Bin 509 -> 520 bytes frontend-dist/js/226.ec43855c.js.gz | Bin 3448 -> 0 bytes frontend-dist/js/226.ec43855c.js.map | 1 - frontend-dist/js/226.ec43855c.js.map.gz | Bin 9256 -> 0 bytes .../js/{226.ec43855c.js => 226.f6040a84.js} | 2 +- frontend-dist/js/226.f6040a84.js.gz | Bin 0 -> 3449 bytes frontend-dist/js/226.f6040a84.js.map | 1 + frontend-dist/js/226.f6040a84.js.map.gz | Bin 0 -> 9207 bytes frontend-dist/js/309.b7dca603.js.gz | Bin 4310 -> 0 bytes frontend-dist/js/309.b7dca603.js.map | 1 - frontend-dist/js/309.b7dca603.js.map.gz | Bin 11806 -> 0 bytes .../js/{309.b7dca603.js => 309.bfaaa238.js} | 2 +- frontend-dist/js/309.bfaaa238.js.gz | Bin 0 -> 4310 bytes frontend-dist/js/309.bfaaa238.js.map | 1 + frontend-dist/js/309.bfaaa238.js.map.gz | Bin 0 -> 11744 bytes .../js/{51.6e7bf298.js => 51.0c776d33.js} | 2 +- frontend-dist/js/51.0c776d33.js.gz | Bin 0 -> 3363 bytes frontend-dist/js/51.0c776d33.js.map | 1 + frontend-dist/js/51.0c776d33.js.map.gz | Bin 0 -> 9212 bytes frontend-dist/js/51.6e7bf298.js.gz | Bin 3364 -> 0 bytes frontend-dist/js/51.6e7bf298.js.map | 1 - frontend-dist/js/51.6e7bf298.js.map.gz | Bin 9268 -> 0 bytes .../js/{577.b10c6bbc.js => 577.95699028.js} | 2 +- ...{577.b10c6bbc.js.gz => 577.95699028.js.gz} | Bin 24745 -> 24745 bytes frontend-dist/js/577.95699028.js.map | 1 + frontend-dist/js/577.95699028.js.map.gz | Bin 0 -> 67893 bytes frontend-dist/js/577.b10c6bbc.js.map | 1 - frontend-dist/js/577.b10c6bbc.js.map.gz | Bin 67955 -> 0 bytes frontend-dist/js/600.08192622.js.map | 1 - frontend-dist/js/600.08192622.js.map.gz | Bin 10858 -> 0 bytes .../js/{600.08192622.js => 600.1faa1202.js} | 2 +- ...{600.08192622.js.gz => 600.1faa1202.js.gz} | Bin 3864 -> 3863 bytes frontend-dist/js/600.1faa1202.js.map | 1 + frontend-dist/js/600.1faa1202.js.map.gz | Bin 0 -> 10794 bytes .../js/{604.b966c795.js => 604.ae4825a8.js} | 2 +- frontend-dist/js/604.ae4825a8.js.gz | Bin 0 -> 2574 bytes ...04.b966c795.js.map => 604.ae4825a8.js.map} | 2 +- frontend-dist/js/604.ae4825a8.js.map.gz | Bin 0 -> 6983 bytes frontend-dist/js/604.b966c795.js.gz | Bin 2575 -> 0 bytes frontend-dist/js/604.b966c795.js.map.gz | Bin 6984 -> 0 bytes frontend-dist/js/718.27080555.js.map.gz | Bin 163616 -> 0 bytes .../js/{718.27080555.js => 718.62a39893.js} | 2 +- ...{718.27080555.js.gz => 718.62a39893.js.gz} | Bin 47862 -> 47863 bytes ...18.27080555.js.map => 718.62a39893.js.map} | 2 +- frontend-dist/js/718.62a39893.js.map.gz | Bin 0 -> 163576 bytes frontend-dist/js/728.c37f6352.js.gz | Bin 2599 -> 0 bytes .../js/{728.c37f6352.js => 728.c60439c5.js} | 2 +- frontend-dist/js/728.c60439c5.js.gz | Bin 0 -> 2599 bytes ...28.c37f6352.js.map => 728.c60439c5.js.map} | 2 +- ...f6352.js.map.gz => 728.c60439c5.js.map.gz} | Bin 7228 -> 7228 bytes .../js/{82.ace43e99.js => 82.00af9bec.js} | 2 +- .../{82.ace43e99.js.gz => 82.00af9bec.js.gz} | Bin 57110 -> 57110 bytes ...{82.ace43e99.js.map => 82.00af9bec.js.map} | 2 +- frontend-dist/js/82.00af9bec.js.map.gz | Bin 0 -> 143120 bytes frontend-dist/js/82.ace43e99.js.map.gz | Bin 143229 -> 0 bytes .../js/{862.d9125cf7.js => 862.2df18983.js} | 2 +- frontend-dist/js/862.2df18983.js.gz | Bin 0 -> 2589 bytes ...62.d9125cf7.js.map => 862.2df18983.js.map} | 2 +- ...25cf7.js.map.gz => 862.2df18983.js.map.gz} | Bin 6541 -> 6541 bytes frontend-dist/js/862.d9125cf7.js.gz | Bin 2588 -> 0 bytes .../js/{916.9fe1890d.js => 916.bc5cc1d8.js} | 2 +- ...{916.9fe1890d.js.gz => 916.bc5cc1d8.js.gz} | Bin 93291 -> 93291 bytes ...16.9fe1890d.js.map => 916.bc5cc1d8.js.map} | 2 +- ...1890d.js.map.gz => 916.bc5cc1d8.js.map.gz} | Bin 334845 -> 334634 bytes .../js/{917.b77a6783.js => 917.6a48878d.js} | 2 +- ...{917.b77a6783.js.gz => 917.6a48878d.js.gz} | Bin 3588 -> 3588 bytes frontend-dist/js/917.6a48878d.js.map | 1 + frontend-dist/js/917.6a48878d.js.map.gz | Bin 0 -> 9501 bytes frontend-dist/js/917.b77a6783.js.map | 1 - frontend-dist/js/917.b77a6783.js.map.gz | Bin 9553 -> 0 bytes .../js/{app.dbe4b0ca.js => app.8f9301fc.js} | 4 ++-- frontend-dist/js/app.8f9301fc.js.gz | Bin 0 -> 22397 bytes frontend-dist/js/app.8f9301fc.js.map | 1 + frontend-dist/js/app.8f9301fc.js.map.gz | Bin 0 -> 16560 bytes frontend-dist/js/app.dbe4b0ca.js.gz | Bin 22381 -> 0 bytes frontend-dist/js/app.dbe4b0ca.js.map | 1 - frontend-dist/js/app.dbe4b0ca.js.map.gz | Bin 16625 -> 0 bytes frontend-dist/js/chunk-vendors.82c104b1.js.gz | Bin 793502 -> 793502 bytes .../js/chunk-vendors.82c104b1.js.map | 2 +- .../js/chunk-vendors.82c104b1.js.map.gz | Bin 2090469 -> 2090629 bytes frontend-dist/static/{ => media}/404.png | Bin frontend-dist/static/{ => media}/BlockImg.png | Bin .../static/{ => media}/WhiteListOn.png | Bin .../{ => static/media}/logo-dark.png | Bin frontend-dist/{ => static/media}/logo.png | Bin functions/file/fileTools.js | 8 ++++---- 115 files changed, 33 insertions(+), 33 deletions(-) rename frontend-dist/css/{226.6548e7b4.css => 226.05f9240b.css} (100%) rename frontend-dist/css/{226.6548e7b4.css.gz => 226.05f9240b.css.gz} (93%) rename frontend-dist/css/{428.8044ed41.css => 428.09003661.css} (100%) rename frontend-dist/css/{428.8044ed41.css.gz => 428.09003661.css.gz} (88%) rename frontend-dist/css/{51.1dd65d6c.css => 51.9f054b72.css} (100%) rename frontend-dist/css/{51.1dd65d6c.css.gz => 51.9f054b72.css.gz} (95%) rename frontend-dist/css/{577.953080b6.css => 577.e5953cea.css} (100%) rename frontend-dist/css/{577.953080b6.css.gz => 577.e5953cea.css.gz} (98%) rename frontend-dist/css/{604.6b8baf9e.css => 604.f98ea32d.css} (100%) rename frontend-dist/css/{604.6b8baf9e.css.gz => 604.f98ea32d.css.gz} (96%) rename frontend-dist/css/{718.d0974d1c.css => 718.8a9bac1a.css} (100%) rename frontend-dist/css/{718.d0974d1c.css.gz => 718.8a9bac1a.css.gz} (99%) rename frontend-dist/css/{728.6b8baf9e.css => 728.f98ea32d.css} (100%) rename frontend-dist/css/{728.6b8baf9e.css.gz => 728.f98ea32d.css.gz} (96%) rename frontend-dist/css/{82.91351de4.css => 82.9088467b.css} (100%) rename frontend-dist/css/{82.91351de4.css.gz => 82.9088467b.css.gz} (97%) rename frontend-dist/css/{833.95983fa6.css => 833.3c02d330.css} (100%) rename frontend-dist/css/{833.95983fa6.css.gz => 833.3c02d330.css.gz} (98%) rename frontend-dist/css/{862.d86e6635.css => 862.57a3b1c1.css} (100%) rename frontend-dist/css/{862.d86e6635.css.gz => 862.57a3b1c1.css.gz} (89%) rename frontend-dist/css/{916.129684a5.css => 916.6f089bea.css} (100%) rename frontend-dist/css/{916.129684a5.css.gz => 916.6f089bea.css.gz} (97%) rename frontend-dist/css/{917.8529ad1e.css => 917.939d7cec.css} (100%) rename frontend-dist/css/{917.8529ad1e.css.gz => 917.939d7cec.css.gz} (93%) rename frontend-dist/css/{app.75711fde.css => app.0cd6595e.css} (100%) rename frontend-dist/css/{app.75711fde.css.gz => app.0cd6595e.css.gz} (91%) delete mode 100644 frontend-dist/js/226.ec43855c.js.gz delete mode 100644 frontend-dist/js/226.ec43855c.js.map delete mode 100644 frontend-dist/js/226.ec43855c.js.map.gz rename frontend-dist/js/{226.ec43855c.js => 226.f6040a84.js} (99%) create mode 100644 frontend-dist/js/226.f6040a84.js.gz create mode 100644 frontend-dist/js/226.f6040a84.js.map create mode 100644 frontend-dist/js/226.f6040a84.js.map.gz delete mode 100644 frontend-dist/js/309.b7dca603.js.gz delete mode 100644 frontend-dist/js/309.b7dca603.js.map delete mode 100644 frontend-dist/js/309.b7dca603.js.map.gz rename frontend-dist/js/{309.b7dca603.js => 309.bfaaa238.js} (99%) create mode 100644 frontend-dist/js/309.bfaaa238.js.gz create mode 100644 frontend-dist/js/309.bfaaa238.js.map create mode 100644 frontend-dist/js/309.bfaaa238.js.map.gz rename frontend-dist/js/{51.6e7bf298.js => 51.0c776d33.js} (99%) create mode 100644 frontend-dist/js/51.0c776d33.js.gz create mode 100644 frontend-dist/js/51.0c776d33.js.map create mode 100644 frontend-dist/js/51.0c776d33.js.map.gz delete mode 100644 frontend-dist/js/51.6e7bf298.js.gz delete mode 100644 frontend-dist/js/51.6e7bf298.js.map delete mode 100644 frontend-dist/js/51.6e7bf298.js.map.gz rename frontend-dist/js/{577.b10c6bbc.js => 577.95699028.js} (99%) rename frontend-dist/js/{577.b10c6bbc.js.gz => 577.95699028.js.gz} (90%) create mode 100644 frontend-dist/js/577.95699028.js.map create mode 100644 frontend-dist/js/577.95699028.js.map.gz delete mode 100644 frontend-dist/js/577.b10c6bbc.js.map delete mode 100644 frontend-dist/js/577.b10c6bbc.js.map.gz delete mode 100644 frontend-dist/js/600.08192622.js.map delete mode 100644 frontend-dist/js/600.08192622.js.map.gz rename frontend-dist/js/{600.08192622.js => 600.1faa1202.js} (99%) rename frontend-dist/js/{600.08192622.js.gz => 600.1faa1202.js.gz} (90%) create mode 100644 frontend-dist/js/600.1faa1202.js.map create mode 100644 frontend-dist/js/600.1faa1202.js.map.gz rename frontend-dist/js/{604.b966c795.js => 604.ae4825a8.js} (99%) create mode 100644 frontend-dist/js/604.ae4825a8.js.gz rename frontend-dist/js/{604.b966c795.js.map => 604.ae4825a8.js.map} (99%) create mode 100644 frontend-dist/js/604.ae4825a8.js.map.gz delete mode 100644 frontend-dist/js/604.b966c795.js.gz delete mode 100644 frontend-dist/js/604.b966c795.js.map.gz delete mode 100644 frontend-dist/js/718.27080555.js.map.gz rename frontend-dist/js/{718.27080555.js => 718.62a39893.js} (99%) rename frontend-dist/js/{718.27080555.js.gz => 718.62a39893.js.gz} (99%) rename frontend-dist/js/{718.27080555.js.map => 718.62a39893.js.map} (81%) create mode 100644 frontend-dist/js/718.62a39893.js.map.gz delete mode 100644 frontend-dist/js/728.c37f6352.js.gz rename frontend-dist/js/{728.c37f6352.js => 728.c60439c5.js} (99%) create mode 100644 frontend-dist/js/728.c60439c5.js.gz rename frontend-dist/js/{728.c37f6352.js.map => 728.c60439c5.js.map} (99%) rename frontend-dist/js/{728.c37f6352.js.map.gz => 728.c60439c5.js.map.gz} (96%) rename frontend-dist/js/{82.ace43e99.js => 82.00af9bec.js} (99%) rename frontend-dist/js/{82.ace43e99.js.gz => 82.00af9bec.js.gz} (99%) rename frontend-dist/js/{82.ace43e99.js.map => 82.00af9bec.js.map} (53%) create mode 100644 frontend-dist/js/82.00af9bec.js.map.gz delete mode 100644 frontend-dist/js/82.ace43e99.js.map.gz rename frontend-dist/js/{862.d9125cf7.js => 862.2df18983.js} (99%) create mode 100644 frontend-dist/js/862.2df18983.js.gz rename frontend-dist/js/{862.d9125cf7.js.map => 862.2df18983.js.map} (99%) rename frontend-dist/js/{862.d9125cf7.js.map.gz => 862.2df18983.js.map.gz} (96%) delete mode 100644 frontend-dist/js/862.d9125cf7.js.gz rename frontend-dist/js/{916.9fe1890d.js => 916.bc5cc1d8.js} (99%) rename frontend-dist/js/{916.9fe1890d.js.gz => 916.bc5cc1d8.js.gz} (99%) rename frontend-dist/js/{916.9fe1890d.js.map => 916.bc5cc1d8.js.map} (79%) rename frontend-dist/js/{916.9fe1890d.js.map.gz => 916.bc5cc1d8.js.map.gz} (79%) rename frontend-dist/js/{917.b77a6783.js => 917.6a48878d.js} (99%) rename frontend-dist/js/{917.b77a6783.js.gz => 917.6a48878d.js.gz} (95%) create mode 100644 frontend-dist/js/917.6a48878d.js.map create mode 100644 frontend-dist/js/917.6a48878d.js.map.gz delete mode 100644 frontend-dist/js/917.b77a6783.js.map delete mode 100644 frontend-dist/js/917.b77a6783.js.map.gz rename frontend-dist/js/{app.dbe4b0ca.js => app.8f9301fc.js} (86%) create mode 100644 frontend-dist/js/app.8f9301fc.js.gz create mode 100644 frontend-dist/js/app.8f9301fc.js.map create mode 100644 frontend-dist/js/app.8f9301fc.js.map.gz delete mode 100644 frontend-dist/js/app.dbe4b0ca.js.gz delete mode 100644 frontend-dist/js/app.dbe4b0ca.js.map delete mode 100644 frontend-dist/js/app.dbe4b0ca.js.map.gz rename frontend-dist/static/{ => media}/404.png (100%) rename frontend-dist/static/{ => media}/BlockImg.png (100%) rename frontend-dist/static/{ => media}/WhiteListOn.png (100%) rename frontend-dist/{ => static/media}/logo-dark.png (100%) rename frontend-dist/{ => static/media}/logo.png (100%) diff --git a/frontend-dist/css/226.6548e7b4.css b/frontend-dist/css/226.05f9240b.css similarity index 100% rename from frontend-dist/css/226.6548e7b4.css rename to frontend-dist/css/226.05f9240b.css diff --git a/frontend-dist/css/226.6548e7b4.css.gz b/frontend-dist/css/226.05f9240b.css.gz similarity index 93% rename from frontend-dist/css/226.6548e7b4.css.gz rename to frontend-dist/css/226.05f9240b.css.gz index 31721599f6a8524ffd5981af9675ed2cb2b2e792..1890701de9e062d78c2a705c8e62ffc65ae2caf8 100644 GIT binary patch delta 19 YcmdnZyPKCwzMF#q1ek<3a&2S-04jw8)Bpeg delta 19 YcmdnZyPKCwzMF#q1emxsa&2S-04i7m%K!iX diff --git a/frontend-dist/css/428.8044ed41.css b/frontend-dist/css/428.09003661.css similarity index 100% rename from frontend-dist/css/428.8044ed41.css rename to frontend-dist/css/428.09003661.css diff --git a/frontend-dist/css/428.8044ed41.css.gz b/frontend-dist/css/428.09003661.css.gz similarity index 88% rename from frontend-dist/css/428.8044ed41.css.gz rename to frontend-dist/css/428.09003661.css.gz index cda74beef54dcede37fc52c1b25366080dd93948..deed95b7c3554bf5ccfcb8a68929a69c5ca3b0d2 100644 GIT binary patch delta 19 Ycmdlbze}D=zMF#q1ek<3a&6!T04&S{{r~^~ delta 19 Ycmdlbze}D=zMF#q1emxsa&6!T04$#a^#A|> diff --git a/frontend-dist/css/51.1dd65d6c.css b/frontend-dist/css/51.9f054b72.css similarity index 100% rename from frontend-dist/css/51.1dd65d6c.css rename to frontend-dist/css/51.9f054b72.css diff --git a/frontend-dist/css/51.1dd65d6c.css.gz b/frontend-dist/css/51.9f054b72.css.gz similarity index 95% rename from frontend-dist/css/51.1dd65d6c.css.gz rename to frontend-dist/css/51.9f054b72.css.gz index 2f23a2ec57de58aef8713da11f8025c5b2675b14..a29a7bcafe4438fc09b5cd4488748f586ceb87c4 100644 GIT binary patch delta 19 XcmZqSYvJRP@8)0t0Vd&%T))@=BYgw0 delta 19 XcmZqSYvJRP@8)0t0Vb}ET))@=BTxgV diff --git a/frontend-dist/css/577.953080b6.css b/frontend-dist/css/577.e5953cea.css similarity index 100% rename from frontend-dist/css/577.953080b6.css rename to frontend-dist/css/577.e5953cea.css diff --git a/frontend-dist/css/577.953080b6.css.gz b/frontend-dist/css/577.e5953cea.css.gz similarity index 98% rename from frontend-dist/css/577.953080b6.css.gz rename to frontend-dist/css/577.e5953cea.css.gz index 2186d3d5f1f4380de8f53b51e6021e939462551d..ea0d43815749385848c40939fdb8ed87a75548c3 100644 GIT binary patch delta 19 YcmX>eaXf-czMF#q1ek<3a@pzt05xd@Gynhq delta 19 YcmX>eaXf-czMF#q1emxsa@pzt05v=WD*ylh diff --git a/frontend-dist/css/604.6b8baf9e.css b/frontend-dist/css/604.f98ea32d.css similarity index 100% rename from frontend-dist/css/604.6b8baf9e.css rename to frontend-dist/css/604.f98ea32d.css diff --git a/frontend-dist/css/604.6b8baf9e.css.gz b/frontend-dist/css/604.f98ea32d.css.gz similarity index 96% rename from frontend-dist/css/604.6b8baf9e.css.gz rename to frontend-dist/css/604.f98ea32d.css.gz index ea25342200c2a4fe04ec172e783f3e2f003a711e..bc55a51433e55c8fff5611a415931cf54bbad596 100644 GIT binary patch delta 19 YcmX>ud|a4IzMF#q1ek<3a_!{=04*E@2LJ#7 delta 19 YcmX>ud|a4IzMF#q1emxsa_!{=04(nV{r~^~ diff --git a/frontend-dist/css/718.d0974d1c.css b/frontend-dist/css/718.8a9bac1a.css similarity index 100% rename from frontend-dist/css/718.d0974d1c.css rename to frontend-dist/css/718.8a9bac1a.css diff --git a/frontend-dist/css/718.d0974d1c.css.gz b/frontend-dist/css/718.8a9bac1a.css.gz similarity index 99% rename from frontend-dist/css/718.d0974d1c.css.gz rename to frontend-dist/css/718.8a9bac1a.css.gz index be76d36c9eb6272dab6b2a83d99aa65196885584..a3e2b08a7bf7d3fc5849d36fcbcd0210cb871bd9 100644 GIT binary patch delta 19 Ycmdn&yxEyczMF#q1ek<3a;;PZ05F^cLjV8( delta 19 Ycmdn&yxEyczMF#q1emxsa;;PZ05ER^IsgCw diff --git a/frontend-dist/css/728.6b8baf9e.css b/frontend-dist/css/728.f98ea32d.css similarity index 100% rename from frontend-dist/css/728.6b8baf9e.css rename to frontend-dist/css/728.f98ea32d.css diff --git a/frontend-dist/css/728.6b8baf9e.css.gz b/frontend-dist/css/728.f98ea32d.css.gz similarity index 96% rename from frontend-dist/css/728.6b8baf9e.css.gz rename to frontend-dist/css/728.f98ea32d.css.gz index ea25342200c2a4fe04ec172e783f3e2f003a711e..bc55a51433e55c8fff5611a415931cf54bbad596 100644 GIT binary patch delta 19 YcmX>ud|a4IzMF#q1ek<3a_!{=04*E@2LJ#7 delta 19 YcmX>ud|a4IzMF#q1emxsa_!{=04(nV{r~^~ diff --git a/frontend-dist/css/740.a94dbb46.css.gz b/frontend-dist/css/740.a94dbb46.css.gz index 257345c088743fc03b9451207f70c043ba499602..a2d2204f379d5452bc6e033cc88525f7ecdef0a0 100644 GIT binary patch delta 19 YcmeyN`$LyYzMF#q1ek<3a=jA+05{_V+W-In delta 19 YcmeyN`$LyYzMF#q1emxsa=jA+05`S-(f|Me diff --git a/frontend-dist/css/82.91351de4.css b/frontend-dist/css/82.9088467b.css similarity index 100% rename from frontend-dist/css/82.91351de4.css rename to frontend-dist/css/82.9088467b.css diff --git a/frontend-dist/css/82.91351de4.css.gz b/frontend-dist/css/82.9088467b.css.gz similarity index 97% rename from frontend-dist/css/82.91351de4.css.gz rename to frontend-dist/css/82.9088467b.css.gz index 4b37d2bd0c30923bbfb5e4e01262fe9d1b4eebfc..e1248c7520a1d9658bf7406bfe5f38c6ad219659 100644 GIT binary patch delta 19 YcmaEu_Arf0zMF#q1ek<3a)lcM06QoIr2qf` delta 19 YcmaEu_Arf0zMF#q1emxsa)lcM06O~woB#j- diff --git a/frontend-dist/css/833.95983fa6.css b/frontend-dist/css/833.3c02d330.css similarity index 100% rename from frontend-dist/css/833.95983fa6.css rename to frontend-dist/css/833.3c02d330.css diff --git a/frontend-dist/css/833.95983fa6.css.gz b/frontend-dist/css/833.3c02d330.css.gz similarity index 98% rename from frontend-dist/css/833.95983fa6.css.gz rename to frontend-dist/css/833.3c02d330.css.gz index 74901a976f04ed35fc71ae18b9f66669532af851..1731d57bd0e5fb214c87f361947d36b0504fd4d3 100644 GIT binary patch delta 19 YcmaE$_&||MzMF#q1ek<3a$OSu05Y`%bpQYW delta 19 YcmaE$_&||MzMF#q1emxsa$OSu05XUKYybcN diff --git a/frontend-dist/css/862.d86e6635.css b/frontend-dist/css/862.57a3b1c1.css similarity index 100% rename from frontend-dist/css/862.d86e6635.css rename to frontend-dist/css/862.57a3b1c1.css diff --git a/frontend-dist/css/862.d86e6635.css.gz b/frontend-dist/css/862.57a3b1c1.css.gz similarity index 89% rename from frontend-dist/css/862.d86e6635.css.gz rename to frontend-dist/css/862.57a3b1c1.css.gz index 99f4d7c42fa02f779a32f8a7730bce78f84c7bff..4c977e1eecd5f6b37359f7a257b012e9b74b2422 100644 GIT binary patch delta 19 YcmdlfxKofzzMF#q1ek<3a;@h804l=+*Z=?k delta 19 YcmdlfxKofzzMF#q1emxsa;@h804kOP&j0`b diff --git a/frontend-dist/css/916.129684a5.css b/frontend-dist/css/916.6f089bea.css similarity index 100% rename from frontend-dist/css/916.129684a5.css rename to frontend-dist/css/916.6f089bea.css diff --git a/frontend-dist/css/916.129684a5.css.gz b/frontend-dist/css/916.6f089bea.css.gz similarity index 97% rename from frontend-dist/css/916.129684a5.css.gz rename to frontend-dist/css/916.6f089bea.css.gz index e2c484c7c7df146f1f16c1d7984df656263a91ca..872657046c57589bb1d6addf57ef36debc2b65f0 100644 GIT binary patch delta 19 YcmbQ~G1G%fzMF#q1ek<3a`CGG04!|-f&c&j delta 19 YcmbQ~G1G%fzMF#q1emxsa`CGG04zWQc>n+a diff --git a/frontend-dist/css/917.8529ad1e.css b/frontend-dist/css/917.939d7cec.css similarity index 100% rename from frontend-dist/css/917.8529ad1e.css rename to frontend-dist/css/917.939d7cec.css diff --git a/frontend-dist/css/917.8529ad1e.css.gz b/frontend-dist/css/917.939d7cec.css.gz similarity index 93% rename from frontend-dist/css/917.8529ad1e.css.gz rename to frontend-dist/css/917.939d7cec.css.gz index 553a3a52bba2ec4be1155bf5c7eae5d33fd8257c..2e7f0923b04eac6fac2ed92d2ae2442350b916cb 100644 GIT binary patch delta 19 YcmZ3(w}y{PzMF#q1ek<3aw)L`04Ht(DgXcg delta 19 YcmZ3(w}y{PzMF#q1emxsaw)L`04G5MApigX diff --git a/frontend-dist/css/app.75711fde.css b/frontend-dist/css/app.0cd6595e.css similarity index 100% rename from frontend-dist/css/app.75711fde.css rename to frontend-dist/css/app.0cd6595e.css diff --git a/frontend-dist/css/app.75711fde.css.gz b/frontend-dist/css/app.0cd6595e.css.gz similarity index 91% rename from frontend-dist/css/app.75711fde.css.gz rename to frontend-dist/css/app.0cd6595e.css.gz index f9bfb5a73c688fbeb12fb2d08753fbc8dfbb82a0..8c67d127eb2258e748b650ddffea4f5c3a599ef1 100644 GIT binary patch delta 19 XcmeB`@0I70@8)0t0Vd&%T+RFdCLRNK delta 19 XcmeB`@0I70@8)0t0Vb}ET+RFdCGi7p diff --git a/frontend-dist/css/chunk-vendors.f9cd4701.css.gz b/frontend-dist/css/chunk-vendors.f9cd4701.css.gz index 4e504129fde5618f98bba28ce438fc5799380cd0..273b9df0735bee2240fcc0db8962f843088f9cfa 100644 GIT binary patch delta 19 YcmbR2GuekrzMF#q1ek<3a&f8w04x&&dH?_b delta 19 YcmbR2GuekrzMF#q1emxsa&f8w04wGLaR2}S diff --git a/frontend-dist/index.html b/frontend-dist/index.html index f124a610..a4e618ed 100644 --- a/frontend-dist/index.html +++ b/frontend-dist/index.html @@ -1 +1 @@ -Sanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/frontend-dist/index.html.gz b/frontend-dist/index.html.gz index 1a1521d942d2a78aa6356287146d0da70d0606ad..aa505725b84bd20691d8da743f7f1274bbc03dfa 100644 GIT binary patch delta 512 zcmV+b0{{K}1Be8FABzY8000000uz-}!EV$r5dD?G9D3O#yRd~;aw1g-iE;u}2yV!+ zC$YPZ$Jmps^7m*rOX;>kz{S#x=DnFW&m&(L(mY25%Y$#^;RUZkUklMli^?=|Kvtlw zN*TEpBX`A>IAtw!EbzzZrdoU}zT6b=Xo!kk>rsHFz!^%H-7Mz=cgt@Xc9cbEj^q-#;#=Stf#?1~A4p_I$3S9-JFwwv-ki$+!p^lua@#`3DWe!bpw z`U&vp*U2B9pLXl6wb{O1Z%UoBSZvKad(0M*#dGwb(OP($H<#C!_$N%Y97s!MZe*Yb z1)M1K%~!lg2$@ovp&c3Wabw@z(A%*ELzu$_!=BO(Vxox2&#-rFX=M1QCUv(g0)uKj zni4*FR2fe(I0mMpKQ4?|%IefrR=)=^ZUSeHU;i+zaZ@9!W!ma^?>_;W2~r*Z0{{Sk CF7y-t literal 509 zcmVrNYrVZ9BqL|bZP zQIlu~{`(nMMxC3ba)zBiCZ& zuDB7WtYwY`{u$j=i-+RpZSk3gsMxh01!xM4fopO1rAE`^KTuEu)?#wFkCgaX-QF3t zwZX}0ERMm-1;_QLG zEAA)_=Zrg?_moV&pj(~zR%a|LaD(cfh1%0-ATuTPa_nkkOX-66hZBut#~zzA;j&ti zaoJ4^@59VP)e=~`5exzctFyJEs%DCP3zgWjyS?WTOpqLI}CeTzcHSeh2M?OLlB zz~hQeE7AF7x9*cR+w1kF)H#b~lbL6a*&?#IL?0Smf4tsoI)kras^#)qGIJvXJvrb+ zp>KZSRYJ&=(hTj$kdG7l?S|ftEf~Tat{C=|b`TRqOn!#FV@o5$H#MpIWe^xt>(P|( z-J{BQior239rxqHh^4GfU1jxOh;b7*b3E{aTH~fhR*Tx|_>untVL&kH*aH9n-ADgp diff --git a/frontend-dist/js/226.ec43855c.js.gz b/frontend-dist/js/226.ec43855c.js.gz deleted file mode 100644 index 17a75d89a70c1ed9c985704c018819ef2a240c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3448 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 avD;YR-q>)>mjiQvhW`iWkZ|n{DF6UUywtD& diff --git a/frontend-dist/js/226.ec43855c.js.map b/frontend-dist/js/226.ec43855c.js.map deleted file mode 100644 index d11fbd5f..00000000 --- a/frontend-dist/js/226.ec43855c.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/226.ec43855c.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/views/NotFound.vue?1f11","webpack://sanyue_imghub/./src/views/NotFound.vue","webpack://sanyue_imghub/./src/views/NotFound.vue?5f0d"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"not-found-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"not-found-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"error-animation\"\n};\nconst _hoisted_6 = {\n class: \"error-image\"\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n class: \"error-info\"\n};\nconst _hoisted_9 = {\n class: \"error-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-links\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_cache[3] || (_cache[3] = _createElementVNode(\"div\", {\n class: \"error-number\"\n }, [_createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\"), _createElementVNode(\"span\", {\n class: \"zero\"\n }, \"0\"), _createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\")], -1)), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"img\", {\n src: $options.errorImage,\n alt: \"404\",\n class: \"floating-image\"\n }, null, 8, _hoisted_7)])]), _createElementVNode(\"div\", _hoisted_8, [_cache[10] || (_cache[10] = _createElementVNode(\"h1\", {\n class: \"error-title\"\n }, \"页面走丢了\", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"error-description\"\n }, \" 抱歉,您访问的页面可能已被删除、更名或暂时不可用 \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[9] || (_cache[9] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"也许您想要:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goDashboard && $options.goDashboard(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tachometer-alt\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 管理面板 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[8] || (_cache[8] = _createTextVNode(\" 刷新页面 \", -1))])])])])]), _cache[12] || (_cache[12] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'NotFound',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig']),\n errorImage() {\n // 使用项目中已有的404图片\n return require('@/assets/404.png');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.not-found-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n goDashboard() {\n this.$router.push('/dashboard');\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./NotFound.vue?vue&type=template&id=5437e264&scoped=true\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport \"./NotFound.vue?vue&type=style&index=0&id=5437e264&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5437e264\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","onClick","goHome","circle","size","default","icon","_","errorImage","type","goBack","href","args","goDashboard","refreshPage","name","mixins","backgroundManager","$router","push","history","go","location","reload","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/226.ec43855c.js.map.gz b/frontend-dist/js/226.ec43855c.js.map.gz deleted file mode 100644 index 71ac1192d73aa14c2a7a424dd23ec531c2b954da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9256 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 K8%O+Ug#ZASyCDPs diff --git a/frontend-dist/js/226.ec43855c.js b/frontend-dist/js/226.f6040a84.js similarity index 99% rename from frontend-dist/js/226.ec43855c.js rename to frontend-dist/js/226.f6040a84.js index af65b040..d6846b51 100644 --- a/frontend-dist/js/226.ec43855c.js +++ b/frontend-dist/js/226.f6040a84.js @@ -1,2 +1,2 @@ "use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[226],{7835:function(e,t,a){e.exports=a.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,a){e.exports=a.p+"img/background.ea1b7ee7.jpg"},48903:function(e,t,a){var n=a(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,n.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const a=document.createElement("img");a.id="bg2",a.className="background-image2",a.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(a,e.firstChild)},initializeBackground(e,t=".login",a=!1,n=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:a,autoCreateElements:n};const s=document.querySelector(t);this.prepareBackgroundContainer(s),n&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),o=document.getElementById("bg2");if(!i||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):a&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,a){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,a),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,a,n){this.loadBackgroundImage(e,a[this.customWallPaperIndex],n),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,a){this.loadBackgroundImage(e,t,a)},setupDefaultWallpaper(e,t){const n=this.useDarkMode,s=a(n?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,a){e.style.zIndex=-1,e.style.opacity=0;const n=document.querySelector(a);this.prepareBackgroundContainer(n);const s=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},i=new Image;i.onload=()=>{e.src=t,s()},i.onerror=()=>{e.src=t,s()},i.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,n=a?e:t,s=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;n.style.zIndex=-2,s.style.zIndex=-1;const o=new Image;o.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,setTimeout(()=>{n.style.opacity=0},1200)},50)},o.src=i},switchCustomWallpaper(e,t,a){const n=0!=e.style.opacity,s=n?e:t,i=n?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%a.length;const o=a[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1;const r=new Image;r.onload=()=>{i.src=o,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{s.style.opacity=0},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),a=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),a&&(a.style.transition="none",a.style.opacity=0,a.src="",setTimeout(()=>{a&&(a.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),a&&(a.style.opacity=0,setTimeout(()=>{a&&(a.src="")},1200)))},smoothThemeTransition(e,t=".login",n=!1,s=!1){const i=this.userConfig?.[e];if(!n||void 0!==i)return void this.reinitializeBackground(e,t,n,s);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,n,s);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,d=this.useDarkMode,u=a(d?10732:7835),g=new Image;g.onload=()=>{c.src=u,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,n,s)},g.src=u},reinitializeBackground(e,t=".login",a=!1,n=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,a,n)},100)}}}},68226:function(e,t,a){a.r(t),a.d(t,{default:function(){return B}});var n=a(80047),s=(a(85331),a(99648),a(56768));const i={class:"not-found-container"},o=["innerHTML"],r={class:"not-found-content"},l={class:"back-button-wrapper"},c={class:"error-animation"},d={class:"error-image"},u=["src"],g={class:"error-info"},m={class:"error-actions"},p={class:"help-links"},h={class:"quick-links"};function k(e,t,a,k,b,y){const I=(0,s.g2)("font-awesome-icon"),f=n.S2;return(0,s.uX)(),(0,s.CE)("div",i,[(0,s.Lk)("div",{class:"background-wrapper",innerHTML:e.backgroundImagesTemplate},null,8,o),(0,s.Lk)("div",r,[(0,s.Lk)("div",l,[(0,s.bF)(f,{class:"back-button",onClick:y.goHome,circle:"",size:"large"},{default:(0,s.k6)(()=>[(0,s.bF)(I,{icon:"home"})]),_:1},8,["onClick"])]),(0,s.Lk)("div",c,[t[3]||(t[3]=(0,s.Lk)("div",{class:"error-number"},[(0,s.Lk)("span",{class:"four"},"4"),(0,s.Lk)("span",{class:"zero"},"0"),(0,s.Lk)("span",{class:"four"},"4")],-1)),(0,s.Lk)("div",d,[(0,s.Lk)("img",{src:y.errorImage,alt:"404",class:"floating-image"},null,8,u)])]),(0,s.Lk)("div",g,[t[10]||(t[10]=(0,s.Lk)("h1",{class:"error-title"},"页面走丢了",-1)),t[11]||(t[11]=(0,s.Lk)("p",{class:"error-description"}," 抱歉,您访问的页面可能已被删除、更名或暂时不可用 ",-1)),(0,s.Lk)("div",m,[(0,s.bF)(f,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:y.goHome},{default:(0,s.k6)(()=>[(0,s.bF)(I,{icon:"home",class:"btn-icon"}),t[4]||(t[4]=(0,s.eW)(" 返回首页 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(f,{size:"large",class:"action-btn secondary-btn",onClick:y.goBack},{default:(0,s.k6)(()=>[(0,s.bF)(I,{icon:"arrow-left",class:"btn-icon"}),t[5]||(t[5]=(0,s.eW)(" 返回上页 ",-1))]),_:1},8,["onClick"])]),(0,s.Lk)("div",p,[t[9]||(t[9]=(0,s.Lk)("p",{class:"help-text"},"也许您想要:",-1)),(0,s.Lk)("div",h,[(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[0]||(t[0]=(...e)=>y.goHome&&y.goHome(...e)),class:"quick-link"},[(0,s.bF)(I,{icon:"cloud-upload-alt"}),t[6]||(t[6]=(0,s.eW)(" 图片上传 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[1]||(t[1]=(...e)=>y.goDashboard&&y.goDashboard(...e)),class:"quick-link"},[(0,s.bF)(I,{icon:"tachometer-alt"}),t[7]||(t[7]=(0,s.eW)(" 管理面板 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[2]||(t[2]=(...e)=>y.refreshPage&&y.refreshPage(...e)),class:"quick-link"},[(0,s.bF)(I,{icon:"redo"}),t[8]||(t[8]=(0,s.eW)(" 刷新页面 ",-1))])])])])]),t[12]||(t[12]=(0,s.Fv)('
',1))])}a(44114);var b=a(60782),y=a(48903),I={name:"NotFound",mixins:[y.A],computed:{...(0,b.L8)(["useDarkMode","userConfig"]),errorImage(){return a(96682)}},mounted(){this.initializeBackground("uploadBkImg",".not-found-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},goDashboard(){this.$router.push("/dashboard")},refreshPage(){window.location.reload()}}},f=a(71241);const v=(0,f.A)(I,[["render",k],["__scopeId","data-v-5437e264"]]);var B=v},96682:function(e,t,a){e.exports=a.p+"img/404.8ed11fb3.png"}}]); -//# sourceMappingURL=226.ec43855c.js.map \ No newline at end of file +//# sourceMappingURL=226.f6040a84.js.map \ No newline at end of file diff --git a/frontend-dist/js/226.f6040a84.js.gz b/frontend-dist/js/226.f6040a84.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..edd31f2cd278bc070682ab4c5e42ab9d484215e4 GIT binary patch literal 3449 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\n \"Background\n `\n },\n // 提供背景图片的CSS样式\n backgroundImagesStyles() {\n return `\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n `\n }\n },\n\n watch: {\n // 监听深色模式切换\n useDarkMode(newVal, oldVal) {\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\n if (newVal !== oldVal && this.backgroundInitParams) {\n this.$nextTick(() => {\n this.smoothThemeTransition(\n this.backgroundInitParams.configKey,\n this.backgroundInitParams.containerSelector,\n this.backgroundInitParams.useDefaultBackground,\n this.backgroundInitParams.autoCreateElements\n )\n })\n }\n }\n },\n\n mounted() {\n // 动态注入背景图片的CSS样式\n this.injectBackgroundStyles()\n },\n\n beforeUnmount() {\n // 组件销毁前清除定时器\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n }\n // 立即清除背景图片,不使用过渡效果\n this.clearBackgroundImages(true)\n // 移除动态注入的样式\n this.removeBackgroundStyles()\n },\n\n methods: {\n /**\n * 动态注入背景图片样式\n */\n injectBackgroundStyles() {\n const styleId = 'background-manager-styles'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = this.backgroundImagesStyles\n document.head.appendChild(style)\n }\n },\n\n /**\n * 移除动态注入的样式\n */\n removeBackgroundStyles() {\n const styleId = 'background-manager-styles'\n const existingStyle = document.getElementById(styleId)\n if (existingStyle) {\n existingStyle.remove()\n }\n },\n\n /**\n * 动态创建背景图片元素\n * @param {HTMLElement} container - 要插入背景图片的容器元素\n */\n createBackgroundElements(container) {\n if (!container) {\n console.warn('未提供有效的容器元素')\n return\n }\n\n // 检查是否已经存在背景图片元素\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\n return\n }\n\n // 创建 bg1 元素\n const bg1 = document.createElement('img')\n bg1.id = 'bg1'\n bg1.className = 'background-image1'\n bg1.alt = 'Background Image'\n \n // 创建 bg2 元素\n const bg2 = document.createElement('img')\n bg2.id = 'bg2'\n bg2.className = 'background-image2'\n bg2.alt = 'Background Image'\n\n // 将元素插入到容器的开头\n container.insertBefore(bg1, container.firstChild)\n container.insertBefore(bg2, container.firstChild)\n },\n /**\n * 初始化背景图\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n // 保存初始化参数,用于主题切换时重新初始化\n this.backgroundInitParams = {\n configKey,\n containerSelector,\n useDefaultBackground,\n autoCreateElements\n }\n\n // 如果需要自动创建元素且元素不存在,则创建\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n if (autoCreateElements) {\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\n this.createBackgroundElements(container)\n }\n }\n\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\n return\n }\n\n const backgroundConfig = this.userConfig?.[configKey]\n\n if (backgroundConfig === 'bing') {\n this.setupBingWallpaper(bg1, bg2, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\n } else if (useDefaultBackground) {\n this.setupDefaultWallpaper(bg1, containerSelector)\n }\n },\n\n /**\n * 设置 Bing 壁纸轮播\n */\n setupBingWallpaper(bg1, bg2, containerSelector) {\n this.$store.dispatch('fetchBingWallPapers').then(() => {\n if (this.bingWallPapers.length === 0) return\n\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchBingWallpaper(bg1, bg2)\n }, this.bkInterval)\n })\n },\n\n /**\n * 设置自定义壁纸轮播\n */\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\n }, this.bkInterval)\n },\n\n /**\n * 设置单张自定义壁纸\n */\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\n },\n\n /**\n * 设置默认壁纸\n */\n setupDefaultWallpaper(bg1, containerSelector) {\n // 根据当前深色模式状态选择背景图\n const isDark = this.useDarkMode\n const defaultImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n \n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\n },\n\n /**\n * 加载背景图片\n */\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\n // 确保初始化时层级正确\n imgElement.style.zIndex = -1\n imgElement.style.opacity = 0\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n const showImage = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n imgElement.style.opacity = this.bkOpacity\n })\n })\n }\n\n const preload = new Image()\n preload.onload = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.onerror = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.src = imageSrc\n },\n \n prepareBackgroundContainer(container) {\n if (!container) return\n\n const computedStyle = window.getComputedStyle(container)\n if (computedStyle.position === 'static') {\n container.style.position = 'relative'\n }\n\n if (computedStyle.zIndex === 'auto') {\n container.style.zIndex = '0'\n }\n\n container.style.isolation = 'isolate'\n },\n\n /**\n * 切换 Bing 壁纸\n */\n switchBingWallpaper(bg1, bg2) {\n if (this.bingWallPapers.length === 0) return\n\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\n\n // 【层级魔法】:让旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\n \n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 切换自定义壁纸\n */\n switchCustomWallpaper(bg1, bg2, wallpapers) {\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\n const nextUrl = wallpapers[this.customWallPaperIndex]\n\n // 旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n \n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 清除背景轮播定时器\n */\n clearBackgroundInterval() {\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n this.backgroundInterval = null\n }\n },\n\n /**\n * 清除背景图片显示(带过渡效果)\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\n */\n clearBackgroundImages(immediate = false) {\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (immediate) {\n // 立即清除,不使用过渡效果\n if (bg1) {\n bg1.style.transition = 'none'\n bg1.style.opacity = 0\n bg1.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n if (bg2) {\n bg2.style.transition = 'none'\n bg2.style.opacity = 0\n bg2.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n } else {\n // 使用过渡效果淡出\n if (bg1) {\n bg1.style.opacity = 0\n setTimeout(() => {\n if (bg1) bg1.src = ''\n }, 1200)\n }\n if (bg2) {\n bg2.style.opacity = 0\n setTimeout(() => {\n if (bg2) bg2.src = ''\n }, 1200)\n }\n }\n },\n\n /**\n * 平滑主题切换(用于响应主题模式变化)\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n const backgroundConfig = this.userConfig?.[configKey]\n \n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\n if (!useDefaultBackground || backgroundConfig !== undefined) {\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 对于默认背景,执行平滑过渡\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n // 如果背景元素不存在,直接重新初始化\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 确定当前显示的背景和下一个背景\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\n\n // 获取新主题对应的背景图\n const isDark = this.useDarkMode\n const newThemeImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n\n // 预加载新背景图\n const preloadImg = new Image()\n preloadImg.onload = () => {\n // 设置下一个背景的图片源\n nextBg.src = newThemeImage\n \n // 等待图片加载完成后执行淡入淡出过渡\n nextBg.onload = () => {\n // 淡出当前背景\n currentBg.style.opacity = 0\n \n // 稍微延迟后淡入新背景,确保过渡效果平滑\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n }, 50) // 50ms 延迟,让淡出效果先开始\n }\n }\n \n preloadImg.onerror = () => {\n // 如果预加载失败,回退到直接重新初始化\n console.warn('主题背景图预加载失败,回退到直接切换')\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }\n \n preloadImg.src = newThemeImage\n },\n\n /**\n * 重新初始化背景图(用于响应配置变化)\n */\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n this.clearBackgroundInterval()\n this.clearBackgroundImages(true) // 使用立即清除\n this.bingWallPaperIndex = 0\n this.customWallPaperIndex = 0\n \n // 延迟一小段时间确保清理完成\n setTimeout(() => {\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }, 100)\n }\n }\n}\n","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"not-found-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"not-found-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"error-animation\"\n};\nconst _hoisted_6 = {\n class: \"error-image\"\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n class: \"error-info\"\n};\nconst _hoisted_9 = {\n class: \"error-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-links\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_cache[3] || (_cache[3] = _createElementVNode(\"div\", {\n class: \"error-number\"\n }, [_createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\"), _createElementVNode(\"span\", {\n class: \"zero\"\n }, \"0\"), _createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\")], -1)), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"img\", {\n src: $options.errorImage,\n alt: \"404\",\n class: \"floating-image\"\n }, null, 8, _hoisted_7)])]), _createElementVNode(\"div\", _hoisted_8, [_cache[10] || (_cache[10] = _createElementVNode(\"h1\", {\n class: \"error-title\"\n }, \"页面走丢了\", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"error-description\"\n }, \" 抱歉,您访问的页面可能已被删除、更名或暂时不可用 \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[9] || (_cache[9] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"也许您想要:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goDashboard && $options.goDashboard(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tachometer-alt\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 管理面板 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[8] || (_cache[8] = _createTextVNode(\" 刷新页面 \", -1))])])])])]), _cache[12] || (_cache[12] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'NotFound',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig']),\n errorImage() {\n // 使用项目中已有的404图片\n return require('@/assets/404.png');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.not-found-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n goDashboard() {\n this.$router.push('/dashboard');\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./NotFound.vue?vue&type=template&id=5437e264&scoped=true\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport \"./NotFound.vue?vue&type=style&index=0&id=5437e264&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5437e264\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","onClick","goHome","circle","size","default","icon","_","errorImage","type","goBack","href","args","goDashboard","refreshPage","name","mixins","backgroundManager","$router","push","history","go","location","reload","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/226.f6040a84.js.map.gz b/frontend-dist/js/226.f6040a84.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..bed5faaf3529c0e630c327cc19e68a07b651da77 GIT binary patch literal 9207 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 N{|_5ZXR?)n003ryDWU)X literal 0 HcmV?d00001 diff --git a/frontend-dist/js/309.b7dca603.js.gz b/frontend-dist/js/309.b7dca603.js.gz deleted file mode 100644 index db2315786c086fcb28ef8d3ee00c6b3c3d26a893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4310 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 E0EdowtN;K2 diff --git a/frontend-dist/js/309.b7dca603.js.map b/frontend-dist/js/309.b7dca603.js.map deleted file mode 100644 index 2608c77a..00000000 --- a/frontend-dist/js/309.b7dca603.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/309.b7dca603.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?4056","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = {\n class: \"tabs-dropdown-link\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: \"title\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.refreshDashboard && $options.refreshDashboard(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.iconName,\n class: \"fa-images\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.titleName), 1)]), _createVNode(_component_el_dropdown, {\n onCommand: $options.handleTabClick,\n class: \"tabs-dropdown\",\n role: \"navigation\",\n onVisibleChange: $options.handleDropdownVisible,\n \"popper-class\": \"tabs-dropdown-popper\"\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [$props.activeTab !== 'dashboard' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 0,\n command: \"dashboard\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"images\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'customerConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 1,\n command: \"customerConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"user-cog\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.userManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'systemConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 2,\n command: \"systemConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cogs\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.systemSettings')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), _createVNode(_component_el_dropdown_item, {\n command: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileUpload')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_2, [_createVNode(_component_font_awesome_icon, {\n icon: \"bars\",\n class: \"tabs-arrow\"\n })])]),\n _: 1\n }, 8, [\"onCommand\", \"onVisibleChange\"]), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\n}","import \"core-js/modules/es.array.push.js\";\nimport AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n computed: {\n titleName() {\n if (this.activeTab === 'dashboard') {\n return this.$t('dashboardTabs.fileManagement');\n } else if (this.activeTab === 'customerConfig') {\n return this.$t('dashboardTabs.userManagement');\n } else if (this.activeTab === 'systemConfig') {\n return this.$t('dashboardTabs.systemSettings');\n } else {\n return this.$t('dashboardTabs.fileUpload');\n }\n },\n iconName() {\n if (this.activeTab === 'dashboard') {\n return 'images';\n } else if (this.activeTab === 'customerConfig') {\n return 'user-cog';\n } else if (this.activeTab === 'systemConfig') {\n return 'cogs';\n } else {\n return 'upload';\n }\n }\n },\n methods: {\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.$router.push(`/${tab}`);\n },\n handleDropdownVisible(isVisible) {\n const arrow = document.querySelector('.tabs-dropdown-link');\n if (isVisible) {\n arrow.classList.add('rotate-up'); // 添加旋转类\n } else {\n arrow.classList.remove('rotate-up'); // 移除旋转类\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=4e00471a&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=4e00471a&scoped=true&lang=css\"\nimport \"./DashboardTabs.vue?vue&type=style&index=1&id=4e00471a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4e00471a\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","class","onClick","args","toggleLocale","role","title","$t","icon","name","isZh","$i18n","locale","next","__exports__","isRedirecting","async","fetchWithAuth","options","credentials","headers","response","fetch","status","store","commit","router","push","finally","_hoisted_2","_hoisted_3","_hoisted_4","handleToggleClick","mode","default","isAuto","key","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","x1","y1","x2","y2","_","getters","cusDarkMode","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_AdminToggleDark","_component_LanguageSwitcher","refreshDashboard","iconName","titleName","onCommand","handleTabClick","onVisibleChange","handleDropdownVisible","dropdown","activeTab","command","props","type","String","components","AdminToggleDark","LanguageSwitcher","location","reload","tab","$router","isVisible","arrow","classList","add"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/309.b7dca603.js.map.gz b/frontend-dist/js/309.b7dca603.js.map.gz deleted file mode 100644 index 1b25cec6c2d9cec853cb6b06da102b52ee6675a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11806 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 M02}~Fd6=;P0GALy0ssI2 diff --git a/frontend-dist/js/309.b7dca603.js b/frontend-dist/js/309.bfaaa238.js similarity index 99% rename from frontend-dist/js/309.b7dca603.js rename to frontend-dist/js/309.bfaaa238.js index 750891f2..dc8f6fe2 100644 --- a/frontend-dist/js/309.b7dca603.js +++ b/frontend-dist/js/309.bfaaa238.js @@ -1,2 +1,2 @@ "use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[309],{213:function(e,t,n){n(85331),n(19104)},4318:function(){},7835:function(e,t,n){e.exports=n.p+"img/background-light.f17603bc.jpg"},10456:function(e,t,n){n(85331)},10732:function(e,t,n){e.exports=n.p+"img/background.ea1b7ee7.jpg"},18785:function(e,t,n){n(85331)},19104:function(e,t,n){n(85331)},23597:function(e,t,n){n(85331)},30694:function(e,t,n){n(85331)},38736:function(e,t,n){n(85331)},40670:function(e,t,n){n(85331),n(99648),n(19104),n(85970)},48903:function(e,t,n){var a=n(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const s=document.querySelector(t);this.prepareBackgroundContainer(s),a&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),o=document.getElementById("bg2");if(!i||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):n&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,n){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,s=n(a?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,n){e.style.zIndex=-1,e.style.opacity=0;const a=document.querySelector(n);this.prepareBackgroundContainer(a);const s=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},i=new Image;i.onload=()=>{e.src=t,s()},i.onerror=()=>{e.src=t,s()},i.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const n=0!=e.style.opacity,a=n?e:t,s=n?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,s.style.zIndex=-1;const o=new Image;o.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,setTimeout(()=>{a.style.opacity=0},1200)},50)},o.src=i},switchCustomWallpaper(e,t,n){const a=0!=e.style.opacity,s=a?e:t,i=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const o=n[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1;const r=new Image;r.onload=()=>{i.src=o,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{s.style.opacity=0},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.src="",setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),n&&(n.style.opacity=0,setTimeout(()=>{n&&(n.src="")},1200)))},smoothThemeTransition(e,t=".login",a=!1,s=!1){const i=this.userConfig?.[e];if(!a||void 0!==i)return void this.reinitializeBackground(e,t,a,s);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,a,s);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,u=this.useDarkMode,d=n(u?10732:7835),g=new Image;g.onload=()=>{c.src=d,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,s)},g.src=d},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}},54047:function(e,t,n){n.d(t,{A:function(){return u}});var a=n(56768);const s=["title"];function i(e,t,n,i,o,r){const l=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>r.toggleLocale&&r.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,a.bF)(l,{icon:"globe",class:"lang-icon"})],8,s)}var o=n(46638),r={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,o.xS)(e)}}},l=n(71241);const c=(0,l.A)(r,[["render",i],["__scopeId","data-v-08567d0a"]]);var u=c},67819:function(e,t,n){n(85331)},70797:function(e,t,n){n.d(t,{A:function(){return o}});n(44114);var a=n(25507),s=n(16915);let i=!1;async function o(e,t={}){t.credentials="include",t.headers={...t.headers};const n=await fetch(e,t);return 401!==n.status||i||(i=!0,a.A.commit("setAdminLoggedIn",!1),s.A.push("/adminLogin").finally(()=>{i=!1})),n}},77128:function(e,t,n){n(85331),n(4318)},78450:function(e,t,n){n(85331)},85970:function(e,t,n){n(85331)},88830:function(e,t,n){n(85331)},96808:function(e,t,n){n(85331),n(18785),n(67819),n(85970),n(19104)},97247:function(e,t,n){n.d(t,{A:function(){return C}});var a=n(54047),s=n(56768),i=n(45130),o=n(24232);const r={id:"themeMaskAdmin"},l=["cx","cy","r"],c=["r"],u=["opacity"];function d(e,t,n,a,d,g){const m=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>g.handleToggleClick&&g.handleToggleClick(...e))},[(0,s.bF)(i.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[d.isAuto?((0,s.uX)(),(0,s.Wv)(m,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.3em",color:"var(--admin-theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,o.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.3em",height:"1.3em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",r,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,l)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMaskAdmin)"},null,8,c),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var g={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},m=n(71241);const h=(0,m.A)(g,[["render",d],["__scopeId","data-v-5c149ed5"]]);var p=h,k=n(62086);n(85331),n(40670),n(88830),n(23597);const b={class:"tabs"},y={class:"tabs-dropdown-link"};function f(e,t,n,i,r,l){const c=(0,s.g2)("font-awesome-icon"),u=k.c6,d=k.Iy,g=k.dW,m=p,h=a.A;return(0,s.uX)(),(0,s.CE)("div",b,[(0,s.Lk)("span",{class:"title",onClick:t[0]||(t[0]=(...e)=>l.refreshDashboard&&l.refreshDashboard(...e))},[(0,s.bF)(c,{icon:l.iconName,class:"fa-images"},null,8,["icon"]),(0,s.eW)(" "+(0,o.v_)(l.titleName),1)]),(0,s.bF)(g,{onCommand:l.handleTabClick,class:"tabs-dropdown",role:"navigation",onVisibleChange:l.handleDropdownVisible,"popper-class":"tabs-dropdown-popper"},{dropdown:(0,s.k6)(()=>[(0,s.bF)(d,null,{default:(0,s.k6)(()=>["dashboard"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:0,command:"dashboard"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"images",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.fileManagement")),1)]),_:1})):(0,s.Q3)("",!0),"customerConfig"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:1,command:"customerConfig"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"user-cog",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.userManagement")),1)]),_:1})):(0,s.Q3)("",!0),"systemConfig"!==n.activeTab?((0,s.uX)(),(0,s.Wv)(u,{key:2,command:"systemConfig"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"cogs",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.systemSettings")),1)]),_:1})):(0,s.Q3)("",!0),(0,s.bF)(u,{command:""},{default:(0,s.k6)(()=>[(0,s.bF)(c,{icon:"upload",style:{"margin-right":"5px",width:"16px"}}),(0,s.eW)(" "+(0,o.v_)(e.$t("dashboardTabs.fileUpload")),1)]),_:1})]),_:1})]),default:(0,s.k6)(()=>[(0,s.Lk)("span",y,[(0,s.bF)(c,{icon:"bars",class:"tabs-arrow"})])]),_:1},8,["onCommand","onVisibleChange"]),(0,s.bF)(m),(0,s.bF)(h,{class:"tabs-language-switcher"})])}n(44114);var I={name:"DashboardTabs",props:{activeTab:{type:String,default:"dashboard"}},components:{AdminToggleDark:p,LanguageSwitcher:a.A},computed:{titleName(){return"dashboard"===this.activeTab?this.$t("dashboardTabs.fileManagement"):"customerConfig"===this.activeTab?this.$t("dashboardTabs.userManagement"):"systemConfig"===this.activeTab?this.$t("dashboardTabs.systemSettings"):this.$t("dashboardTabs.fileUpload")},iconName(){return"dashboard"===this.activeTab?"images":"customerConfig"===this.activeTab?"user-cog":"systemConfig"===this.activeTab?"cogs":"upload"}},methods:{refreshDashboard(){location.reload()},handleTabClick(e){this.$router.push(`/${e}`)},handleDropdownVisible(e){const t=document.querySelector(".tabs-dropdown-link");e?t.classList.add("rotate-up"):t.classList.remove("rotate-up")}}};const v=(0,m.A)(I,[["render",f],["__scopeId","data-v-4e00471a"]]);var C=v}}]); -//# sourceMappingURL=309.b7dca603.js.map \ No newline at end of file +//# sourceMappingURL=309.bfaaa238.js.map \ No newline at end of file diff --git a/frontend-dist/js/309.bfaaa238.js.gz b/frontend-dist/js/309.bfaaa238.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..10b7099081de7de9d81f33e08348db05b0e29c96 GIT binary patch literal 4310 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 E0AXQTC;$Ke literal 0 HcmV?d00001 diff --git a/frontend-dist/js/309.bfaaa238.js.map b/frontend-dist/js/309.bfaaa238.js.map new file mode 100644 index 00000000..49831388 --- /dev/null +++ b/frontend-dist/js/309.bfaaa238.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/309.bfaaa238.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?4056","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414"],"sourcesContent":["/**\n * 背景图管理 Mixin\n * 用于统一管理页面背景图的加载和轮播逻辑\n */\n\nimport { mapGetters } from 'vuex'\n\nexport default {\n data() {\n return {\n bingWallPaperIndex: 0,\n customWallPaperIndex: 0,\n backgroundInterval: null, // 存储轮播定时器\n // 存储初始化参数,用于主题切换时重新初始化\n backgroundInitParams: null,\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\n bkInterval() {\n return this.userConfig?.bkInterval || 3000\n },\n bkOpacity() {\n return this.userConfig?.bkOpacity || 1\n },\n // 提供背景图片元素的模板\n backgroundImagesTemplate() {\n return `\n \"Background\n \"Background\n `\n },\n // 提供背景图片的CSS样式\n backgroundImagesStyles() {\n return `\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n `\n }\n },\n\n watch: {\n // 监听深色模式切换\n useDarkMode(newVal, oldVal) {\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\n if (newVal !== oldVal && this.backgroundInitParams) {\n this.$nextTick(() => {\n this.smoothThemeTransition(\n this.backgroundInitParams.configKey,\n this.backgroundInitParams.containerSelector,\n this.backgroundInitParams.useDefaultBackground,\n this.backgroundInitParams.autoCreateElements\n )\n })\n }\n }\n },\n\n mounted() {\n // 动态注入背景图片的CSS样式\n this.injectBackgroundStyles()\n },\n\n beforeUnmount() {\n // 组件销毁前清除定时器\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n }\n // 立即清除背景图片,不使用过渡效果\n this.clearBackgroundImages(true)\n // 移除动态注入的样式\n this.removeBackgroundStyles()\n },\n\n methods: {\n /**\n * 动态注入背景图片样式\n */\n injectBackgroundStyles() {\n const styleId = 'background-manager-styles'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = this.backgroundImagesStyles\n document.head.appendChild(style)\n }\n },\n\n /**\n * 移除动态注入的样式\n */\n removeBackgroundStyles() {\n const styleId = 'background-manager-styles'\n const existingStyle = document.getElementById(styleId)\n if (existingStyle) {\n existingStyle.remove()\n }\n },\n\n /**\n * 动态创建背景图片元素\n * @param {HTMLElement} container - 要插入背景图片的容器元素\n */\n createBackgroundElements(container) {\n if (!container) {\n console.warn('未提供有效的容器元素')\n return\n }\n\n // 检查是否已经存在背景图片元素\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\n return\n }\n\n // 创建 bg1 元素\n const bg1 = document.createElement('img')\n bg1.id = 'bg1'\n bg1.className = 'background-image1'\n bg1.alt = 'Background Image'\n \n // 创建 bg2 元素\n const bg2 = document.createElement('img')\n bg2.id = 'bg2'\n bg2.className = 'background-image2'\n bg2.alt = 'Background Image'\n\n // 将元素插入到容器的开头\n container.insertBefore(bg1, container.firstChild)\n container.insertBefore(bg2, container.firstChild)\n },\n /**\n * 初始化背景图\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n // 保存初始化参数,用于主题切换时重新初始化\n this.backgroundInitParams = {\n configKey,\n containerSelector,\n useDefaultBackground,\n autoCreateElements\n }\n\n // 如果需要自动创建元素且元素不存在,则创建\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n if (autoCreateElements) {\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\n this.createBackgroundElements(container)\n }\n }\n\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\n return\n }\n\n const backgroundConfig = this.userConfig?.[configKey]\n\n if (backgroundConfig === 'bing') {\n this.setupBingWallpaper(bg1, bg2, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\n } else if (useDefaultBackground) {\n this.setupDefaultWallpaper(bg1, containerSelector)\n }\n },\n\n /**\n * 设置 Bing 壁纸轮播\n */\n setupBingWallpaper(bg1, bg2, containerSelector) {\n this.$store.dispatch('fetchBingWallPapers').then(() => {\n if (this.bingWallPapers.length === 0) return\n\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchBingWallpaper(bg1, bg2)\n }, this.bkInterval)\n })\n },\n\n /**\n * 设置自定义壁纸轮播\n */\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\n }, this.bkInterval)\n },\n\n /**\n * 设置单张自定义壁纸\n */\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\n },\n\n /**\n * 设置默认壁纸\n */\n setupDefaultWallpaper(bg1, containerSelector) {\n // 根据当前深色模式状态选择背景图\n const isDark = this.useDarkMode\n const defaultImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n \n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\n },\n\n /**\n * 加载背景图片\n */\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\n // 确保初始化时层级正确\n imgElement.style.zIndex = -1\n imgElement.style.opacity = 0\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n const showImage = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n imgElement.style.opacity = this.bkOpacity\n })\n })\n }\n\n const preload = new Image()\n preload.onload = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.onerror = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.src = imageSrc\n },\n \n prepareBackgroundContainer(container) {\n if (!container) return\n\n const computedStyle = window.getComputedStyle(container)\n if (computedStyle.position === 'static') {\n container.style.position = 'relative'\n }\n\n if (computedStyle.zIndex === 'auto') {\n container.style.zIndex = '0'\n }\n\n container.style.isolation = 'isolate'\n },\n\n /**\n * 切换 Bing 壁纸\n */\n switchBingWallpaper(bg1, bg2) {\n if (this.bingWallPapers.length === 0) return\n\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\n\n // 【层级魔法】:让旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\n \n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 切换自定义壁纸\n */\n switchCustomWallpaper(bg1, bg2, wallpapers) {\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\n const nextUrl = wallpapers[this.customWallPaperIndex]\n\n // 旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n \n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 清除背景轮播定时器\n */\n clearBackgroundInterval() {\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n this.backgroundInterval = null\n }\n },\n\n /**\n * 清除背景图片显示(带过渡效果)\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\n */\n clearBackgroundImages(immediate = false) {\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (immediate) {\n // 立即清除,不使用过渡效果\n if (bg1) {\n bg1.style.transition = 'none'\n bg1.style.opacity = 0\n bg1.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n if (bg2) {\n bg2.style.transition = 'none'\n bg2.style.opacity = 0\n bg2.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n } else {\n // 使用过渡效果淡出\n if (bg1) {\n bg1.style.opacity = 0\n setTimeout(() => {\n if (bg1) bg1.src = ''\n }, 1200)\n }\n if (bg2) {\n bg2.style.opacity = 0\n setTimeout(() => {\n if (bg2) bg2.src = ''\n }, 1200)\n }\n }\n },\n\n /**\n * 平滑主题切换(用于响应主题模式变化)\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n const backgroundConfig = this.userConfig?.[configKey]\n \n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\n if (!useDefaultBackground || backgroundConfig !== undefined) {\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 对于默认背景,执行平滑过渡\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n // 如果背景元素不存在,直接重新初始化\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 确定当前显示的背景和下一个背景\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\n\n // 获取新主题对应的背景图\n const isDark = this.useDarkMode\n const newThemeImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n\n // 预加载新背景图\n const preloadImg = new Image()\n preloadImg.onload = () => {\n // 设置下一个背景的图片源\n nextBg.src = newThemeImage\n \n // 等待图片加载完成后执行淡入淡出过渡\n nextBg.onload = () => {\n // 淡出当前背景\n currentBg.style.opacity = 0\n \n // 稍微延迟后淡入新背景,确保过渡效果平滑\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n }, 50) // 50ms 延迟,让淡出效果先开始\n }\n }\n \n preloadImg.onerror = () => {\n // 如果预加载失败,回退到直接重新初始化\n console.warn('主题背景图预加载失败,回退到直接切换')\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }\n \n preloadImg.src = newThemeImage\n },\n\n /**\n * 重新初始化背景图(用于响应配置变化)\n */\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n this.clearBackgroundInterval()\n this.clearBackgroundImages(true) // 使用立即清除\n this.bingWallPaperIndex = 0\n this.customWallPaperIndex = 0\n \n // 延迟一小段时间确保清理完成\n setTimeout(() => {\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }, 100)\n }\n }\n}\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import store from '@/store'\nimport router from '@/router'\n\nlet isRedirecting = false;\n\nexport default async function fetchWithAuth(url, options = {}) {\n // 开发环境下添加 /api 前缀\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\n\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\n options.credentials = 'include';\n\n options.headers = {\n ...options.headers,\n };\n\n const response = await fetch(url, options);\n\n if (response.status === 401 && !isRedirecting) {\n isRedirecting = true;\n store.commit('setAdminLoggedIn', false);\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\n router.push('/adminLogin').finally(() => {\n isRedirecting = false;\n });\n }\n\n return response;\n}\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = {\n class: \"tabs-dropdown-link\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: \"title\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.refreshDashboard && $options.refreshDashboard(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.iconName,\n class: \"fa-images\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.titleName), 1)]), _createVNode(_component_el_dropdown, {\n onCommand: $options.handleTabClick,\n class: \"tabs-dropdown\",\n role: \"navigation\",\n onVisibleChange: $options.handleDropdownVisible,\n \"popper-class\": \"tabs-dropdown-popper\"\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [$props.activeTab !== 'dashboard' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 0,\n command: \"dashboard\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"images\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'customerConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 1,\n command: \"customerConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"user-cog\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.userManagement')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), $props.activeTab !== 'systemConfig' ? (_openBlock(), _createBlock(_component_el_dropdown_item, {\n key: 2,\n command: \"systemConfig\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cogs\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.systemSettings')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true), _createVNode(_component_el_dropdown_item, {\n command: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\",\n style: {\n \"margin-right\": \"5px\",\n \"width\": \"16px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('dashboardTabs.fileUpload')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_2, [_createVNode(_component_font_awesome_icon, {\n icon: \"bars\",\n class: \"tabs-arrow\"\n })])]),\n _: 1\n }, 8, [\"onCommand\", \"onVisibleChange\"]), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\n}","import \"core-js/modules/es.array.push.js\";\nimport AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n computed: {\n titleName() {\n if (this.activeTab === 'dashboard') {\n return this.$t('dashboardTabs.fileManagement');\n } else if (this.activeTab === 'customerConfig') {\n return this.$t('dashboardTabs.userManagement');\n } else if (this.activeTab === 'systemConfig') {\n return this.$t('dashboardTabs.systemSettings');\n } else {\n return this.$t('dashboardTabs.fileUpload');\n }\n },\n iconName() {\n if (this.activeTab === 'dashboard') {\n return 'images';\n } else if (this.activeTab === 'customerConfig') {\n return 'user-cog';\n } else if (this.activeTab === 'systemConfig') {\n return 'cogs';\n } else {\n return 'upload';\n }\n }\n },\n methods: {\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.$router.push(`/${tab}`);\n },\n handleDropdownVisible(isVisible) {\n const arrow = document.querySelector('.tabs-dropdown-link');\n if (isVisible) {\n arrow.classList.add('rotate-up'); // 添加旋转类\n } else {\n arrow.classList.remove('rotate-up'); // 移除旋转类\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=4e00471a&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=4e00471a&scoped=true&lang=css\"\nimport \"./DashboardTabs.vue?vue&type=style&index=1&id=4e00471a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4e00471a\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","class","onClick","args","toggleLocale","role","title","$t","icon","name","isZh","$i18n","locale","next","__exports__","isRedirecting","async","fetchWithAuth","options","credentials","headers","response","fetch","status","store","commit","router","push","finally","_hoisted_2","_hoisted_3","_hoisted_4","handleToggleClick","mode","default","isAuto","key","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","x1","y1","x2","y2","_","getters","cusDarkMode","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_AdminToggleDark","_component_LanguageSwitcher","refreshDashboard","iconName","titleName","onCommand","handleTabClick","onVisibleChange","handleDropdownVisible","dropdown","activeTab","command","props","type","String","components","AdminToggleDark","LanguageSwitcher","location","reload","tab","$router","isVisible","arrow","classList","add"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/309.bfaaa238.js.map.gz b/frontend-dist/js/309.bfaaa238.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..37731ea6df8563c302be1245c21c771ee549e188 GIT binary patch literal 11744 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 C5B[(0,i.bF)(w,{icon:"home"})]),_:1},8,["onClick"])]),(0,i.Lk)("div",d,[(0,i.Lk)("div",u,[(0,i.bF)(w,{icon:"shield-alt",class:"shield-icon"}),(0,i.Lk)("div",g,[(0,i.bF)(w,{icon:"clock",class:"clock-icon"})])])]),(0,i.Lk)("div",h,[(0,i.Lk)("h1",m,(0,s.v_)(e.$t("whitelist.title")),1),(0,i.Lk)("p",p,(0,s.v_)(e.$t("whitelist.description")),1),(0,i.Lk)("div",k,[(0,i.bF)(C,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:B.goHome},{default:(0,i.k6)(()=>[(0,i.bF)(w,{icon:"home",class:"btn-icon"}),(0,i.eW)(" "+(0,s.v_)(e.$t("whitelist.goHome")),1)]),_:1},8,["onClick"]),(0,i.bF)(C,{size:"large",class:"action-btn secondary-btn",onClick:B.goBack},{default:(0,i.k6)(()=>[(0,i.bF)(w,{icon:"arrow-left",class:"btn-icon"}),(0,i.eW)(" "+(0,s.v_)(e.$t("whitelist.goBack")),1)]),_:1},8,["onClick"])]),(0,i.Lk)("div",b,[(0,i.Lk)("p",y,(0,s.v_)(e.$t("whitelist.helpText")),1),(0,i.Lk)("div",v,[(0,i.Lk)("a",{href:"javascript:void(0)",onClick:t[0]||(t[0]=(...e)=>B.goHome&&B.goHome(...e)),class:"quick-link"},[(0,i.bF)(w,{icon:"cloud-upload-alt"}),(0,i.eW)(" "+(0,s.v_)(e.$t("whitelist.uploadImage")),1)]),(0,i.Lk)("a",{href:"javascript:void(0)",onClick:t[1]||(t[1]=(...e)=>B.refreshPage&&B.refreshPage(...e)),class:"quick-link"},[(0,i.bF)(w,{icon:"redo"}),(0,i.eW)(" "+(0,s.v_)(e.$t("whitelist.refreshPage")),1)])])]),t[2]||(t[2]=(0,i.Lk)("div",{class:"powered-by"},[(0,i.Lk)("p",null,[(0,i.eW)("Powered By: "),(0,i.Lk)("a",{href:"https://github.com/MarSeventh/CloudFlare-ImgBed",class:"project-link"}," CloudFlare-ImgBed ")])],-1))])]),t[3]||(t[3]=(0,i.Fv)('
',1))])}a(44114);var f=a(74354),B=a(60782),w=a(48903),C={name:"WhiteListOn",mixins:[w.A],computed:{...(0,B.L8)(["useDarkMode","userConfig"])},setup(){(0,f.u)({title:"White List On",meta:[{name:"robots",content:"noindex, nofollow"},{name:"viewport",content:"width=device-width, initial-scale=1"},{charset:"UTF-8"}]})},mounted(){this.initializeBackground("uploadBkImg",".whitelist-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},refreshPage(){window.location.reload()}}},W=a(71241);const x=(0,W.A)(C,[["render",I],["__scopeId","data-v-46822ec2"]]);var P=x},48903:function(e,t,a){var n=a(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,n.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const a=document.createElement("img");a.id="bg2",a.className="background-image2",a.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(a,e.firstChild)},initializeBackground(e,t=".login",a=!1,n=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:a,autoCreateElements:n};const i=document.querySelector(t);this.prepareBackgroundContainer(i),n&&(!i||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(i));const s=document.getElementById("bg1"),o=document.getElementById("bg2");if(!s||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(s,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(s,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(s,r[0],t):a&&this.setupDefaultWallpaper(s,t)},setupBingWallpaper(e,t,a){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,a),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,a,n){this.loadBackgroundImage(e,a[this.customWallPaperIndex],n),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,a){this.loadBackgroundImage(e,t,a)},setupDefaultWallpaper(e,t){const n=this.useDarkMode,i=a(n?10732:7835);this.loadBackgroundImage(e,i,t)},loadBackgroundImage(e,t,a){e.style.zIndex=-1,e.style.opacity=0;const n=document.querySelector(a);this.prepareBackgroundContainer(n);const i=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},s=new Image;s.onload=()=>{e.src=t,i()},s.onerror=()=>{e.src=t,i()},s.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,n=a?e:t,i=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const s=this.bingWallPapers[this.bingWallPaperIndex]?.url;n.style.zIndex=-2,i.style.zIndex=-1;const o=new Image;o.onload=()=>{i.src=s,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{n.style.opacity=0},1200)},50)},o.src=s},switchCustomWallpaper(e,t,a){const n=0!=e.style.opacity,i=n?e:t,s=n?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%a.length;const o=a[this.customWallPaperIndex];i.style.zIndex=-2,s.style.zIndex=-1;const r=new Image;r.onload=()=>{s.src=o,setTimeout(()=>{s.style.opacity=this.bkOpacity,setTimeout(()=>{i.style.opacity=0},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),a=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),a&&(a.style.transition="none",a.style.opacity=0,a.src="",setTimeout(()=>{a&&(a.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),a&&(a.style.opacity=0,setTimeout(()=>{a&&(a.src="")},1200)))},smoothThemeTransition(e,t=".login",n=!1,i=!1){const s=this.userConfig?.[e];if(!n||void 0!==s)return void this.reinitializeBackground(e,t,n,i);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,n,i);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,d=this.useDarkMode,u=a(d?10732:7835),g=new Image;g.onload=()=>{c.src=u,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,n,i)},g.src=u},reinitializeBackground(e,t=".login",a=!1,n=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,a,n)},100)}}}}}]); -//# sourceMappingURL=51.6e7bf298.js.map \ No newline at end of file +//# sourceMappingURL=51.0c776d33.js.map \ No newline at end of file diff --git a/frontend-dist/js/51.0c776d33.js.gz b/frontend-dist/js/51.0c776d33.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..55228722489d53b9cac5177b763fbd8a3f6770f8 GIT binary patch literal 3363 zcmV+;4czh{iwFP!000026YV#hG~(G9YY)7D zRxnCrNvaW5#i=Sv?vV%tNP=~O$?iPt20QCykqieRWPI+vnAB8erHpn(EyTau{X0aMb8aWFa^CTt`zJ5R_XIvxy@9_ad4 z?wHRzUFgJ#9NL}Eq1#2XqvO`0*H2iWC}%c73Sl@S4tX4Np`?$U_$@%kgZ&;3MgzeU z7SEk3)%Uy6Lh)M*r?xiVgPq46f6{pK5VsIh_Ly3#it)-b<9?tUeVujt#YN0hbD^MAk8*W306TDM~hhG%)Lf&GjA*2Lz;OxP`#_ z9HeNxxvr>+G(x-y2#E{?jdKA;ThbYWOOT@80yHF1TrfIcUsdF>Ho|1F`hG%#Q9Yt; zBthCP9B7?ojz(vwk51q$bHvoQ8;ClCCbU7HGgZe^BKeqPR)FZ#XU_d*J9E9+n*1}g zAu^ArUx79V=>#B-I%ehWs90I`NFL6GL(syr9&wiNvoRhJ`GAb$2rH5zmP8RcMj~gn zBpq!r3-XoT9cZ7Tl3)Ocv(tzMBk#l+@UQYQK>-y(L_7eHq#qCuL|7R2E+XGh9NmDn z4gH%-`cpL1w(-D_j|oU&7ota=o1$aX0XY-U)vFsahFel6sD!E8r}Ka*8hClaU25un?*>}YQ<9q zfoLmrg0$jXC1E{@BaX8(`pV|Za7>O{*zo!)xtU7ts!D?N1(CyhcwqEe`Fc&|1PS@8 zE40F=P{@RU>NGPUn_a)6Cd7P71PSZC^MxQqgqWn?SxRs(+iIPhdlo3S*iflhdi(nW zs)k9=3HW&b9W3sX31Mouf2uupC&Gf%&&Goj5-yHFEckmQP=!H&wYAj(S|wC>VWC

~S&c4q?ZH@_UxiDhW|pdWFpC>zvCM80``$psF zxCznJ$M(VT+l`j)S7r>4i3c9)K)p+)`Z@z>OdnGwz0TCR-9-T($B81LH**}vZlDwA z?lH7GAd%!Buo%6=LjsWgCQdo)(*fwh6iK3z*oHH^f%;AY?U^ZpIU7s!u?!=ku-C~& z5WL5g1SoG*J-|3+A$g1}#``>q_*AzW+1?2yQ{BI>?4Ht44gHWzXh7=b3$iGqisGm) z0~`_G)%d{>3rUm*-hFVVehkuX3R5)Z2~#Ar;Yu;@pV{8>rz;_tqNXfZKH!dR4?$liz}3!~@gpJA!D1ZJ4Gh zdZ;7GZ63JANb*=8>4(m3U79-`AP5V!0nWOp10Fq+0guU92oTtaSO*l5X)f*G%T{ zEVt44(%Slv=-Y)70PmTy*r&>~0zM&P4f;Xd_=GQb*%4Cq-CEbMxH)1vhZjI5r}3Ns?5 z?LxRhA>HAR=HLDCxAO-`Q#8dY7<#jnRHU;ioRK}>SGAf+C1sf}2fe|_WA%UrBQqOi zMM#c0SHlNGGA0ie+S-+roWNwMuaR@Kb5B+>?~{lGii;h4wJzD@woD^Cw&O(cQ$esI zU&)(Fn8LKA#_KRyQY?~AMeW|MBDI>S=ZhR)u??cq+HVq_z1PUWf{giulu5Jb45|dq zZ>Gpv_8nt}2Sn7R*#z3OZ|{XXNVGki0a3YWPR`Flo4|sG@)vu8RSVj{&;hy@)6geK zIrsg5e7*zT1TbgbzRC@BJSd!C2qWc~%KMLaOv>swQcijO%{k#K zIAN!#@CfhXWZ>nT5OFAzM5q&UtZapd)2Biz69sS+jMu>_D(%GyQa*4ZKA;RB?C-gV z`Fn23Q7y89KU-uakD#sW<0({@Wju_wvx&#j++|$K?VX#lJ;E5!Wp(4uZxSD-VYlYH% z$_5eHpl3@YI*qO-g!6K2Hs@ivx=$4&_PRRx{FGI4Jr)utq%zhmferdZ1;dl|nFTs( zNLW_u8@fX<=VxtCE_|()6*w~jucvy=b{ns=y=Eq|?ky(~5yB8v6ii`#sz1U&7rOH*pnF3`)Wf!s6lYZ0TnZLF*$i**@l2s>Hc*77a zj~&wtX2*stj!n@jBI;wC-O65>>KCwi9xG=A-E`onJ+2Yq0mN0vSzM&jr}_1S>6Ub}V_t>QKqoup6hl|7W*1r& zOFj@J!ir7^fC%W6nxSMKT0zKN1{we^oJJ*&a7HD2)UW@lj-^(i;qS^Q>*`^@vFC3% z0WlxnBA(J=c}sbuU6E3Jy8`f*3%^t?z@jW(JA1X+Mr1b;-Hi3coBL(V@U@tsCKRMT zrw{0u@I=|g`i@B4+RiqQREpeYL*GFj>JOfADI8UiOo~%j;sfe4;{)llr4P!oV(x`9 zkoE&!w>tNCCD=CIGO(;Luvjs$STk^T*7%minSkz=lPu2vyym zfXvnq;abhcl@j1B32>DJRfMjR0D5aySaPaR(Qt=(z^uz(jhpXU$JMo?^d4qy6w*@= zqAQM<<*l)av+ zPoSU-AUux3?ZzkZu^p~9K4`F#R|ac&B{058P_VWdUFp|gcZ*@tNs0#R-NX8D_3XEQ zc=^eHEk>-DpM2}$yFYsIr$1f%FPo t{V!UQCn6y4;5epi@a{j|^$%UA5gZ-e2wN@ZJ?V^b{QoAcMh)vI000zriG=_F literal 0 HcmV?d00001 diff --git a/frontend-dist/js/51.0c776d33.js.map b/frontend-dist/js/51.0c776d33.js.map new file mode 100644 index 00000000..5db37fb0 --- /dev/null +++ b/frontend-dist/js/51.0c776d33.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/51.0c776d33.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/WhiteListOn.vue?649a","webpack://sanyue_imghub/./src/views/WhiteListOn.vue","webpack://sanyue_imghub/./src/views/WhiteListOn.vue?05e5","webpack://sanyue_imghub/./src/mixins/backgroundManager.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"whitelist-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"whitelist-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-title\"\n};\nconst _hoisted_10 = {\n class: \"status-description\"\n};\nconst _hoisted_11 = {\n class: \"status-actions\"\n};\nconst _hoisted_12 = {\n class: \"help-info\"\n};\nconst _hoisted_13 = {\n class: \"help-text\"\n};\nconst _hoisted_14 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n class: \"shield-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\",\n class: \"clock-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h1\", _hoisted_9, _toDisplayString(_ctx.$t('whitelist.title')), 1), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('whitelist.description')), 1), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goHome')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goBack')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"p\", _hoisted_13, _toDisplayString(_ctx.$t('whitelist.helpText')), 1), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.uploadImage')), 1)]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.refreshPage')), 1)])])]), _cache[2] || (_cache[2] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[3] || (_cache[3] = _createStaticVNode(\"

\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'WhiteListOn',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'White List On',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.whitelist-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./WhiteListOn.vue?vue&type=template&id=46822ec2&scoped=true\"\nimport script from \"./WhiteListOn.vue?vue&type=script&lang=js\"\nexport * from \"./WhiteListOn.vue?vue&type=script&lang=js\"\n\nimport \"./WhiteListOn.vue?vue&type=style&index=0&id=46822ec2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-46822ec2\"]])\n\nexport default __exports__","/**\n * 背景图管理 Mixin\n * 用于统一管理页面背景图的加载和轮播逻辑\n */\n\nimport { mapGetters } from 'vuex'\n\nexport default {\n data() {\n return {\n bingWallPaperIndex: 0,\n customWallPaperIndex: 0,\n backgroundInterval: null, // 存储轮播定时器\n // 存储初始化参数,用于主题切换时重新初始化\n backgroundInitParams: null,\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\n bkInterval() {\n return this.userConfig?.bkInterval || 3000\n },\n bkOpacity() {\n return this.userConfig?.bkOpacity || 1\n },\n // 提供背景图片元素的模板\n backgroundImagesTemplate() {\n return `\n \"Background\n \"Background\n `\n },\n // 提供背景图片的CSS样式\n backgroundImagesStyles() {\n return `\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n `\n }\n },\n\n watch: {\n // 监听深色模式切换\n useDarkMode(newVal, oldVal) {\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\n if (newVal !== oldVal && this.backgroundInitParams) {\n this.$nextTick(() => {\n this.smoothThemeTransition(\n this.backgroundInitParams.configKey,\n this.backgroundInitParams.containerSelector,\n this.backgroundInitParams.useDefaultBackground,\n this.backgroundInitParams.autoCreateElements\n )\n })\n }\n }\n },\n\n mounted() {\n // 动态注入背景图片的CSS样式\n this.injectBackgroundStyles()\n },\n\n beforeUnmount() {\n // 组件销毁前清除定时器\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n }\n // 立即清除背景图片,不使用过渡效果\n this.clearBackgroundImages(true)\n // 移除动态注入的样式\n this.removeBackgroundStyles()\n },\n\n methods: {\n /**\n * 动态注入背景图片样式\n */\n injectBackgroundStyles() {\n const styleId = 'background-manager-styles'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = this.backgroundImagesStyles\n document.head.appendChild(style)\n }\n },\n\n /**\n * 移除动态注入的样式\n */\n removeBackgroundStyles() {\n const styleId = 'background-manager-styles'\n const existingStyle = document.getElementById(styleId)\n if (existingStyle) {\n existingStyle.remove()\n }\n },\n\n /**\n * 动态创建背景图片元素\n * @param {HTMLElement} container - 要插入背景图片的容器元素\n */\n createBackgroundElements(container) {\n if (!container) {\n console.warn('未提供有效的容器元素')\n return\n }\n\n // 检查是否已经存在背景图片元素\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\n return\n }\n\n // 创建 bg1 元素\n const bg1 = document.createElement('img')\n bg1.id = 'bg1'\n bg1.className = 'background-image1'\n bg1.alt = 'Background Image'\n \n // 创建 bg2 元素\n const bg2 = document.createElement('img')\n bg2.id = 'bg2'\n bg2.className = 'background-image2'\n bg2.alt = 'Background Image'\n\n // 将元素插入到容器的开头\n container.insertBefore(bg1, container.firstChild)\n container.insertBefore(bg2, container.firstChild)\n },\n /**\n * 初始化背景图\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n // 保存初始化参数,用于主题切换时重新初始化\n this.backgroundInitParams = {\n configKey,\n containerSelector,\n useDefaultBackground,\n autoCreateElements\n }\n\n // 如果需要自动创建元素且元素不存在,则创建\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n if (autoCreateElements) {\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\n this.createBackgroundElements(container)\n }\n }\n\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\n return\n }\n\n const backgroundConfig = this.userConfig?.[configKey]\n\n if (backgroundConfig === 'bing') {\n this.setupBingWallpaper(bg1, bg2, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\n } else if (useDefaultBackground) {\n this.setupDefaultWallpaper(bg1, containerSelector)\n }\n },\n\n /**\n * 设置 Bing 壁纸轮播\n */\n setupBingWallpaper(bg1, bg2, containerSelector) {\n this.$store.dispatch('fetchBingWallPapers').then(() => {\n if (this.bingWallPapers.length === 0) return\n\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchBingWallpaper(bg1, bg2)\n }, this.bkInterval)\n })\n },\n\n /**\n * 设置自定义壁纸轮播\n */\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\n }, this.bkInterval)\n },\n\n /**\n * 设置单张自定义壁纸\n */\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\n },\n\n /**\n * 设置默认壁纸\n */\n setupDefaultWallpaper(bg1, containerSelector) {\n // 根据当前深色模式状态选择背景图\n const isDark = this.useDarkMode\n const defaultImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n \n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\n },\n\n /**\n * 加载背景图片\n */\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\n // 确保初始化时层级正确\n imgElement.style.zIndex = -1\n imgElement.style.opacity = 0\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n const showImage = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n imgElement.style.opacity = this.bkOpacity\n })\n })\n }\n\n const preload = new Image()\n preload.onload = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.onerror = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.src = imageSrc\n },\n \n prepareBackgroundContainer(container) {\n if (!container) return\n\n const computedStyle = window.getComputedStyle(container)\n if (computedStyle.position === 'static') {\n container.style.position = 'relative'\n }\n\n if (computedStyle.zIndex === 'auto') {\n container.style.zIndex = '0'\n }\n\n container.style.isolation = 'isolate'\n },\n\n /**\n * 切换 Bing 壁纸\n */\n switchBingWallpaper(bg1, bg2) {\n if (this.bingWallPapers.length === 0) return\n\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\n\n // 【层级魔法】:让旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\n \n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 切换自定义壁纸\n */\n switchCustomWallpaper(bg1, bg2, wallpapers) {\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\n const nextUrl = wallpapers[this.customWallPaperIndex]\n\n // 旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n \n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 清除背景轮播定时器\n */\n clearBackgroundInterval() {\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n this.backgroundInterval = null\n }\n },\n\n /**\n * 清除背景图片显示(带过渡效果)\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\n */\n clearBackgroundImages(immediate = false) {\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (immediate) {\n // 立即清除,不使用过渡效果\n if (bg1) {\n bg1.style.transition = 'none'\n bg1.style.opacity = 0\n bg1.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n if (bg2) {\n bg2.style.transition = 'none'\n bg2.style.opacity = 0\n bg2.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n } else {\n // 使用过渡效果淡出\n if (bg1) {\n bg1.style.opacity = 0\n setTimeout(() => {\n if (bg1) bg1.src = ''\n }, 1200)\n }\n if (bg2) {\n bg2.style.opacity = 0\n setTimeout(() => {\n if (bg2) bg2.src = ''\n }, 1200)\n }\n }\n },\n\n /**\n * 平滑主题切换(用于响应主题模式变化)\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n const backgroundConfig = this.userConfig?.[configKey]\n \n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\n if (!useDefaultBackground || backgroundConfig !== undefined) {\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 对于默认背景,执行平滑过渡\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n // 如果背景元素不存在,直接重新初始化\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 确定当前显示的背景和下一个背景\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\n\n // 获取新主题对应的背景图\n const isDark = this.useDarkMode\n const newThemeImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n\n // 预加载新背景图\n const preloadImg = new Image()\n preloadImg.onload = () => {\n // 设置下一个背景的图片源\n nextBg.src = newThemeImage\n \n // 等待图片加载完成后执行淡入淡出过渡\n nextBg.onload = () => {\n // 淡出当前背景\n currentBg.style.opacity = 0\n \n // 稍微延迟后淡入新背景,确保过渡效果平滑\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n }, 50) // 50ms 延迟,让淡出效果先开始\n }\n }\n \n preloadImg.onerror = () => {\n // 如果预加载失败,回退到直接重新初始化\n console.warn('主题背景图预加载失败,回退到直接切换')\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }\n \n preloadImg.src = newThemeImage\n },\n\n /**\n * 重新初始化背景图(用于响应配置变化)\n */\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n this.clearBackgroundInterval()\n this.clearBackgroundImages(true) // 使用立即清除\n this.bingWallPaperIndex = 0\n this.customWallPaperIndex = 0\n \n // 延迟一小段时间确保清理完成\n setTimeout(() => {\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }, 100)\n }\n }\n}\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","$t","type","goBack","href","args","refreshPage","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","__exports__","data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","userConfig","bkOpacity","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/51.0c776d33.js.map.gz b/frontend-dist/js/51.0c776d33.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..a612e0f30c525e658143c44520856267d0200091 GIT binary patch literal 9212 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 diff --git a/frontend-dist/js/51.6e7bf298.js.map b/frontend-dist/js/51.6e7bf298.js.map deleted file mode 100644 index 0c6c3b30..00000000 --- a/frontend-dist/js/51.6e7bf298.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/51.6e7bf298.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/WhiteListOn.vue?649a","webpack://sanyue_imghub/./src/views/WhiteListOn.vue","webpack://sanyue_imghub/./src/views/WhiteListOn.vue?05e5","webpack://sanyue_imghub/./src/mixins/backgroundManager.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"whitelist-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"whitelist-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-title\"\n};\nconst _hoisted_10 = {\n class: \"status-description\"\n};\nconst _hoisted_11 = {\n class: \"status-actions\"\n};\nconst _hoisted_12 = {\n class: \"help-info\"\n};\nconst _hoisted_13 = {\n class: \"help-text\"\n};\nconst _hoisted_14 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n class: \"shield-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\",\n class: \"clock-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h1\", _hoisted_9, _toDisplayString(_ctx.$t('whitelist.title')), 1), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('whitelist.description')), 1), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goHome')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goBack')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"p\", _hoisted_13, _toDisplayString(_ctx.$t('whitelist.helpText')), 1), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.uploadImage')), 1)]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.refreshPage')), 1)])])]), _cache[2] || (_cache[2] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[3] || (_cache[3] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'WhiteListOn',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'White List On',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.whitelist-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./WhiteListOn.vue?vue&type=template&id=46822ec2&scoped=true\"\nimport script from \"./WhiteListOn.vue?vue&type=script&lang=js\"\nexport * from \"./WhiteListOn.vue?vue&type=script&lang=js\"\n\nimport \"./WhiteListOn.vue?vue&type=style&index=0&id=46822ec2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-46822ec2\"]])\n\nexport default __exports__","/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","$t","type","goBack","href","args","refreshPage","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","__exports__","data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","userConfig","bkOpacity","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","zIndex","opacity","showImage","requestAnimationFrame","preload","Image","onload","src","onerror","computedStyle","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/51.6e7bf298.js.map.gz b/frontend-dist/js/51.6e7bf298.js.map.gz deleted file mode 100644 index be04bf15398a00d45f3374e251b3e83be50f2d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9268 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 Wq#QF0J29L{ockYYO#|2Bg#ZA>hAgB2 diff --git a/frontend-dist/js/577.b10c6bbc.js b/frontend-dist/js/577.95699028.js similarity index 99% rename from frontend-dist/js/577.b10c6bbc.js rename to frontend-dist/js/577.95699028.js index 5d77f4b8..18f1650b 100644 --- a/frontend-dist/js/577.b10c6bbc.js +++ b/frontend-dist/js/577.95699028.js @@ -1,2 +1,2 @@ (self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[577],{213:function(e,t,o){"use strict";o(85331),o(19104)},2893:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},10456:function(e,t,o){"use strict";o(85331)},11393:function(e,t,o){o(16573),o(78100),o(77936),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721),function(t,o){e.exports=o()}(0,function(){return function(e){var t={};function o(s){if(t[s])return t[s].exports;var l=t[s]={i:s,l:!1,exports:{}};return e[s].call(l.exports,l,l.exports,o),l.l=!0,l.exports}return o.m=e,o.c=t,o.d=function(e,t,s){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)o.d(s,l,function(t){return e[t]}.bind(null,l));return s},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";var s;function l(e){return["image/png","image/jpeg","image/gif"].some(t=>t===e)}o.r(t),o.d(t,"canvastoDataURL",function(){return a}),o.d(t,"canvastoFile",function(){return n}),o.d(t,"dataURLtoFile",function(){return d}),o.d(t,"dataURLtoImage",function(){return c}),o.d(t,"downloadFile",function(){return u}),o.d(t,"filetoDataURL",function(){return p}),o.d(t,"imagetoCanvas",function(){return m}),o.d(t,"urltoBlob",function(){return g}),o.d(t,"urltoImage",function(){return f}),o.d(t,"compress",function(){return b}),o.d(t,"compressAccurately",function(){return v}),o.d(t,"EImageType",function(){return s}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(s||(s={}));var i=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function a(e,t=.92,o=s.JPEG){return i(this,void 0,void 0,function*(){return l(o)||(o=s.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=s.JPEG){return new Promise(s=>e.toBlob(e=>s(e),o,t))}var r=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let s=o[0].match(/:(.*?);/)[1];const i=atob(o[1]);let a=i.length;const n=new Uint8Array(a);for(;a--;)n[a]=i.charCodeAt(a);return l(t)&&(s=t),new Blob([n],{type:s})})}function c(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),s.src=e})}function u(e,t){const o=document.createElement("a");o.href=window.URL.createObjectURL(e),o.download=t||Date.now().toString(36),document.body.appendChild(o);const s=document.createEvent("MouseEvents");s.initEvent("click",!1,!1),o.dispatchEvent(s),document.body.removeChild(o)}function p(e){return new Promise(t=>{const o=new FileReader;o.onloadend=e=>t(e.target.result),o.readAsDataURL(e)})}var h=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),s=document.createElement("canvas"),l=s.getContext("2d");let i,a;for(const e in o)Object.prototype.hasOwnProperty.call(o,e)&&(o[e]=Number(o[e]));if(o.scale){const t=o.scale>0&&o.scale<10?o.scale:1;a=e.width*t,i=e.height*t}else a=o.width||o.height*e.width/e.height||e.width,i=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=a,s.width=i):(s.height=i,s.width=a),o.orientation){case 3:l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 6:l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 8:l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;case 2:l.translate(s.width,0),l.scale(-1,1),l.drawImage(e,0,0,s.width,s.height);break;case 4:l.translate(s.width,0),l.scale(-1,1),l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 5:l.translate(s.width,0),l.scale(-1,1),l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 7:l.translate(s.width,0),l.scale(-1,1),l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;default:l.drawImage(e,0,0,s.width,s.height)}return s})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),s.src=e})}var y=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function b(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compress(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({quality:t})),t.quality=Number(t.quality),Number.isNaN(t.quality))return e;const o=yield p(e);let i=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;l(t.type)&&(n=t.type,i=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield a(u,t.quality,n),g=yield d(h,i);return g.size>e.size?e:g})}function v(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compressAccurately(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({size:t})),t.size=Number(t.size),Number.isNaN(t.size))return e;if(1024*t.size>e.size)return e;t.accuracy=Number(t.accuracy),(!t.accuracy||t.accuracy<.8||t.accuracy>.99)&&(t.accuracy=.95);const o=t.size*(2-t.accuracy)*1024,i=1024*t.size,n=t.size*t.accuracy*1024,r=yield p(e);let u=r.split(",")[0].match(/:(.*?);/)[1],h=s.JPEG;l(t.type)&&(h=t.type,u=t.type);const g=yield c(r),f=yield m(g,Object.assign({},t));let y,b=.5;const v=[null,null];for(let e=1;e<=7;e++){y=yield a(f,b,h);const t=.75*y.length;if(7===e){(ot)&&(y=[y,...v].filter(e=>e).sort((e,t)=>Math.abs(.75*e.length-i)-Math.abs(.75*t.length-i))[0]);break}if(ot))break;v[0]=y,b+=Math.pow(.5,e+1)}}const C=yield d(y,u);return C.size>e.size?e:C})}}])})},13378:function(e,t,o){"use strict";o(85331),o(38736),o(79899)},15616:function(e,t,o){"use strict";o(85331),o(97197)},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},23597:function(e,t,o){"use strict";o(85331)},30694:function(e,t,o){"use strict";o(85331)},33892:function(e,t,o){"use strict";o.d(t,{A:function(){return $}});var s=o(99114),l=(o(85331),o(30694),o(49385)),i=(o(37952),o(30650)),a=(o(19104),o(31802)),n=(o(13378),o(80047)),r=(o(99648),o(56768)),d=o(45130),c=o(24232);const u={class:"directory-tree-picker"},p={class:"tree-container"},h={key:0,class:"error-state"},m={class:"error-text"},g={class:"node-label"},f={class:"tree-container"},y={key:0,class:"error-state"},b={class:"error-text"},v={class:"node-label"};function C(e,t,o,C,k,w){const F=(0,r.g2)("font-awesome-icon"),L=n.S2,U=a.qk,$=i.Vc,S=l.pw,T=s.A;return(0,r.uX)(),(0,r.CE)("div",u,[w.isDesktop?((0,r.uX)(),(0,r.Wv)($,{key:0,visible:k.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>k.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,r.k6)(()=>[(0,r.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",p,[k.error?((0,r.uX)(),(0,r.CE)("div",h,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",m,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRef",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",g,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:3},8,["visible"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,r.bF)(S,{modelValue:k.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>k.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",f,[k.error?((0,r.uX)(),(0,r.CE)("div",y,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",b,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRefMobile",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",v,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:1},8,["modelValue","title"])],64))])}var k=o(457),w=o(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await k.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},L=o(71241);const U=(0,L.A)(F,[["render",C],["__scopeId","data-v-62eab69a"]]);var $=U},34396:function(e,t,o){"use strict";o(85331),o(4885)},37952:function(e,t,o){"use strict";o(85331),o(97197)},38736:function(e,t,o){"use strict";o(85331)},40670:function(e,t,o){"use strict";o(85331),o(99648),o(19104),o(85970)},50333:function(e,t,o){"use strict";o(85331),o(29092)},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return l}});var s=o(46638);function l(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:s.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:s.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:s.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:s.Ay.global.t("validation.consecutiveSlashNotAllowed")};const l=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return l.test(e)?{valid:!1,error:s.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},67819:function(e,t,o){"use strict";o(85331)},70797:function(e,t,o){"use strict";o.d(t,{A:function(){return a}});o(44114);var s=o(25507),l=o(16915);let i=!1;async function a(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||i||(i=!0,s.A.commit("setAdminLoggedIn",!1),l.A.push("/adminLogin").finally(()=>{i=!1})),o}},76334:function(e,t,o){e.exports=o(11393)},79899:function(e,t,o){"use strict";o(85331)},85970:function(e,t,o){"use strict";o(85331)},88830:function(e,t,o){"use strict";o(85331)},95385:function(e,t,o){"use strict";o(85331)},96682:function(e,t,o){"use strict";e.exports=o.p+"img/404.8ed11fb3.png"},96808:function(e,t,o){"use strict";o(85331),o(18785),o(67819),o(85970),o(19104)},99761:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return $o}});var s=o(78507),l=(o(85331),o(213),o(80047)),i=(o(99648),o(56768)),a=o(24232);const n={class:"history-header"},r={class:"header-left"},d={class:"record-count"},c={class:"header-right"},u={class:"timeline-header"},p={class:"date-label"},h={key:0,class:"grid-view"},m={class:"grid-preview"},g=["src"],f=["src"],y={key:2,class:"file-icon-wrapper"},b={class:"grid-overlay"},v={class:"grid-actions"},C={class:"grid-info"},k=["title"],w={class:"upload-time"},F={key:1,class:"list-view"},L={class:"list-preview"},U=["src"],$=["src"],S={key:2,class:"file-icon-wrapper-small"},T={class:"list-info"},_=["title"],x=["title"],M={class:"list-meta"},R={class:"upload-time"},A={class:"list-actions"},E={key:0,class:"load-more-container"},D={key:0,class:"loading-indicator"},I={key:1,class:"load-more-hint"},N={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function V(e,t,o,V,W,z){const B=(0,i.g2)("font-awesome-icon"),H=l.S2,X=s.R7;return(0,i.uX)(),(0,i.CE)("div",{class:(0,a.C4)(["history-container",{active:o.show}])},[(0,i.Lk)("div",n,[(0,i.Lk)("div",r,[(0,i.Lk)("h2",null,(0,a.v_)(e.$t("uploadHistory.title")),1),(0,i.Lk)("span",d,(0,a.v_)(e.$t("uploadHistory.totalRecords",{count:W.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(X,{content:e.$t("uploadHistory.switchView"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:z.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"grid"===W.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(X,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:z.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"times"})]),_:1})])]),W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>z.handleScroll&&z.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(z.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,a.v_)(e.date),1)]),"grid"===W.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,g)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(B,{icon:"file",class:"file-icon"})])),(0,i.Lk)("div",b,[(0,i.Lk)("div",v,[(0,i.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,i.Lk)("div",C,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,k),(0,i.Lk)("div",w,(0,a.v_)(z.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,U)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(B,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,_),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,a.v_)(e.url),9,x)]),(0,i.Lk)("div",M,[(0,i.Lk)("div",R,(0,a.v_)(z.formatTime(e.time)),1)]),(0,i.Lk)("div",A,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),z.hasMore?((0,i.uX)(),(0,i.CE)("div",E,[W.loadingMore?((0,i.uX)(),(0,i.CE)("div",D,[(0,i.bF)(B,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",I,(0,a.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",N,(0,a.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(B,{icon:"history",class:"empty-icon"}),(0,i.Lk)("p",null,(0,a.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701),o(33110),o(58335);var W={name:"UploadHistory",props:{show:{type:Boolean,default:!1}},data(){return{historyList:[],allHistory:[],viewMode:"grid",pageSize:30,currentPage:0,loadingMore:!1,totalCount:0}},watch:{show(e){e&&this.resetAndLoad()}},computed:{hasMore(){return this.historyList.length{const o=new Date(t.time),s=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[s]||(e[s]=[]),e[s].push(t)}),Object.keys(e).sort((e,t)=>new Date(t)-new Date(e)).map(t=>({date:t,items:e[t]}))}},mounted(){const e=localStorage.getItem("historyViewMode");e&&(this.viewMode=e)},methods:{resetAndLoad(){this.historyList=[],this.currentPage=0,this.loadAllHistory(),this.loadMore()},loadAllHistory(){try{const e=JSON.parse(localStorage.getItem("uploadHistory")||"[]");this.allHistory=e.sort((e,t)=>t.time-e.time),this.totalCount=this.allHistory.length}catch(e){console.error("Failed to load history",e),this.allHistory=[],this.totalCount=0}},loadMore(){!this.loadingMore&&this.hasMore&&(this.loadingMore=!0,setTimeout(()=>{const e=this.currentPage*this.pageSize,t=e+this.pageSize,o=this.allHistory.slice(e,t);this.historyList=[...this.historyList,...o],this.currentPage++,this.loadingMore=!1},50))},handleScroll(e){const t=e.target,o=t.scrollTop,s=t.scrollHeight,l=t.clientHeight;s-o-l<100&&this.loadMore()},toggleViewMode(){this.viewMode="grid"===this.viewMode?"list":"grid",localStorage.setItem("historyViewMode",this.viewMode)},clearHistory(){this.$confirm(this.$t("uploadHistory.clearConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=[],this.allHistory=[],this.totalCount=0,this.currentPage=0,localStorage.removeItem("uploadHistory"),this.$message.success(this.$t("uploadHistory.recordsCleared"))}).catch(()=>{})},deleteItem(e){this.$confirm(this.$t("uploadHistory.deleteConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=this.historyList.filter(t=>t.time!==e.time),this.allHistory=this.allHistory.filter(t=>t.time!==e.time),this.totalCount=this.allHistory.length;try{localStorage.setItem("uploadHistory",JSON.stringify(this.allHistory)),this.$message.success(this.$t("uploadHistory.recordDeleted"))}catch(t){console.error("Failed to update history",t)}}).catch(()=>{})},isImage(e){const t=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},isVideo(e){const t=["mp4","webm","ogg","mkv"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},formatTime(e){const t=new Date(e),o=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${l} ${i}:${a}:${n}`},copyLink(e){navigator.clipboard.writeText(e).then(()=>{this.$message.success(this.$t("uploadHistory.linkCopied"))}).catch(()=>{this.$message.error(this.$t("uploadHistory.copyFailed"))})},openLink(e){window.open(e,"_blank")},handleImageError(e){e.target.src=o(96682)}}},z=o(71241);const B=(0,z.A)(W,[["render",V],["__scopeId","data-v-550797ce"]]);var H=B,X=o(86975),O=o(9267),Q=(o(15616),o(81418)),j=(o(50333),o(74757)),q=o(55558),G=(o(10456),o(39623)),K=(o(29092),o(76018)),J=(o(96808),o(67819),o(66810));o(34396),o(4885);const Y={class:"dialog-section"},Z={class:"section-header"},ee={class:"section-title"},te={class:"section-content"},oe={class:"setting-item"},se={class:"setting-label"},le={key:0,class:"setting-item"},ie={class:"setting-label"},ae={class:"setting-item"},ne={class:"setting-label"},re={class:"setting-item"},de={class:"setting-label"},ce={class:"dialog-section"},ue={class:"section-header"},pe={class:"section-title"},he={class:"section-content"},me={class:"dialog-section"},ge={class:"section-header"},fe={class:"section-title"},ye={class:"section-content"},be={class:"setting-item"},ve={class:"setting-label"},Ce={class:"setting-item"},ke={class:"setting-label"},we={key:0,class:"setting-item slider-item"},Fe={class:"setting-label"},Le={class:"slider-wrapper"},Ue={class:"slider-input-wrapper"},$e={key:1,class:"setting-item slider-item"},Se={class:"setting-label"},Te={class:"slider-wrapper"},_e={class:"slider-input-wrapper"},xe={key:0,class:"dialog-section"},Me={class:"section-header"},Re={class:"section-title"},Ae={class:"section-content"},Ee={class:"setting-item"},De={class:"setting-label"},Ie={class:"dialog-action"};function Ne(e,t,o,n,r,d){const c=(0,i.g2)("font-awesome-icon"),u=J.ll,p=J.MQ,h=s.R7,m=K.P9,g=K.AV,f=G.WK,y=q.qi,b=j.B8,v=Q.lq,C=l.S2,k=O.kZ;return(0,i.uX)(),(0,i.Wv)(k,{title:e.$t("uploadSettings.title"),modelValue:d.visible,"onUpdate:modelValue":t[12]||(t[12]=e=>d.visible=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Y,[(0,i.Lk)("div",Z,[(0,i.Lk)("span",ee,(0,a.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,i.Lk)("div",te,[(0,i.Lk)("div",oe,[(0,i.Lk)("span",se,(0,a.v_)(e.$t("uploadSettings.channelType")),1),(0,i.bF)(p,{"model-value":o.uploadChannel,"onUpdate:modelValue":t[0]||(t[0]=t=>e.$emit("update:uploadChannel",t)),class:"radio-card-group compact"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"paper-plane",class:"channel-icon"}),t[13]||(t[13]=(0,i.Lk)("span",null,"TG",-1))]),_:1}),(0,i.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cloud",class:"channel-icon"}),t[14]||(t[14]=(0,i.Lk)("span",null,"R2",-1))]),_:1}),(0,i.bF)(u,{label:"s3",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"database",class:"channel-icon"}),t[15]||(t[15]=(0,i.Lk)("span",null,"S3",-1))]),_:1}),(0,i.bF)(u,{label:"discord",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"comments",class:"channel-icon"}),t[16]||(t[16]=(0,i.Lk)("span",null,"DC",-1))]),_:1}),(0,i.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"robot",class:"channel-icon"}),t[17]||(t[17]=(0,i.Lk)("span",null,"HF",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,i.uX)(),(0,i.CE)("div",le,[(0,i.Lk)("span",ie,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(g,{"model-value":o.channelName,"onUpdate:modelValue":t[1]||(t[1]=t=>e.$emit("update:channelName",t)),placeholder:e.$t("uploadSettings.autoSelect"),clearable:"",class:"setting-input"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(m,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,i.Q3)("",!0),(0,i.Lk)("div",ae,[(0,i.Lk)("span",ne,(0,a.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,i.bF)(f,{"model-value":o.uploadFolder,"onUpdate:modelValue":d.handleUploadFolderInput,placeholder:e.$t("uploadSettings.uploadDirectoryPlaceholder"),class:"setting-input"},null,8,["model-value","onUpdate:modelValue","placeholder"])]),(0,i.Lk)("div",re,[(0,i.Lk)("span",de,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,i.Lk)("div",ce,[(0,i.Lk)("div",ue,[(0,i.Lk)("span",pe,(0,a.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,i.Lk)("div",he,[(0,i.bF)(p,{"model-value":o.uploadNameType,"onUpdate:modelValue":t[3]||(t[3]=t=>e.$emit("update:uploadNameType",t)),class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"default",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cog",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,i.bF)(u,{label:"index",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"hashtag",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,i.bF)(u,{label:"origin",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"file-signature",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,i.bF)(u,{label:"short",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"compress-alt",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,i.Lk)("div",me,[(0,i.Lk)("div",ge,[(0,i.Lk)("span",fe,(0,a.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",be,[(0,i.Lk)("span",ve,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,i.Lk)("div",Ce,[(0,i.Lk)("span",ke,(0,a.v_)(e.$t("uploadSettings.fileCompress")),1),(0,i.bF)(y,{"model-value":o.customerCompress,"onUpdate:modelValue":t[5]||(t[5]=t=>e.$emit("update:customerCompress",t))},null,8,["model-value"])]),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",we,[(0,i.Lk)("span",Fe,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Le,[(0,i.bF)(b,{"model-value":o.compressBar,"onUpdate:modelValue":t[6]||(t[6]=t=>e.$emit("update:compressBar",t)),min:1,max:20,"format-tooltip":e=>`${e} MB`},null,8,["model-value","format-tooltip"]),(0,i.Lk)("div",Ue,[(0,i.bF)(v,{"model-value":o.compressBar,"onUpdate:modelValue":t[7]||(t[7]=t=>e.$emit("update:compressBar",t)),min:1,max:20,step:1,"value-on-clear":1,class:"slider-input","controls-position":"right"},null,8,["model-value"]),t[18]||(t[18]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",$e,[(0,i.Lk)("span",Se,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Te,[(0,i.bF)(b,{"model-value":o.compressQuality,"onUpdate:modelValue":t[8]||(t[8]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,"format-tooltip":e=>`${e} MB`},null,8,["model-value","max","format-tooltip"]),(0,i.Lk)("div",_e,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[19]||(t[19]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,i.uX)(),(0,i.CE)("div",xe,[(0,i.Lk)("div",Me,[(0,i.Lk)("span",Re,(0,a.v_)(e.$t("uploadSettings.serverCompress")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Ae,[(0,i.Lk)("div",Ee,[(0,i.Lk)("span",De,(0,a.v_)(e.$t("uploadSettings.enableCompress")),1),(0,i.bF)(y,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,i.Q3)("",!0),(0,i.Lk)("div",Ie,[(0,i.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"])}var Pe={name:"UploadSettingsDialog",methods:{handleUploadFolderInput(e){e&&!e.startsWith("/")&&(e="/"+e),this.$emit("update:uploadFolder",e)}},props:{modelValue:{type:Boolean,default:!1},uploadChannel:{type:String,default:"telegram"},channelName:{type:String,default:""},currentChannelList:{type:Array,default:()=>[]},uploadFolder:{type:String,default:""},autoRetry:{type:Boolean,default:!0},uploadNameType:{type:String,default:"default"},convertToWebp:{type:Boolean,default:!1},customerCompress:{type:Boolean,default:!0},compressBar:{type:Number,default:5},compressQuality:{type:Number,default:4},serverCompress:{type:Boolean,default:!0}},emits:["update:modelValue","update:uploadChannel","update:channelName","update:uploadFolder","update:autoRetry","update:uploadNameType","update:convertToWebp","update:customerCompress","update:compressBar","update:compressQuality","update:serverCompress"],computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth>768?"50%":"90%"}}};const Ve=(0,z.A)(Pe,[["render",Ne]]);var We=Ve,ze=o(88559),Be=(o(85970),o(813)),He=(o(34896),o(69655)),Xe=(o(2893),o(74253));o(79899);const Oe={class:"upload-list-item"},Qe=["href"],je={key:0,style:{width:"10vw","border-radius":"12px"},autoplay:"",muted:"",playsinline:"",loop:""},qe=["src"],Ge=["src"],Ke={key:2,style:{width:"10vw","border-radius":"12px"}},Je={class:"upload-list-item-content"},Ye={class:"upload-list-item-name-wrapper"},Ze={key:0,class:"upload-list-item-url"},et={class:"upload-list-item-url-row"},tt={class:"upload-list-item-url-row"},ot={key:1,class:"upload-list-item-progress"},st={class:"upload-list-item-action"};function lt(e,t,o,s,l,n){const r=(0,i.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=He.ve,p=(0,i.g2)("Link"),h=Be.tk,m=(0,i.g2)("Delete");return(0,i.uX)(),(0,i.CE)("div",Oe,[(0,i.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,i.uX)(),(0,i.CE)("video",je,[(0,i.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,qe),t[7]||(t[7]=(0,i.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,i.uX)(),(0,i.CE)("img",{key:1,style:{width:"10vw","border-radius":"12px"},src:o.file.url,onError:t[0]||(t[0]=t=>e.$emit("preview-error",o.file))},null,40,Ge)):((0,i.uX)(),(0,i.CE)("div",Ke,[(0,i.bF)(r,{icon:"file",class:"file-icon"})]))],8,Qe),(0,i.Lk)("div",Je,[(0,i.Lk)("div",Ye,[(0,i.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,i.uX)(),(0,i.CE)("div",Ze,[(0,i.Lk)("div",et,[(0,i.bF)(c,{modelValue:o.file.finalURL,"onUpdate:modelValue":t[1]||(t[1]=e=>o.file.finalURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[8]||(t[8]=[(0,i.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.mdURL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.file.mdURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,i.Lk)("div",tt,[(0,i.bF)(c,{modelValue:o.file.htmlURL,"onUpdate:modelValue":t[3]||(t[3]=e=>o.file.htmlURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[10]||(t[10]=[(0,i.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.ubbURL,"onUpdate:modelValue":t[4]||(t[4]=e=>o.file.ubbURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[11]||(t[11]=[(0,i.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,i.uX)(),(0,i.CE)("div",ot,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",st,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var it=o(57477);const at=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp","raw","cr2","nef","dng","eps","ai","emf","wmf"],nt=["mp4","webm","ogg","mkv"];var rt={name:"UploadFileItem",components:{Link:it.Link,Delete:it.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return at.includes(t)},isVideo(e){const t=e.split(".").pop().toLowerCase();return nt.includes(t)},truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},selectAllText(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("uploadForm.copyFailed")})})}}};const dt=(0,z.A)(rt,[["render",lt],["__scopeId","data-v-4848c2b0"]]);var ct=dt,ut=o(62086),pt=(o(40670),o(88830),o(23597),o(70683)),ht=(o(95385),o(47358));const mt={class:"upload-form"},gt={class:"upload-card-glow",ref:"uploadCardGlow"},ft=["innerHTML"],yt={key:0,class:"upload-card"},bt={class:"paste-card-actions"},vt={class:"upload-list-dashboard-action"},Ct={class:"modern-action-group"},kt={class:"modern-dropdown-item-content"},wt={class:"modern-action-btn modern-action-btn-danger"};function Ft(e,t,n,r,d,c){const u=(0,i.g2)("CameraFilled"),p=Be.tk,h=ht.j5,m=G.WK,g=l.S2,f=J.Zh,y=J.MQ,b=pt.Ik,v=(0,i.g2)("List"),C=(0,i.g2)("Checked"),k=(0,i.g2)("Failed"),w=Xe.$g,F=(0,i.g2)("font-awesome-icon"),L=s.R7,U=q.qi,$=ut.c6,S=ut.Iy,T=ut.dW,_=ct,x=ze.kA;return(0,i.uX)(),(0,i.CE)("div",mt,[(0,i.Lk)("div",{class:"upload-card-wrapper",onMousemove:t[0]||(t[0]=(...e)=>c.handleUploadCardMouseMove&&c.handleUploadCardMouseMove(...e)),onMouseleave:t[1]||(t[1]=(...e)=>c.handleUploadCardMouseLeave&&c.handleUploadCardMouseLeave(...e))},[(0,i.Lk)("div",gt,null,512),"default"===n.uploadMethod?((0,i.uX)(),(0,i.Wv)(h,{key:0,class:(0,a.C4)(["upload-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}]),drag:"",multiple:"","http-request":c.uploadFile,onSuccess:c.handleSuccess,"on-error":c.handleError,"before-upload":c.beforeUpload,"on-progress":c.handleProgress,"file-list":d.fileList,"show-file-list":!1},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(u)]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,a.C4)(["el-upload__text",{"upload-list-busy":d.fileList.length}]),innerHTML:e.$t("upload.dragUploadText")},null,10,ft)]),_:1},8,["class","http-request","onSuccess","on-error","before-upload","on-progress","file-list"])):(0,i.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,i.uX)(),(0,i.CE)("div",yt,[(0,i.bF)(b,{class:(0,a.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",bt,[(0,i.bF)(g,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.bF)(y,{modelValue:d.pasteUploadMethod,"onUpdate:modelValue":t[3]||(t[3]=e=>d.pasteUploadMethod=e),class:"paste-card-method-group",size:c.pasteCardMethodButtonSize},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"save"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteSave")),1)]),_:1}),(0,i.bF)(f,{label:"external"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteExternal")),1)]),_:1})]),_:1},8,["modelValue","size"])])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(b,{class:(0,a.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length,"is-uploading":d.uploading}])},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-container",{"upload-list-busy":d.fileList.length}])},[(0,i.bF)(x,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,i.bF)(w,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(v)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(C)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(k)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",vt,[(0,i.Lk)("div",Ct,[(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[4]||(t[4]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(F,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",kt,[(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(U,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[6]||(t[6]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[5]||(t[5]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(F,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)($,{onClick:c.clearSuccessList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",wt,[(0,i.bF)(F,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[7]||(t[7]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(16573),o(78100),o(77936),o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721);var Lt=o(457),Ut=o(76334),$t=o(60782);function St(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function Tt(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function _t(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=St(e.srcID,e.name,t);Object.assign(e,o)})}const xt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Mt=(e,t)=>e>>>t|e<<32-t;function Rt(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=Mt(o[u-15],7)^Mt(o[u-15],18)^o[u-15]>>>3,t=Mt(o[u-2],17)^Mt(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,l,i,a,n,r,d,c]=t;for(let u=0;u<64;u++){const e=Mt(n,6)^Mt(n,11)^Mt(n,25),t=n&r^~n&d,p=c+e+t+xt[u]+o[u]>>>0,h=Mt(s,2)^Mt(s,13)^Mt(s,22),m=s&l^s&i^l&i,g=h+m>>>0;c=d,d=r,r=n,n=a+p>>>0,a=i,i=l,l=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+l>>>0,t[2]=t[2]+i>>>0,t[3]=t[3]+a>>>0,t[4]=t[4]+n>>>0,t[5]=t[5]+r>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+c>>>0}function At(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,s=0;return{update(l){s+=l.length;let i=0;if(o>0){const s=64-o,a=Math.min(s,l.length);t.set(l.subarray(0,a),o),o+=a,i=a,64===o&&(Rt(t,e),o=0)}while(i+64<=l.length)Rt(l.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),Rt(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(l/4294967296),!1),i.setUint32(60,l>>>0,!1),Rt(t,e);let a="";for(let t=0;t<8;t++)a+=e[t].toString(16).padStart(8,"0");return a}}}async function Et(e){const t=At(),o=4194304;let s=0;while(sthis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){_t(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&_t(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,$t.L8)(["storeAutoReUpload"]),uploadSuccessCount(){return this.fileList.filter(e=>"done"===e.status||"success"===e.status).length},uploadErrorCount(){return this.fileList.filter(e=>"exception"===e.status).length},uploadingCount(){return this.fileList.filter(e=>"uploading"===e.status).length},waitingCount(){return this.uploadQueue.length},urlSize(){return window.innerWidth<768?"small":"default"},disableTooltip(){return window.innerWidth<768},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},pasteCardMethodButtonSize(){return this.fileList.length||window.innerWidth<768?"small":"medium"}},mounted(){document.addEventListener("paste",this.handlePaste),this.autoReUpload=this.storeAutoReUpload},beforeUnmount(){document.removeEventListener("paste",this.handlePaste),this.uploadQueue=[],this.fileList=[],this.activeUploads=0},methods:{truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},uploadFile(e){if(!this.fileList.find(t=>t.uid===e.file.uid))return;if(this.activeUploads>=this.maxConcurrentUploads){this.uploadQueue.push(e);const t=this.fileList.find(t=>t.uid===e.file.uid);return void(t&&(t.status="waiting"))}this.activeUploads++;const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.status="uploading");const o=this.fileList.find(t=>t.uid===e.file.uid),s=o?.uploadChannel||this.uploadChannel;if("external"===s)return void this.uploadSingleFile(e);if("huggingface"===s){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===s){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const l=20971520;e.file.size>l?this.uploadFileInChunks(e):this.uploadSingleFile(e)},processUploadQueue(){if(0===this.uploadQueue.length||this.activeUploads>=this.maxConcurrentUploads)return;const e=this.uploadQueue.shift();e&&this.fileList.find(t=>t.uid===e.file.uid)?this.uploadFile(e):this.processUploadQueue()},onUploadComplete(){this.activeUploads=Math.max(0,this.activeUploads-1),this.processUploadQueue(),0===this.activeUploads&&0===this.uploadQueue.length&&(this.uploading=!1)},async uploadSingleFile(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.serverCompress,s=t.uploadChannel||this.uploadChannel,l=this.autoRetry&&"external"!==s,i="external"===s?"default":this.uploadNameType,a=new AbortController;this.abortControllers.set(e.file.uid,a);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Et(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Lt.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+l+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:a.signal,onUploadProgress:t=>{const o=Math.round(t.loaded/t.total*100);e.onProgress({percent:o,file:e.file})}}).then(t=>{e.onSuccess(t,e.file)}).catch(t=>{"CanceledError"!==t.name&&"ERR_CANCELED"!==t.code?t.response&&401!==t.response.status?(this.exceptionList.push(e),e.onError(t,e.file)):t.response||(this.exceptionList.push(e),e.onError(t,e.file)):console.log("上传已取消:",e.file.name)}).finally(()=>{this.abortControllers.delete(e.file.uid),this.onUploadComplete()})},async uploadFileInChunks(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.uploadChannel||this.uploadChannel,s=new AbortController;this.abortControllers.set(e.file.uid,s);const l="discord"===o?9437184:16777216,i=e.file.size,a=Math.ceil(i/l),n=t.serverCompress,r=this.autoRetry&&"external"!==o,d="external"===o?"default":this.uploadNameType;let c=null;if("huggingface"===o)try{console.log("Computing SHA256 for HuggingFace chunked upload..."),c=await Et(e.file),console.log("SHA256 computed:",c)}catch(u){console.error("Failed to compute SHA256:",u)}try{const t=new FormData;t.append("originalFileName",e.file.name),t.append("originalFileType",e.file.type),t.append("totalChunks",a.toString());const p=await(0,Lt.A)({url:"/upload?serverCompress="+n+"&uploadChannel="+o+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+d+"&autoRetry="+r+"&uploadFolder="+encodeURIComponent(this.uploadFolder)+"&initChunked=true",method:"post",data:t,withAuthCode:!0});if(!p.data.success)throw new Error(this.$t("uploadForm.chunkInitFailed")+": "+p.data.message);const h=p.data.uploadId;console.log("分块上传初始化成功,uploadId:",h);const m=this.fileList.find(t=>t.uid===e.file.uid);m&&(m.totalChunks=a,m.uploadId=h);const g=3,f=new Array(a).fill(0);let y=0,b=!1,v="",C=!1;const k=async t=>{if(b||C)return;const c=t*l,p=Math.min(c+l,i),m=e.file.slice(c,p),g=new FormData;g.append("file",m,`${e.file.name}.part${t.toString().padStart(3,"0")}`),g.append("chunkIndex",t.toString()),g.append("totalChunks",a.toString()),g.append("uploadId",h),g.append("originalFileName",e.file.name),g.append("originalFileType",e.file.type);let y=0;const k=3;while(y{if(b||C)return;const s=Math.round(o.loaded/o.total*100);f[t]=s;const l=Math.round(f.reduce((e,t)=>e+t,0)/a);e.onProgress({percent:l,file:e.file})}})}catch(u){if("CanceledError"===u.name||"ERR_CANCELED"===u.code)return C=!0,void console.log("分块上传已取消:",e.file.name);if(y++,console.warn(`分块 ${t+1}/${a} 上传失败 (重试 ${y}/${k}):`,u),y>=k)throw b=!0,v=`分块 ${t+1}/${a} 上传失败: ${u.message}`,new Error(v);await new Promise(e=>setTimeout(e,2e3*y))}}},w=[];for(let e=0;e{while(yt.uid===e.file.uid);t&&t.uploadId&&this.cleanupUploadResources(t.uploadId,t.totalChunks).then(()=>{console.log(`已清理分块上传失败的资源: ${t.uploadId}`)}).catch(e=>{console.warn("清理分块上传失败资源时出错:",e)}),u.response&&401!==u.response.status?(this.exceptionList.push(e),e.onError(u,e.file)):u.response||(this.exceptionList.push(e),e.onError(u,e.file))}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},handleRemove(e){this.abortControllers.has(e.uid)&&(this.abortControllers.get(e.uid).abort(),this.abortControllers.delete(e.uid)),this.uploadQueue=this.uploadQueue.filter(t=>t.file.uid!==e.uid),this.fileList=this.fileList.filter(t=>t.uid!==e.uid),this.$message({type:"info",message:this.$t("uploadForm.deleted",{name:this.truncateFilename(e.name)})})},async cleanupUploadResources(e,t=0){try{await(0,Lt.A)({url:`/upload?cleanup=true&uploadId=${e}&totalChunks=${t}`,method:"get",withAuthCode:!0,timeout:5e3}),console.log(`清理上传资源成功: ${e}`)}catch(o){console.warn("清理上传资源失败:",o)}},handleSuccess(e,t){const o=this.fileList.find(e=>e.uid===t.uid);if(o)try{const s=o.uploadChannel||this.uploadChannel;if("external"!==s){const s=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+s;const l=St(s,t.name,this.rootUrl);Object.assign(o,l),o.srcID=s}o.progreess=100,o.status="success",this.saveToHistory(o),this.$message({type:"success",message:this.$t("uploadForm.uploadSuccess",{name:this.truncateFilename(t.name)})}),setTimeout(()=>{const e=this.fileList.find(e=>e.uid===t.uid);e&&(e.status="done")},1e3)}catch(s){this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception"}},saveToHistory(e){try{const t=JSON.parse(localStorage.getItem("uploadHistory")||"[]"),o={name:e.name,url:e.finalURL,time:Date.now(),type:e.name.split(".").pop().toLowerCase()};t.push(o),localStorage.setItem("uploadHistory",JSON.stringify(t))}catch(t){console.error("Failed to save history",t)}},handleError(e,t){const o=this.fileList.find(e=>e.uid===t.uid);o&&(this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception",this.autoReUpload&&this.scheduleAutoRetry())},handleCopy(e){const t=this.fileList.find(t=>t.uid===e.uid).status;"done"===t||"success"===t?(navigator.clipboard.writeText(Tt(e,this.selectedUrlForm)),this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})):this.$message({type:"warning",message:this.$t("uploadForm.fileNotUploaded")})},beforeUpload(e){return new Promise(async(t,o)=>{let s=e;const l=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(l)try{const t=await this.convertImageToWebp(e);t&&(s=t,console.log(`WebP转换成功: ${e.name} -> ${t.name}, 大小: ${(e.size/1024).toFixed(1)}KB -> ${(t.size/1024).toFixed(1)}KB`))}catch(r){console.warn("WebP转换失败,使用原文件:",r)}const i=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,a=s.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const s=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:s,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)Ut.compressAccurately(s,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const l=new File([t],s.name,{type:t.type});l.uid=e.uid;const i=this.uploadCount++,a=this.serverCompress&&l.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(l,a):setTimeout(()=>{n(l,a),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(a){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!s.type.includes("image")||s.size/1024/1024<10);0===e?n(s,t):setTimeout(()=>{n(s,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))})},handleProgress(e){const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.progreess=e.percent)},copyAll(){const e=this.fileList.filter(e=>"done"===e.status||"success"===e.status).map(e=>Tt(e,this.selectedUrlForm)).join("\n");navigator.clipboard.writeText(e),this.$message({type:"success",message:this.$t("uploadForm.copyAllSuccess")})},clearFileList(){this.fileList.length>0?(this.abortControllers.forEach((e,t)=>{e.abort()}),this.abortControllers.clear(),this.uploadQueue=[],this.fileList=[],this.$message({type:"success",message:this.$t("uploadForm.fileListCleared")})):this.$message({type:"info",message:this.$t("uploadForm.fileListEmpty")})},clearSuccessList(){this.uploadSuccessCount>0?(this.fileList=this.fileList.filter(e=>"done"!==e.status&&"success"!==e.status),this.$message({type:"success",message:this.$t("uploadForm.successFilesCleared")})):this.$message({type:"info",message:this.$t("uploadForm.successFilesEmpty")})},handlePaste(e){if("INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName)return;const t=e.clipboardData.items;t.length>0&&this.uploadFromUrl(t)},handleUploadPasteUrls(){const e=this.pastedUrls.split("\n"),t=e.map(e=>e.trim()).filter(e=>""!==e).filter(e=>/^(https?:\/\/[^\s$.?#].[^\s]*)$/.test(e));if("save"===this.pasteUploadMethod)this.uploadFromUrl(t.map(e=>({kind:"string",getAsString:t=>{t(e)}})));else if("external"===this.pasteUploadMethod)for(let o=0;o`,a=`[img]${e}[/img]`,n=new File([],e.split("/").pop(),{type:"text/plain"});n.uid=Date.now()+o,n.url=e,this.fileList.push({uid:n.uid,name:n.name,url:e,finalURL:e,mdURL:l,htmlURL:i,ubbURL:a,srcID:e,status:"uploading",progreess:0,serverCompress:!1,uploadChannel:"external",retryCount:0}),this.uploadFile({file:n,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}},uploadFromUrl(e){for(let t=0;t{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}else"string"===e[t].kind&&e[t].getAsString(e=>{const o=/^(https?:\/\/[^\s$.?#].[^\s]*)$/;let s="";o.test(e)&&Lt.A.post("/api/fetchRes",{url:e},{responseType:"blob",withAuthCode:!0}).then(o=>{o.headers["content-type"];if(200!=o.status)throw new Error("URL地址请求失败");{const i=o.headers["content-disposition"];if(i){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(i);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(l){s=""}}""===s&&(o=t.exec(i),null!=o&&o[1]&&(s=decodeURIComponent(o[1])))}if(""===s){const t=new URL(e);s=t.pathname.split("/").pop()}if(""===s){const o=new URL(e);let l=o.pathname.split(".").pop();(!l||""===l||l.length>10)&&(l="bin"),s="PastedFile"+Date.now()+t+"."+l}const a=o.data,n=new File([a],s,{type:a.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await Et(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),l=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,Lt.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:l,channelName:this.channelName,uploadNameType:this.uploadNameType,uploadFolder:this.uploadFolder},withAuthCode:!0,signal:o.signal});if(!i.data.success)throw new Error(i.data.error||"Failed to get upload URL");const a=i.data;if(console.log("Upload info:",a),a.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(a.needsLfs&&a.uploadAction){const{href:t,header:s}=a.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,a,o);else{console.log("Uploading to S3 (basic)...");const l=await fetch(t,{method:"PUT",headers:s||{},body:e.file,signal:o.signal});if(!l.ok){const e=await l.text();throw new Error(`S3 upload failed: ${l.status} - ${e}`)}console.log("S3 upload complete")}}if(o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);e.onProgress({percent:95,file:e.file}),console.log("Committing file...");const n=await(0,Lt.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:a.fullId,filePath:a.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:a.channelName},withAuthCode:!0,signal:o.signal});if(!n.data.success)throw new Error(n.data.error||"Failed to commit file");console.log("Upload complete:",n.data);const r={data:[{src:n.data.src}]};e.onSuccess(r,e.file)}catch(s){if("CanceledError"===s.name||"ERR_CANCELED"===s.code||"AbortError"===s.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",s),this.exceptionList.push(e),e.onError(s,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:s}=t,{href:l,header:i}=s,a=parseInt(i.chunk_size),n=Object.keys(i).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${a}`);const r=[],d=n.length;for(const u of n){if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");const t=parseInt(u)-1,s=t*a,l=Math.min(s+a,e.file.size),n=e.file.slice(s,l);console.log(`Uploading part ${u}/${d}`);const c=await fetch(i[u],{method:"PUT",body:n,signal:o?o.signal:void 0});if(!c.ok)throw new Error(`Failed to upload part ${u}: ${c.status}`);const p=c.headers.get("ETag");if(!p)throw new Error(`No ETag for part ${u}`);r.push({partNumber:parseInt(u),etag:p});const h=10+Math.round(parseInt(u)/d*80);e.onProgress({percent:h,file:e.file})}if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");console.log("Completing multipart upload...");const c=await fetch(l,{method:"POST",headers:{Accept:"application/vnd.git-lfs+json","Content-Type":"application/vnd.git-lfs+json"},body:JSON.stringify({oid:t.oid,parts:r}),signal:o?o.signal:void 0});if(!c.ok){const e=await c.text();throw new Error(`Multipart complete failed: ${c.status} - ${e}`)}console.log("Multipart upload complete")},async convertImageToWebp(e){return new Promise((t,o)=>{if(e.type.includes("gif")||e.type.includes("svg")||e.type.includes("webp"))return void t(null);const s=new Image,l=document.createElement("canvas"),i=l.getContext("2d");s.onload=()=>{l.width=s.width,l.height=s.height,i.drawImage(s,0,0),l.toBlob(l=>{if(l){const o=e.name,s=o.lastIndexOf("."),i=s>0?o.substring(0,s)+".webp":o+".webp",a=new File([l],i,{type:"image/webp"});a.uid=e.uid,t(a)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(s.src)},"image/webp",.92)},s.onerror=()=>{URL.revokeObjectURL(s.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},s.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),s=e.clientX-o.left,l=e.clientY-o.top;t.style.opacity="1",t.style.left=s+"px",t.style.top=l+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const It=(0,z.A)(Dt,[["render",Ft],["__scopeId","data-v-37f80c81"]]);var Nt=It,Pt=o(732),Vt=o(33892),Wt=o(45130);const zt={class:"directory-suggestion-input",ref:"wrapperRef"},Bt={class:"suggestion-dropdown"},Ht={class:"suggestion-list"},Xt=["title","onMousedown"];function Ot(e,t,o,s,l,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",zt,[(0,i.bF)(r,{ref:"inputRef",modelValue:n.inputValue,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputValue=e),placeholder:o.placeholder,onFocus:n.handleFocus,onBlur:n.handleBlur,onInput:n.handleInput},null,8,["modelValue","placeholder","onFocus","onBlur","onInput"]),(0,i.bo)((0,i.Lk)("div",Bt,[(0,i.Lk)("ul",Ht,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Wt.D$)(t=>n.selectItem(e),["prevent"])},(0,a.v_)(e.value),41,Xt))),128))])],512),[[Wt.aG,l.dropdownVisible&&l.suggestions.length>0]])],512)}var Qt={name:"DirectorySuggestionInput",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:""}},emits:["update:modelValue","focus","blur","select"],data(){return{directoryTreeRoot:null,directoryTreeLoaded:!1,directoryTreeLoading:!1,directoryChildrenMap:{},focusTime:null,dropdownVisible:!1,isFocused:!1,suggestions:[]}},computed:{inputValue:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}}},watch:{modelValue(){this.isFocused&&this.refreshSuggestions()}},methods:{handleFocus(){this.isFocused=!0,this.focusTime=Date.now(),this.ensureDirectoryTreeLoaded(),this.$emit("focus"),setTimeout(()=>{this.isFocused&&(this.refreshSuggestions(),this.dropdownVisible=!0)},500)},handleBlur(){this.isFocused=!1,this.dropdownVisible=!1,this.$emit("blur")},handleInput(e){this.$nextTick(()=>{this.refreshSuggestions(),this.isFocused&&(this.dropdownVisible=!0)})},selectItem(e){const t=e.value;this.inputValue=t,this.$emit("select",t);const o=this.normalizeDirectoryPath(t),s=this.directoryChildrenMap[o];s&&s.length>0?this.$nextTick(()=>{this.refreshSuggestions(),this.dropdownVisible=!0,this.$refs.inputRef?.focus()}):this.dropdownVisible=!1},refreshSuggestions(){this.suggestions=this.getDirectorySuggestions(this.modelValue||"")},normalizeDirectoryPath(e){if(!e)return"/";let t=e;return t.startsWith("/")||(t="/"+t),"/"===t||t.endsWith("/")||(t+="/"),t},buildDirectoryChildrenMap(e){const t={},o=e=>{const s=this.normalizeDirectoryPath(e.path),l=Array.isArray(e.children)?e.children:[];t[s]=l.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),l.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await Lt.A.get("/api/directoryTree",{withAuthCode:!0}),t=e?.data?.tree;t&&(this.directoryTreeRoot=t,this.buildDirectoryChildrenMap(t),this.directoryTreeLoaded=!0)}catch(e){console.error("Failed to load directory tree for autocomplete:",e)}finally{this.directoryTreeLoading=!1}}},parseDirectoryQuery(e){const t=e&&e.startsWith("/")?e:`/${e||""}`,o=t.slice(1),s=o.split("/"),l=s[s.length-1]||"",i=s.slice(0,-1).filter(Boolean),a=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:l,parentPath:a}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),s=this.directoryChildrenMap[o]||[];if(!t)return s.slice(0,10).map(e=>({value:e.path}));const l=t.toLowerCase();return s.filter(e=>e.name.toLowerCase().startsWith(l)).slice(0,10).map(e=>({value:e.path}))}}};const jt=(0,z.A)(Qt,[["render",Ot],["__scopeId","data-v-0ff63416"]]);var qt=jt,Gt=o(6834);const Kt={class:"container"},Jt={class:"upload-home"},Yt={class:"toolbar-manage"},Zt={class:"toolbar"},eo={class:"header"},to={class:"title"},oo={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},so={class:"dialog-section"},lo={class:"section-header"},io={class:"section-title"},ao={class:"section-content"},no={class:"dialog-section"},ro={class:"section-header"},co={class:"section-title"},uo={class:"section-content"},po={class:"setting-item"},ho={class:"setting-label"},mo={key:0,class:"setting-item"},go={class:"setting-label"},fo={class:"dialog-action"},yo=["innerHTML"],bo={class:"dialog-footer"};function vo(e,t,o,n,r,d){const c=Gt.A,u=(0,i.g2)("font-awesome-icon"),p=l.S2,h=ut.c6,m=ut.Iy,g=ut.dW,f=qt,y=G.WK,b=Vt.A,v=s.R7,C=Pt.A,k=Nt,w=J.ll,F=J.MQ,L=q.qi,U=O.kZ,$=We,S=X.A,T=H;return(0,i.uX)(),(0,i.CE)("div",Kt,[(0,i.Lk)("div",Jt,[(0,i.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,i.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(f,{key:0,modelValue:r.uploadFolder,"onUpdate:modelValue":t[0]||(t[0]=e=>r.uploadFolder=e),class:"inner-folder-input",placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur,onSelect:d.handleDirectorySelect},null,8,["modelValue","placeholder","onFocus","onBlur","onSelect"])):((0,i.uX)(),(0,i.Wv)(y,{key:1,class:"inner-folder-input",modelValue:r.uploadFolder,"onUpdate:modelValue":t[1]||(t[1]=e=>r.uploadFolder=e),placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur},null,8,["modelValue","placeholder","onFocus","onBlur"]))],2),d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,i.k6)(()=>[(0,i.bF)(p,{class:"directory-tree-trigger"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,i.Q3)("",!0)],2),(0,i.bF)(v,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,i.k6)(()=>["default"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,i.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,i.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"toggleTheme"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)(d.getThemeText()),1)]),_:1}),(0,i.bF)(h,{command:"toggleUploadMethod"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"mobile-more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",Yt,[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-manage-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleOpenToolbar,circle:""},{default:(0,i.k6)(()=>[r.isToolBarOpen?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"times",class:"manage-icon",size:"lg"})):((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"bars",class:"manage-icon",size:"lg"}))]),_:1},8,["class","onClick"])]),(0,i.Lk)("div",Zt,[(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button compress-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openCompressDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cloud-upload",class:"compress-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.linkFormat"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button link-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openUrlDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"link-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.manage"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button config-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleManage,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cog",class:"config-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.logout"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button sign-out-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleLogout,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"sign-out-alt",class:"sign-out-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"])]),(0,i.bF)(C,{useConfigLink:!0}),(0,i.Lk)("div",eo,[(0,i.Lk)("h1",to,[(0,i.Lk)("a",oo,(0,a.v_)(d.ownerName),1),t[21]||(t[21]=(0,i.eW)(" ImgHub",-1))])]),(0,i.bF)(k,{selectedUrlForm:r.selectedUrlForm,customerCompress:r.customerCompress,compressQuality:r.compressQuality,compressBar:r.compressBar,serverCompress:r.serverCompress,uploadChannel:r.uploadChannel,channelName:r.channelName,uploadNameType:r.uploadNameType,useCustomUrl:r.useCustomUrl,customUrlPrefix:r.customUrlPrefix,autoRetry:r.autoRetry,urlPrefix:d.urlPrefix,uploadMethod:r.uploadMethod,uploadFolder:r.uploadFolder,convertToWebp:r.convertToWebp,class:"upload"},null,8,["selectedUrlForm","customerCompress","compressQuality","compressBar","serverCompress","uploadChannel","channelName","uploadNameType","useCustomUrl","customUrlPrefix","autoRetry","urlPrefix","uploadMethod","uploadFolder","convertToWebp"]),(0,i.bF)(U,{title:e.$t("settings.linkFormatTitle"),modelValue:r.showUrlDialog,"onUpdate:modelValue":t[6]||(t[6]=e=>r.showUrlDialog=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",so,[(0,i.Lk)("div",lo,[(0,i.Lk)("span",io,(0,a.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",ao,[(0,i.bF)(F,{modelValue:r.selectedUrlForm,"onUpdate:modelValue":t[2]||(t[2]=e=>r.selectedUrlForm=e),onChange:d.changeUrlForm,class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(w,{value:"url",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,i.bF)(w,{value:"md",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code",class:"radio-icon"}),t[22]||(t[22]=(0,i.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,i.bF)(w,{value:"html",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[23]||(t[23]=(0,i.Lk)("span",null,"HTML",-1))]),_:1}),(0,i.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[24]||(t[24]=(0,i.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,i.Lk)("div",no,[(0,i.Lk)("div",ro,[(0,i.Lk)("span",co,(0,a.v_)(e.$t("settings.customLink")),1),(0,i.bF)(v,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",uo,[(0,i.Lk)("div",po,[(0,i.Lk)("span",ho,(0,a.v_)(e.$t("settings.enableCustom")),1),(0,i.bF)(L,{modelValue:r.useCustomUrl,"onUpdate:modelValue":t[3]||(t[3]=e=>r.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===r.useCustomUrl?((0,i.uX)(),(0,i.CE)("div",mo,[(0,i.Lk)("span",go,(0,a.v_)(e.$t("settings.customPrefix")),1),(0,i.bF)(y,{modelValue:r.customUrlPrefix,"onUpdate:modelValue":t[4]||(t[4]=e=>r.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,i.Q3)("",!0)])]),(0,i.Lk)("div",fo,[(0,i.bF)(p,{type:"primary",onClick:t[5]||(t[5]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,i.bF)($,{modelValue:r.showCompressDialog,"onUpdate:modelValue":t[7]||(t[7]=e=>r.showCompressDialog=e),uploadChannel:r.uploadChannel,"onUpdate:uploadChannel":t[8]||(t[8]=e=>r.uploadChannel=e),channelName:r.channelName,"onUpdate:channelName":t[9]||(t[9]=e=>r.channelName=e),currentChannelList:d.currentChannelList,uploadFolder:r.uploadFolder,"onUpdate:uploadFolder":t[10]||(t[10]=e=>r.uploadFolder=e),autoRetry:r.autoRetry,"onUpdate:autoRetry":t[11]||(t[11]=e=>r.autoRetry=e),uploadNameType:r.uploadNameType,"onUpdate:uploadNameType":t[12]||(t[12]=e=>r.uploadNameType=e),convertToWebp:r.convertToWebp,"onUpdate:convertToWebp":t[13]||(t[13]=e=>r.convertToWebp=e),customerCompress:r.customerCompress,"onUpdate:customerCompress":t[14]||(t[14]=e=>r.customerCompress=e),compressBar:r.compressBar,"onUpdate:compressBar":t[15]||(t[15]=e=>r.compressBar=e),compressQuality:r.compressQuality,"onUpdate:compressQuality":t[16]||(t[16]=e=>r.compressQuality=e),serverCompress:r.serverCompress,"onUpdate:serverCompress":t[17]||(t[17]=e=>r.serverCompress=e)},null,8,["modelValue","uploadChannel","channelName","currentChannelList","uploadFolder","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","compressQuality","serverCompress"])]),(0,i.bF)(S,{class:"footer"}),(0,i.bF)(U,{title:e.$t("upload.announcementTitle"),modelValue:r.showAnnouncementDialog,"onUpdate:modelValue":t[19]||(t[19]=e=>r.showAnnouncementDialog=e),width:d.dialogWidth,"show-close":!1,"close-on-click-modal":!1,"close-on-press-escape":!1,center:""},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",bo,[(0,i.bF)(p,{type:"primary",onClick:t[18]||(t[18]=e=>r.showAnnouncementDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.announcementAck")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",{innerHTML:r.announcementContent},null,8,yo)]),_:1},8,["title","modelValue","width"]),(0,i.bF)(T,{show:r.showHistory,onClose:t[20]||(t[20]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var Co=o(46638),ko=o(48903),wo=o(90144),Fo=o(62388),Lo={name:"UploadHome",mixins:[ko.A],data(){return{selectedUrlForm:(0,wo.KR)(""),showUrlDialog:!1,showCompressDialog:!1,customerCompress:!0,compressQuality:4,compressBar:5,convertToWebp:!1,serverCompress:!0,uploadChannel:"",channelName:"",availableChannels:{},uploadNameType:"",customUrlPrefix:"",useCustomUrl:"false",autoRetry:!0,useDefaultWallPaper:!1,isToolBarOpen:!1,uploadMethod:"default",uploadFolder:"",isFolderInputActive:!1,showAnnouncementDialog:!1,announcementContent:"",showHistory:!1,themeMode:"auto"}},watch:{customerCompress(e){this.updateCompressConfig("customerCompress",e)},compressQuality(e){this.updateCompressConfig("compressQuality",e)},compressBar(e){null===e||void 0===e||e<1?this.compressBar=1:(this.compressQuality>e&&(this.compressQuality=e),this.updateCompressConfig("compressBar",e))},serverCompress(e){this.updateCompressConfig("serverCompress",e)},convertToWebp(e){this.updateCompressConfig("convertToWebp",e)},uploadChannel(e){this.updateStoreUploadChannel(e);const t=this.availableChannels[e]||[],o=this.storeChannelName;o&&t.some(e=>e.name===o)?this.channelName=o:this.channelName=""},channelName(e){this.$store.commit("setStoreChannelName",e||"")},uploadNameType(e){this.updateStoreUploadNameType(e)},customUrlPrefix(e){this.$store.commit("setCustomUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setCustomUrlSettings",{key:"useCustomUrl",value:e})},autoRetry(e){this.$store.commit("setStoreAutoRetry",e)},uploadFolder(e){if(this.validateUploadFolder(e,!1)){const t=(0,Fo.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,$t.L8)(["userConfig","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeUploadNameType","customUrlSettings","storeAutoRetry","storeUploadMethod","storeUploadFolder"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},disableTooltip(){return window.innerWidth<768},urlPrefix(){return this.userConfig?.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},announcementAvailable(){return!!this.userConfig?.announcement},showDirectorySuggestions(){return this.userConfig?.showDirectorySuggestions??!1},currentChannelList(){return this.availableChannels[this.uploadChannel]||[]}},mounted(){this.initializeBackground("uploadBkImg",".container",!1,!0),this.selectedUrlForm=this.uploadCopyUrlForm||"url",this.customerCompress=this.compressConfig.customerCompress??this.parseBoolean(this.userConfig?.defaultCustomerCompress,!0),this.compressQuality=this.compressConfig.compressQuality??this.parseNumber(this.userConfig?.defaultCompressQuality,4),this.compressBar=this.compressConfig.compressBar??this.parseNumber(this.userConfig?.defaultCompressBar,5),this.serverCompress=this.compressConfig.serverCompress??!0,this.convertToWebp=this.compressConfig.convertToWebp??this.parseBoolean(this.userConfig?.defaultConvertToWebp,!1),this.uploadChannel=this.storeUploadChannel||this.userConfig?.defaultUploadChannel||"telegram",this.autoRetry=this.storeAutoRetry,this.uploadNameType=this.storeUploadNameType||this.userConfig?.defaultUploadNameType||"default",this.customUrlPrefix=this.customUrlSettings.customUrlPrefix,this.useCustomUrl=this.customUrlSettings.useCustomUrl,this.uploadMethod=this.storeUploadMethod,this.fetchAvailableChannels(),this.uploadFolder=this.storeUploadFolder||this.userConfig?.defaultUploadFolder||"";const e=this.$store.getters.cusDarkMode,t=this.$store.getters.useDarkMode;this.themeMode=e?t?"dark":"light":"auto";const o=localStorage.getItem("visitedUploadHome"),s=this.userConfig?.announcement;!o&&s&&(this.announcementContent=s,this.showAnnouncementDialog=!0,localStorage.setItem("visitedUploadHome","true"))},components:{UploadForm:Nt,Footer:X.A,ToggleDark:Gt.A,Logo:Pt.A,UploadHistory:H,UploadSettingsDialog:We,DirectoryTreePicker:Vt.A,DirectorySuggestionInput:qt},methods:{async fetchAvailableChannels(){try{const e=await Lt.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,s=this.availableChannels[this.uploadChannel]||[];t&&s.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&s.some(e=>e.name===o)&&(this.channelName=o)}}catch(e){console.error("Failed to fetch available channels:",e)}},validateUploadFolder(e,t=!0){e&&!e.startsWith("/")&&(e="/"+e,this.uploadFolder=e);const o=(0,Fo.G)(e,{strict:t});return!!o.valid||(this.$message.error(o.error),!1)},handleFolderInputFocus(){this.isFolderInputActive=!0},handleFolderInputBlur(){this.isFolderInputActive=!1,this.uploadFolder&&!this.uploadFolder.startsWith("/")&&(this.uploadFolder="/"+this.uploadFolder),this.validateUploadFolder(this.uploadFolder,!0)||this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})},handleManage(){this.$router.push("/dashboard")},parseBoolean(e,t){return void 0===e||null===e?t:"boolean"===typeof e?e:"string"===typeof e?"true"===e:t},parseNumber(e,t){if(void 0===e||null===e)return t;const o=parseFloat(e);return isNaN(o)?t:o},openUrlDialog(){this.showUrlDialog=!0},handleLogout(){Lt.A.post("/api/auth/logout",{authType:"user"},{withCredentials:!0}).finally(()=>{this.$store.commit("setUserLoggedIn",!1),this.$router.push("/login"),this.$message.success(this.$t("upload.logoutSuccess"))})},changeUrlForm(){this.$store.commit("setUploadCopyUrlForm",this.selectedUrlForm)},openCompressDialog(){this.showCompressDialog=!0},updateCompressConfig(e,t){this.$store.commit("setCompressConfig",{key:e,value:t})},updateStoreUploadChannel(e){this.$store.commit("setStoreUploadChannel",e)},updateStoreUploadNameType(e){this.$store.commit("setStoreUploadNameType",e)},handleOpenToolbar(){this.isToolBarOpen=!this.isToolBarOpen,setTimeout(()=>{const e=document.querySelectorAll(".toolbar-button");e.forEach(e=>{e.style.pointerEvents=this.isToolBarOpen?"auto":"none"})},300)},handleChangeUploadMethod(){this.uploadMethod="default"===this.uploadMethod?"paste":"default",this.$store.commit("setUploadMethod",this.uploadMethod)},handleMobileMenuCommand(e){if("toggleTheme"===e)"auto"===this.themeMode?(this.themeMode="light",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):"light"===this.themeMode?(this.themeMode="dark",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0)):(this.themeMode="auto",this.$store.commit("setCusDarkMode",!1));else if("toggleUploadMethod"===e)this.handleChangeUploadMethod();else if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},handleDesktopMenuCommand(e){if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},getThemeIcon(){return"auto"===this.themeMode?"sun":"light"===this.themeMode?"moon":"adjust"},getThemeText(){return"auto"===this.themeMode?this.$t("theme.lightMode"):"light"===this.themeMode?this.$t("theme.darkMode"):this.$t("theme.autoMode")},handleShowAnnouncement(){const e=this.userConfig?.announcement;e?(this.announcementContent=e,this.showAnnouncementDialog=!0):this.$message.info(this.$t("upload.noAnnouncement"))},handleDirectorySelect(e){this.uploadFolder=e,this.validateUploadFolder(e,!0)&&this.$store.commit("setStoreUploadFolder",e)}}};const Uo=(0,z.A)(Lo,[["render",vo],["__scopeId","data-v-f50dcc42"]]);var $o=Uo}}]); -//# sourceMappingURL=577.b10c6bbc.js.map \ No newline at end of file +//# sourceMappingURL=577.95699028.js.map \ No newline at end of file diff --git a/frontend-dist/js/577.b10c6bbc.js.gz b/frontend-dist/js/577.95699028.js.gz similarity index 90% rename from frontend-dist/js/577.b10c6bbc.js.gz rename to frontend-dist/js/577.95699028.js.gz index 5962e44d99f257bb3599933e2cbaba3f8040a7d2..0aaa26c4f54d82614b9d64a294c008d69461e000 100644 GIT binary patch delta 1947 zcmV;M2W0rE!2zkk0SX_B2mk;80006Lu?p!}e}%;+1_>-^DzB&^nl4pfo` zFwovo2)VpyAP88|;Gr_X$$AWRH~gjSV(;slo455nlf_vl1GoGQlkZs~f5-J4vO|Z5 zlM2hFl$s;OBybg{gWmrqNBkaBfNJO@`W_4i(2{I(Kn7V9UR6~h8~Yrll?Z4} zfdZcnKMOF&YH~>;i2llje^+n9G>F+9n%!?qQmp*ZyQX3@qA&FBygW$|Mz0l;5TNXI zCit1M-9R}h*vuxIn(D|JOSV_Y*+SvFG544HW(MsvaqhETKeLe6v|y(q|2<1NTL9bA zWvjH;Wo|{T(D57-$A)ty#v*un$D6Soj+TNNC6-en&-1ikPul!!e~74p2F4SN4r_CY z`|o7i!x=(g_637NUv#<~O-Jp{@Ds|EYct*kZAXVNT}|3=7p z#iAzxO~t)lP&3W2e_~z7@7Fwf=ZXC>&@hBPidR%PcZNcLIGF%-R`} z3>?>&*H@BwQ1##A>({r?QF8*v>GdJf6cwIx^#@JYUoPdoM^sU?a+W^X96_S-*h0V+ zI6V!TQ12)C-nMyKe|?SC?53d=OZvv{dOc@(&#M(ofORz+f%zJaLmaEj zO)?&9Y7jS!5r0gQ;)lM66I+2eV%Rl<`PS2U4@>ouS&d7o^$fuzTe6uJS%kwpcmjQ6 z(<9h))>tMT-A0Jrix+Na*v6lAZ8rAakcC5bCdf2vmME8e!K-T2VFtmoHY@3S_V0=yQLLelUU2chEQcANl|I)P15c@h_W z21COW*J=MUYi2NIS%1=yNOaBUhdr^q-DopC;>lEv8i5^wgQ7#CJ$x3mJCZ3+0|l3w zaxpOkjOBUDPG$H50qS^)8``Ku@H`wxDiP*Bq4MwLe=GIB?mo&fd(WA}0`qoudClh~ zqUO7J$jZ+xVXl&dGF?4tv61#g+2Bo#@#PTtNRgm>5ntvidE0d)d<#lD5V6ULq-v@k zTS|d{rV0IzHsXJPs|%9X+uKrL3w}v|u_ra+)m;%SQDnwLq&`iydIU=iewZ!uPFuRU zB{R*6e|1>lEs)?WI4Y-mlrunAiF`{uGF@;>f)%md+m$9z>Ggy(;US(B5&aeNZ^kgH z6bDgKelaf;QT2*QE}xVv$kY$tNHZSMYmpWSTLKxW{Htn)jW&9a7z`IR(f+)@!sszk z{qj%d;-Te=nmXB;*3Cy$Kn0)HS<``laY31Ue^q=#M?J=fZN#)ly!HJabj2G<<$0 zf3B|h^z~h0Z6fcx+=wfbv2zEA(nIjcdDVGYqs1&`h3QGAw9{>$gwASIS6a5K8!n}d z>+PLF3rB-T__@0R6P}ZdQ3mJa#ugpaf+ZIJDd3^S*;39ajiIa$d}Vk zWsFCq^Jk4oWkIs;Xqh%c6YEb#$2CdU2WYb__z_QlrtE+F00o>7@$11Bd0ahxe=74F zfz)CX69K$fZ?Od!lpAJK0T`H2Qp5Ol`QdLq%^M6Yl!2+1dGZB}ys1&- hZSwA{8XO$tqrv`YR6HBzpFo21{vWURyR@Zm0RWs5#2Wwr delta 1931 zcmV;62Xy$U!2zkk0SX_B2mk;80006Cu?p!}e?`Qm1_>-^D!ybo3}GjA6VwTU7(yP3 zKG4#}QGBc;(m5dMzZWxm%^sATw2ytVOzuH0_n4X8@B4;3dk2RSmhxNxSHS-M&M0G7 z_}2dK{5~v(ySo`Xh2Q&6c1EL&ooV?zMLF{lU@7co_H70b-z$+H`+#IWfS4BS zQ>)1TdB&^Yg4pfpB zFwovo2)VpyAP88|;Gr_X$$AWRxBP|dV(**l>$lAvlf_vl12_CNlkZs~e<#fxvO|Z5 zlM2hF!MY|GL5NyJ>we27+EkM@N~GQaAaX|I^2er^8>2#-AEVS*f`Fr z2icwO?PUjbO3jgC61a-fLGS;IBYux5Ks9s{eGi5MXi0WCAcHIluc|7M)jo%5B?4Mg zpunfY&jQS`np~0yqQ7$Pf7P2X4PthOX8#+L6f1x9uBq6J=ySb0FHaJL(QAby1SmV5 z34W$*H&9LrHnYj5raHF9lI<08wov$P%>AXgo6G@m%&o{3dY)tK*l@1ISOib+cr&)c(Na*O#BxgHd7c*RahIQse-KsB!gzwwVQo%v z_nmBeI70}`zF<)3i%xf=>8RZqenOd&d;pr&>|q4&1xA3`yz{6r>|51#gKxP^&YRos z_YmhHhMvu;bdu3r!CTJ`_D6NHSNxWg$zkyu=A(PSYqCB)*dMLzR@R#5GijE~eQWL9s{VU&_38#XYEIxdgCRtkqQY~o{-Ejl%cb1+h$@O!&eA8FBS=)&76Puo z>1oh}dOykcw$0P}>ua=THw~>=(l_?k>p9E2UaepPtgG>)f0_S8ZQ$|mnXlnE#IefU zBz3K+LEJD#{4q(2ANn3nYz5+oVb=`iTTkabEY(Y9H7=>vGX#@t$!1z)5f1a<3G|Ik zk6_bTW0`bx8zFWtp1Yx88-Lcd+1PteMkl6E-bhaK!TYHFeMuw)6r0EXl;Mgfu3ZQ> zHHuD^B(5~6e_E+8dDo$K<9++0nO}ju&$?&|@LE&~NyB3tgo@W)odA?NflX0)5*K|2 zL&Fo-Y5y{7XE0@1f6|ah^v&o;1F^N$YBN3J$yBWxfjxnPqDP`Vd=|Akk||FE1((`# zF*XE@<(rP3%J2sQ)bSKIv{8xRc{q+#BFueE<=@Mff9ikTeUxMNo->C9=Iv~9#pflW z=KFZa%Fi8Pu9Ac@eLZTik@iK|;BAcYvB`;~YO5bx zN`Zf-4gHTU;(vgv3zFAcTT);Peo23EAT{FET@fu&WX40JK25fI080&im`CQF9_i+m z%rq<3e`AGrK!UU2sGROm&H!B{@-6YmbipkNR>XGiR+>O%Fc8v&hj>y%^jFBg8N;Yj z97IX^#k^2NH7Fvvd{VL?(=dD^&3HtwMOq|m31p=5uc{d~+UP-IFkI9``}6(^qsK(` z%Rior`;IGW>STM`v>#Cc6?|G}O$P$T1!eM8fAI|+^{5fsh-r~{>-!z(nDLsIL|f2Y zH5{La{%E5YOAJSMInz*MkJqvT5UW*23;WQ)9tbNnGNx}Iq#fmv+lMQ8=yQ68k zh&;lXW(!}Zu(|I(ZmV;sYytnt5FAV-5Qc^c>-n5d`7Kz`t<)$~Y)|A%h5qTd9zBbXKFf(z0FMa4BtE zZ|@XZI2t^{&)pZ8@SJ3fN^lj3=rF?3A5dCsjt3Y=o5zX@VmWKevd%a+BaMJj>|8@) ztkodA7Vt6Z71NMoe+IfMiBcAGkP}aGfA>Ih0@UzSP)$<`--#LQoBR&sNos|2@h{S7 zDwA7Ki-z{yAv}&DaM)F*R>md;CI)vcXwo&1`}(1dQv?Os*~~}DYE@{8YsI-kzMOt4 zV>~LIKWj`X3zGFm%d{DqSbs7)u1UHfK$~U34|oDJW&hg;DBy&MUk|p(!|EAQDVgU8 zq!yc)2;jwfi!H#Q+%TI8z`%r(8pf~5hYLQs z8zJC+GyQarjNvY`e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/**\n * 路径验证器模块\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\n */\nimport i18n from '@/locales'\n\n/**\n * 验证文件夹路径的合法性\n * @param {string} path - 要验证的路径\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\n * @returns {{ valid: boolean, error?: string }} 验证结果\n */\nexport function validateFolderPath(path, { strict = true } = {}) {\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\n if (!path || path.trim() === '') {\n return { valid: true };\n }\n \n // 如果路径仅为 \"/\",返回有效(表示根目录)\n if (path === '/') {\n return { valid: true };\n }\n \n // 检查路径是否以 \"/\" 开头\n if (!path.startsWith('/')) {\n return { \n valid: false, \n error: i18n.global.t('validation.pathMustStartWithSlash') \n };\n }\n\n // 检查路径穿越:包含 .. 的路径段\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\n return {\n valid: false,\n error: i18n.global.t('validation.pathTraversalNotAllowed')\n };\n }\n\n // 检查路径中单独的 . 段\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\n if (dotPattern.test(path)) {\n return {\n valid: false,\n error: i18n.global.t('validation.singleDotNotAllowed')\n };\n }\n\n // 检查路径是否包含连续的斜杠\n if (path.includes('//')) {\n return { \n valid: false, \n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \n };\n }\n \n // 检查路径是否包含非法字符\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\n if (invalidChars.test(path)) {\n return { \n valid: false, \n error: i18n.global.t('validation.invalidCharacters') \n };\n }\n \n return { valid: true };\n}\n","import store from '@/store'\nimport router from '@/router'\n\nlet isRedirecting = false;\n\nexport default async function fetchWithAuth(url, options = {}) {\n // 开发环境下添加 /api 前缀\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\n\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\n options.credentials = 'include';\n\n options.headers = {\n ...options.headers,\n };\n\n const response = await fetch(url, options);\n\n if (response.status === 401 && !isRedirecting) {\n isRedirecting = true;\n store.commit('setAdminLoggedIn', false);\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\n router.push('/adminLogin').finally(() => {\n isRedirecting = false;\n });\n }\n\n return response;\n}\n","module.exports = require(\"./build/conversion.js\");\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=550797ce&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=550797ce&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-550797ce\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[18] || (_cache[18] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","export default {\n name: 'UploadSettingsDialog',\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=46fb0fac\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=4848c2b0&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=4848c2b0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4848c2b0\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\n * URL 构建工具函数\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\n */\n\n/**\n * 根据 srcID 和文件名生成所有格式的 URL\n * @param {string} srcID - 文件资源 ID\n * @param {string} name - 文件名\n * @param {string} rootUrl - 链接前缀\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\n */\nexport function buildFileUrls(srcID, name, rootUrl) {\n const url = rootUrl + srcID\n return {\n finalURL: url,\n mdURL: `![${name}](${url})`,\n htmlURL: `\"${name}\"`,\n ubbURL: `[img]${url}[/img]`\n }\n}\n\n/**\n * 根据 selectedUrlForm 获取对应格式的 URL 值\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\n * @returns {string}\n */\nexport function getUrlByFormat(file, format) {\n const map = {\n url: file.finalURL,\n md: file.mdURL,\n html: file.htmlURL,\n ubb: file.ubbURL\n }\n return map[format] || file.finalURL\n}\n\n/**\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\n * @param {Array} fileList - 文件列表\n * @param {string} rootUrl - 新的链接前缀\n */\nexport function updateFileListUrls(fileList, rootUrl) {\n fileList.forEach(item => {\n if (item.uploadChannel === 'external') {\n return\n }\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\n Object.assign(item, urls)\n })\n}\n","/**\n * SHA256 计算工具\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\n */\n\n// SHA256 常量\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n])\n\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\n\nfunction processBlock(block, H) {\n const W = new Uint32Array(64)\n\n for (let i = 0; i < 16; i++) {\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\n }\n\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\n }\n\n let [a, b, c, d, e, f, g, h] = H\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\n const ch = (e & f) ^ (~e & g)\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\n const maj = (a & b) ^ (a & c) ^ (b & c)\n const temp2 = (S0 + maj) >>> 0\n\n h = g; g = f; f = e\n e = (d + temp1) >>> 0\n d = c; c = b; b = a\n a = (temp1 + temp2) >>> 0\n }\n\n H[0] = (H[0] + a) >>> 0\n H[1] = (H[1] + b) >>> 0\n H[2] = (H[2] + c) >>> 0\n H[3] = (H[3] + d) >>> 0\n H[4] = (H[4] + e) >>> 0\n H[5] = (H[5] + f) >>> 0\n H[6] = (H[6] + g) >>> 0\n H[7] = (H[7] + h) >>> 0\n}\n\n/**\n * 创建增量 SHA256 哈希器\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\n */\nexport function createSha256() {\n let H = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n ])\n\n let buffer = new Uint8Array(64)\n let bufferLength = 0\n let totalLength = 0\n\n return {\n update(data) {\n totalLength += data.length\n let offset = 0\n\n if (bufferLength > 0) {\n const needed = 64 - bufferLength\n const toCopy = Math.min(needed, data.length)\n buffer.set(data.subarray(0, toCopy), bufferLength)\n bufferLength += toCopy\n offset = toCopy\n\n if (bufferLength === 64) {\n processBlock(buffer, H)\n bufferLength = 0\n }\n }\n\n while (offset + 64 <= data.length) {\n processBlock(data.subarray(offset, offset + 64), H)\n offset += 64\n }\n\n if (offset < data.length) {\n buffer.set(data.subarray(offset), 0)\n bufferLength = data.length - offset\n }\n },\n digest() {\n const bitLength = totalLength * 8\n\n // Padding\n buffer[bufferLength++] = 0x80\n\n if (bufferLength > 56) {\n buffer.fill(0, bufferLength, 64)\n processBlock(buffer, H)\n bufferLength = 0\n }\n\n buffer.fill(0, bufferLength, 56)\n\n // Length in bits (big-endian, 64-bit)\n const view = new DataView(buffer.buffer)\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\n view.setUint32(60, bitLength >>> 0, false)\n\n processBlock(buffer, H)\n\n // Convert to hex\n let hex = ''\n for (let i = 0; i < 8; i++) {\n hex += H[i].toString(16).padStart(8, '0')\n }\n return hex\n }\n }\n}\n\n/**\n * 计算文件的 SHA256 哈希\n * 使用增量哈希算法,支持任意大小文件\n * @param {File} file - 要计算哈希的文件\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\n */\nexport async function computeSha256(file) {\n const sha256 = createSha256()\n\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\n let offset = 0\n\n while (offset < file.size) {\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\n const buffer = await chunk.arrayBuffer()\n sha256.update(new Uint8Array(buffer))\n offset += CHUNK_SIZE\n\n // 每处理 20MB 打印一次进度\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\n }\n }\n\n return sha256.digest()\n}\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.array-buffer.detached.js\";\nimport \"core-js/modules/es.array-buffer.transfer.js\";\nimport \"core-js/modules/es.array-buffer.transfer-to-fixed-length.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.typed-array.with.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-hex.js\";\nimport \"core-js/modules/esnext.uint8-array.to-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.to-hex.js\";\nimport \"core-js/modules/web.dom-exception.stack.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', file.file.type);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', file.file.type);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', file.file.type);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=37f80c81&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=37f80c81&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-37f80c81\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=0ff63416&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=0ff63416&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0ff63416\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"toolbar-manage\"\n};\nconst _hoisted_4 = {\n class: \"toolbar\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_8 = {\n class: \"dialog-section\"\n};\nconst _hoisted_9 = {\n class: \"section-header\"\n};\nconst _hoisted_10 = {\n class: \"section-title\"\n};\nconst _hoisted_11 = {\n class: \"section-content\"\n};\nconst _hoisted_12 = {\n class: \"dialog-section\"\n};\nconst _hoisted_13 = {\n class: \"section-header\"\n};\nconst _hoisted_14 = {\n class: \"section-title\"\n};\nconst _hoisted_15 = {\n class: \"section-content\"\n};\nconst _hoisted_16 = {\n class: \"setting-item\"\n};\nconst _hoisted_17 = {\n class: \"setting-label\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_19 = {\n class: \"setting-label\"\n};\nconst _hoisted_20 = {\n class: \"dialog-action\"\n};\nconst _hoisted_21 = [\"innerHTML\"];\nconst _hoisted_22 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-manage-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleOpenToolbar,\n circle: \"\"\n }, {\n default: _withCtx(() => [!$data.isToolBarOpen ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"bars\",\n class: \"manage-icon\",\n size: \"lg\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"times\",\n class: \"manage-icon\",\n size: \"lg\"\n }))]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button compress-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openCompressDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"compress-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button link-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openUrlDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"link-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.manage'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button config-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleManage,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"config-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.logout'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button sign-out-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleLogout,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"sign-out-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"a\", _hoisted_7, _toDisplayString($options.ownerName), 1), _cache[21] || (_cache[21] = _createTextVNode(\" ImgHub\", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[22] || (_cache[22] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[23] || (_cache[23] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[24] || (_cache[24] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", _hoisted_17, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[8] || (_cache[8] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[9] || (_cache[9] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[10] || (_cache[10] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[11] || (_cache[11] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[12] || (_cache[12] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[13] || (_cache[13] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[14] || (_cache[14] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[15] || (_cache[15] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[16] || (_cache[16] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[17] || (_cache[17] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_22, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[18] || (_cache[18] = $event => $data.showAnnouncementDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_21)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[20] || (_cache[20] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n isToolBarOpen: false,\n //是否打开工具栏\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', false, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n\n // 首次访问公告\n const visited = localStorage.getItem('visitedUploadHome');\n const announcement = this.userConfig?.announcement;\n if (!visited && announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n localStorage.setItem('visitedUploadHome', 'true');\n }\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleOpenToolbar() {\n this.isToolBarOpen = !this.isToolBarOpen;\n // 等过渡动画结束,向active类添加pointer-events属性,使其可以点击\n setTimeout(() => {\n const buttons = document.querySelectorAll('.toolbar-button');\n buttons.forEach(button => {\n button.style.pointerEvents = this.isToolBarOpen ? 'auto' : 'none';\n });\n }, 300);\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=f50dcc42&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=f50dcc42&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f50dcc42\"]])\n\nexport default __exports__"],"names":["t","e","module","exports","this","n","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","some","a","f","g","w","b","PNG","JPEG","GIF","Promise","u","next","throw","done","then","apply","toDataURL","toBlob","split","match","atob","length","Uint8Array","charCodeAt","Blob","type","Image","onload","onerror","Error","src","document","createElement","href","window","URL","createObjectURL","download","Date","now","toString","body","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","target","result","readAsDataURL","h","assign","getContext","Number","scale","width","height","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","y","quality","isNaN","size","accuracy","filter","sort","abs","pow","v","_hoisted_1","class","_hoisted_2","_hoisted_3","key","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","visible","popoverVisible","$event","placement","trigger","transition","reference","onClick","$slots","undefined","error","icon","fetchDirectoryTree","$t","_","ref","data","treeData","props","treeProps","currentDirectory","onNodeClick","handleNodeClick","node","path","expanded","name","loading","args","openDrawer","modelValue","drawerVisible","direction","title","String","source","validator","includes","children","label","windowWidth","innerWidth","computed","watch","newVal","setTimeout","$refs","treeRef","store","nodesMap","treeRefMobile","$nextTick","setCurrentKey","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","methods","response","fetchWithAuth","method","ok","status","json","axios","withAuthCode","tree","err","console","startsWith","$emit","__exports__","validateFolderPath","strict","trim","valid","i18n","global","test","dotPattern","invalidChars","isRedirecting","async","url","options","credentials","headers","commit","router","push","finally","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_component_el_tooltip","show","count","totalCount","content","circle","toggleViewMode","viewMode","clearHistory","historyList","onScroll","handleScroll","groupedHistory","group","date","items","item","time","isImage","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","formatTime","hasMore","loadingMore","spin","Boolean","allHistory","pageSize","currentPage","val","resetAndLoad","groups","forEach","dateStr","getFullYear","getMonth","padStart","getDate","keys","map","savedMode","localStorage","getItem","loadAllHistory","loadMore","history","JSON","parse","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","removeItem","$message","success","catch","stringify","fileName","imageExtensions","extension","pop","toLowerCase","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","open","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","dialogWidth","uploadChannel","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","Array","emits","set","style","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","components","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","x","processBlock","block","H","W","s0","s1","S1","temp1","S0","maj","temp2","createSha256","buffer","bufferLength","totalLength","update","offset","needed","toCopy","subarray","digest","bitLength","fill","view","DataView","setUint32","floor","hex","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","scrollContainer","setScrollTop","deep","immediate","$store","location","protocol","host","handlePaste","storeAutoReUpload","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","encodeURIComponent","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","delete","fileSize","totalChunks","ceil","precomputedSha256","initFormData","initResponse","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","fileType","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","etag","partNumber","progress","completeResponse","oid","img","canvas","ctx","originalName","newName","webpFile","revokeObjectURL","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","clientY","top","opacity","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","normalizedPath","normalizeDirectoryPath","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","parentPath","isArray","child","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isToolBarOpen","handleOpenToolbar","openCompressDialog","openUrlDialog","handleManage","handleLogout","useConfigLink","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","updateStoreUploadNameType","validateUploadFolder","strictResult","storeUploadFolder","userConfig","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","cusDarkMode","getters","useDarkMode","visited","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","$router","defaultValue","num","parseFloat","authType","withCredentials","buttons","querySelectorAll","button","pointerEvents","handleShowAnnouncement","info"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/577.95699028.js.map.gz b/frontend-dist/js/577.95699028.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..42b88dbdc5e87771a75b015bfea9adc42ae2c9a2 GIT binary patch literal 67893 zcmV(Si-!m|2q9^+@8()lkW1b|M_e9tdu#eD^*vgo>HDU^_7|z4E?B> z)0$GXB0cH{r$(vX9sM2N`SiMc+El7}T2ZRP9o$em|1?l4;Lkm3EB~YSK{SBRe{T6f z2@j|n_rW!f&As8nJGV9U?D2yl|K$$(fq#b&dF-&~Yi?EM2f=AcsS=*taAORhoF^W) z#0Xy0cTt+~nt25JpC_Hu-zS+R{jE4pFhnha#*08BT2w(sqrX*oOUrNbAm+5AROgrT z6;GgZ+M-RM$)WWV7EKKbZetqr4)3N~si_`nUa6Aa+e)=>4@MeldDK#>#RHntvfcW- zgXY`|H=FW@3~($R4Q`{!s5m;vCeR`Z4is+DL&;xyJ=YPk zE;PQSZp*SQ^c;V&Jo<8=ok7uA%~|mSdTA)t;1xHbod~#-nRaKsH@$Ft{!?LutU7D1 z?IA&Y|DyHFJNmQK+zbEd$;fCJp2C8I=G@bKZ81)4FZ!)9-`X1K$7>7Y%Ara!nN;_+Q*HKfNz$D9)o@Zt5G1|o!^U04$EfwW)A>4~bHd-D(>@}z!OfRbX+@3izn;pKGnKUdy8VgM zK9kVCMVk_~?wY7|HlcM}sn@7=BWiqi*tSV~9=1Jm=CMlXd9IaOI`i&3Gs%59lTy^! zp$I_lF)jec!3nTxYCseS8E1GjmsZ>*9RkM1xtG#%KBJpEBv8)jyx%(>v6CtY9`(~V zbZVRYWlFov>4_ZFypG7wJ9-}ApCP8dG0~;ZXU!60YIE;QI6TEIf#8vT$LMDF<9?-^ zwK*i5^!E(&ofwCFPjSsow9{^?dANz@jR}OQ2x%lg@Er=RTtXKpRg!_gLyUAZ)pNjd zU>vfy#Nx8Xg+G1%ZbC}#M?3szH)Vg!z`cU6umJvCj?WG4bSdnx22w~rec{t+NOjnW z;N>NwN@HVOXn5iF(9D|7x%kG!1a%4eJ**ms_X^9-<5^jlOZtCF#*VOpx>!17e{KGY z|NqDFANZBk@y!)9n3zOFrxA?9;+_bf%;c9AwQ~W*y`DR)bi_x<0oY=NSrg+Gx0sjQ zEN3R-SyxWecf-9dbhKE-e+5=U?Q%yKXuZHdAm;15LQiZ(m$IppSvB?*(B4U+I44Q;OcUfQ=DJ0Y`+Gm98Fm4wbn?2l8y_ z$yZo4z2Q$E_`eN#NtibBqNxBp%YvMFMnvL|N4T)ZBAwI;6jsa%W_UUGcEtb32*VJ;2&f1lVU6BCFr^$ub&tfAClI5)(rA5-IrfU^Ii$$_ zVsu;w#s5;||Kk)H3-6h@?jzdfE|4JSeL};@7(9cDpLtt_ThH-{rC1Yx^~|7!_^L z`(N+(EYot{#WvabLqJG_PUl?N9Izc1dF!KLsh=GHw9zi;^4RXZhACGqDeX46S_DMn zA~XcNrGkDAu;dJb;)f?g_IF-n6v`GI-nEPGdc}kdkO@TZ_*#rO6Fyk`!-Ft?HGBxi za`HI)bBGjc;iv+q-(9o};ll3+qb||o`tWQ>1G$Z&WeQ@(01*Bu{}kH4J%j%+mi+B` z|9jEv-wx)V;U&R2_4}A5-C7do@UG|Dau?wpc_lQfXoU}2Nya$W`AN|snbeD{^XVVK zvyVNc#@;79J3Z(+Y(vlgFK76FoHInH8GW2HJOK)4i;0{e^?bt%vsf0gbwK9RzNb{* zbFDW!7iroD3}pujC*M(bb$x#J!i^?H`wR=9XRkOWzWWA;Th>aiOWa9J2&0+Q9G2;iBB(lrN`-r8w!-(Ixkq9PHIdIAuRefO7Dy6+QBOlM^Nb=Y+7DRur6 zZ0ci&MlL!H@#B|^PD5Wd;sBlG4I2B7)f9J{)8Rg(+z*U>!DLmt1CM>!8^Ukt5{rI? zij3GJr*r!#yg*V#hsfCJ^UmxI0{xg=myrQg7PBro_$$vwhXdw-?e__WG=t9v$7%sY7n$PRyf#DOKkVnGmoepRp= zLBCFb1Fz_To^1Tch#qZA%jLufoWIj$j7y+yw%ENKUQT5bixJ7YC_0+pL}I%2T>bH=Ic^^!DB&1rETby#;EKZK8qqDO`MlxG)SJNR26Fqw2gfa5E5!Y6yE z$wX`haKU;fT4L6kf6V#E0zW?Z$3`bM3zW%-n?{qgST%C^;WgnVyC&&QsI4#Db=A*#S@^ZOtujA+T#C~=F)jXEbC0%eBN3z z-kWt{c8!}SHnE2FWNJX?N(q>^@=gua^W(nO7jVlka%D=a)s9Tv{)Y`CQB1` z>U;fQ;FVZgP=~ljlbdVhK^OqmVDUhkoDsBPtSYgr)uc1nWpJ&`pkT?Pxx?;9yTZI# zG|iHOTVqV6VNX1}tC@lSoVdNbNCpM~%YKV<9bI5O*>7h2%2Qgd$rWD`I}3f0?9nOV zl$sG)bOUg9<|YZqd3_z;SDz6I-r$QOUle&sIF#BxEU0$G)6BIah7vlrhSfRFxfBY zf4|T&Q0A%6LTUvfVt9u8MwwrW=(;y|jOml&_vzr)p@a3$=wL?2=wRc=bg<^&YUTej z9pr`orwHNY|2GL?-9fGs{U0NQ)}N5fq68Up`k_sV{c?@h!Wx!zNQBij%G`#IpM>;! zz}$cNgyaKrmkTT^drwzExFL7F>!en7WgbofCL0qL?dqZWh5Z!j(;H}>Z%#|fU$AmS zom}(eqWSz1hYBFam5vC~8+!7Uc|?Eo^kE>Jp07-`ZfUD|7;Cg{D)T6~SySEv5GM=q z=h8oIirLTDc^YNz>3@o~=LVu${u+8pcDC%$b0(->(U0a$n4{9XXPtBY_JN49DQ4ie zeI5`t`nP>yU`xaY6Lw_rz8mnuhq?!0^U`YEYXGFln@HBGrAh~lYV_U=gbJ{ZfhkyJ z?uo2ISPchtaYI?LP+7V%7H)K3`Vkl0XBf2z@l>60aCZ&w<7?3?GNvvtyX7qr1m-Ygvw*i* zd~nO{6KJ!RMs$ym zeS!F|3=sS51}BYoK z2*ZgxG|E8dTpBYgS{*^X*}cIPM?|?`-f>O320YqF@xWVwRSZp5QSKqUGcPXde$@^g7n@Qp~rf_I#V_akjm2s z9kJK3ue>zhy`>SqV`Y=-=@4Zq1UI?YNTn)j++fB`Ynxs@u&LIlsM)mOwxix*&2_bzkaDkZzrqKd7w~_ z&XSIKJLiSHh7W!j``e84==z{QY=wcW zmI)427NKNMmk8M#+E7!F(ny?VjMGmp*w=Zj( z-UpZ3DoEC~56HK9UUd27n$(Yv;ZQQ6bZnk&AOnm{iz1W*vtVzK3)Y!ELPTp&r=%Oo z`-$o^>T~W#s=0LG>KdFp$)kg7M;+H^&daLfW|gD;P5np_H1ePb+Om)|(KBes#;mDY zGQjGmEoIUst_5l;^OE%wRWYy1RMjyhP1{)$;It|v!s+VI!D&&(?CZ+hO^Xi9#w3AS zkga|OvNE5?``-q^%+a_mlD74TDjqs+o_}dtv>qE~UEoEGZhyFlRwWQw)G)jq!wYFSd|X?GLZx9;MUs1zyhD@QG>E})9fk!oJp zi&E5#w!Z9;rJ~I7R5VWxTN#irA3>Y$P$z@(f@^vvTtmIL#yk< zn<&o(t+&j&IU-7_pAx0!QNsES^65^w=8z<@aJo|--$a2}e{;$o`cKW-g1Mdy=IIS9 z6-d`?R+w!558hm3k@Rk0{{ccPZfHn-nmgNC7)!;)p)FJdUv$&&rZN$JmntjAe4^4W!5BL64v) z(&LG-&%#wNxtp#&zTkwTF}pr`G-A>TcsU1plWT|m)RO2=?SCJcul+A1^R@ptnIE!? zNShuK=#Vj?zPy3BmFS8Gnzn{O{BZ+A=8=}+#8%hQ#4@3`3Zd3K2z_vFT(5^nn$O+r z34~{w?F32GbL=|@BzGP6)low}AobO^g_~j7=`g?FVV7*Dp;HWfVO^zbiIbcAF_`Qe zm}GysFiCRY3C+KbA7eO|6B3K$^n2_IZcc}u$yMR^&<^on&+lOsorRd`QU33PE%IjC zc~Vcon#0Lif}Y+~x%=_G#GjD)ZFU>Q0c<=;2N>9x3Y>=$;xbF_BT1hzg|As&Mh)Pyr|uSUh4tHH?!4<<6Zv z*fBCh&%6P;?BDaYBf_jE*6Bm2OD;pOeLDoZY$^KI%nFm5MR4kAQFZ!lPSD0gChh@D z-0$T*8~0W#bw>7S^7$~nJ2iSV(t~?<5Eg%3YjjO1b;TTCd4h#q)oA5ioyY7h$r;q- zwH#5rC1Cp#Qu9PEHN5dmF>C9(yD@f4$Y;s)3?f;}1-B*MO*AqjHg_(Fn_HaN>qrxx zH=Ft%I&ds*)jnc9(iOMNnq4@TS7LSV_g29WqQ&0=8ia7HWmN564JJn#`if6$D_^%6 zILJ;k%s> zyf#(m)Lb&@9_gL?&?pSw)2EV)}~C3o!GLW4x`#CA%|RX{zT7W|BL=uoxuuL^cGW+CWEz}bD}`I_cAVAfqiAx zUX*9Ls}~TYmN$G9Of>lkCf|1^U;1S76%xR%e{U)VQ`sd=g$_<02Zx=1a z-awcGU*NdJjtlUK-SPeWOGQ_*s!Vh!Zr50O02j7w2`+5io8NX}tDSz7$gkMOf{P!? zqvI9eJXY>wKmNF%{CJ%Fxcj|M{A4eLZ;u|f7LSE^>;1<+Yd!qY<0GAn|NVXcOJH)i zQ5Sy#m>>VfVdfR*#i)|(B(roItt!r&clXV@;!NYieY2@Jo3nM_>?*FGjr%6;_IB>R z$vAH$`pf5xcz?(3=KM|+h^3JEzd)pvMy>}NBt7;IqNMkJ>~(Rx8Rv61IX$SjuZGUA zT+H96ts)iYs*t%&3X=QK%KU;#zl9{Ob>c+G4--Lr&$yM#T&*E=J$`kRpv<{6`1a`) zQ=%!5fJ0W{yCKwzYPhkV$KyE){3I`S^wID_raE&6)AQNfK6Av?K$$!!EOsyS>%gp9iHhgLD)Wdkf?kPFvyi6 zD@dwf9VoxL^25;nF(56-WPCf$u3?!C1kulN2Y+=&;SKy(~x5of$jb${(3- z?cX)s(jS>_^WQby#{aJAzW&3Ip{%@Hbj(eaMor=^Ne($o^;dd8z|; zSn#9U_+{@l2Ius_7FvJDV$^*b&Iz~9v&S6_*TYBquuKAT%+IqX9-uQq4s-K-#NAPK ztdH-$Nv!gn>rd=#nf>ceR9GR(ojYeXTjen)*uWEZ#fWWd{gT;A(=#`To5c|!3*&B3 zZ0Wozbb06&15qd8JhczbQ#0<@D!2NPNuSr9;X@L-mgMEEkGJozkQs5 z#~jdVcEvd0-vRSafPH)iB6Rw70QM7|#HKlxS(n4g)?E&3Nb3J+sgv(76<+9|9I24Q zy8L|(>(5-Ofyfs|!QoTP-&9$m*-Llk|q4&(`0{ae-%dZd~=n-B+< z?pl}xsA{?UI!gkv<-wf#wU|rSmkosJgmEw}Ie%7a@VPeTzX;{K;9!oU{H~se^2`4v zD8H@pEgq=?zmF?$`2nu9eMvJ+GOt;4Y1I}HDc6?)ir zj|}#5LfAiK{oNDtD%)BA)*;D!eMl-S8@DO-NZYD_yWq;=Q4uT;pQhI$MMX6aEaNI9%@IWhni#{d4-qX zsWI6nrY<(A+dJVz*EsH-#1*P@cAEUqJu1+OLZFlajA@^|1`~C7U zOz;z?FMzmVlTtaF!Ktys1Mb>zJM0zX*_$uMv5 zRG}twI&~`GdN-j*yv0>a6u3H)WNJ;N)Q1=KJE%t)08s$Ej1*)g&dv~+nRgRr%MZO; z{6nu6_${9{PTz~>PK70i!~taBg*ScV7{UkIyd^uBY->&kK-q@5*Wnek-(+qUB_T5=<)}6f%_njbOPBG>yZ<>!}e~63kJwEL3GWo;v zKk1%uQWbR+M>O>IJPnY(pIxijN!jP`YVz02jB&p;lHm^T8|)#Om{%ljISAksZ)U{- z7tAQ1!NumaXWCzslV4GtS4QIZIzgO&Cce@Wi?P@;oF+P}`eG zX}l_>Z<$R&I&RxNvEP)9QFzqaC!6{b|4udY>_R&#o>U{EoUS_ARnBV2*^OWs8&h@8 z$MH=H8pL2pnAf{c4rsP3>uc-TYz9SZDo@G=ESY1Ft+;*WDAChiB0Or6of7aE+%&K`jGgT7~@YzZjof)6)h=RPK75u%~Qb&8U-Tdxs-(|M>imid@ zRZmIDYi0qs{0kOV#(yd>CH7hDPvjd_Q6`UarQ@SvCA|Xc1_o8f7CWp)B05V40lTs= ztBE88*=ocVomZmZ=rov1&cSc)rY#VLK>2Su?TClMW2y#^m)5R`$Kf&CyGZ<6Hx9+G z8q&lY$$#C~j#x zA#p8-xBZ*2>Rf5=GYRyf)aY-V$9~C*>*thr5U_IzHCPVVnMN|)cO8cBEDHPKJFHI{ z)go=;5{0QY&j+D7qfY{Q_PVJZ?dC!&N=+A-N#UEii6AlFrg3`Vh4D6#TyEXKI>#bt zqJ(x7YEW=A3GIDN!YsL_+hM26Bk?jO@$vhQT3?ypl=g@G!I>4v$m@<_O1;d zpyC92;<>_q{%$XRpzg*NtUWi3;ln#n1H{z?zV#a65-?_M4wMBeWN!$&NmUb+6=&CO zz{GMdU;?wa;?MI4h1mNMsWC8h3jD^8Gk(+irnbV~EvsVgA>4gay?S8Aef03{1Wt9< zonKPCwfw&1-9iE-hu27H)nBFv=o_R2PMV`eP#ab{mX8zXlI(>f;74%%(nW|Ii*O#u`d%eWVf@Gx%YCuXo2w zc;v13c52*UU1YdbtFN~TpQx$c@MbMSA7L)wc^_Ln!3T2xq#{oXP7_CH}FMOi7 z*vjn&-It)K>k5WLG?kjYvjzf58tBtF>W z`jf%VWw6obgS|KGMNOQX2M#YfxIeIu>}6}ezJzvT1MqFRVDf~NdI=stL;W+iIY%S5 zAiT2{R*uZXXn0|;%T3;Tzi&iMN3Fdp*)>nigF|;cRA4sP0iGEa>+sxjL zdP)8((S_Q3{PIHOFH~pLfNFirh|tJkSFRci`iWjO!~C1K$5hQGL;1eqcM$z|cl~cb z;S=@;dQCO#FN$?%_aV2&?$;=M{Qmq?*gXB`V>9c+()SMA*d+U6U0>o z%;yPV$M?}3vW2}l^dE&rf^~iQ`^?huN)+G2+kMjS`eEjL#}D(n$R#dbCFI=sEXviE zo&b+CfS z8Hhj80uPsuV3dTX%Oq2pjhmC~r%{j!$6;Ny0iT;jmUS|Z{oAN81@fBI z&$x=>LJx04N6hw!$#XkhkldS>mC%+`n@|l=;{J@PVTzn+OLbPTCcLw*eSpa=ZlOvi zGf9S%YnQfc)`nxkHC7kiwJukWY7b#zt%$h62QoB1}qIhU$BKO^8z4@NU{v z`0k%Z{F#{*oi~kyPvQ+@ts9>=JUWR6H~ebUZ}!+s>hW*QQ7%A#RAlg06dyH^(hQf- zteo>d<;)vz%=sG%OcD*?M_vjRhYOei9HshBM_K%^Z+F8e0_1NkAp`+!HNW`SX{2l_b3MmA~+#3GPj5Z+`H?gTkVG z$zPY)0lieRv$l&b@#FWmV{Zx6(ONwy29ee}Rk%Xe)r61jp(rPIZQsVbE{W^t#M_5& ztXU8(s}S$EboCY{GwxCLI23&>ZC)i$Fa3oqCK0`G_quW)vBg!DhR=*i4pL-}BL#pi z*mZ*0-E%kjH+ymL?A%ARl7mNPW9G09E%=|{iusBPO56u0QuzLZS5#l~{DUR`QyPE+ zd}sTUw?Nks_)4;O8`EdaK#8M+N`u#EhW*#QM>NBOM`mL#_(vtn{{$$2#J+6-3dfa^ z`8Qxto0JAb>P5*D8bDj=<@65o9~2y*y8q8h+#3ixGeH3ke-p($Wl!91Ft+@-alb#~ z`PO`VZ@73g;mAD-i27j?XI}B*6^s#I(DT>CHUqa!Ke^5N&1v)gme^+Hwpk{(8FidC z!%kwGnLD3p@_Z(4n{jfR(KFhBk{DGMCxU0LSInp3A)=wT;oUdWNq2~e-#~5U&rApT z+}T6m1%?hnE`9z24*@T#9O-ca@{mVjUPbY}P{|Pzo9he4Y(vFBr&E z9y1HUwe6p|ID?+c(9H4b8EM{_YSnkJdQb0>Gd(~a(r_3`o@OxP%9;yj2FQR?>Nlg@ zo~U|!%erJE)m=*{?+Tv@;yw{QLnTlHWfV`f%@|*ML_O!Goj25(9!$%A2*z^WUHw|0 zaB9?czTwUXX}eYUQR$7@zXGInx@J&ax*l~#Zf&0}@!AF%nh`R{b~4UHRGl}#Tfp@s zkiGMj38K3g?rv|y6Z<2{gU?2WA?=|jx@2a>f58j70r`cX`v4>fh?zeQHlNa%AOF^u z^2CiOFD;k|q{QR+rh!4u1-NQ3F7?{TQQVfQ>7GdMuSn18#oOPYV2uxg>&?ijxj$on z0kqwMlEQ2n-a)fp2X_$u8<3bZxugD-^q7bD{SzmV!1lwy@F=Z_a5eTRE*hK#tekeWbz?4u#=c z>*4Ae!F3J=8fxpkvp2>GWrEd8h5eBWTH%ZxXgin<+@Lb>9;!g@;2v@yGiNWr6~4Y3 zoZ$XWX3ehMymxuMW_woc>;XzKgvV~$?vzkjTuK}O1#kiGua}6Yw<_Yy(rnJ3MIfm$ z`7ve?Ab@W37zQQm`N++$X+H>0y`D}rBiFd@lN(}{dQFP|A|dVU$>N~*yfWX2^73LI z4b0cET=8!f=Bp^N_!lYtWhB_a#0p=<@ipUvn6F~`{MZ*8^JS1-BlgMkI*Re@y(N87 zi+wS_b|E}?`_9C6=BpUNIJlPA(HEm{jRD~rD_K8%XYCpDReWQ7jJ5eHJkebTd3$m} z8g?(*D}{3(`I;2KQ&5EXdC``#FmEyvWt7f(QL55QPqx@Y4)U->&ZKB7>X_%inr|u; zmeYv7UV64y@0V~pCFMPb|Mj1Z4TtkyWCk9$6+5m+a!GhDar;0f=I<$2$Fa_ag_%cvT&gsVG1Zw0?7XX=LQmeIpFn zp|hz35EFn$+C53!9n6Uh$pi;+xC@13GaFD?+%a0uL&0o=7+|kIvVe zk*#O5M&jX8_iosAwdlA2cb}s{@}Ca!8Xx3C`kQ!B`I5_4)LrK9bw|Lxa=Oc+y9@Xo zweoM&SdIsZOg*A1(Kj5r!})$VFkZCwzG464sP}C>ta)^4vFI&CqBe1`BSG~s&YBwP zi9DHhok|5e=oT;DB;`Jxpxm4LjOq>;mgS9NbAlR01+;?oOYA_^l>g9+1tlnDmlTHt8N(2PYxP|e0LAGT2k+4%)}W+mhzCtdd=_OmOq-D zx1tkT2#}S88@GD0Gfm}f$gj{>`P*>PNaDw%Ym`b!{f*(x%wx+;hughcoMb4mFmd@eRZ;BQlbD(cfK5@?jP>i2CSy#?(-Wuv7% z9odnF8++ft4GFA;bvvl5a+Y@SHdwi{%VEZ>wlXt4k~NO|Nbqo`*EEoq(t>=k8ThQt z@|8@Z70m*s;1rMq?u6`gU+x*6#U?fj66@wtYicI5nD=c~+8xhg^VKY9tTS7chqDx= z6NY)0VOBpH#uM(*Q{X4gOSr*&o9i~K*L@woRN0|Sn8su0jZCV1IC=W0a)Rb?d@~T6DJr;HnMzozxM2PupJK`v=}Q$ z6+{r7mj3?noxpbM<5s9B?-zI7gg^5WR1~*l|IX`?4i7p#PCDo&W!O2hwE(c@T#xod z&ONEmO9O}^=c>V@ZFN0md(?S@&_JLr-o7vN3`gitoEd9Q8>q{vY@fQHd<8& z*5K%_Ziec*3aiuZR6(?=6&sB>yOn;*6u{S(b5GX%{+-*F#H_Hbq**Ab;6*6b8FOV^ z+S1$I?CFQDSad0~C8Wkh|3q~bj=M3#TX!rH08p+eO-dNIGkBQVLRw)xvo+hNt7fm9 z*#*a&aJCJPnOl!p7sYB>1=A=+PL9Qtb;il#KOV)m9gfcVGNJ`#uTCDpoPm!W-U+=K z477dSM%pk*96i^p5$?+wLcv4c$g#dC$G#pn8Kv&mr7&y2y_8-)d1kgM*NjB#J`1w7 zJ0K~=0DGHIQs(MyJ;$g!)~PpF9XIExyfVaLe|q)9)H;J=23vh`3$f0yetB-0&!UW3Ux;(q&oND0Qv&eE$-_r7V~lj ztMmua@?d5*d`bg~W1zfpWs01r%cDB;bL=!BY{nAg>or$*Se}hYSnF#>82HbYwsv+E zs``5?T{e~Xmi{|^J*@TSb`Oa;{yA{Y66Zu|4ou%e%|B8gr|)9t{u2B+*pEH7Yi;aB zaJEnJ$@RH>OUFd6M5|o>7n0IR`Ae$lr_9Nppmimob+D422-}js5jU_JdwkcG7j*d$ zHV5T64`CK!f_>d|a60f0D*cT(6V=3Y3rW|*;~ygYYtLFBtY5W>v4dH=Ta1&|oQdHc2N_){*-~3IWtwD)+lASED$y8nyO`d`kbbs66pgn#zBfBTFR?JJgylT&{bvm;&!kljj1;Q zzj_XmP;eVeUpPY0q@MPXj=h`b9-9sUefahMJ%W-duop!Ux(LK;zADJ{@bajS+4R_? zeGOL5?bc`Q$3RQLO`hfgxdE;aJe~1i+hjL3n9Yj&U;0)lj-{~P(jYxqXlBP~uN%_0 z8!r8=g837(@*eDc6;_Y2!HbW7ZOZ?&dqw!CO!%0WM|ZBd3^5h8DZgtCh3pJG*8&Jg zi5<`>1f9~$+CHym7W$CQD}-L5elK?Q5MRzHrigGk^Y~A!tS(8Yxn(d7|qXINR5T)W~EH=q^ez z3fjS*-W_gfpvKxGaxv0;ji_CW#614HTmVoboc4N}{Hk-Ne7(-qe zG_Ndfk>?SA$DMUHzueB2JmxEO*lZVA475{d{wDIeg4b5J&lr~RM&%>yERSOza2!K^ zwysJO9o>yPa!~QA*ud}csXm7y7va(H$~hbttvw=22O!P_mQ{(fwieZxP4Q}jZ!TIO zUZE=m6u>XEdmozh&#yd{u1>QedtKbNLU(JQ<$$8PJ0Nk?pYQh9BuvYI!RF#nl*fcG zcr+gNIISccomS9~*G?G9s=0s`V%`pYXezgou)z@f;;SGiTQX!`BHxWX*ap{mqiYp{ zJ?0V3$Xww`X(y$STWRO z!lh%j^}zInm-|4(xgpMBYa^iw_L@J}Dp=Xt>Paa}Do0b6oO4*m_7$eLKzYv*wUpa* z%{NP0BbMQHW#VLfVBlmDzKY)fy~4b=-{L5xpA;@%zG}&&-bCo8EU&)Xr8K=f{@J)5`yhpTggObX?PwCb3|0d-{ zS$P>DjWy*d(Wd`gB|%|hRnW-LhMj|hz<_g}R}Z>Ahg6I-J=7_s&F(5}1-OWwGJ7buA%1->+ydgh;w zaK3#mL)676A8^>s7e*}`Vr%Y85yN@@Y`yTjr_J-;A)`|`=h7D$=Vng7u!`cmuy?%3 zduaVCtYd^?WPX3Ib0V=-Nckdb=kF@OurYZ=LJ;fZ-9{RbZ>YY=ejBq4B4W`KFVZpm zkXI15GR8`+%HMG4Sg;hX%ih&yQOJRqL6(VnuPA9f4U1ex8P$aY!R7`o@63>W+*tpE3jF5$k)?rG zBhW2|xtVCYWk1X9CUqP*@5dKMqM`f+@iNx+3%(Ca_+DeApW@4^khzzl4dU2Sfm1E% zV*|2*he*!&VXC`5HZB9!Umn^uNiG-;-v08KdlQ39DGHyKwaoO4B{Pg5#|Wy=I4zUuOlR?MAfrpu~>!S%zhKRu0E7 zPjJJ$>O>!_Qr=Inb@UK%80@H|*4s;=_&u0^3eqdidEoRVnpI_t}U&@}HF0;#>0n%8u-d@hp%Z zfg7!BE&W|^8=JzQ`#W^vQmco7{zQm6{^^NUb@9St24~5)PaB5Jr^wkp%`RHCE+Uvu zU{v7AQm`?Uczlg;5vgD%o);BZ@g`%jzc+EYKv7ac_Se!-LgvZa?c*-#4bj}>H^iqT zzo{sbx?!P|BUZ!`AxDorC}%RO`8f2zU?IO(_^7Z>w}>Tq@FMQD53YNW7$z)IHqW6L z%5ZY7*KuVpW`M!bm0OUwGw78T*znlg~5V>bl0iHHlwv<)#3 zTu@IWG#8RHVDCp$DBu~>$=8XUO86&Lgd&TQnw$JJ%2L32E!Mg$*+@<#bX&dz_mC-E z)WmQ`>aQFFru>4ml~CiO=X~EWt*Nd)VFUTh?7N}wQk9XQTslsJ*-g@iy}o+o@#OlO}azgp>P} z3QrCD8I#RPsPGoZyrX0g-bx}=D}(XA`iAPSgp|keixJIrAMTE_sj_QKF^LQRFm{MA zM@eBVq5CkO1)DB==Ra?uGOguVz$));HmQ%?~S28GaG3$qI+^1)t5hONcrIY)3k zt{)=z0#luozuvkJ!-@`KRlU!)F8@rKBR~f$%T>ccK7X~1*>$yZi zP>XOUO`%ca>M>H(ym~o8dbplu0BBz!j>CeRd+V$V@C-}>x6{I;j)Gfa+KgwH_d`DA z+b6_d=*USO;$0`Jp-!few!sg%trcRlGuqK1^*q-ODRK%@#tlpCH}3eqZ?3~goANud zC2ijRL{LJPqp^c5Qbu=KdEe=Y^|0nLJ8GyeeQO{v*_&1UfLFQ-5V|K*`*~jMh2zzJ z&UZ<9{hAO~gM%yHeUa8>Q^jpeBn!&b)~Lt~t{KADVn*D!_j0JP>H9#6-sHeP-uv7? z{%5Ns?3(D`QlDQU<98H2asdc!0HMnlQ3J!;xfiqYnP%v_$YQddaNR#!@%;B!Ou(`$ zZXzIs#>I@BwmVGTrfPrZs${BLKsC_xUHoN@6-^bo(AlKO%yDgbgLEcb$oh5g zgtXV_d2(m*&I~NxjVDkUjGiPWoaaeeG4*~MhO3m39^4++IbvYbEr@$%%EGXPsi&2_ z0b6{FbQhkaUxAL55PRoC2g0s}%zxao5Yrl6J1;6+lyit2Zlw|jS6@pW@VZhNat>fF z@rAQiRd+9Y%R$bc)uWvRCk5cpw_!WX4|j)nIyTrofr8E2r)?EH%0TVIf!-oh+~VcH z5{DdcjnxpD^3oj6ywe7VYfR0!xnpzi4@>j9bzBsSWVVq&{V>&pkEaG_^C08>D$ zzcS~j_JWf>ru7n?v1qX3+mtfCQ4*(_8A5NsfM2(XYz#D#F+srURzsy(AbB(nMn}wG z-s}X`JIcF1YecM&D(BxKWk)T`E>Ii&@dO)WDb(heCxPW3VX3*t+lx{{s;eoYU?wQI zgI^C5uDMaeulqFE?;Kh#^ilR2G6C4@k))??D)Z~4Vp(nfEj!%vEoYngsNiHNgE74| z#%ah1c^GuDYM~Im)oL zsYma;6(_d2arD1c)@F^KtTs!K9C14?l3!LGVgeK=>zFSQ7iy%XMUE|GejlqvAf>o0 zNVHPs+HLqTq1%eCuiEFxCADhHTO7C7oWOJVf-_J+8i_vVc7E3x>v4AuFZI?+F3u^; z)=vz9u{J0-kR2c0%oBDlyqgsMNxNB5{-WUe2V0R{R0bLP$H$T{SyemISB3Zvk^7*Y zJ-LsE6Bu-Aj<_REK|>R!YFIZS7qEByfAC@#$kiJ2FED{n*IiumPH1gf=Qy~Mh=Ol3 z82bq1C0CH%tF_&lmo#*AV`8SwD=7Ab4%L+ursqo;2sP1JEir2q)%Bht=YS1zhMcxl z&!Z4%$)aAqzzz0_L{DMI?_tNmMLTqr__b&C-x>sb!z*=aY$7nIryACor^I<-kSWiX zn(0qI;)az?(WL?=hz5yGo6!8$V5u-xQG@cnYd(D5f^ngF(hz+TCl=kaSZCn#e~xR0 zL()Sx4DkOioc*JS(Kw@^8fq_^F?{-BlVw$k%rhLlXy5r+gKQPBlhYt*i;WkI!kvem zS;K{Shyn{U$+B**#W}KQ=ES|wUQi|8p4dRw;W*wm#z9sT9;~(gbTBHVX$q1qu%y(R zLiG{`NF!SVgGDt|MEgYcJns#BJFH06I60GiWXlHxAVyJLs8U`zDMt1!((zOduWzCj z1Ngd79u`kx`&VX#J9}$z7n63$d->|}{x5y~E&3WL-;B99P&vo!OUyF$O;KZNR3+u; z#`_%K)js26_$29U&R!5tjaa9~`n@hQ%p#ci6mz@7T`Zk{3xqUjEqP z6z0QjCrAdvJLV)L8k68R)~YlUwCb}^%YpRep4C3WBfHv%WhFCpAA2*M?nVy?`1!|B z@0Wp#uY{Sh8BlfgB>70$JaJO$?h2F=0U_D_gOyJ>SRB}CA4f;hhonWXjqT-}XKF}s zAxe5b&XFru$DHV-?wqO%f;fTS z{-$twf5gR^1;yNcz#iS0vA`f=2|o?f3^qgru2t+iI$t+PA~!5V&f}_bUL?+9r`bo4 zRlClT*+VJ8{W&ku?!RpMITfTvq3>4XFcKmxq+J@{F$pgWZ^Wmc?aCdVOZS(^ymZ(3 zDJe&h1T6nsz`6{9HNAnl7EwoU`;JjPV?CqBq^4Qx17}VSK)pgOp$wL4*Y9QCh=%Y|9qPeQf-y{( zuY6>NLF9mkf{FE^q_yPaO6&nI3~u@C!MS9Yx5u`63j&#ci=;b@JmcMY9ZEPzj`P~( z9UR!m6qyLj^?WQ1-}p*h6gUSVhYYCmLY!)#o>Vc+RS{g7KR|PYp#C;FScdy>CHuhS zAR8kGS^Yh7(8UV~w(Nc}k?jBQkZvHzYsQXKYV7@a>Ty|TdNCIjF8NS-X^O1<1`#*| zX5{vW!03<&EbYec6M?N(UfRTV9{&GVH{l0mY6R93h$a;Yb*~rJ>EIfx<`#aFrFm?) z4ds3EH+tT1z2v)9akHsMr(pMY+~mtjeQ=V*7l~U>(@uK}&Xl9h&9_k0&&QqT$AONxY9I^kqeMcsl%Lg5D-lJdIgcUooU^xbZ7uP`s58q4eG0~5#)3@GJ1ZV+#$3-! z$T>c-)OpO321%Y_^i)?Y9wxf7_=5_=Hn5RfACOUM5GaVABhEWmUppG8eNvVsv^pSV z?_5oWli`+-X;4bQy>h0DP>WZ)lb`}$GMuwd1-(Edajgm)!0zdIQ0mzeXh1#AbDFH# z&ry3ULUmzgemuxY4fO{L8MOimgz-n24q|kA@bSEYt4ie+TgDcrbSJvY(r_6)L%8&^ z5K*LI1j`ngRXG*o0yY+KsdXPlfsiV#gUHWwtGm#!)w7*2N0^rb#-8(|N~+^(RCi^| zw^LL-4RZkz?K&D^B3e7i0@r19@K&gsLcVU1;i&({!tH&yeP*F4F`_u8c~(8GN(<3T zNr>dQPScD}(y`lO65*P0&b*^L#a9d}=7X_rsDN5}`=+-iikJ~D~t z{Gtyq+Yb*d9`LYqBKXlz^L4RdlPffYg_&V^I6KQ`@Npkw6M1aZepr5_*Qn=VI+t8SomH!9^wHT?YGqBA( zUSPfT^+ZdU0<#wl5}e-gu8g?#p7qCP%m0aR*=eS+ii?arolC7U(Qem7#t5?f+f4K& z9#rT7eI=URAj7|j>5&JU5m04`-=(m?(Fzp4vOv+eO1}UNSXgX?xDF3K>GE-B@!%+P zW_k;UsuR8m+xh!2i{i%MS)*4Ev+xJfEO)=3Gf~00wSm`km`u-i5xqZDy8JQFT#L_t*+i@hwrqQl&1$)D+o7WgTm&6V^*f`k{=cY`Xxt#uAdN}-a)3ow#bc=s#9~Vyj}6MaXK{SUfHb5uyzjgqzz9H(&kj(#joX6c?G8p zij#4wV&+fnbJUn%eR=pessc_*kGfRNs5GPernQ5=V3E>bEs&=O)r+$_jIjQs2)K$0 zap#I)LO3-3w!;jB6b2(drX~lzBXvt|s6VMp`RIJ3+NlA;yNf5R)o*8Es=MI2$ur%D zQag*qt>%#nuAcUB%>Vgi(Ag<4C%fBj_0DRl?>)4JSE_?I&qQMbhJSTRpqs+|o- z-WO&3dQz3AKhieyy)uheB(f#sFuj_)0airMnLOh8OJGsWt>|4Ukb}0oofW2;sx%^b z*E|z7v1{n8*-UF;JsjbBTZf!3sv!YGEyCr4mkU@G32gC)fUd-I?gfZcagi)Z7V9gknxk!*9Xdbx@bgI1oDYh1WL+( zxqP(UDr4(Y)(~u>YQzE{iHjOl;+gCR+Nl*xiV+BENUy`0!l91k>pBdDg_>)vr7i$* z47WDPGrMV*qpbK3VM==JuFChKLaF!fJsp986+DxLj?!hrPvnxkhM7S_SsOK{N+K%A zv#F+Nt#Rc@Aeiebo0Kb1{!QACmdxhO7bcoHc#CwomY%8hR^qt4vU%T#$ZmQrcTE17 zTZpLMXsMm=t%thpIn z-45iz*-}S&{k@GuLWcI-JD&0E(-}Km@b0FU`%|M}_{dAOi<0225ySFPHo;B!Kf2wU zYQau5zLveI`!*js&6?u~agZf2F2iTBa_$m?krvfScL^%H>q|ke^-T=6s*y5I64Z-< z$Osde%5-IO8stE!bLJHiyM)3owVV(n05o}|YmpQQ>+3LccF!7uKY>Wn=IudVxPp(q z4&BfFwO$>5#e5pz#%XwQ&TaSaNJ9L&mTuoyn&q4iy_Oc2H({Feg?Irh*%-?8X(Mo; zYEVh|b4%_3Z9=~Y0zH^{#n-YAQ5vUxp3+q zy2=Y2|NP)2uJ^!h8i(7=y;u<|rP7q=s6V4s%ejbQ{Lz@>II0qVC!ECUR z6gqsXwtmU~L%(@%dkv|BecN6)=&-&;X{-J#%G1FGN2=?JfL_LL^Nfn8g2U0=zyWPI zm$R3~+(_}jZUmg*ZX$OaD>QF2vO0^q@4ELQ*|`{mYyqCWz_*Um6Uhe`OUvS9Ej~&Y z>`rA=&UuW6k~tuZXq@zk-|DXmaL$m67{OB3r!rfSuTV!B5z)K z_Z0H`kPUaxTb;1kBx5ca4cpAlc2)}=IyInnpLEw*!FwPSWCq3PV&>{oMo}od^*bhn zSA5rhpk9_Wf0CZN2=BS3GS9f(>@n`XYtafymR8AXxO&$yBF^p=9h_GtY-MN}E4JcY zC;Q?U#%U$bHjv0x0L>Y`g;ZsT0tOjU&-#*HstZoB0W12tO?+q$vdCE*Dh;dtaPyb! zd~0){Q?b5gd>A4MwUPUBN<05xN)@ENH0hh0zbE@O6GXorICR>$1gWl*_;i>o0yYz$ zHWHuK6Q8z~sagZzu%OJH7y!d4Lur1gKb=VU_!ZHJ^0=S;c%1xr_@l=^>%05CPNbSI ziB;D>`Y`D+3zM+BAGRv~j*#Am=ITR~Qiyk<$Ql@aiAx$3_%lAdX06}rlIDfAm*(Kd zmVfLtT+LC`du2w?kuqSV$Ins{g3|*9l@xMZFNXQ}o>* zT;W#@4P0Wa2RLg3Z6$k;*`Kc!6vSCjktbXedjoDOj(}H|Gz$-6z$kOJP1b_6DL$)aoxscZ?*P#xXBtXR zF|P16Yph3aqN(9SLMUL zY}G`sf_i(4%oXe+Nf-0GTU7gdi+N`~!^$pcIJKcB71mX-Td(Ls%)sA3{rcsuwSIp+ zl|Q^WqOu_#*KST(c~Jl2zq{+BQ{<3w;iS_ATfw+PHbYw7r1-l&-tdYs-=t*t3D{mF@t9sAD1(7Skni@j*w7ig-ddKiz0;9JX8Zw z<=rU@w;m){lM-@9k0o!FrLk?c8z8;J+D}b%bXATKV6cYc*ClfmBg^aes-Nh4pQ0~R z2l}>NF>Q%5>ocpY5tH;r76nKdw9xZ`-qQe+HHpZ`NG}R|I$$~jOARG3CtVb?(=`0x zJ6d1?VF-{}JJNvXuXB|H-hmge{IkFjRrueB2fgThwQi}Jtb)<>IAS1Q10%+w)SEhp zAxE|4EImUBLn}xkXYM~n`q+lhY1~YX)0)Smb9|e#()s>xf+I}u*%^ZSSooOqTGB?n_o6r}e=@2tI?-_ju?3GXDQ%{Qt}N|3Suo zssDqV|Gs7d6l*Eh-{_Eq7u;ld!C~Rg5WnV)^kD8F(z|hPe`+&iej;rZe1SMk7dR(p zoD=Yb1vmo%CwIm0p5B0213dDDFD~lW=$>wX9t_}@pl_>T5DCl9Z`@WUNFpK>&&8R^V7cJvEW z?l^$%?lD&0r;vW7^P7z8Y%ph^lLLm>`w7tJF3@X#0_aiH>+GjMzhF0FGveG|e-q{| za<~3bAn*Tike_HPAg+E2^2@1)#GL#4ATKA=lmC+-{~M&`%7Q%q&!sGu#@H{zNyf)FvRGDd8)&Fr(r^Y^NJzz!(wiHIDeA~WOx&0H0dL6x^vID<-( ztu?Ybyffx6w8tIn@Nio}2NIMErBt~q9bDWnhnB^hF9_e+8iSeTM7d*^lINV2%@le* zA#0===o36epxzv3Gu2kBxBOd?3WBf%@9$k)frC%fQ1>|R{-ii=Fy%#dq`JU+qDONb zS@XVR`cEDr?e4BHY2Z^TRsCKJuaMsq9V#)ZcY^AIxKY0wlbsnm z+0q}MY==E@kI_H70{+b>r>soMJJa8qZRL;5_VxE>E9GEJ=DV{k|0ieLka(nAINRew zCrj4|dpvp~k3Ec?^^8u^m4sUFrNjQDtBG3gE0@oqG8-Vjfdtoo#_=50+D8y1L)OF6 zd{_4VyXzMNUAX>>vcr>AGJ9kV*Jeo7QeRUw{z7#IE!chJ`l&FLm+PvY6u&_4wru8F z>#(N|&oseZ;XYx?(j6OgGM!l+f^5_J8?1 z9ktBPiqlFG=W7!yeBB*?p;|NUF7M5gxp6s$ldt>ZFH~PIxWi3xSxI7{WtV1O_s3tL zHVp6jd*z7GBDLEWUw4U5)R=aLoNtZ7La)lEi0-!9+R_#kLVSKylSlLA)k%$Cb zf&`2qrc~FK{I#sdn=8gF%(umu`7AWmgLrHbB;)wnmx7GMUPx*-q)34O zdiN!!o!C$3x-a0^@HL0z&s>fB#Q%imf3c#F5t4xU!g{TLNa)3~))koBVx0*OsmXC?-AGJ0%v610)1ZpzXu`s=%tvN=p3lN+9UIPc{ zDf7z{e|IFG8nrEVOeL5?jSK4EK+nQOMvArr?^i9#V(vv*%zfqk^1|@Fm+6Z=j1pDj z%_udqy^4>&iLS4O$pZ7kQ z>*x%58y(uwe9Eqd`iz{yxNI#O-Y*U)$c(jPyW^akSGUN?IpbKuUpAI-V?zXl7L6ps zdjWw79SQ^FnyX#C<1gP1zXY)4%an;i=jQxnYf(h`gbEips4*+RemD1szn@E02Kq2( zq<=1Y#ZUAHYhHJr`{8>?A16RDo0_sKD$>nHGL>#@@s`vt zcrJ0hw0T!fWmFr$cYVgE2+dD(*PLn>Btq8xvs zV~^b;8MN1mx06{EeaIN#U^r*+r*kB5kP zQUPM7Dtm|-8x$M}GFap!N`Pd~+cb0lQ-Y!Q6r~xy;%-TLp)|uk=(TgC(>moY=G8U0 zaIv{R(kV{&WkIS%hBG>0oN066MDGd8Y)R!CV%!GtEhQV|;z^wi1o1+G9!mrn5(Z^V z#>2H6DDQ3xZG3x##3sKo>C8ok_Bb$5Ufl)`eeWXnUzZ) zEdvPzzFD;PzVSH-D#U?{$B+(IX5IY>W$x`K%HO?yU52;C{AZLT`V66A z;C^ETJGd?s_e6^IK7ppW(EfNEF~g-U5%@3uOs z&qt-|fEQ<59Lc3l$3Aa~LmfHk?TQ(BJ8!ZCy}-~HJR@(Vv+{Z=%af$Dms=a*n~U|{ z5gCOTt86hZZ^t1P+1#-wTZ^~ZIt!M0V_yxs8p?r#ra5A@y^OJMwry+}ig9&!+|JwS z-cFEr$G5t7JCFy7^ia)pezU)dv0WY=hE*|2&G$Nyo-A3ux@QVr;PffRLrK%*Hbe!2 zm9cN<8v@dG@rvmJCm=GECCwua?S>MT*4#=bjTPLzZ0%-}Qd0Wl7lLfJae_l>NDSkM zYOYwmdb5qLJ}hbgEi>A_IsXU+GUB#$rsGy&4%LF5@L?ClD5J&&r+r5`QTDLnlt*_4 zPfPr?Bo4+m>;!%!}Eig5pETt5`D(Nx2D$3q}plH=i6b8PY91jDJ z!Z>!U60C=GomvT;E35;JY5(DFxloo>P5un_+O;tMOaCfeS zuI7v#tQIREcAZ)H5hwdYuzTss*sKsHqoJdzMD@U4B>RC-h%DicCqdv@4}CHNcj1L8 znpb8>0V*CVJW6@w&g^nF$;V7m;nF>^8KZ7qcnM7PYFPR-9zM!7vh<@gFwd89hvI~|!r9=XCNY40maJt|n& z`a4L2Ap4I4B$B*9$>I^t9@@@X;l%$pDgI6}fq25FA|=gge+q~p`eX`S3BkuaMumvH zmw}xVbR>x&uRzqM???s+5fb(YN1#n{_6=_$;QRQn`c5NR;RMVmdAdLftNj{S!qG66 zP2qdRAsV6@6qOKX+surm7!}ob+}6;@*l6)1J-|AF9;{M`3y<{I z0O7zMIABa)_nZf>l;~$RiV{R2Ez%h@mW@2hoYqf1Y|3fA($WTbCsWYX*7^hR9?)$r z-jHPT4Xo;l?G0yzJU#{7_YOrG@{)LmRKs;JdG#2pQD9pKKR!2F+RgIZ2Lrw(N<;+RLS!b|X|hS~OoR#s6cArfcSm z4-AU+zRN+$ulMkjGoqMZK7f-!L``o(5@Dd!KBOz!X(+NjRIO^Df*Gj#XM`~W3Oh}yAb!x+5UVxGiv{>^gi{!PXAg?-xsf) zU;YZe=gbU% z8C*z^k`iY(ZJ%1i%$%7ybLPyMGw0I8r}g^cQnQj%a;8aRUHYYJ=vCFV>@=95&1%@ymVTwXOOH3*rC!atFNbbc z@wqO|4dn1H*e#H}DY`*D2D9cx*=??aXk-ig|5tNR~~Z)C$FX%ALgkG;QMv;8VDd zP05-%OKNd^Vmmv^8~64nUa3~9197wy&BaCRxVmK?F&j;n0>cGur-1F)peClZ(VoDT zb-dzu9Kxz&(sHsmr47__u0;A`gY>al)6`&Ak}KovT6xH-Jcl*6 zJX9*Vs|{?`5I)ziY}Xkcjwz#z{UH5EVKqxw%FdLBJiuJ_Dz51!9v-IuDr&uYkp3yn zFUS}gCG~!g{i~28WX?Z9NMCN;*Oufi>5eS<^UJQ;*lpS-3TB*LTUKp^OKYuJ?;|oL zJG-XWBs^~~WLXRN+ne1iG_gwXskElg*s?M6SV3lmGi$BZENkRKBTY37$@1FDmK^+T zW@Sq;N{{7(Z!Ol;RO%&HHWjUeWmBn^_%)L4?3$@qWVz0tf0p1&p;$a-TMcZxtEAc* zHk);9s}%#!JeHRiu{&e8vMt$E>=KWG@=(*H&8y|1$2_#3SgltqV|bYUtGLz)*VfI& zlj`E|a8jSqy7JnxYBcdodFUvikn&I~Doo}R$VNaO~c3nKvS_LJ8Af~ zTpp_8n%Xp67`upjIuo~*m5X#x4nYuyZZ})AY>7}7(oN)MO{FT?vL*YI#yNDa}CV@T-0mjp#{aU>R7_11GrQwx!D%1G0w`~EH%|!Rvp(m zq`K;<<4>1|;@FAW%0^p&91&k#kpH_RKFzA}PAczaBdrd}I{qD!(}LWJ#dQmSmqlFWIHF zRyIp0T^El46Al4yN8%O9Jbzv?OUG=ht~)rJm4X3UvYuV@cZo_yX0NU_C0jA^ITtu* zOH*BK2}*Ry&9+*8ZH=$(F4@*f*Xm85-ORd5)iUuxOL7&$`?502vP-t2HW~&w;Le|)U&vvh#(7S=vf3sjgL#%=y9sZK0NQ#lYsGyToc}C79tU-E^lO zw{3M*QnRygsL!e+BePj;UR@~ZingTMb5<2U?n1FoX*fGPEZHSEdGHD%)G@Cu$ZK$H z5~+Q&(amV9I zZni}k$gY3_l!mL_yl@-0}F73s#UUHQstS>IPdvOaJ4n}Ipq^0N2n_dyCpY!UTKhM6% zddc*^v37gCS~=GP@`#dC*K`pamG?yTQwa6 zpn9Vq@CYSHBL%q-9dEw-%*WC~-5tb__u2ica?w-uW%<5 zdD)R%#z$ehDHRY#`1r6O_A2B-|imjok=mEeR_yVmPC<68&4&*&m*q z+GO1rl9`pO?8l)X8E4HarFo*xhW}e2@-I|zONCi?e`#{o z-M25hw(3)RU2e!rUeCCsOpfne_3q<(O`0U?+%?JEkI$di4v>MbmgZMwMNujXN=-Lh zY?A{nt2mbJO61;JIzSF%wcx*~)xjp|mPDMoOen z!&;G)aoOEh$j*Y`Ot%b-DN9fA%6y*G-xsOhYSH;E`+Ip+uKIg_#z|W{_@LbtSTn8qMv1C zW5+U<@tpT`$~qH2dJw~)7!21sq&p2mU8PrhQX%xsgK!d`iwwyBMrStXp7ZB4=bn?1 z)xhQxhNYb)pZ#B&uwOsQ-~p)&Ci+V(>{uPul8Y-CGm?M+?<#tB%S;%S~J!nk}1@+DjUD zwX%tj27{eJ<)Nzg7(U|K7>_iF)lqqo(jb@pys+)<;M!jZd@#+l9%K`)< zGmbbQJ0~}1`_-4rLo&w#WHj%s zv7$SNuyfY68t5RBVxiIBvDlI+g$T5d(6a96@JLSSNnv$=Nx!l>hrOXTtVRRdBV@b5Frz%vqYb}_vt+G|sJ3mbKm*rq1`}V>t9V4M zxllhqn%BhpJ|2uqH60xmi!cXc=9h1lnNjIhMkvG{Vp_vSNb*KA0jxmN^G_@>eY{tXdvcO_V&?P}W*9ng??U z82>^xOX0ysPK+U(O4;KWmg~rb6_a6*v9@I7Tervrx7mg4g17XZ?j(u<@c@;iLH14& z_70&y!ln~9O%E`mvcDp9DY~&&Zh7D*A%k<8q1K7Ib41f^jo1N1){vegl=CtyM@AT? zgy7JXBVwAw%{(ikLI5l>37?~LgC`GPKw7q5SM619#NAsjR@jrX$8+D-l^W z@%RrP{zc*NFT&w3DT<=niw@Ze{+@$r9HMga@NnE`zggBF_%_6Xt|t_oqd)h$RmH|H ziCHIGC|V&=at#`A!t1DjiP1RWRR9~2T^ZTXgTCShBCB^wPUL?UmNYfPa&Sb_1g15z zL<|oiWxp9AZaVONG@ti{P2B~-J>eL1uz|IJn`FEZC#e#=`;I82?yi6~u`>eNSx)a3S8RIkbGZ*|keHu=ObGaH}=SVq&u zReuP+DmXxxk1{YBP`Dn@ffAaWn4XOwduVbs} zdRk1LufsGRBZCgu8sC4WAFuRitwTBeavcb~cJ%z-|;DfZP~@K(U(v zyK{6H|AzemaMNq`>Wm`4k1oB{O51TO8|902t7*Ep8n9Nzq19@YcpW?qf{=-ADPv=} zZDnLS5GwEk$N~K zPZ&^GB?8xtP;1p$H8m8+9zw8!cT^4vE2Bz*63S$P@AfKB0K}F`b=BDzGNMuq5!aan z5~3YuCySkiWjZhqbw$-fQk;~@sSQ0RTwpVDcvsV9m_eCe96p&5Hfwe^!mYdx73*w- zJwOG&94rx<4w=AMz7WGo1SHX&5V>rtO?T-@V!WHlhS^GlKc@%lV0#(c#Ii67SNutZ zlGy|vMx{O<`TpdebHKTi->@;GO;|x9mxFIdy471@YYlE;^zPhc3E61|Ah}bzJ3EQ^NHDJtwKoP_yH1niy)=j7$`IsU??@UGp zaX1^=UD&o2Z~h0nQ|UG+G;#7hz!6{T7;ph>gl6F>c;_Xq z>#mfc8sdyh8e~P*8!_1sQ4)I$@Kxwx3g%5i@=$IsYMKqBxu}~X%T2J-@`Agds_sCH zhAP^d3z#&Jqwq^;#99)`PW$;I^sczg`&)zU-}tCfjqb=c9Y2CkOKh92@S>5gXW z4Yv>2w85~Unv1399Du~G?t8Zd#2-+)_U@{Ihsi5IDW5b;3SM&@Zn}L#F9^_ih(1g@ z|G>`FLxYl2LgB_>wTTC%ovZ4Oo1-nC!bXEcRsyKZvg$Moz;gODDxuuoe>r{n*s0@( zPoLhK3-u;ZRDuR5Ln$RA(|;G_`ON9l1RqC0J3(|zBg-S+WXeMepp}cLUbwyqvF`djr-qizIqej z=X^Ztg(=flBN-O>FF6^QfHy|kS7-p6Z@(qP;Ir2)@aO=7Ud5k zXzSzWY5UE$U!X08+G{M*$H5s?u`C0tCTg`1Q|+P=^x(qf2RGn)POG7fJ9o+1i8^n5 z)%nYX&ifyA-u-*~^KaW%U)y~7)6KVE017D&JzT%^;NF{Cw>~75AFf}fol+sefo_R5 z$?sIA3Ymj5hz=hH!G?YBkDd44Wf%*aP%@Piev&9akE!kw;kz>Oro{wK)B^j=md`&y zG4b(lJMXsPkEd$s+}d!2VLcV4^n zaQ)KOjhmYv-tBzw&E`9|+V@|hbMvG=g7ov}3Gx-!*6VQD0?|~IN$AJO5U_WFhPhhK(}(e>o>yA~xi zHV~??3zadw9qbup(XcA2p}10p(E-Gngien(9rpzE3*DYDRA(uZ<=}9Wi=Ei!U%%V> z>ZOP4Z?~^pY+wI7QWWHGp3bfR3TBv-4$l1ge7T&4PCG>01{5xDn#j0jb|+Pal^1yKvYVPgpE6&1$$aS{=9QJZ)*XsT)#%! zpq!Eejz^gR$|<1G`_p@3)s1@>x!N1|K5Acle(Tnq%~x-BE`7au?~~1YpKX2n$M(gK z+8_TG<&;8klxaA~*-^FJW2)<78!VC;+=D1rF6TJRqZ#i@xtz<*21^yR<`!p{SHaQE zMFStQ+`(3W?k`G%Ti?C6dG9lF487a=(+A?V=4dPTeQYsU53DueO@?ePetPlStOpOF zbA0fp_d5T4jj~<8GXJrC%H`I-{H$F5^_l;e{rPaIT;5kM?~xaHTH~SiqPCq}7p`Ab zbFuC8UXDcO-zuBIs~A<9dLjz>mGQ+F+iJSl_DktcBEJydP3JgfFL=V8D zoHA?^XZ(Kr_jO_|DDGb2;F;BWF|@4p2?-O!=wd)V^Je$l>lseSeDTVKAv_2pl-Zhg3Q`+0Qg|N6)$ zL{CUmX*3<8_+ujh&7s1S261l?D3O*UIwYT?dw~ELO8tE$#_=SIrhjkhHoU_taiO!R zhY9a&*oOz-_vTd?>kCLPZJ_byydvReg16kG=RG)p|K1V}Q0*J~rF7h*)kh3mb9;I1 z`E6{hS$1_qgExoNzIv=98!U=ad+WJ+9UHodyU!}>vIiHmu3mm!-Srl2y*dK1c2hg+ zkroXbcWDIfdf@M3YvrMZm<7%EC@%;jE{Y?D*p9>&C$P|s9YmoRKXlN@8R}|MtI_yY zDml8Gq*i0`t#q?yB{dnRNbpQ%VroR!np%U50I4K_6<50;;?B?=x7%tLqRUO1bYJd5 zkM%D0Snpzg>pj9uGUIoBF@6SJR-!oCYbAjI%-LiW-{uZZu!O_h{u(H-QFl0(%viYtg>W^kgPh`2Hg>E2Bt2cmRHvqWaa92ei z=Kqb}#g=8bdZUYjF|9DTf3E0(5o1^C9rPSwau1Igl^8B&d^=ol3}7PSLbkgTNSudo zx|+qrnoC8fNUcJX&A6LFjt#<6m>G9!+tJZJ;9IV094A7I6Fk}yamKg4hAMMJzyXx` zCgms{KE}FO<_1*6bxmUSa~>DsfN99QU+Q=z)5Wzpy@y2~&H&VF0Xpew@9$cRiw1@f z9tDf%zHR*nvR|f4wahxDS85P3;4+T z1=$aHz!lGhN-gt*W?P2Q%{MRJOOYC6(AI*VB3}^oROIJN91weYYO?b&&{Rl%SBtjQ zY+#QS$cX&rG(`hT7!1h-9vB;WmEchpVx6@@{XTqHz4LVlc#dSwU@QQ!tFfURX{7l*Gx z3VhY6YY3cMapDuFzDnz#9&^no$lE>cYoeEBoTfw+1X4@#g<|^a(x}{@WR)OW1%9?c z)*;TIFwr}g7rp{lb6*Uz8mmw1=2^*GWuE@HA?>h07OW8rAXtQuJjP38@iJL|KFkB5 z)+ZXOIU1?BCQ}Ti#4!;64~k=a4$KWyW5m$Sv!eL>C?Y)Z7SSEeRcv6Fq;e#P{=ShM zbGPUlxeH8kPRUuudNHB3B-RHcUi`+v6_93$qjkNzi_Khd3|U>Z8060SJqM+Rfk$hM$O4|H~V7<3xM zNjeDa*3ix1wC^1RtiNYfHeWwJ*1!_OXg+%3O~^tc&~+u#Posb0A;8&>fPzRk zCNZ259BwuqdCtjsu6o!}RLGi1tY3*`=`80&7*kt!u?@B|#OmL*o8V#CS38;mq`xMX zJ%UxOzwy=8Mw4UBN_dBnB{@}%H{@W4_<8e$~#Qgo0 zI~OA1o_w>A8I+I4QWB#c0m>mDRVd=ka$L9@8-szmSp`NZMdPk?3D?BV!=zwMG2C@O zbM^P<5{j@PzBuxLsYMhir#=y)+cw`<&9V=x+L9Dek@&t*-n}+fKuxd-$*2tcArr{Hlu`RK<>lO_B&g zTyvI>=`3D#sH)2Gk|3!vst~!)$9N@+MuJ~zHVgbrqU&-1@$nLc*I`8Nv(5}Zg@s_u zX@cJ5atH{WY;zKC7d8Bx1-v7Pqb}nreSJm5OZkLr+3F%$G9vb77|D5tM}A-iSS!DE zI5JG|rW^DSGwM(T9C3?=KysunE;=dY7!4|+{A?sn&Er0gl(NxMy1zraG~A3EkQm8^ zqLK{|mC(PQc=j23u1N7X6%PIkaVO2pFJwZVGK3l{s|dC%p~nzM3)ns?dA)~8u|hUH z8bNAg=Z9F77nLJ`>SY9r1|~@tmIUVLjSHfYL^>BHAZ+94*z!psJ%Z&E4*@h{2H58;x7x$_w}f2;uWAeCuV^iL)WlGz{mhIvO=LvrzlGJ zvkXpaUKf!i z%l3zF^K>l?YJ{87h}idj0F{jmlp}Dv$c7RPO{FfZJ@h-?IFx*u4J1E~A38~Aj4Xl< z(*bYq7#ZIl%`$7cU6=eALot?~bF|J;>^SNo&SYhjqV`E@G%bhrF%&&PR8$a7dnOH} zXU}GM6^;hUKaDo=s(K(b<(y8-seAwsjlHc6ECx=4IYI`ssZua$ZSdQa!@XYw%B{-hh8raE1KqER#Z4uaQz+vq-G#Wmly)7 zqrV$I%;y@Jh0uYIy-|P+!^Vpa`hT)i!5Jl!g}`i5R&lMTtrcv~sSX^jGkkqe9zt$p|WBu&%_c6!NfKtqndom?f^R8NNMCKXR zc?2~>Q(DEUO~d?!bRD63b$=$l zZANtbv>*it2WysDjRA3j7IX!{7W>SeHNZEhg$O?3kE*)bLVMQ81Y0wE*4R+tPu8Wc z8uH~n?@<|EJA;)s)n$E=YO@W!QGqyZ%8ISi^d_WkH~A+mql8z^Ijf;}7bcQ`Q&yRD z=vs|cFYIMVITeoT8#8?t3>Zpj0Fcb-ilLfkGx66a&QgbG6W)bMacqqXU6J{DPIVmY zI=Qj@m;yXCyDL#51?_rre8};g4SWXQgn3sD=pwG2mtjGNN{u^S)B z@QvQw(uHsQ@x?(&l}-JJ43?6R96fa;m4VWntA@2W;?Ue`sl%kO`rYG@j3zc?K@w7i zO7U9xZf+@~r8wAiNw5KCA(|>wiq~l1XelXrof@du=|Lt~$Pd(4p)gQq#lboo9gHjs zV}sFUVSFIMEKCeYnT5##=QlOr{H6z*Uok)6{E7n+OK~t_DUJ@*+1Oy6ji=q|$T4)1 z0IbUx24glc;apf>-D4XSr;^&~W~1r$YCYX8_(`8LA03PdjTQ!*`Dk%FGanu8w&tle z?&yGwX>>5gG&(3_8l4gaY0qU<&Q3kj;&U8D>(uVDel?+H1lKc3dM6g z-??}^aWE(jlR?n(ZV+g`gJcM_yc-0vQIi3X;;thg5n{TGfRuNIKsZJh2&BB{98R0f zdZim2%93cU-Hp{mcUv+9TAn6SQ(PKY+S-2%38ze^I+PQXPdHvkBRM9;v}f47+*f|- zg6JPrD26gjhoDB%ORvxbfq^YKnGQ+Ul#o-Jw}cBbLdQpDe^E)khX7QA1d8&PjsBcl zQcV-yng)*ol`2xkz|kv`hOg0qpImK3!fD01GH{HUd*ovoO-GhJ3S@!B1l({rfxFXf z>M%F-wPr?K0okMCY&2L2Jux)ZuF_+Jm`bV|A1q|>s6!rhgvU>oiL*T9VgoPQYCYbE zCK#CD#rJ)IPW}RZjS!Rn zB)5Z5Et!5V=Ih1RL)vRs@*(kMcuvyNL3o=HjAmF4j~HKXPcdt%~Jt2j`O_ z&L`93{HZ5X;JkZeJwbk85#xk3_w0BVUBC+4iL;ebn3@Wz`cEQKzv2}b89)k@eUKak zz!&<9{+Jy9F|MbRv^8h=Bm{zVt;UWBJn0<&|GkMFs&^qSukrgvH(3aGqY)E{sT<*N z(H47n;nEv+3aORDWNMi;CJSjv*Aht|mb~I>)3r{}G>W{ei&a~#M0|^* z+AOLs=z|V+BxYgKrj`-tCJw|Tqe*?;ruWnkdn5`=ZHYv25O^bF>TyNO^xDmegp}8O zR9L3j0}kjju37$&VXn%l`5r*xR-V#y3UAZ2m(A()T(6Mt`wHwQdQ5YVB-EGs21yg? z_1=u3m@cQd#z#npeeJK%w2lRBGTHR|il>;!YRAqamJCt{Q!4ba$i;1)ZG`_2rQt3g zZ9zvrooulu8^KMA-2{j{j$L~-^|=-kVyWx7=J&vzYQ48Y-@(pC(}%Pg>tjER_rdg- z?I<5Dp`UMXhHqp<`>07JXC0G6#U>gFT20wnsG zqc57O+qCf`u@KJ^OzqxEI7^oOC~~5D!^Vz7!!kVr%WwkF)O!{BR3Pan4``Yj)Btj{*vXGimJSStc1W1+^7KNH1-@Xr ztW@Ot`swnut;?5y%hY0eOjeBUiba7s`n`mu-Wj8Pko#Dld~l8(P-(bedh9nH*Q#UN z1D<*T#Mi&^-U|@wXn-|H81ldo2>UP{DNbyYH_@SZ@JnPoe&P;!)d-xl3*M zQn53N`X^L7^>*~1~RLpaup&qw^f#(cW?L%*8_N@8Bmxzw0$Etk?7-vR(}vYdS>I=yjCv-R%Bh z;x9das)!gYO#i^Aig1w-45Vq8GtV4(;7o<1>7U?6`*?yI?dJ*3!S*tD(b^rQnb=91 zqlY6kTU`nK&G;lO|65gRqZ8@LrVk^%(WySj2Ag0XwJTZ%kyz4OkBKf1h2B07A<`e@ zv3&;(i$xDc|eEA(_?B2Gv#uhJ|I9V99lWET#msf8Y+PaE8B%63a7 z%{*LXkKQ-~A>y3HEY2Xbe$T+~-lz@{FRV;#{Ne<&sZcy}i1_*9-`X$T+`92m`{K>^ z<*V)6>nIlrU=BI99$Quog+ym{ex70%HJBo@{s0w_3ZL&2Z|6VUXq!Z0Fslo3#mLtcd_Bu3l| zaWj098O9AbDBlJsJ+es{q?nO-<|gUK!u|^5iPws6iw45C^zF=%lY%2)o}nUt1j=|k z2quW91~Vpt5s#CB<`nEb*sabCn)fzru=^l9UxL$KykT_0o{zIOOSDr;dKu}Wu#Z=Q zC0~9LPUVI8bPVjM;;_7kT`3!5`b@ZAfIcp`G#8>fK3jyyGleDKIA$bvGUwwPlP-cq zY9kqmNF8(lO-@Wfxa9Ht&q%c7>HN&BCrh*o{TcM5h2lQLV&XQ^3alvYvrMZ zE|JK%kS-*&pU;^VmiE>|g) z(hPOgp}JA-t6^CU@2;E>3~jzV*w#w=IBNYuD0U0P6am(-twlJG(}!A%fcTMz<8kr1E|FuP zbTV`oj$Z2)BBm?mXi)Kl#s(?%8BT5+(Asup&TX}QR0Hpo_YmoN?Z zja+q6L4i6xlmVPZeIFQgV%~Hi1-N)dbvvbco>SblFB#k6TU^F|n#oc~sGeFqn%=&+hn)y;YJURV#Q}dxuH7^> zRmc&aKKN1>rKeBzUI$O=28N!aecki)YbPf0`yT_qnKy?xHUSe+Gh`0E9Q|`(@lhJ@LexRmD5F1-FsCz0kud$-A!wn83D% zO_yXz=GTQ*44%U22|p8a>WdL2>6MgwfC)Wl2mP^G6BsOD#*X-rd$B{K;ufIaHb;nr zNc95nq>SP}kAz>i!|&Uv-3uVcN`g4um4OnOm*Os^&=&y%SL`JDZFjL(Rn0|EX(b>p zwLLk_&-VkNk7^3y5eWZfFZjMX9ndW!rhH)f;mpr5#qdbOXgWC|2=v5nG;8zedfgXnNmzf8CzX}e>A%Y|CpFms?z>&gFLFKI{8s2MJx4MCQ#4* z^2njX&xQxzJ-t^?g9o^eKr*_F{|ZOnoBT^O!884nDRUCc2Y^~4Z=y7fwj8{Wk$gkd zUT>mo8wV5_x-cia8M5;y)tlUY?@i9BtA;^d<-Aw%-YKkmX0D^E#FUxS!g;j9L@H!W z>pLghwuTZWxvoQr+;MB{4;jo_pQiEXN~o9*<#2w?s|S3_``e3Ox4#rL_HsGmu3$Wx15L&BWniZP0QOe80 zAo#q9!8(N6#5ZUmY&f_}uMyB(_Pv&fm$Mi*4wGEc_?#aYa330*jaECsa#aTlHsUuQ zL8AhWg8KVQfT7Uhh-l#fj)D_JMp2YVzQAZZzZ1U=+Q+JqwALeIP!KF%V64H3s}dD> z(r9eL)!K++2RtKhSSBxP3wP3x;Src zeWr{1o-@Ij;I3lmzrk}Lm6LMuQ$n)19(EbqP1Pp%lQyr12}vK8BK>B!8{A|A+=No6 zlVfdY6fMK@-gn3|pjSGl+SOkeiSOj2)D(hk8ey1cgdt>cT8+{Aj{PDGcomzi zmz>s!=WnUt)v?)30S~IBf!7;UA{0^9OaLTS>WXvCwhW`9c1vsJRoPWzA67Hrai1Kg zzJ;H!4n1l$9im9;W~U)3ilW+!PF8T3;(dKUjv%0pTFV$5cY4?Ifo8?Q7+B>-6Z6vD z$7r4gSiOfsss-Z-X?1&Ng`(Qs@j@}|F?*Eg#+W?<)1W1qB*aA|r(i^bp1f#k5|X^7 z`H;}Xd8lP{haHj-basXc0E+*`zxZZ&nyECMRlhFiFSrZ}>~iZXrmMEPC_I(bo4~R{ zvE<7`ORn1(0fi@aTp{ds)8BSJQLyWNBsMqu&OHQD1!zndZ(@iPnBd}?Wn*7j;A+zn zN*p}gz`8I3`k42Sr!q0XV~p z(Y@E7P{0m&CG%2bFV|t1NQy8C=}iaDCX=e3vJGcvBD05~Ml2%|Bn;R>s*P37n6z7}1lq$X z+lbGN;92a(Km|kF1jM6*XbjDu!dS8^ds3nVndCuQar%kCGTx`_dYqnvq0oQz?(OCt zGA|*ph(JSj+Yzr#z|$Ja`9|AcfgkrmN~E zJxg{v6Y>;5LCggs@1KkGz+GDG`6~NRYlJeSoQ@P% zedNK{6YL}R0=tmqc5!Ndh(w==;3a{@Q`w<_`|;*s0|EmY68VV8NdzXD#x29&Pjgn& zbkV+mm{wHX^}eT%*|>94Wt!n#m@T_6{a`brYU^E?7*T=HX{9|#dx*X1<8bu|7#t0$ zhI~5+A$dIc#Nwy%p~w;fuo3f&#|+xz& zHb+6n$-apS&ED)Vefp2as+iPcp$k2ELWj4aR7~MQzx5ezZ-;2ZhM+H=?anUHN8Dt* zmx*{*!3qb0NM2V$0J}U&(?=G*ax2n!I};?2N3pXUT$YIQaNJf78DhZ|#Qzy2h#zMr z7P(zg$bv4J|IfApokx3!xm^m(WeKbWBI4lV-t1|4OjCOAEDsSwV3A}}s8+m=Ll=^y zgDrC3iLVr?vNOE84{n{x2_v3g6TU+ZV}WG{pX0dp_V_lJ;Tu=2(7unZOIX2?`#h--y?&L^T*!?|8s5CS)y6%zCR{N{wpJR7Tb~h=c3Yx8v17y8!uxUyi{c3 zW3Zh>=%VRMTsCw+FoS?I>f}@l-tPUaU^P}FvIl$&)jQ4%Q9?E8=TO~a)aOYIF%lE0 zr3RR&f%h#cc`jB`=I1%paj@&;#`0rIgCyWhOw!K6dr)zPTz%-@bXbF=Z1>c2ggSsS zQmJa0lV5J{-m;1IBJfu3y!S%;-re@sAGI%j-G1?Y=e5sC(dMf+H}1Z&`Rek=m)uWI}H)!0h5Wx1zp1C1a$t@h=s zo9h>7Rk{rvw6=!4z!)>gVOHTJ21D?Zx$XxasE4@s8?{;tC1KOsN>ew;?t#}diOf%C zj#O-HzOM~6Cu6k9#=VcC#B)C<`7dMcHNXua|fQVo~(ag5mNYGa-baKZCA^al`L*2~{Kc=1~2oi97Df6kWV(i>YhZf@N9j4dSa znEQW(VBfdi-uUJ+za`t(-fUlaz4OLbjJx=YL*h--r6z{O{&Ex8JvM#k_0Kooej&W| zV-|+Swe=)avR8dOt;k08kK3AMA6B&`iCV`BXDoRA!RNSS8Q6dA3yUTc>D=KXTyQ9N z0OJdhtB`&eYaxG&{3U=veT)^=fxO8Q6;=VF_qLQJE6N=!C!Tt|I6i^4Zr#|t^#(mz z=$Uf&Hu_g}Sv^60#@e^u+k6Eu-Tw1?4_>_HHEaLzQv1%8&0BAD{`uO&^(&oMZ+EUd zzj5zg=Y?zS4?k&tevPhVaG2!$mUr$vc=4L&8}V^0kUqgTL`~WxQHZ$KmhM>G27zI9`Fj$ERzBLZL?L zPZvjPQ$=+Q{#GjmZ5&sJD-+Wi0gP)EJT^Hs0e|Of zT4B1XP0$YWnp)5_@^=+a7qtm8!!dPoY-&tZ$w0J9UY)LzI+GK%>8Yuz>UT0dHHyaz z<3%#fsnLQqF;OMx%I8OmlNy;}r8Yi2S<~n!CvZMrsgYS#$JNQ{!Wj9UpU~8a(Qz`^ z!dP*-I6X1xcT$|JOy<=og6|?OREmXB0(h)i)F!GmGP3c}(W!j3KmbpS=hey4@i98$ z2{o@)$ofnbw4yd$q^K)S7K_?cuqJA;Qo~bffzG6$PE3rEMp|*KGF6$(lfNe?wDE#U zM_-sO;wi|YoIh8cn4Zp06iJ7*u{<6fr-LozCsZ{*nfE&>OsivBp+In7z@w8BTAs|L zI5{>oIXOmVGCEetSF{SFu7Z}=Dx||PT%A(YF}fy|X-!kd$XZQI74bx^HtKgWIW|?B zDq=Ft$tiVwVw5iG)R;CkIaQ!kq-m4+BJF%SU%|CnjR021#`6;zCNr<#+O#@aW9v3q zn4GE=%O-Ukq&vyBTrfge`V=*aq2%r>1EBX9`Uv}`1S8@Y~3C_jsIv>z2FW|6*cpTGxyHLnwe8R=zSM|;uO z0t~D;Mh3}!M*C2K6cr|7ii)IY3QEL+(FOmYiy0Xi655X@#-c-`^K|k=Kyz*BSMxd= zL51-J8BJ!(1f5i@*Lm)?OJbBxf^e(PrBlE`u&APICXGlb1e5iUnK>9VC)WmMG{vE!#h>2*1zDwh*W zYH@rb2*m<>>#1ashn^V|YJM6|Ob}jQsZ30&n4Vyx+61nRPSW#ze5_U*A5~?(;dmjB z$BUCSDvspGC#I&zDORXWjaH{sDi>97UaJJ z*K$>ZFG#xDQfw1kN5o_v$i5Pywm*WsR1mbps?{9q@_q3lx-igi@Dgzgn;2J#gW<#& z8WCog)WWquLxf7`sOl~$b={OG44EHsHrkrPRv;G#spvE-D#3AHW-zm|Fn~lD0gh<9 znAboLJzj-ql?a~T5;HLtiz*t%j+YfkLl73?E5}ocpmYxDpuHPG!>q6E{Be()xZW*9Oyhh-hKOkUBhK5#V#G6=!UhLZWypr z_(n4F+0#Ij+MP-xi`{i3;}h8!L^0U92?%zORM8hluvyhr6UIJL(cNs^YJk?8@!~_O ztNv2QD{LYP{U_84>H}TTb441TkSTMj8J1;B!P@4?Wr+O;UJ*zVysoe&V5U9*a@+>( z#FmM8kDz6aCRswRg_iKSD0g2X;j6riVZK^4Mns*8N~pfzh0nnrerjG{P+W^WniVFp zN<*!ZfJ)Moj57I5HgWrKN0>0oR=fg~>Qkup15{&z=s{|1-2ZO#)tgi@=|hd;tHMAx zeMs;cKXDT|L-s= zp)s@<74k*@pIi=&9eo06OHK2v6G$7;!(Tit_EUu>*tNvmT?jN5M~pqKd1r%vqWgzL zFg%$98o3Dg;*$zyv$P9^F!v`&iNv*_Xi=CX6q2{t_U5Vwr%^B#eoN(YsB`;T`@|58N{C4%omz{l}9 zC+7uu!Vbl~(r7wMB&yRa7l`) z_%wiY7uz(B8xW%1)Zp)a+SPQ!#r-xhtNk^w>=CSL{Y|K@Hu|b><7!jGX_`FeSf)bx zp?clU6n!pQKPY!lRAc)jRMRoAR*tS3{;d6tu zcdc!7?pmq3UBMNlYSl;ZISmt|00{Q1olVsaQb0LawY8-Yaz;8zl>})WuHw zTBxadPPZH{FmJBu>V}ge-!eg+y%01^hghmqCW1WntO@x#qWPb>R%`Hp_Y3U0*mnHb zzspU0PN*Y1C&@97VRGo@G6*BgMoVA0a!uQK0$^cVfG-FDNo^_b=GuiKvv`ey_=sN1 zXt=;ks(`+hogB^{&$0QI#KAUc4JYx=nz$J2m$rcH&%kjmgJ@7KuXQ2WC#w!Zv`nb*DexAsdn zAG~;V>-KA#@7!r${HIru_azAtd0jn6eMIP}3V9xS=iLkK4?m$0JD=X57Kom5#9lqA z*MWS9IVIPMA4mJv+nqPQqOUJO!$X+leJvF8d7(en=H6FZ-@V^?<$|{Qe)?m#=m{`%C-Xn;{?^dg|)AIm^_VwvA2K2Q(4I zEgd`s#I=WxuD#y*>JlpvCZ|?N5Mt9M^k+LWL|u4PZAe+t@Uu7DzrESHeQo2;-vX7? z<6VOyEV@e$vGfyTrzi9-)4_PAZ!x3L>vde!$wO{*D9Iv5cWUORKyCa0cG$je z(7|&{ka8Y81DBRngBu8?CC9aFtY}u9q_Y7cf)9^#%`!5AhS3Zkkz68*q6C*rX+Gmb zK=~H!QMdY-3?w2sQLU42Vo7ZsBZ(c)pO2P!`2?~eNs2N};0eF&k@&}d_a41a3ES>3 zhR$GrQV=BkVVD|8!7nsrB6{40>idZ zXyCjp@Wb^h8|!bjFJ9Wb`^m%gw>MwC*}3$!Z=H+|1VTGHfF9g?bL-ZJu_%n+{OBMp z4)GMkl1Buv&!0zU_N=i<8J4CJ%~r#yi8`dVdTp);?pwTY4f$Wm<9eHu5>Q{ zwf)6w)R*S_$x;-hqDa!7)=!y>x@RuRm!Gj|z&xc)Ys0=={P zmrNMzx8H8udFjDh*TKE&r4QN{KcY8adO41qDk66}z<6%lB{v&M$;1mJ@G46YJsW;U zXR-~8**+MWW<^P!1DWOF`$8AWu&r|5f0`S1^h{HM;J=c$B!ofUCTXqZv& zoev&7|Hq9xciSJn{@{<_`a6x8*N~62W)wLoT(-EOoY2ih0|%TTErmSQTwK)6#V1t_ zBRblL>u*yBNp@%x6Q2hcE_Yu3E1T5o-?Z1S@iX>JfF7=2+7E^u57#e0Tz~t)g}1l9 zdlAh&iGF3-XW;>GC8&KDS~ zxQPQQBgP{KN^#)g^h$J`CoOK0hjbfjZe%^9r*>LOXr&~IL%O3`b~PXfidIx0OLJxG ztBZj4>7!4e_UB&!Az%7^`%iCpY~~V(bhj?IFW%g^|JH*SuW_o-gaxV6{^Azn(2)~! z&mKQ?ni~7?3o;$E9@D*+BMDyeijXH*bB-8x{QyhRzWCL~z1O{kxYGH{h0gmQ@jDaP z`tSbNE(M=l#=T zK>4IAp={iH#h*R6vA=jXgn;%pU&RpwsI#9WF*>61kF%uLTuD5+{rbbhsgGW-O@f3N zq8Go5ZnWYr6`Nd0p1t?U=Dp86%3x>+br?qqUC4|*-rTxE!dScluPEd`-TwNcjr;Gy zyU(TT?U&vMY9Vi24}N!l>+|1jzIxMVe-L7gKB(0jVEH43wW8rmHMLSy&k?_iXoV3} z$c97@GU1+^pgRKiHy`3l&z_Aqy+NX=P08G&jHG>#wD{nwRHCnw-S+#{*XU$;YNi&y z@w_9PW_jmiM_<`MrC7EuS{cb*f1^#~_+DxzIUN?|pntjdG(Z4NwS1RsWn zLmfRP2%@oL@{BxC33U@Z7QHSv=RzX`I)GW^41XmX+Y)K4J

KL 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%0AXR4<+WwJ-qrt{X~lz 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/577.b10c6bbc.js.map b/frontend-dist/js/577.b10c6bbc.js.map deleted file mode 100644 index e64a23db..00000000 --- a/frontend-dist/js/577.b10c6bbc.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/577.b10c6bbc.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/utils/pathValidator.js","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./node_modules/image-conversion/index.js","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?61df","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?d5f5","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?201d","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?adb2","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?d2e4","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?420c","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?f120","webpack://sanyue_imghub/./src/utils/upload/urlBuilder.js","webpack://sanyue_imghub/./src/utils/upload/sha256.js","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?bdbd","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?be1c","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?69c3","webpack://sanyue_imghub/./src/views/UploadHome.vue?728c","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.imageConversion=e():t.imageConversion=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=0)}([function(t,e,n){\"use strict\";var r;function o(t){return[\"image/png\",\"image/jpeg\",\"image/gif\"].some(e=>e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/**\r\n * 路径验证器模块\r\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\r\n */\r\nimport i18n from '@/locales'\r\n\r\n/**\r\n * 验证文件夹路径的合法性\r\n * @param {string} path - 要验证的路径\r\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\r\n * @returns {{ valid: boolean, error?: string }} 验证结果\r\n */\r\nexport function validateFolderPath(path, { strict = true } = {}) {\r\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\r\n if (!path || path.trim() === '') {\r\n return { valid: true };\r\n }\r\n \r\n // 如果路径仅为 \"/\",返回有效(表示根目录)\r\n if (path === '/') {\r\n return { valid: true };\r\n }\r\n \r\n // 检查路径是否以 \"/\" 开头\r\n if (!path.startsWith('/')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.pathMustStartWithSlash') \r\n };\r\n }\r\n\r\n // 检查路径穿越:包含 .. 的路径段\r\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.pathTraversalNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径中单独的 . 段\r\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\r\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\r\n if (dotPattern.test(path)) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.singleDotNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径是否包含连续的斜杠\r\n if (path.includes('//')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \r\n };\r\n }\r\n \r\n // 检查路径是否包含非法字符\r\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","module.exports = require(\"./build/conversion.js\");\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=550797ce&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=550797ce&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-550797ce\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[18] || (_cache[18] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","export default {\n name: 'UploadSettingsDialog',\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=46fb0fac\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=4848c2b0&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=4848c2b0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4848c2b0\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.array-buffer.detached.js\";\nimport \"core-js/modules/es.array-buffer.transfer.js\";\nimport \"core-js/modules/es.array-buffer.transfer-to-fixed-length.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.typed-array.with.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-hex.js\";\nimport \"core-js/modules/esnext.uint8-array.to-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.to-hex.js\";\nimport \"core-js/modules/web.dom-exception.stack.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', file.file.type);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', file.file.type);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', file.file.type);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=37f80c81&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=37f80c81&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-37f80c81\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=0ff63416&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=0ff63416&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0ff63416\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"toolbar-manage\"\n};\nconst _hoisted_4 = {\n class: \"toolbar\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_8 = {\n class: \"dialog-section\"\n};\nconst _hoisted_9 = {\n class: \"section-header\"\n};\nconst _hoisted_10 = {\n class: \"section-title\"\n};\nconst _hoisted_11 = {\n class: \"section-content\"\n};\nconst _hoisted_12 = {\n class: \"dialog-section\"\n};\nconst _hoisted_13 = {\n class: \"section-header\"\n};\nconst _hoisted_14 = {\n class: \"section-title\"\n};\nconst _hoisted_15 = {\n class: \"section-content\"\n};\nconst _hoisted_16 = {\n class: \"setting-item\"\n};\nconst _hoisted_17 = {\n class: \"setting-label\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_19 = {\n class: \"setting-label\"\n};\nconst _hoisted_20 = {\n class: \"dialog-action\"\n};\nconst _hoisted_21 = [\"innerHTML\"];\nconst _hoisted_22 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-manage-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleOpenToolbar,\n circle: \"\"\n }, {\n default: _withCtx(() => [!$data.isToolBarOpen ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"bars\",\n class: \"manage-icon\",\n size: \"lg\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"times\",\n class: \"manage-icon\",\n size: \"lg\"\n }))]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button compress-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openCompressDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"compress-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button link-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openUrlDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"link-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.manage'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button config-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleManage,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"config-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.logout'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button sign-out-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleLogout,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"sign-out-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"a\", _hoisted_7, _toDisplayString($options.ownerName), 1), _cache[21] || (_cache[21] = _createTextVNode(\" ImgHub\", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[22] || (_cache[22] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[23] || (_cache[23] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[24] || (_cache[24] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", _hoisted_17, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[8] || (_cache[8] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[9] || (_cache[9] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[10] || (_cache[10] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[11] || (_cache[11] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[12] || (_cache[12] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[13] || (_cache[13] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[14] || (_cache[14] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[15] || (_cache[15] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[16] || (_cache[16] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[17] || (_cache[17] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_22, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[18] || (_cache[18] = $event => $data.showAnnouncementDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_21)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[20] || (_cache[20] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n isToolBarOpen: false,\n //是否打开工具栏\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', false, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n\n // 首次访问公告\n const visited = localStorage.getItem('visitedUploadHome');\n const announcement = this.userConfig?.announcement;\n if (!visited && announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n localStorage.setItem('visitedUploadHome', 'true');\n }\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleOpenToolbar() {\n this.isToolBarOpen = !this.isToolBarOpen;\n // 等过渡动画结束,向active类添加pointer-events属性,使其可以点击\n setTimeout(() => {\n const buttons = document.querySelectorAll('.toolbar-button');\n buttons.forEach(button => {\n button.style.pointerEvents = this.isToolBarOpen ? 'auto' : 'none';\n });\n }, 300);\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=f50dcc42&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=f50dcc42&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f50dcc42\"]])\n\nexport default __exports__"],"names":["t","e","module","exports","this","n","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","some","a","f","g","w","b","PNG","JPEG","GIF","Promise","u","next","throw","done","then","apply","toDataURL","toBlob","split","match","atob","length","Uint8Array","charCodeAt","Blob","type","Image","onload","onerror","Error","src","document","createElement","href","window","URL","createObjectURL","download","Date","now","toString","body","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","target","result","readAsDataURL","h","assign","getContext","Number","scale","width","height","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","y","quality","isNaN","size","accuracy","filter","sort","abs","pow","v","_hoisted_1","class","_hoisted_2","_hoisted_3","key","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","visible","popoverVisible","$event","placement","trigger","transition","reference","onClick","$slots","undefined","error","icon","fetchDirectoryTree","$t","_","ref","data","treeData","props","treeProps","currentDirectory","onNodeClick","handleNodeClick","node","path","expanded","name","loading","args","openDrawer","modelValue","drawerVisible","direction","title","String","source","validator","includes","children","label","windowWidth","innerWidth","computed","watch","newVal","setTimeout","$refs","treeRef","store","nodesMap","treeRefMobile","$nextTick","setCurrentKey","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","methods","response","fetchWithAuth","method","ok","status","json","axios","withAuthCode","tree","err","console","startsWith","$emit","__exports__","validateFolderPath","strict","trim","valid","i18n","global","test","dotPattern","invalidChars","isRedirecting","async","url","options","credentials","headers","commit","router","push","finally","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_component_el_tooltip","show","count","totalCount","content","circle","toggleViewMode","viewMode","clearHistory","historyList","onScroll","handleScroll","groupedHistory","group","date","items","item","time","isImage","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","formatTime","hasMore","loadingMore","spin","Boolean","allHistory","pageSize","currentPage","val","resetAndLoad","groups","forEach","dateStr","getFullYear","getMonth","padStart","getDate","keys","map","savedMode","localStorage","getItem","loadAllHistory","loadMore","history","JSON","parse","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","removeItem","$message","success","catch","stringify","fileName","imageExtensions","extension","pop","toLowerCase","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","open","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","dialogWidth","uploadChannel","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","Array","emits","set","style","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","components","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","x","processBlock","block","H","W","s0","s1","S1","temp1","S0","maj","temp2","createSha256","buffer","bufferLength","totalLength","update","offset","needed","toCopy","subarray","digest","bitLength","fill","view","DataView","setUint32","floor","hex","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","scrollContainer","setScrollTop","deep","immediate","$store","location","protocol","host","handlePaste","storeAutoReUpload","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","encodeURIComponent","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","delete","fileSize","totalChunks","ceil","precomputedSha256","initFormData","initResponse","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","fileType","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","etag","partNumber","progress","completeResponse","oid","img","canvas","ctx","originalName","newName","webpFile","revokeObjectURL","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","clientY","top","opacity","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","normalizedPath","normalizeDirectoryPath","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","parentPath","isArray","child","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isToolBarOpen","handleOpenToolbar","openCompressDialog","openUrlDialog","handleManage","handleLogout","useConfigLink","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","updateStoreUploadNameType","validateUploadFolder","strictResult","storeUploadFolder","userConfig","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","cusDarkMode","getters","useDarkMode","visited","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","$router","defaultValue","num","parseFloat","authType","withCredentials","buttons","querySelectorAll","button","pointerEvents","handleShowAnnouncement","info"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/577.b10c6bbc.js.map.gz b/frontend-dist/js/577.b10c6bbc.js.map.gz deleted file mode 100644 index 69a61d34efb379f0d7d01dcb0a9dd2d8f06c2415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67955 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 z 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 Am;e9( diff --git a/frontend-dist/js/600.08192622.js.map b/frontend-dist/js/600.08192622.js.map deleted file mode 100644 index 56e149f9..00000000 --- a/frontend-dist/js/600.08192622.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/600.08192622.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?6d4a","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=466b2b5c&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=466b2b5c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-466b2b5c\"]])\n\nexport default __exports__","/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\r\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.src = ''\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.src = ''\r\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.src = ''\r\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","createElement","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","defaultImage","require","imgElement","imageSrc","zIndex","showImage","requestAnimationFrame","preload","Image","onload","onerror","computedStyle","window","getComputedStyle","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","disableFooter","thisYear","footerLink","Date","getFullYear"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/600.08192622.js.map.gz b/frontend-dist/js/600.08192622.js.map.gz deleted file mode 100644 index 72372d281e989e61ca82398152dea580c519a23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10858 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["_blank","_self","_parent","_top"].includes(e)},alt:{type:String,default:"Sanyue logo"},customSrc:{type:String,default:""},position:{type:String,default:"fixed",validator:e=>["fixed","relative","absolute","static"].includes(e)},size:{type:String,default:"normal",validator:e=>["small","normal","large"].includes(e)},enableHover:{type:Boolean,default:!0},useConfigLink:{type:Boolean,default:!1}},computed:{...(0,l.L8)(["userConfig"]),logoUrl(){return this.customSrc||this.userConfig?.logoUrl||n(33153)},logoHref(){return this.useConfigLink&&this.userConfig?.logoLink?this.userConfig.logoLink:this.href},logoClasses(){return{logo:!0,[`logo--${this.position}`]:!0,[`logo--${this.size}`]:!0,"logo--hover-enabled":this.enableHover}}}},u=n(71241);const g=(0,u.A)(c,[["render",r],["__scopeId","data-v-17f54292"]]);var d=g},6834:function(e,t,n){n.d(t,{A:function(){return h}});var a=n(56768),o=n(45130),i=n(24232);const s={id:"themeMask"},r=["cx","cy","r"],l=["r"],c=["opacity"];function u(e,t,n,u,g,d){const m=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>d.handleToggleClick&&d.handleToggleClick(...e))},[(0,a.bF)(o.eB,{name:"icon-fade",mode:"out-in"},{default:(0,a.k6)(()=>[g.isAuto?((0,a.uX)(),(0,a.Wv)(m,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,a.uX)(),(0,a.CE)("svg",{key:"sun-moon",class:(0,i.C4)(["theme_toggle_svg",{dark:g.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,a.Lk)("mask",s,[t[1]||(t[1]=(0,a.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,a.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:g.isDark?"50%":"100%",cy:g.isDark?"23%":"0%",r:g.isDark?"9":"5"},null,8,r)]),(0,a.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:g.isDark?"9":"5",mask:"url(#themeMask)"},null,8,l),(0,a.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:g.isDark?0:1},[...t[2]||(t[2]=[(0,a.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,a.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,a.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,c)],2))]),_:1})])}var g={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},d=n(71241);const m=(0,d.A)(g,[["render",u],["__scopeId","data-v-466b2b5c"]]);var h=m},7835:function(e,t,n){e.exports=n.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,n){e.exports=n.p+"img/background.ea1b7ee7.jpg"},33153:function(e,t,n){e.exports=n.p+"img/logo.e8dbfa27.png"},34896:function(e,t,n){n(85331)},48903:function(e,t,n){var a=n(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const o=document.querySelector(t);this.prepareBackgroundContainer(o),a&&(!o||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(o));const i=document.getElementById("bg1"),s=document.getElementById("bg2");if(!i||!s)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,s,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,s,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):n&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,n){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,o=n(a?10732:7835);this.loadBackgroundImage(e,o,t)},loadBackgroundImage(e,t,n){e.style.zIndex=-1,e.style.opacity=0;const a=document.querySelector(n);this.prepareBackgroundContainer(a);const o=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity})})},i=new Image;i.onload=()=>{e.src=t,o()},i.onerror=()=>{e.src=t,o()},i.src=t},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const n=0!=e.style.opacity,a=n?e:t,o=n?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,o.style.zIndex=-1;const s=new Image;s.onload=()=>{o.src=i,setTimeout(()=>{o.style.opacity=this.bkOpacity,setTimeout(()=>{a.style.opacity=0},1200)},50)},s.src=i},switchCustomWallpaper(e,t,n){const a=0!=e.style.opacity,o=a?e:t,i=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const s=n[this.customWallPaperIndex];o.style.zIndex=-2,i.style.zIndex=-1;const r=new Image;r.onload=()=>{i.src=s,setTimeout(()=>{i.style.opacity=this.bkOpacity,setTimeout(()=>{o.style.opacity=0},1200)},50)},r.src=s},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.src="",setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.src="",setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&(t.src="")},1200)),n&&(n.style.opacity=0,setTimeout(()=>{n&&(n.src="")},1200)))},smoothThemeTransition(e,t=".login",a=!1,o=!1){const i=this.userConfig?.[e];if(!a||void 0!==i)return void this.reinitializeBackground(e,t,a,o);const s=document.getElementById("bg1"),r=document.getElementById("bg2");if(!s||!r)return void this.reinitializeBackground(e,t,a,o);const l=0!=s.style.opacity?s:r,c=0!=s.style.opacity?r:s,u=this.useDarkMode,g=n(u?10732:7835),d=new Image;d.onload=()=>{c.src=g,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},d.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,o)},d.src=g},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}},86975:function(e,t,n){n.d(t,{A:function(){return d}});var a=n(56768),o=n(24232);const i={key:0,class:"page-footer"},s=["href"];function r(e,t,n,r,l,c){const u=(0,a.g2)("font-awesome-icon");return c.disableFooter?(0,a.Q3)("",!0):((0,a.uX)(),(0,a.CE)("div",i,[(0,a.Lk)("p",null,[(0,a.eW)("© 2024-"+(0,o.v_)(c.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,a.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,a.eW)(" for You! ",-1)),(0,a.Lk)("a",{href:c.footerLink,target:"_blank"},[(0,a.bF)(u,{icon:"paper-plane",class:"footer-link-icon"})],8,s)])]))}var l=n(60782),c={name:"Footer",computed:{...(0,l.L8)(["userConfig"]),footerLink(){return this.userConfig?.footerLink||"https://github.com/MarSeventh"},thisYear(){return(new Date).getFullYear()},disableFooter(){return this.userConfig?.disableFooter||!1}}},u=n(71241);const g=(0,u.A)(c,[["render",r],["__scopeId","data-v-08acbaa9"]]);var d=g}}]); -//# sourceMappingURL=600.08192622.js.map \ No newline at end of file +//# sourceMappingURL=600.1faa1202.js.map \ No newline at end of file diff --git a/frontend-dist/js/600.08192622.js.gz b/frontend-dist/js/600.1faa1202.js.gz similarity index 90% rename from frontend-dist/js/600.08192622.js.gz rename to frontend-dist/js/600.1faa1202.js.gz index 1925029e141c56fc4c0ca22646f45b1d1cefa3a0..70684457488c387acf9bed122231d42a37161f11 100644 GIT binary patch delta 41 vcmbOsH(icPzMF#q1ek<3a{b^Fl}>u|bKU!z30A^3fA!l8>Q{f!WncgR`lJoi delta 42 wcmbO(H$#p~zMF#q1emxsa{b^Fv;C0wyL#XInh93IHh=Yb8^nsg=rS+>012@T!2kdN diff --git a/frontend-dist/js/600.1faa1202.js.map b/frontend-dist/js/600.1faa1202.js.map new file mode 100644 index 00000000..b2a1a2a8 --- /dev/null +++ b/frontend-dist/js/600.1faa1202.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/600.1faa1202.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?6d4a","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=466b2b5c&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=466b2b5c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-466b2b5c\"]])\n\nexport default __exports__","/**\n * 背景图管理 Mixin\n * 用于统一管理页面背景图的加载和轮播逻辑\n */\n\nimport { mapGetters } from 'vuex'\n\nexport default {\n data() {\n return {\n bingWallPaperIndex: 0,\n customWallPaperIndex: 0,\n backgroundInterval: null, // 存储轮播定时器\n // 存储初始化参数,用于主题切换时重新初始化\n backgroundInitParams: null,\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\n bkInterval() {\n return this.userConfig?.bkInterval || 3000\n },\n bkOpacity() {\n return this.userConfig?.bkOpacity || 1\n },\n // 提供背景图片元素的模板\n backgroundImagesTemplate() {\n return `\n \"Background\n \"Background\n `\n },\n // 提供背景图片的CSS样式\n backgroundImagesStyles() {\n return `\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease;\n filter: var(--background-image-filter, brightness(1));\n }\n `\n }\n },\n\n watch: {\n // 监听深色模式切换\n useDarkMode(newVal, oldVal) {\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\n if (newVal !== oldVal && this.backgroundInitParams) {\n this.$nextTick(() => {\n this.smoothThemeTransition(\n this.backgroundInitParams.configKey,\n this.backgroundInitParams.containerSelector,\n this.backgroundInitParams.useDefaultBackground,\n this.backgroundInitParams.autoCreateElements\n )\n })\n }\n }\n },\n\n mounted() {\n // 动态注入背景图片的CSS样式\n this.injectBackgroundStyles()\n },\n\n beforeUnmount() {\n // 组件销毁前清除定时器\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n }\n // 立即清除背景图片,不使用过渡效果\n this.clearBackgroundImages(true)\n // 移除动态注入的样式\n this.removeBackgroundStyles()\n },\n\n methods: {\n /**\n * 动态注入背景图片样式\n */\n injectBackgroundStyles() {\n const styleId = 'background-manager-styles'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = this.backgroundImagesStyles\n document.head.appendChild(style)\n }\n },\n\n /**\n * 移除动态注入的样式\n */\n removeBackgroundStyles() {\n const styleId = 'background-manager-styles'\n const existingStyle = document.getElementById(styleId)\n if (existingStyle) {\n existingStyle.remove()\n }\n },\n\n /**\n * 动态创建背景图片元素\n * @param {HTMLElement} container - 要插入背景图片的容器元素\n */\n createBackgroundElements(container) {\n if (!container) {\n console.warn('未提供有效的容器元素')\n return\n }\n\n // 检查是否已经存在背景图片元素\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\n return\n }\n\n // 创建 bg1 元素\n const bg1 = document.createElement('img')\n bg1.id = 'bg1'\n bg1.className = 'background-image1'\n bg1.alt = 'Background Image'\n \n // 创建 bg2 元素\n const bg2 = document.createElement('img')\n bg2.id = 'bg2'\n bg2.className = 'background-image2'\n bg2.alt = 'Background Image'\n\n // 将元素插入到容器的开头\n container.insertBefore(bg1, container.firstChild)\n container.insertBefore(bg2, container.firstChild)\n },\n /**\n * 初始化背景图\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n // 保存初始化参数,用于主题切换时重新初始化\n this.backgroundInitParams = {\n configKey,\n containerSelector,\n useDefaultBackground,\n autoCreateElements\n }\n\n // 如果需要自动创建元素且元素不存在,则创建\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n if (autoCreateElements) {\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\n this.createBackgroundElements(container)\n }\n }\n\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\n return\n }\n\n const backgroundConfig = this.userConfig?.[configKey]\n\n if (backgroundConfig === 'bing') {\n this.setupBingWallpaper(bg1, bg2, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\n } else if (useDefaultBackground) {\n this.setupDefaultWallpaper(bg1, containerSelector)\n }\n },\n\n /**\n * 设置 Bing 壁纸轮播\n */\n setupBingWallpaper(bg1, bg2, containerSelector) {\n this.$store.dispatch('fetchBingWallPapers').then(() => {\n if (this.bingWallPapers.length === 0) return\n\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchBingWallpaper(bg1, bg2)\n }, this.bkInterval)\n })\n },\n\n /**\n * 设置自定义壁纸轮播\n */\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector)\n \n this.backgroundInterval = setInterval(() => {\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\n }, this.bkInterval)\n },\n\n /**\n * 设置单张自定义壁纸\n */\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\n },\n\n /**\n * 设置默认壁纸\n */\n setupDefaultWallpaper(bg1, containerSelector) {\n // 根据当前深色模式状态选择背景图\n const isDark = this.useDarkMode\n const defaultImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n \n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\n },\n\n /**\n * 加载背景图片\n */\n loadBackgroundImage(imgElement, imageSrc, containerSelector) {\n // 确保初始化时层级正确\n imgElement.style.zIndex = -1\n imgElement.style.opacity = 0\n const container = document.querySelector(containerSelector)\n this.prepareBackgroundContainer(container)\n\n const showImage = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n imgElement.style.opacity = this.bkOpacity\n })\n })\n }\n\n const preload = new Image()\n preload.onload = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.onerror = () => {\n imgElement.src = imageSrc\n showImage()\n }\n preload.src = imageSrc\n },\n \n prepareBackgroundContainer(container) {\n if (!container) return\n\n const computedStyle = window.getComputedStyle(container)\n if (computedStyle.position === 'static') {\n container.style.position = 'relative'\n }\n\n if (computedStyle.zIndex === 'auto') {\n container.style.zIndex = '0'\n }\n\n container.style.isolation = 'isolate'\n },\n\n /**\n * 切换 Bing 壁纸\n */\n switchBingWallpaper(bg1, bg2) {\n if (this.bingWallPapers.length === 0) return\n\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\n\n // 【层级魔法】:让旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\n \n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 切换自定义壁纸\n */\n switchCustomWallpaper(bg1, bg2, wallpapers) {\n const isBg1Current = bg1.style.opacity != 0\n const curBg = isBg1Current ? bg1 : bg2\n const nextBg = isBg1Current ? bg2 : bg1\n \n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\n const nextUrl = wallpapers[this.customWallPaperIndex]\n\n // 旧图垫底,新图置顶\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n\n const preload = new Image()\n preload.onload = () => {\n nextBg.src = nextUrl\n \n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n \n setTimeout(() => { \n curBg.style.opacity = 0 \n }, 1200)\n }, 50)\n }\n preload.src = nextUrl\n },\n\n /**\n * 清除背景轮播定时器\n */\n clearBackgroundInterval() {\n if (this.backgroundInterval) {\n clearInterval(this.backgroundInterval)\n this.backgroundInterval = null\n }\n },\n\n /**\n * 清除背景图片显示(带过渡效果)\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\n */\n clearBackgroundImages(immediate = false) {\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (immediate) {\n // 立即清除,不使用过渡效果\n if (bg1) {\n bg1.style.transition = 'none'\n bg1.style.opacity = 0\n bg1.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n if (bg2) {\n bg2.style.transition = 'none'\n bg2.style.opacity = 0\n bg2.src = ''\n // 恢复过渡效果\n setTimeout(() => {\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out'\n }, 50)\n }\n } else {\n // 使用过渡效果淡出\n if (bg1) {\n bg1.style.opacity = 0\n setTimeout(() => {\n if (bg1) bg1.src = ''\n }, 1200)\n }\n if (bg2) {\n bg2.style.opacity = 0\n setTimeout(() => {\n if (bg2) bg2.src = ''\n }, 1200)\n }\n }\n },\n\n /**\n * 平滑主题切换(用于响应主题模式变化)\n * @param {string} configKey - 用户配置中的背景图配置键名\n * @param {string} containerSelector - 容器选择器\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\n */\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n const backgroundConfig = this.userConfig?.[configKey]\n \n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\n if (!useDefaultBackground || backgroundConfig !== undefined) {\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 对于默认背景,执行平滑过渡\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n \n if (!bg1 || !bg2) {\n // 如果背景元素不存在,直接重新初始化\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n return\n }\n\n // 确定当前显示的背景和下一个背景\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\n\n // 获取新主题对应的背景图\n const isDark = this.useDarkMode\n const newThemeImage = isDark \n ? require('@/assets/background.jpg') \n : require('@/assets/background-light.jpg')\n\n // 预加载新背景图\n const preloadImg = new Image()\n preloadImg.onload = () => {\n // 设置下一个背景的图片源\n nextBg.src = newThemeImage\n \n // 等待图片加载完成后执行淡入淡出过渡\n nextBg.onload = () => {\n // 淡出当前背景\n currentBg.style.opacity = 0\n \n // 稍微延迟后淡入新背景,确保过渡效果平滑\n setTimeout(() => {\n nextBg.style.opacity = this.bkOpacity\n }, 50) // 50ms 延迟,让淡出效果先开始\n }\n }\n \n preloadImg.onerror = () => {\n // 如果预加载失败,回退到直接重新初始化\n console.warn('主题背景图预加载失败,回退到直接切换')\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }\n \n preloadImg.src = newThemeImage\n },\n\n /**\n * 重新初始化背景图(用于响应配置变化)\n */\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n this.clearBackgroundInterval()\n this.clearBackgroundImages(true) // 使用立即清除\n this.bingWallPaperIndex = 0\n this.customWallPaperIndex = 0\n \n // 延迟一小段时间确保清理完成\n setTimeout(() => {\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\n }, 100)\n }\n }\n}\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","createElement","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","bg2","insertBefore","firstChild","initializeBackground","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","defaultImage","require","imgElement","imageSrc","zIndex","showImage","requestAnimationFrame","preload","Image","onload","onerror","computedStyle","window","getComputedStyle","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","transition","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","disableFooter","thisYear","footerLink","Date","getFullYear"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/600.1faa1202.js.map.gz b/frontend-dist/js/600.1faa1202.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a0e83f9023ef1b49236a56a6476dc234d4e9fc8 GIT binary patch literal 10794 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,u.uX)(),(0,u.CE)("div",{key:e.key,class:"input-container"},[(0,u.Lk)("label",{class:"input-name",ref_for:!0,ref:`inputLabel${t}`,style:(0,c.Tr)({"--underline-width":w.labelUnderlineWidths[t]+"px"})},(0,c.v_)(e.label),5),(0,u.Lk)("div",m,[(0,u.bF)(C,{modelValue:w.formData[e.key],"onUpdate:modelValue":t=>w.formData[e.key]=t,placeholder:e.placeholder,type:e.type||"text","show-password":e.showPassword,class:"password-input",onKeyup:(0,h.jR)(k.handleSubmit,["enter","native"]),onFocus:k.handleInputFocus,onBlur:k.handleInputBlur},(0,u.eX)({_:2},[e.icon?{name:"prefix",fn:(0,u.k6)(()=>[(0,u.bF)(v,{class:"el-input__icon"},{default:(0,u.k6)(()=>[((0,u.uX)(),(0,u.Wv)((0,u.$y)(e.icon)))]),_:2},1024)]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","placeholder","type","show-password","onKeyup","onFocus","onBlur"])])]))),128)),(0,u.bF)(A,{class:(0,c.C4)(["submit",{"is-loading":i.loading}]),type:"primary",onClick:k.handleSubmit,disabled:i.loading},{default:(0,u.k6)(()=>[i.loading?((0,u.uX)(),(0,u.CE)("div",f)):((0,u.uX)(),(0,u.CE)("span",b,(0,c.v_)(k.computedSubmitText),1))]),_:1},8,["class","onClick","disabled"])]),(0,u.bF)(S,{class:"footer"})],2)}i(18111),i(7588);var w=i(60782),k=i(48903),L={name:"BaseLogin",mixins:[k.A],props:{title:{type:String,required:!0},fields:{type:Array,required:!0},submitText:{type:String,default:""},backgroundKey:{type:String,required:!0},isAdmin:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},data(){return{formData:{},labelUnderlineWidths:[],isFocused:!1}},computed:{...(0,w.L8)(["userConfig"]),computedSubmitText(){return this.submitText||this.$t("login.submit")}},watch:{fields:{handler(){this.$nextTick(()=>{this.calculateLabelWidths()})},deep:!0}},components:{Footer:s.A,ToggleDark:d.A,LanguageSwitcher:r.A,Logo:l.A},mounted(){this.initFormData(),this.initializeBackground(this.backgroundKey,".login",!this.isAdmin,!0),this.$nextTick(()=>{this.calculateLabelWidths()})},methods:{initFormData(){const e={};this.fields.forEach(t=>{e[t.key]=""}),this.formData=e,this.labelUnderlineWidths=new Array(this.fields.length).fill(0)},calculateLabelWidths(){this.$nextTick(()=>{this.fields.forEach((e,t)=>{const i=this.$refs[`inputLabel${t}`];if(i&&i[0]){const s=document.createElement("canvas"),n=s.getContext("2d"),o=i[0],a=window.getComputedStyle(o);n.font=`${a.fontWeight} ${a.fontSize} ${a.fontFamily}`;const l=n.measureText(e.label).width;this.labelUnderlineWidths[t]=Math.ceil(l)+3}})})},handleSubmit(){this.loading||this.$emit("submit",{...this.formData})},handleInputFocus(e){this.isFocused=!0;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.add("focused")}},handleInputBlur(e){this.isFocused=!1;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.remove("focused")}}}},F=i(71241);const $=(0,F.A)(L,[["render",y],["__scopeId","data-v-6b04d67b"]]);var v=$},54047:function(e,t,i){i.d(t,{A:function(){return u}});var s=i(56768);const n=["title"];function o(e,t,i,o,a,l){const r=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>l.toggleLocale&&l.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,s.bF)(r,{icon:"globe",class:"lang-icon"})],8,n)}var a=i(46638),l={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,a.xS)(e)}}},r=i(71241);const d=(0,r.A)(l,[["render",o],["__scopeId","data-v-08567d0a"]]);var u=d},61880:function(e,t,i){i.r(t),i.d(t,{default:function(){return c}});var s=i(47263),n=i(56768);function o(e,t,i,o,a,l){const r=s.A;return(0,n.uX)(),(0,n.Wv)(r,{title:l.loginTitle,fields:a.loginFields,"submit-text":e.$t("login.submit"),"background-key":"loginBkImg","is-admin":!1,loading:a.isLoading,onSubmit:l.handleLogin},null,8,["title","fields","submit-text","loading","onSubmit"])}i(44114);var a=i(457),l=i(60782),r={data(){return{isLoading:!1,loginFields:[]}},computed:{...(0,l.L8)(["userConfig"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},loginTitle(){return this.$t("login.title",{owner:this.ownerName})}},components:{BaseLogin:s.A},created(){this.updateLoginFields()},watch:{"$i18n.locale"(){this.updateLoginFields()}},methods:{updateLoginFields(){this.loginFields=[{key:"password",label:this.$t("login.password"),placeholder:this.$t("login.passwordPlaceholder"),type:"password",showPassword:!0,icon:"Lock"}]},async handleLogin(e){const{password:t}=e;this.isLoading=!0;const i=new Promise(e=>setTimeout(e,500)),s=a.A.post("/api/auth/login",{authCode:t},{withCredentials:!0}).then(e=>({res:e})).catch(e=>({err:e}));try{const[e]=await Promise.all([s,i]);e.res&&200===e.res.status?(this.$store.commit("setUserLoggedIn",!0),this.$router.push("/"),this.$message.success(this.$t("login.success"))):(this.isLoading=!1,this.$message.error(this.$t("login.failed")))}catch(n){this.isLoading=!1,this.$message.error(this.$t("login.systemError"))}}}},d=i(71241);const u=(0,d.A)(r,[["render",o]]);var c=u}}]); -//# sourceMappingURL=604.b966c795.js.map \ No newline at end of file +//# sourceMappingURL=604.ae4825a8.js.map \ No newline at end of file diff --git a/frontend-dist/js/604.ae4825a8.js.gz b/frontend-dist/js/604.ae4825a8.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..07f64ae56dda3a6f7593455d7b54f4537ffcf331 GIT binary patch literal 2574 zcmV+p3i0(HiwFP!000026TMh%Z{s!+{(iqA;RS(+(p>o^jw3_6@TMDJv2IZ`+1sLq zk!7T@%~~d1l8WOh`tJvllKisC7QGLLe26$4j)%{TW}XqsHJoUpcw*2n(2&h0Xaf&x zmMpIqxmao@wmIDM)qIgZplSTK8qd#@DW>aOFM`RWANHoC=v{XD-DsAJ#BeDBAck;U zaGC~&6r4knA32fd4SH^jq43T;m2agk(9>j-6X&P6Mc!Z0pCp^~hR_6#=}AY#}9 z7b!eNC`2V$HA-BpbJN-=wqCpAv$$BoHVR2&gr!`}TZ)T0D#?T2ZkNLvx09`hlx)d{ zEOFsI9LFggk(*f25jl%9IwFrTqh?92V@bb!BBNN)+YY&nH60B-?m2UBZ?e#B)C(_T07iuJ@ye?aReRN``n40u&cF1`VDwHLT+QmkYO*?(A;L$skYsa8KS!zS*|Q-Y-U zyiS>cXs3oE6TkgNH8y0Ou>=+}OF>0I_g2Jg*AM}<|DKTt(ON)HXc*xlqXWWD{M3)v{o?VPl(J!P|$pXl{^Y{1G0xC(7!i?paIX-%vhF>1Bmz`~GK<#Oa@e~v1Q9JDP?80WKtvS)7 z)b%qhl*Sdp zDe2&n2kk+-?YiIP#bDrj<;M1~@N&?>WNF*g;4185GLEZ+e9ttDebHX=CoXg}S<=yz ztd(5rsBmR6DjdMK#`YSb;Ln^ZNTbuRB)%Y43L~Z1_HbV}*F7{+!;Wn0V##u@WG>QA zu>H<&aXm^`TvQtGrObed#?ooKBvsH}*C#`h#-xrNuN48-8q zFJ(zAU~}SrjaGnn$E#oOJQ4WfI2C%wAxxBEZ%UD%8gg3 zvfFZxK;ogGGbv2`^{im-=?n1r!jvcV`j-C%yVVU_@oZautw?hg3%UZPa|P~2sVN9` z>}B{W>=QGMe`01q6X02p;UBtX=`vuy>eu*IrJ;V=z;5kY3#IfR+B++|o*zJ+>UBYg zPs8d8CI)JlnuDQ9CN*diAbQOBunmgYC8D8!=AgE>kU?UkYEIOg9}nUD9H=YxW3CNl zX&RuKRon7#L_S{fu>F7aP{B$*!hw@zNp4~uT(&#Cc0DGY#X(4J=*SKLlL=BF9Ff>g z$pqcs>qM^Mqh%1bShpTq{fDrZ_AejMbn1KBV|-Q;H>3TN@iE^YAN?>_`6J>9^5fWa zH$KT~e3FEbtj0uH&o!NQu)U-(Ew%wISI}}44eur2N421MY};>RqH==Zw=J3v=F;<#I&y++CP?~5i3=&wcV`ezi!RsG`a zfuNbYM!8qK53aYDkv_eDU%W#gP*fQk1|ebe=@tiIGtQ0h2ML$juqm5x*?z*wR}wB9 zT=Xx~kTnUH$7xCW?ZF^?A>mYDFsbsc<{IB-U$UQl?$d|=cu^(d-=*EbI4*X{B^=vV zq+)8BZ>4v3QIj*~WjB6yt%_dD4O4Y?9Pkc;cI~;fge|JRSiE0;T+I=&G@RK6jiS?b zL%A5`dhDNx6u$OGSw+Ad!7TkWZJBQM=>vHO(VFDU1%{D%m^k32XWpA`>CcEYb_D6mDNyJyJu}qezoR);?tw>JxlFqh7 z_X-uYjmVTS468a)<;Sj(bI0X=QF6sK1Q5T~VD9(|WNrc=7h#Ao(J`YVx|X(uzF}+r zhUI4QrvCC}7uPa{$dshmaI?5pkb%Z5TJTUzBB8Fwulh@ers2eSY2v!#IxJf@;G|uHShsdZvw3V8>6-c))ztpvH1O zhxDVR+zrWAGB=?7CtCCd)#4Rs?HWg(B%pQh&9LIc2-{)!7}fTX4Nyv|V+%9J?TCvp zEx k>ophi&%ci2e%PZ7dV|gd8_+*AU9t6l0qaAT)F~GL0Pk1~G5`Po literal 0 HcmV?d00001 diff --git a/frontend-dist/js/604.b966c795.js.map b/frontend-dist/js/604.ae4825a8.js.map similarity index 99% rename from frontend-dist/js/604.b966c795.js.map rename to frontend-dist/js/604.ae4825a8.js.map index 1ef15ca5..7086f46a 100644 --- a/frontend-dist/js/604.b966c795.js.map +++ b/frontend-dist/js/604.ae4825a8.js.map @@ -1 +1 @@ -{"version":3,"file":"js/604.b966c795.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/BaseLogin.vue?ea4f","webpack://sanyue_imghub/./src/components/BaseLogin.vue","webpack://sanyue_imghub/./src/components/BaseLogin.vue?0ac4","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/views/Login.vue?1d03","webpack://sanyue_imghub/./src/views/Login.vue","webpack://sanyue_imghub/./src/views/Login.vue?2b97"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, withCtx as _withCtx, withKeys as _withKeys, createSlots as _createSlots, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"login-container\"\n};\nconst _hoisted_2 = {\n class: \"login-title\",\n tabindex: \"0\"\n};\nconst _hoisted_3 = {\n class: \"input-wrapper\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"loading-ring\"\n};\nconst _hoisted_5 = {\n key: 1\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_Footer = _resolveComponent(\"Footer\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"login\", {\n 'is-focused': $data.isFocused\n }])\n }, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark\"\n }), _createVNode(_component_LanguageSwitcher, {\n class: \"language-switcher\"\n }), _createVNode(_component_Logo), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"h1\", _hoisted_2, _toDisplayString($props.title), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.fields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: field.key,\n class: \"input-container\"\n }, [_createElementVNode(\"label\", {\n class: \"input-name\",\n ref_for: true,\n ref: `inputLabel${index}`,\n style: _normalizeStyle({\n '--underline-width': $data.labelUnderlineWidths[index] + 'px'\n })\n }, _toDisplayString(field.label), 5), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.formData[field.key],\n \"onUpdate:modelValue\": $event => $data.formData[field.key] = $event,\n placeholder: field.placeholder,\n type: field.type || 'text',\n \"show-password\": field.showPassword,\n class: \"password-input\",\n onKeyup: _withKeys($options.handleSubmit, [\"enter\", \"native\"]),\n onFocus: $options.handleInputFocus,\n onBlur: $options.handleInputBlur\n }, _createSlots({\n _: 2\n }, [field.icon ? {\n name: \"prefix\",\n fn: _withCtx(() => [_createVNode(_component_el_icon, {\n class: \"el-input__icon\"\n }, {\n default: _withCtx(() => [(_openBlock(), _createBlock(_resolveDynamicComponent(field.icon)))]),\n _: 2\n }, 1024)]),\n key: \"0\"\n } : undefined]), 1032, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\", \"type\", \"show-password\", \"onKeyup\", \"onFocus\", \"onBlur\"])])]);\n }), 128)), _createVNode(_component_el_button, {\n class: _normalizeClass([\"submit\", {\n 'is-loading': $props.loading\n }]),\n type: \"primary\",\n onClick: $options.handleSubmit,\n disabled: $props.loading\n }, {\n default: _withCtx(() => [$props.loading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString($options.computedSubmitText), 1))]),\n _: 1\n }, 8, [\"class\", \"onClick\", \"disabled\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n })], 2);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport Logo from '@/components/Logo.vue';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BaseLogin',\n mixins: [backgroundManager],\n props: {\n // 页面标题\n title: {\n type: String,\n required: true\n },\n // 输入字段配置\n fields: {\n type: Array,\n required: true\n // fields 格式: [{ key: 'username', label: '用户名', placeholder: '请输入用户名', type: 'text', showPassword: false }]\n },\n // 提交按钮文本\n submitText: {\n type: String,\n default: ''\n },\n // 背景图配置键名\n backgroundKey: {\n type: String,\n required: true\n },\n // 是否为管理端登录(影响背景样式)\n isAdmin: {\n type: Boolean,\n default: false\n },\n // 是否正在加载\n loading: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n formData: {},\n labelUnderlineWidths: [],\n isFocused: false\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n computedSubmitText() {\n return this.submitText || this.$t('login.submit');\n }\n },\n watch: {\n fields: {\n handler() {\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n deep: true\n }\n },\n components: {\n Footer,\n ToggleDark,\n LanguageSwitcher,\n Logo\n },\n mounted() {\n // 初始化表单数据\n this.initFormData();\n // 初始化背景图\n this.initializeBackground(this.backgroundKey, '.login', !this.isAdmin, true);\n // 在下一个tick计算标签宽度,确保DOM已经渲染\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n methods: {\n initFormData() {\n // 根据字段配置初始化表单数据\n const newFormData = {};\n this.fields.forEach(field => {\n newFormData[field.key] = '';\n });\n this.formData = newFormData;\n // 初始化下划线宽度数组\n this.labelUnderlineWidths = new Array(this.fields.length).fill(0);\n },\n calculateLabelWidths() {\n // 计算每个标签的文字宽度\n this.$nextTick(() => {\n this.fields.forEach((field, index) => {\n const labelRef = this.$refs[`inputLabel${index}`];\n if (labelRef && labelRef[0]) {\n // 创建一个临时的canvas来测量文字宽度\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // 获取标签的计算样式\n const labelElement = labelRef[0];\n const computedStyle = window.getComputedStyle(labelElement);\n\n // 设置font样式以匹配标签\n context.font = `${computedStyle.fontWeight} ${computedStyle.fontSize} ${computedStyle.fontFamily}`;\n\n // 测量文字宽度\n const textWidth = context.measureText(field.label).width;\n\n // 添加一些额外的边距,确保下划线覆盖整个文字\n this.labelUnderlineWidths[index] = Math.ceil(textWidth) + 3;\n }\n });\n });\n },\n handleSubmit() {\n if (this.loading) return;\n // 触发父组件的提交事件,传递表单数据\n this.$emit('submit', {\n ...this.formData\n });\n },\n handleInputFocus(event) {\n this.isFocused = true;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.add('focused');\n }\n }\n },\n handleInputBlur(event) {\n this.isFocused = false;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.remove('focused');\n }\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BaseLogin.vue?vue&type=template&id=6b04d67b&scoped=true\"\nimport script from \"./BaseLogin.vue?vue&type=script&lang=js\"\nexport * from \"./BaseLogin.vue?vue&type=script&lang=js\"\n\nimport \"./BaseLogin.vue?vue&type=style&index=0&id=6b04d67b&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6b04d67b\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_BaseLogin = _resolveComponent(\"BaseLogin\");\n return _openBlock(), _createBlock(_component_BaseLogin, {\n title: $options.loginTitle,\n fields: $data.loginFields,\n \"submit-text\": _ctx.$t('login.submit'),\n \"background-key\": \"loginBkImg\",\n \"is-admin\": false,\n loading: $data.isLoading,\n onSubmit: $options.handleLogin\n }, null, 8, [\"title\", \"fields\", \"submit-text\", \"loading\", \"onSubmit\"]);\n}","import \"core-js/modules/es.array.push.js\";\nimport axios from '@/utils/axios';\nimport { mapGetters } from 'vuex';\nimport BaseLogin from '@/components/BaseLogin.vue';\nexport default {\n data() {\n return {\n isLoading: false,\n loginFields: []\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n loginTitle() {\n return this.$t('login.title', {\n owner: this.ownerName\n });\n }\n },\n components: {\n BaseLogin\n },\n created() {\n this.updateLoginFields();\n },\n watch: {\n '$i18n.locale'() {\n this.updateLoginFields();\n }\n },\n methods: {\n updateLoginFields() {\n this.loginFields = [{\n key: 'password',\n label: this.$t('login.password'),\n placeholder: this.$t('login.passwordPlaceholder'),\n type: 'password',\n showPassword: true,\n icon: 'Lock'\n }];\n },\n async handleLogin(formData) {\n const {\n password\n } = formData;\n this.isLoading = true;\n const minDelayPromise = new Promise(resolve => setTimeout(resolve, 500));\n const loginPromise = axios.post('/api/auth/login', {\n authCode: password\n }, {\n withCredentials: true\n }).then(res => ({\n res\n })).catch(err => ({\n err\n }));\n try {\n const [result] = await Promise.all([loginPromise, minDelayPromise]);\n if (result.res && result.res.status === 200) {\n // 会话 Token 已通过 HttpOnly Cookie 由后端设置\n this.$store.commit('setUserLoggedIn', true);\n this.$router.push('/');\n this.$message.success(this.$t('login.success'));\n } else {\n this.isLoading = false;\n this.$message.error(this.$t('login.failed'));\n }\n } catch (err) {\n this.isLoading = false;\n this.$message.error(this.$t('login.systemError'));\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Login.vue?vue&type=template&id=5d4ca02e\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","tabindex","_hoisted_3","_hoisted_4","key","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","_component_ToggleDark","_component_LanguageSwitcher","_component_Logo","_component_el_icon","_component_el_input","_component_el_button","_component_Footer","isFocused","title","fields","field","index","ref_for","ref","style","labelUnderlineWidths","label","modelValue","formData","$event","placeholder","type","showPassword","onKeyup","handleSubmit","onFocus","handleInputFocus","onBlur","handleInputBlur","_","icon","name","fn","default","undefined","loading","onClick","disabled","computedSubmitText","mixins","backgroundManager","props","String","required","Array","submitText","backgroundKey","isAdmin","Boolean","data","computed","this","$t","watch","handler","$nextTick","calculateLabelWidths","deep","components","Footer","ToggleDark","LanguageSwitcher","Logo","mounted","initFormData","initializeBackground","methods","newFormData","forEach","length","fill","labelRef","$refs","canvas","document","createElement","context","getContext","labelElement","computedStyle","window","getComputedStyle","font","fontWeight","fontSize","fontFamily","textWidth","measureText","width","Math","ceil","$emit","event","container","target","closest","wrapper","querySelector","classList","add","remove","__exports__","_component_font_awesome_icon","args","toggleLocale","role","isZh","$i18n","locale","next","_component_BaseLogin","loginTitle","loginFields","isLoading","onSubmit","handleLogin","ownerName","userConfig","owner","BaseLogin","created","updateLoginFields","password","minDelayPromise","Promise","resolve","setTimeout","loginPromise","axios","post","authCode","withCredentials","then","res","catch","err","result","all","status","$store","commit","$router","push","$message","success","error"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/604.ae4825a8.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/BaseLogin.vue?ea4f","webpack://sanyue_imghub/./src/components/BaseLogin.vue","webpack://sanyue_imghub/./src/components/BaseLogin.vue?0ac4","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/views/Login.vue?1d03","webpack://sanyue_imghub/./src/views/Login.vue","webpack://sanyue_imghub/./src/views/Login.vue?2b97"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, withCtx as _withCtx, withKeys as _withKeys, createSlots as _createSlots, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"login-container\"\n};\nconst _hoisted_2 = {\n class: \"login-title\",\n tabindex: \"0\"\n};\nconst _hoisted_3 = {\n class: \"input-wrapper\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"loading-ring\"\n};\nconst _hoisted_5 = {\n key: 1\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_Footer = _resolveComponent(\"Footer\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"login\", {\n 'is-focused': $data.isFocused\n }])\n }, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark\"\n }), _createVNode(_component_LanguageSwitcher, {\n class: \"language-switcher\"\n }), _createVNode(_component_Logo), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"h1\", _hoisted_2, _toDisplayString($props.title), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.fields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: field.key,\n class: \"input-container\"\n }, [_createElementVNode(\"label\", {\n class: \"input-name\",\n ref_for: true,\n ref: `inputLabel${index}`,\n style: _normalizeStyle({\n '--underline-width': $data.labelUnderlineWidths[index] + 'px'\n })\n }, _toDisplayString(field.label), 5), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.formData[field.key],\n \"onUpdate:modelValue\": $event => $data.formData[field.key] = $event,\n placeholder: field.placeholder,\n type: field.type || 'text',\n \"show-password\": field.showPassword,\n class: \"password-input\",\n onKeyup: _withKeys($options.handleSubmit, [\"enter\", \"native\"]),\n onFocus: $options.handleInputFocus,\n onBlur: $options.handleInputBlur\n }, _createSlots({\n _: 2\n }, [field.icon ? {\n name: \"prefix\",\n fn: _withCtx(() => [_createVNode(_component_el_icon, {\n class: \"el-input__icon\"\n }, {\n default: _withCtx(() => [(_openBlock(), _createBlock(_resolveDynamicComponent(field.icon)))]),\n _: 2\n }, 1024)]),\n key: \"0\"\n } : undefined]), 1032, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\", \"type\", \"show-password\", \"onKeyup\", \"onFocus\", \"onBlur\"])])]);\n }), 128)), _createVNode(_component_el_button, {\n class: _normalizeClass([\"submit\", {\n 'is-loading': $props.loading\n }]),\n type: \"primary\",\n onClick: $options.handleSubmit,\n disabled: $props.loading\n }, {\n default: _withCtx(() => [$props.loading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString($options.computedSubmitText), 1))]),\n _: 1\n }, 8, [\"class\", \"onClick\", \"disabled\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n })], 2);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport Logo from '@/components/Logo.vue';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BaseLogin',\n mixins: [backgroundManager],\n props: {\n // 页面标题\n title: {\n type: String,\n required: true\n },\n // 输入字段配置\n fields: {\n type: Array,\n required: true\n // fields 格式: [{ key: 'username', label: '用户名', placeholder: '请输入用户名', type: 'text', showPassword: false }]\n },\n // 提交按钮文本\n submitText: {\n type: String,\n default: ''\n },\n // 背景图配置键名\n backgroundKey: {\n type: String,\n required: true\n },\n // 是否为管理端登录(影响背景样式)\n isAdmin: {\n type: Boolean,\n default: false\n },\n // 是否正在加载\n loading: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n formData: {},\n labelUnderlineWidths: [],\n isFocused: false\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n computedSubmitText() {\n return this.submitText || this.$t('login.submit');\n }\n },\n watch: {\n fields: {\n handler() {\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n deep: true\n }\n },\n components: {\n Footer,\n ToggleDark,\n LanguageSwitcher,\n Logo\n },\n mounted() {\n // 初始化表单数据\n this.initFormData();\n // 初始化背景图\n this.initializeBackground(this.backgroundKey, '.login', !this.isAdmin, true);\n // 在下一个tick计算标签宽度,确保DOM已经渲染\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n methods: {\n initFormData() {\n // 根据字段配置初始化表单数据\n const newFormData = {};\n this.fields.forEach(field => {\n newFormData[field.key] = '';\n });\n this.formData = newFormData;\n // 初始化下划线宽度数组\n this.labelUnderlineWidths = new Array(this.fields.length).fill(0);\n },\n calculateLabelWidths() {\n // 计算每个标签的文字宽度\n this.$nextTick(() => {\n this.fields.forEach((field, index) => {\n const labelRef = this.$refs[`inputLabel${index}`];\n if (labelRef && labelRef[0]) {\n // 创建一个临时的canvas来测量文字宽度\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // 获取标签的计算样式\n const labelElement = labelRef[0];\n const computedStyle = window.getComputedStyle(labelElement);\n\n // 设置font样式以匹配标签\n context.font = `${computedStyle.fontWeight} ${computedStyle.fontSize} ${computedStyle.fontFamily}`;\n\n // 测量文字宽度\n const textWidth = context.measureText(field.label).width;\n\n // 添加一些额外的边距,确保下划线覆盖整个文字\n this.labelUnderlineWidths[index] = Math.ceil(textWidth) + 3;\n }\n });\n });\n },\n handleSubmit() {\n if (this.loading) return;\n // 触发父组件的提交事件,传递表单数据\n this.$emit('submit', {\n ...this.formData\n });\n },\n handleInputFocus(event) {\n this.isFocused = true;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.add('focused');\n }\n }\n },\n handleInputBlur(event) {\n this.isFocused = false;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.remove('focused');\n }\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BaseLogin.vue?vue&type=template&id=6b04d67b&scoped=true\"\nimport script from \"./BaseLogin.vue?vue&type=script&lang=js\"\nexport * from \"./BaseLogin.vue?vue&type=script&lang=js\"\n\nimport \"./BaseLogin.vue?vue&type=style&index=0&id=6b04d67b&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6b04d67b\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_BaseLogin = _resolveComponent(\"BaseLogin\");\n return _openBlock(), _createBlock(_component_BaseLogin, {\n title: $options.loginTitle,\n fields: $data.loginFields,\n \"submit-text\": _ctx.$t('login.submit'),\n \"background-key\": \"loginBkImg\",\n \"is-admin\": false,\n loading: $data.isLoading,\n onSubmit: $options.handleLogin\n }, null, 8, [\"title\", \"fields\", \"submit-text\", \"loading\", \"onSubmit\"]);\n}","import \"core-js/modules/es.array.push.js\";\nimport axios from '@/utils/axios';\nimport { mapGetters } from 'vuex';\nimport BaseLogin from '@/components/BaseLogin.vue';\nexport default {\n data() {\n return {\n isLoading: false,\n loginFields: []\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n loginTitle() {\n return this.$t('login.title', {\n owner: this.ownerName\n });\n }\n },\n components: {\n BaseLogin\n },\n created() {\n this.updateLoginFields();\n },\n watch: {\n '$i18n.locale'() {\n this.updateLoginFields();\n }\n },\n methods: {\n updateLoginFields() {\n this.loginFields = [{\n key: 'password',\n label: this.$t('login.password'),\n placeholder: this.$t('login.passwordPlaceholder'),\n type: 'password',\n showPassword: true,\n icon: 'Lock'\n }];\n },\n async handleLogin(formData) {\n const {\n password\n } = formData;\n this.isLoading = true;\n const minDelayPromise = new Promise(resolve => setTimeout(resolve, 500));\n const loginPromise = axios.post('/api/auth/login', {\n authCode: password\n }, {\n withCredentials: true\n }).then(res => ({\n res\n })).catch(err => ({\n err\n }));\n try {\n const [result] = await Promise.all([loginPromise, minDelayPromise]);\n if (result.res && result.res.status === 200) {\n // 会话 Token 已通过 HttpOnly Cookie 由后端设置\n this.$store.commit('setUserLoggedIn', true);\n this.$router.push('/');\n this.$message.success(this.$t('login.success'));\n } else {\n this.isLoading = false;\n this.$message.error(this.$t('login.failed'));\n }\n } catch (err) {\n this.isLoading = false;\n this.$message.error(this.$t('login.systemError'));\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Login.vue?vue&type=template&id=5d4ca02e\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","tabindex","_hoisted_3","_hoisted_4","key","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","_component_ToggleDark","_component_LanguageSwitcher","_component_Logo","_component_el_icon","_component_el_input","_component_el_button","_component_Footer","isFocused","title","fields","field","index","ref_for","ref","style","labelUnderlineWidths","label","modelValue","formData","$event","placeholder","type","showPassword","onKeyup","handleSubmit","onFocus","handleInputFocus","onBlur","handleInputBlur","_","icon","name","fn","default","undefined","loading","onClick","disabled","computedSubmitText","mixins","backgroundManager","props","String","required","Array","submitText","backgroundKey","isAdmin","Boolean","data","computed","this","$t","watch","handler","$nextTick","calculateLabelWidths","deep","components","Footer","ToggleDark","LanguageSwitcher","Logo","mounted","initFormData","initializeBackground","methods","newFormData","forEach","length","fill","labelRef","$refs","canvas","document","createElement","context","getContext","labelElement","computedStyle","window","getComputedStyle","font","fontWeight","fontSize","fontFamily","textWidth","measureText","width","Math","ceil","$emit","event","container","target","closest","wrapper","querySelector","classList","add","remove","__exports__","_component_font_awesome_icon","args","toggleLocale","role","isZh","$i18n","locale","next","_component_BaseLogin","loginTitle","loginFields","isLoading","onSubmit","handleLogin","ownerName","userConfig","owner","BaseLogin","created","updateLoginFields","password","minDelayPromise","Promise","resolve","setTimeout","loginPromise","axios","post","authCode","withCredentials","then","res","catch","err","result","all","status","$store","commit","$router","push","$message","success","error"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/604.ae4825a8.js.map.gz b/frontend-dist/js/604.ae4825a8.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..86eed2e9e2ce486ea75bda12cd359ae007f9a4b3 GIT binary patch literal 6983 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/604.b966c795.js.gz b/frontend-dist/js/604.b966c795.js.gz deleted file mode 100644 index 2debbb62706af54f6819eafab97d714c3d9d91b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2575 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

}K?v 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 aqO=nI>*Oo08>l5!-Tz;Wbf%4AQvd)?E~qO2 diff --git a/frontend-dist/js/718.27080555.js.map.gz b/frontend-dist/js/718.27080555.js.map.gz deleted file mode 100644 index 980088bdd957ebbaaab0cc14d82fb7edcb65977a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163616 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

yUM^ZpGi^G<*DEO?U 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"Sma^)q5gOwuY# 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 diff --git a/frontend-dist/js/718.27080555.js b/frontend-dist/js/718.62a39893.js similarity index 99% rename from frontend-dist/js/718.27080555.js rename to frontend-dist/js/718.62a39893.js index c77f1c21..91fc1fcf 100644 --- a/frontend-dist/js/718.27080555.js +++ b/frontend-dist/js/718.62a39893.js @@ -1,2 +1,2 @@ (self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[718],{3975:function(e,t,i){i(44114),i(18111),i(22489),i(7588),i(61701),function(t,i){e.exports=i()}(0,function(){"use strict";function e(e,t){for(var i=0;it){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}return function(){function t(e,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,t),f(e)?this.element=e:p(e)&&(this.element=document.querySelector(e)),f(this.element)&&b(this.element.rangeTouch)&&(this.config=s({},n,{},i),this.init())}return i=t,o=[{key:"setup",value:function(e){var i=1(i=100/l.width*(n.clientX-l.left))?i=0:100i?i-=(100-2*i)*c:50u.handleToggleClick&&u.handleToggleClick(...e))},[(0,s.bF)(n.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[d.isAuto?((0,s.uX)(),(0,s.Wv)(p,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,a.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",r,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,o)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMask)"},null,8,l),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,c)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},u=i(71241);const p=(0,u.A)(d,[["render",h],["__scopeId","data-v-466b2b5c"]]);var m=p},49718:function(e,t,i){"use strict";i.r(t),i.d(t,{default:function(){return cs}});var s=i(56768),n=i(45130),a=i(24232);const r=["src"],o=["src"],l={key:2,class:"video-placeholder"},c={class:"audio-cover"},h=["src"],d={key:1,class:"audio-icon-large",viewBox:"0 0 24 24",fill:"currentColor"},u={class:"audio-info"},p={class:"audio-title"},m={key:0,class:"audio-artist"},g=["src"],f={key:4,class:"audio-placeholder"},y={class:"audio-name"};function b(e,t,i,b,v,w){return(0,s.uX)(),(0,s.CE)("div",{class:"tm-viewport",ref:"viewport",onPointerdown:t[3]||(t[3]=(...e)=>w.onPointerDown&&w.onPointerDown(...e)),onPointermove:t[4]||(t[4]=(...e)=>w.onPointerMove&&w.onPointerMove(...e)),onPointerup:t[5]||(t[5]=(...e)=>w.onPointerUp&&w.onPointerUp(...e)),onPointercancel:t[6]||(t[6]=(...e)=>w.onPointerUp&&w.onPointerUp(...e)),onDblclick:t[7]||(t[7]=(0,n.D$)((...e)=>w.onDblClick&&w.onDblClick(...e),["prevent"]))},[i.isImage?((0,s.uX)(),(0,s.CE)("img",{key:0,class:"tm-media",src:i.src,draggable:"false",style:(0,a.Tr)(w.mediaStyle),onLoad:t[0]||(t[0]=(...e)=>w.onLoad&&w.onLoad(...e))},null,44,r)):i.isVideo&&i.isActive?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"tm-video-wrap",onPointerdown:t[1]||(t[1]=(0,n.D$)(()=>{},["stop"]))},[(0,s.Lk)("video",{ref:"videoEl",class:"plyr-video",src:i.src,playsinline:""},null,8,o)],32)):i.isVideo?((0,s.uX)(),(0,s.CE)("div",l,[...t[8]||(t[8]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M8 5v14l11-7z"})],-1)])])):i.isAudio&&i.isActive?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"tm-audio-wrap",onPointerdown:t[2]||(t[2]=(0,n.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",c,[v.audioCover?((0,s.uX)(),(0,s.CE)("img",{key:0,src:v.audioCover,class:"cover-img"},null,8,h)):((0,s.uX)(),(0,s.CE)("svg",d,[...t[9]||(t[9]=[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"},null,-1)])]))]),(0,s.Lk)("div",u,[(0,s.Lk)("div",p,(0,a.v_)(v.audioTitle),1),v.audioArtist?((0,s.uX)(),(0,s.CE)("div",m,(0,a.v_)(v.audioArtist),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("audio",{ref:"audioEl",class:"plyr-audio",src:i.src},null,8,g)],32)):i.isAudio?((0,s.uX)(),(0,s.CE)("div",f,[t[10]||(t[10]=(0,s.Lk)("svg",{class:"audio-icon-large",viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})],-1)),(0,s.Lk)("span",y,(0,a.v_)(v.audioTitle),1)])):(0,s.Q3)("",!0)],544)}i(16573),i(78100),i(77936),i(18111),i(7588),i(79577),i(41549),i(49797),i(49631),i(35623),i(14603),i(47566),i(98721);var v=i(91114),w=(i(22489),i(61701),i(58335),i(81148),i(20116),i(44114),i(13579),i(3975));const k=e=>null!==e&&"undefined"!==typeof e?e.constructor:null,T=(e,t)=>Boolean(e&&t&&e instanceof t),C=e=>null===e||"undefined"===typeof e,A=e=>k(e)===Object,S=e=>k(e)===Number&&!Number.isNaN(e),x=e=>k(e)===String,M=e=>k(e)===Boolean,E=e=>"function"===typeof e,L=e=>Array.isArray(e),P=e=>T(e,WeakMap),I=e=>T(e,NodeList),$=e=>k(e)===Text,N=e=>T(e,Event),D=e=>T(e,KeyboardEvent),F=e=>T(e,window.TextTrackCue)||T(e,window.VTTCue),_=e=>T(e,TextTrack)||!C(e)&&x(e.kind),R=e=>T(e,Promise)&&E(e.then);function O(e){return null!==e&&"object"===typeof e&&1===e.nodeType&&"object"===typeof e.style&&"object"===typeof e.ownerDocument}function B(e){return C(e)||(x(e)||L(e)||I(e))&&!e.length||A(e)&&!Object.keys(e).length}function H(e){if(T(e,window.URL))return!0;if(!x(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!B(new URL(t).hostname)}catch{return!1}}var V={nullOrUndefined:C,object:A,number:S,string:x,boolean:M,function:E,array:L,weakMap:P,nodeList:I,element:O,textNode:$,event:N,keyboardEvent:D,cue:F,track:_,promise:R,url:H,empty:B};const j=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find(t=>void 0!==e.style[t]);return!!V.string(i)&&t[i]})();function q(e,t){setTimeout(()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch{}},t)}i(18237),i(33110);function U(e){return JSON.parse(JSON.stringify(e))}function X(e,t){return t.split(".").reduce((e,t)=>e&&e[t],e)}function z(e={},...t){if(!t.length)return e;const i=t.shift();return V.object(i)?(Object.keys(i).forEach(t=>{V.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),z(e[t],i[t])):Object.assign(e,{[t]:i[t]})}),z(e,...t)):e}function W(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)})}function K(e,t){V.element(e)&&!V.empty(t)&&Object.entries(t).filter(([,e])=>!V.nullOrUndefined(e)).forEach(([t,i])=>e.setAttribute(t,i))}function Y(e,t,i){const s=document.createElement(e);return V.object(t)&&K(s,t),V.string(i)&&(s.textContent=i),s}function Q(e,t){V.element(e)&&V.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function J(e,t,i,s){V.element(t)&&t.appendChild(Y(e,i,s))}function G(e){V.nodeList(e)||V.array(e)?Array.from(e).forEach(G):V.element(e)&&V.element(e.parentNode)&&e.parentNode.removeChild(e)}function Z(e){if(!V.element(e))return;let{length:t}=e.childNodes;while(t>0)e.removeChild(e.lastChild),t-=1}function ee(e,t){return V.element(t)&&V.element(t.parentNode)&&V.element(e)?(t.parentNode.replaceChild(e,t),e):null}function te(e,t){if(!V.string(e)||V.empty(e))return{};const i={},s=z({},t);return e.split(",").forEach(e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,""),r=a.split("="),[o]=r,l=r.length>1?r[1].replace(/["']/g,""):"",c=t.charAt(0);switch(c){case".":V.string(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[o]=l;break;default:break}}),z(s,i)}function ie(e,t){if(!V.element(e))return;let i=t;V.boolean(i)||(i=!e.hidden),e.hidden=i}function se(e,t,i){if(V.nodeList(e))return Array.from(e).map(e=>se(e,t,i));if(V.element(e)){let s="toggle";return"undefined"!==typeof i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function ne(e,t){return V.element(e)&&e.classList.contains(t)}function ae(e,t){const{prototype:i}=Element;function s(){return Array.from(document.querySelectorAll(t)).includes(this)}const n=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||s;return n.call(e,t)}function re(e,t){const{prototype:i}=Element;function s(){let e=this;do{if(ae.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}const n=i.closest||s;return n.call(e,t)}function oe(e){return this.elements.container.querySelectorAll(e)}function le(e){return this.elements.container.querySelector(e)}function ce(e=null,t=!1){V.element(e)&&e.focus({preventScroll:!0,focusVisible:t})}const he={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},de={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t){const i=de[e]||"html5"!==t,s=i&&de.rangeInput;return{api:i,ui:s}},pip:(()=>document.pictureInPictureEnabled&&!Y("video").disablePictureInPicture)(),airplay:V.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(V.empty(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(he).includes(i)&&(i+=`; codecs="${he[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch{return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==j,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};var ue=de;const pe=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch{}return e})();function me(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||V.empty(t)||!V.function(i))return;const r=t.split(" ");let o=a;pe&&(o={passive:n,capture:a}),r.forEach(t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:o}),e[s?"addEventListener":"removeEventListener"](t,i,o)})}function ge(e,t="",i,s=!0,n=!1){me.call(this,e,t,i,!0,s,n)}function fe(e,t="",i,s=!0,n=!1){me.call(this,e,t,i,!1,s,n)}function ye(e,t="",i,s=!0,n=!1){const a=(...r)=>{fe(e,t,a,s,n),i.apply(this,r)};me.call(this,e,t,a,!0,s,n)}function be(e,t="",i=!1,s={}){if(!V.element(e)||V.empty(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function ve(){this&&this.eventListeners&&(this.eventListeners.forEach(e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)}),this.eventListeners=[])}function we(){return new Promise(e=>this.ready?setTimeout(e,0):ge.call(this,this.elements.container,"ready",e)).then(()=>{})}function ke(e){V.promise(e)&&e.then(null,()=>{})}function Te(e){return V.array(e)?e.filter((t,i)=>e.indexOf(t)===i):e}function Ce(e,t){return V.array(e)&&e.length?e.reduce((e,i)=>Math.abs(i-t)({...e,[t/i]:[t,i]}),{});function xe(e){if(!V.array(e)&&(!V.string(e)||!e.includes(":")))return!1;const t=V.array(e)?e:e.split(":");return t.map(Number).every(V.number)}function Me(e){if(!V.array(e)||!e.every(V.number))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function Ee(e){const t=e=>xe(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!V.empty(this.embed)&&V.array(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return Me(i)}function Le(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=Ee.call(this,e);if(!V.array(i))return{};const[s,n]=Me(i),a=Ae(`aspect-ratio: ${s}/${n}`),r=100/s*n;if(a?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${r}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*Number.parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-r)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:r,ratio:i}}function Pe(e,t,i=.05){const s=e/t,n=Ce(Object.keys(Se),s);return Math.abs(n-s)<=i?Se[n]:[e,t]}function Ie(){const e=Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight||0,window.innerHeight||0);return[e,t]}const $e={getSources(){if(!this.isHTML5)return[];const e=Array.from(this.media.querySelectorAll("source"));return e.filter(e=>{const t=e.getAttribute("type");return!!V.empty(t)||ue.mime.call(this,t)})},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:$e.getSources.call(this).map(e=>Number(e.getAttribute("size"))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,V.empty(this.config.ratio)||Le.call(e),Object.defineProperty(e.media,"quality",{get(){const t=$e.getSources.call(e),i=t.find(t=>t.getAttribute("src")===e.source);return i&&Number(i.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&V.function(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=$e.getSources.call(e),s=i.find(e=>Number(e.getAttribute("size"))===t);if(!s)return;const{currentTime:n,paused:a,preload:r,readyState:o,playbackRate:l}=e.media;e.media.src=s.getAttribute("src"),("none"!==r||o)&&(e.once("loadedmetadata",()=>{e.speed=l,e.currentTime=n,a||ke(e.play())}),e.media.load())}be.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(G($e.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};var Ne=$e;const De=Boolean(window.document.documentMode),Fe=/Edge/.test(navigator.userAgent),_e="WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),Re=/iPhone|iPod/i.test(navigator.userAgent)&&navigator.maxTouchPoints>1,Oe="MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,Be=/iPad|iPhone|iPod/i.test(navigator.userAgent)&&navigator.maxTouchPoints>1;var He={isIE:De,isEdge:Fe,isWebKit:_e,isIPhone:Re,isIPadOS:Oe,isIos:Be};function Ve(e){return`${e}-${Math.floor(1e4*Math.random())}`}function je(e,...t){return V.empty(e)?e:e.toString().replace(/\{(\d+)\}/g,(e,i)=>t[i].toString())}function qe(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}function Ue(e="",t="",i=""){return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())}function Xe(e=""){return e.toString().replace(/\w\S*/g,e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase())}function ze(e=""){let t=e.toString();return t=Ue(t,"-"," "),t=Ue(t,"_"," "),t=Xe(t),Ue(t," ","")}function We(e=""){let t=e.toString();return t=ze(t),t.charAt(0).toLowerCase()+t.slice(1)}function Ke(e){const t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.textContent}function Ye(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const Qe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},Je={get(e="",t={}){if(V.empty(e)||V.empty(t))return"";let i=X(t.i18n,e);if(V.empty(i))return Object.keys(Qe).includes(e)?Qe[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach(([e,t])=>{i=Ue(i,e,t)}),i}};var Ge=Je;class Ze{constructor(e){(0,v.A)(this,"get",e=>{if(!Ze.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(V.empty(t))return null;const i=JSON.parse(t);return V.string(e)&&e.length?i[e]:i}),(0,v.A)(this,"set",e=>{if(!Ze.supported||!this.enabled)return;if(!V.object(e))return;let t=this.get();V.empty(t)&&(t={}),z(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch{}}),this.enabled=e.config.storage.enabled,this.key=e.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch{return!1}}}var et=Ze;function tt(e,t="text",i=!1){return new Promise((s,n)=>{try{const n=new XMLHttpRequest;if(!("withCredentials"in n))return;i&&(n.withCredentials=!0),n.addEventListener("load",()=>{if("text"===t)try{s(JSON.parse(n.responseText))}catch{s(n.responseText)}else s(n.response)}),n.addEventListener("error",()=>{throw new Error(n.status)}),n.open("GET",e,!0),n.responseType=t,n.send()}catch(a){n(a)}})}function it(e,t){if(!V.string(e))return;const i="cache",s=V.string(t);let n=!1;const a=()=>null!==document.getElementById(t),r=(e,t)=>{e.innerHTML=t,s&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!s||!a()){const a=et.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),s&&o.setAttribute("id",t),a){const e=window.localStorage.getItem(`${i}-${t}`);if(n=null!==e,n){const t=JSON.parse(e);r(o,t.content)}}tt(e).then(e=>{if(!V.empty(e)){if(a)try{window.localStorage.setItem(`${i}-${t}`,JSON.stringify({content:e}))}catch{}r(o,e)}}).catch(()=>{})}}const st=e=>Math.trunc(e/60/60%60,10),nt=e=>Math.trunc(e/60%60,10),at=e=>Math.trunc(e%60,10);function rt(e=0,t=!1,i=!1){if(!V.number(e))return rt(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=st(e);const a=nt(e),r=at(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(r)}`}const ot={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||He.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=le.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:oe.call(this,this.config.selectors.buttons.play),pause:le.call(this,this.config.selectors.buttons.pause),restart:le.call(this,this.config.selectors.buttons.restart),rewind:le.call(this,this.config.selectors.buttons.rewind),fastForward:le.call(this,this.config.selectors.buttons.fastForward),mute:le.call(this,this.config.selectors.buttons.mute),pip:le.call(this,this.config.selectors.buttons.pip),airplay:le.call(this,this.config.selectors.buttons.airplay),settings:le.call(this,this.config.selectors.buttons.settings),captions:le.call(this,this.config.selectors.buttons.captions),fullscreen:le.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=le.call(this,this.config.selectors.progress),this.elements.inputs={seek:le.call(this,this.config.selectors.inputs.seek),volume:le.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:le.call(this,this.config.selectors.display.buffer),currentTime:le.call(this,this.config.selectors.display.currentTime),duration:le.call(this,this.config.selectors.display.duration)},V.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=ot.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");K(a,z(t,{"aria-hidden":"true",focusable:"false"}));const r=document.createElementNS(i,"use"),o=`${n}-${e}`;return"href"in r&&r.setAttributeNS("http://www.w3.org/1999/xlink","href",o),r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(r),a},createLabel(e,t={}){const i=Ge.get(e,this.config),s={...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")};return Y("span",s,i)},createBadge(e){if(V.empty(e))return null;const t=Y("span",{class:this.config.classNames.menu.value});return t.appendChild(Y("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=z({},t);let s=We(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])}),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").includes(this.config.classNames.control)||z(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:V.empty(n.label)&&(n.label=s),V.empty(n.icon)&&(n.icon=e)}const a=Y(n.element);return n.toggle?(a.appendChild(ot.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(ot.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(ot.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(ot.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(ot.createIcon.call(this,n.icon)),a.appendChild(ot.createLabel.call(this,n.label))),z(i,te(this.config.selectors.buttons[s],i)),K(a,i),"play"===s?(V.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=Y("input",z(te(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Ge.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,ot.updateRangeFill.call(this,i),w.setup(i),i},createProgress(e,t){const i=Y("progress",z(te(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(Y("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?Ge.get(t,this.config):"";i.textContent=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=te(this.config.selectors.display[e],t),s=Y("div",z(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":Ge.get(e,this.config),role:"timer"}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){ge.call(this,e,"keydown keyup",i=>{if(![" ","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=ae(e,'[role="menuitemradio"]');if(!s&&[" ","ArrowRight"].includes(i.key))ot.showMenuPanel.call(this,t,!0);else{let t;" "!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,V.element(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,V.element(t)||(t=e.parentNode.lastElementChild)),ce.call(this,t,!0))}},!1),ge.call(this,e,"keyup",e=>{"Return"===e.key&&ot.focusFirstMenuItem.call(this,null,!0)})},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const r=te(this.config.selectors.inputs[i]),o=Y("button",z(r,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${r.class?r.class:""}`.trim(),"aria-checked":a,value:e})),l=Y("span");l.innerHTML=s,V.element(n)&&l.appendChild(n),o.appendChild(l),Object.defineProperty(o,"checked",{enumerable:!0,get(){return"true"===o.getAttribute("aria-checked")},set(e){e&&Array.from(o.parentNode.children).filter(e=>ae(e,'[role="menuitemradio"]')).forEach(e=>e.setAttribute("aria-checked","false")),o.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(o,"click keyup",t=>{if(!V.keyboardEvent(t)||" "===t.key){switch(t.preventDefault(),t.stopPropagation(),o.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=Number.parseFloat(e);break;default:break}ot.showMenuPanel.call(this,"home",V.keyboardEvent(t))}},i,!1),ot.bindMenuItemShortcuts.call(this,o,i),t.appendChild(o)},formatTime(e=0,t=!1){if(!V.number(e))return e;const i=st(this.duration)>0;return rt(e,i,t)},updateTimeDisplay(e=null,t=0,i=!1){V.element(e)&&V.number(t)&&(e.textContent=ot.formatTime(t,i))},updateVolume(){this.supported.ui&&(V.element(this.elements.inputs.volume)&&ot.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),V.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){V.element(e)&&(e.value=t,ot.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!V.event(e))return;let t=0;const i=(e,t)=>{const i=V.number(t)?t:0,s=V.element(e)?e:this.elements.display.buffer;if(V.element(s)){s.value=i;const e=s.getElementsByTagName("span")[0];V.element(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":t=qe(this.currentTime,this.duration),"timeupdate"===e.type&&ot.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered);break;default:break}},updateRangeFill(e){const t=V.event(e)?e.target:e;if(V.element(t)&&"range"===t.getAttribute("type")){if(ae(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=ot.formatTime(this.currentTime),i=ot.formatTime(this.duration),s=Ge.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(ae(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);(He.isWebKit||He.isIPadOS)&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){if(!this.config.tooltips.seek||!V.element(this.elements.inputs.seek)||!V.element(this.elements.display.seekTooltip)||0===this.duration)return;const t=this.elements.display.seekTooltip,i=`${this.config.classNames.tooltip}--visible`,s=e=>se(t,i,e);if(this.touch)return void s(!1);let n=0;const a=this.elements.progress.getBoundingClientRect();if(V.event(e)){const t=e.pageX-e.clientX;n=100/a.width*(e.pageX-a.left-t)}else{if(!ne(t,i))return;n=Number.parseFloat(t.style.left,10)}n<0?n=0:n>100&&(n=100);const r=this.duration/100*n;t.textContent=ot.formatTime(r);const o=this.config.markers?.points?.find(({time:e})=>e===Math.round(r));o&&t.insertAdjacentHTML("afterbegin",`${o.label}
`),t.style.left=`${n}%`,V.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)},timeUpdate(e){const t=!V.element(this.elements.display.duration)&&this.config.invertTime;ot.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||ot.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return ie(this.elements.display.currentTime,!0),void ie(this.elements.progress,!0);V.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=V.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&ot.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&ot.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&ot.setMarkers.call(this),ot.updateSeekTooltip.call(this)},toggleMenuButton(e,t){ie(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=V.empty(i)?this[e]:i,V.empty(n)&&(n=this.config[e].default),!V.empty(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(V.element(a)||(a=s&&s.querySelector('[role="menu"]')),!V.element(a))return;const r=this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`);r.innerHTML=ot.getLabel.call(this,e,n);const o=a&&a.querySelector(`[value="${n}"]`);V.element(o)&&(o.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?Ge.get("normal",this.config):`${t}×`;case"quality":if(V.number(t)){const e=Ge.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return Xe(t);case"captions":return ut.getLabel.call(this);default:return null}},setQualityMenu(e){if(!V.element(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');V.array(e)&&(this.options.quality=Te(e).filter(e=>this.config.quality.options.includes(e)));const s=!V.empty(this.options.quality)&&this.options.quality.length>1;if(ot.toggleMenuButton.call(this,t,s),Z(i),ot.checkMenu.call(this),!s)return;const n=e=>{const t=Ge.get(`qualityBadge.${e}`,this.config);return t.length?ot.createBadge.call(this,t):null};this.options.quality.sort((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1}).forEach(e=>{ot.createMenuItem.call(this,{value:e,list:i,type:t,title:ot.getLabel.call(this,"quality",e),badge:n(e)})}),ot.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!V.element(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=ut.getTracks.call(this),s=Boolean(i.length);if(ot.toggleMenuButton.call(this,e,s),Z(t),ot.checkMenu.call(this),!s)return;const n=i.map((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:ut.getLabel.call(this,e),badge:e.language&&ot.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"}));n.unshift({value:-1,checked:!this.captions.toggled,title:Ge.get("disabled",this.config),list:t,type:"language"}),n.forEach(ot.createMenuItem.bind(this)),ot.updateSetting.call(this,e,t)},setSpeedMenu(){if(!V.element(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter(e=>e>=this.minimumSpeed&&e<=this.maximumSpeed);const i=!V.empty(this.options.speed)&&this.options.speed.length>1;ot.toggleMenuButton.call(this,e,i),Z(t),ot.checkMenu.call(this),i&&(this.options.speed.forEach(i=>{ot.createMenuItem.call(this,{value:i,list:t,type:e,title:ot.getLabel.call(this,"speed",i)})}),ot.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!V.empty(e)&&Object.values(e).some(e=>!e.hidden);ie(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;V.element(i)||(i=Object.values(this.elements.settings.panels).find(e=>!e.hidden));const s=i.querySelector('[role^="menuitem"]');ce.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!V.element(t)||!V.element(i))return;const{hidden:s}=t;let n=s;if(V.boolean(e))n=e;else if(V.keyboardEvent(e)&&"Escape"===e.key)n=!1;else if(V.event(e)){const s=V.function(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(s);if(a||!a&&e.target!==i&&n)return}i.setAttribute("aria-expanded",n),ie(t,!n),se(this.elements.container,this.config.classNames.menu.open,n),n&&V.keyboardEvent(e)?ot.focusFirstMenuItem.call(this,null,!0):n||s||ce.call(this,i,V.keyboardEvent(e))},getMenuSize(e){const t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);const i=t.scrollWidth,s=t.scrollHeight;return G(t),{width:i,height:s}},showMenuPanel(e="",t=!1){const i=this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);if(!V.element(i))return;const s=i.parentNode,n=Array.from(s.children).find(e=>!e.hidden);if(ue.transitions&&!ue.reducedMotion){s.style.width=`${n.scrollWidth}px`,s.style.height=`${n.scrollHeight}px`;const e=ot.getMenuSize.call(this,i),t=e=>{e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="",fe.call(this,s,j,t))};ge.call(this,s,j,t),s.style.width=`${e.width}px`,s.style.height=`${e.height}px`}ie(n,!0),ie(i,!1),ot.focusFirstMenuItem.call(this,i,t)},setDownloadUrl(){const e=this.elements.buttons.download;V.element(e)&&e.setAttribute("href",this.download)},create(e){const{bindMenuItemShortcuts:t,createButton:i,createProgress:s,createRange:n,createTime:a,setQualityMenu:r,setSpeedMenu:o,showMenuPanel:l}=ot;this.elements.controls=null,V.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));const c=Y("div",te(this.config.selectors.controls.wrapper));this.elements.controls=c;const h={class:"plyr__controls__item"};return Te(V.array(this.config.controls)?this.config.controls:[]).forEach(r=>{if("restart"===r&&c.appendChild(i.call(this,"restart",h)),"rewind"===r&&c.appendChild(i.call(this,"rewind",h)),"play"===r&&c.appendChild(i.call(this,"play",h)),"fast-forward"===r&&c.appendChild(i.call(this,"fast-forward",h)),"progress"===r){const t=Y("div",{class:`${h.class} plyr__progress__container`}),i=Y("div",te(this.config.selectors.progress));if(i.appendChild(n.call(this,"seek",{id:`plyr-seek-${e.id}`})),i.appendChild(s.call(this,"buffer")),this.config.tooltips.seek){const e=Y("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(e),this.elements.display.seekTooltip=e}this.elements.progress=i,t.appendChild(this.elements.progress),c.appendChild(t)}if("current-time"===r&&c.appendChild(a.call(this,"currentTime",h)),"duration"===r&&c.appendChild(a.call(this,"duration",h)),"mute"===r||"volume"===r){let{volume:t}=this.elements;if(V.element(t)&&c.contains(t)||(t=Y("div",z({},h,{class:`${h.class} plyr__volume`.trim()})),this.elements.volume=t,c.appendChild(t)),"mute"===r&&t.appendChild(i.call(this,"mute")),"volume"===r&&!He.isIos&&!He.isIPadOS){const i={max:1,step:.05,value:this.config.volume};t.appendChild(n.call(this,"volume",z(i,{id:`plyr-volume-${e.id}`})))}}if("captions"===r&&c.appendChild(i.call(this,"captions",h)),"settings"===r&&!V.empty(this.config.settings)){const s=Y("div",z({},h,{class:`${h.class} plyr__menu`.trim(),hidden:""}));s.appendChild(i.call(this,"settings",{"aria-haspopup":!0,"aria-controls":`plyr-settings-${e.id}`,"aria-expanded":!1}));const n=Y("div",{class:"plyr__menu__container",id:`plyr-settings-${e.id}`,hidden:""}),a=Y("div"),r=Y("div",{id:`plyr-settings-${e.id}-home`}),o=Y("div",{role:"menu"});r.appendChild(o),a.appendChild(r),this.elements.settings.panels.home=r,this.config.settings.forEach(i=>{const s=Y("button",z(te(this.config.selectors.buttons.settings),{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--forward`,role:"menuitem","aria-haspopup":!0,hidden:""}));t.call(this,s,i),ge.call(this,s,"click",()=>{l.call(this,i,!1)});const n=Y("span",null,Ge.get(i,this.config)),r=Y("span",{class:this.config.classNames.menu.value});r.innerHTML=e[i],n.appendChild(r),s.appendChild(n),o.appendChild(s);const c=Y("div",{id:`plyr-settings-${e.id}-${i}`,hidden:""}),h=Y("button",{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--back`});h.appendChild(Y("span",{"aria-hidden":!0},Ge.get(i,this.config))),h.appendChild(Y("span",{class:this.config.classNames.hidden},Ge.get("menuBack",this.config))),ge.call(this,c,"keydown",e=>{"ArrowLeft"===e.key&&(e.preventDefault(),e.stopPropagation(),l.call(this,"home",!0))},!1),ge.call(this,h,"click",()=>{l.call(this,"home",!1)}),c.appendChild(h),c.appendChild(Y("div",{role:"menu"})),a.appendChild(c),this.elements.settings.buttons[i]=s,this.elements.settings.panels[i]=c}),n.appendChild(a),s.appendChild(n),c.appendChild(s),this.elements.settings.popup=n,this.elements.settings.menu=s}if("pip"===r&&ue.pip&&c.appendChild(i.call(this,"pip",h)),"airplay"===r&&ue.airplay&&c.appendChild(i.call(this,"airplay",h)),"download"===r){const e=z({},h,{element:"a",href:this.download,target:"_blank"});this.isHTML5&&(e.download="");const{download:t}=this.config.urls;!V.url(t)&&this.isEmbed&&z(e,{icon:`logo-${this.provider}`,label:this.provider}),c.appendChild(i.call(this,"download",e))}"fullscreen"===r&&c.appendChild(i.call(this,"fullscreen",h))}),this.isHTML5&&r.call(this,Ne.getQualityOptions.call(this)),o.call(this),c},inject(){if(this.config.loadSprite){const e=ot.getIconUrl.call(this);e.cors&&it(e.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());let e=null;this.elements.controls=null;const t={id:this.id,seektime:this.config.seekTime,title:this.config.title};let i=!0;V.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,t)),this.config.controls||(this.config.controls=[]),V.element(this.config.controls)||V.string(this.config.controls)?e=this.config.controls:(e=ot.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ut.getLabel.call(this)}),i=!1);const s=e=>{let i=e;return Object.entries(t).forEach(([e,t])=>{i=Ue(i,`{${e}}`,t)}),i};let n;i&&V.string(this.config.controls)&&(e=s(e)),V.string(this.config.selectors.controls.container)&&(n=document.querySelector(this.config.selectors.controls.container)),V.element(n)||(n=this.elements.container);const a=V.element(e)?"insertAdjacentElement":"insertAdjacentHTML";if(n[a]("afterbegin",e),V.element(this.elements.controls)||ot.findElements.call(this),!V.empty(this.elements.buttons)){const e=e=>{const t=this.config.classNames.controlPressed;e.setAttribute("aria-pressed","false"),Object.defineProperty(e,"pressed",{configurable:!0,enumerable:!0,get(){return ne(e,t)},set(i=!1){se(e,t,i),e.setAttribute("aria-pressed",i?"true":"false")}})};Object.values(this.elements.buttons).filter(Boolean).forEach(t=>{V.array(t)||V.nodeList(t)?Array.from(t).filter(Boolean).forEach(e):e(t)})}if(He.isEdge&&q(n),this.config.tooltips.controls){const{classNames:e,selectors:t}=this.config,i=`${t.controls.wrapper} ${t.labels} .${e.hidden}`,s=oe.call(this,i);Array.from(s).forEach(e=>{se(e,this.config.classNames.hidden,!1),se(e,this.config.classNames.tooltip,!0)})}},setMediaMetadata(){try{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new window.MediaMetadata({title:this.config.mediaMetadata.title,artist:this.config.mediaMetadata.artist,album:this.config.mediaMetadata.album,artwork:this.config.mediaMetadata.artwork}))}catch{}},setMarkers(){if(!this.duration||this.elements.markers)return;const e=this.config.markers?.points?.filter(({time:e})=>e>0&&ese(s,n,e);e.forEach(e=>{const t=Y("span",{class:this.config.classNames.marker},""),n=e.time/this.duration*100+"%";s&&(t.addEventListener("mouseenter",()=>{e.label||(s.style.left=n,s.innerHTML=e.label,a(!0))}),t.addEventListener("mouseleave",()=>{a(!1)})),t.addEventListener("click",()=>{this.currentTime=e.time}),t.style.left=n,i.appendChild(t)}),t.appendChild(i),this.config.tooltips.seek||(s=Y("span",{class:this.config.classNames.tooltip},""),t.appendChild(s)),this.elements.markers={points:i,tip:s},this.elements.progress.appendChild(t)}};var lt=ot;function ct(e,t=!0){let i=e;if(t){const e=document.createElement("a");e.href=i,i=e.href}try{return new URL(i)}catch{return null}}function ht(e){const t=new URLSearchParams;return V.object(e)&&Object.entries(e).forEach(([e,i])=>{t.set(e,i)}),t}const dt={setup(){if(!this.supported.ui)return;if(!this.isVideo||this.isYouTube||this.isHTML5&&!ue.textTracks)return void(V.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&<.setCaptionsMenu.call(this));if(V.element(this.elements.captions)||(this.elements.captions=Y("div",te(this.config.selectors.captions)),this.elements.captions.setAttribute("dir","auto"),Q(this.elements.captions,this.elements.wrapper)),He.isIE&&window.URL){const e=this.media.querySelectorAll("track");Array.from(e).forEach(e=>{const t=e.getAttribute("src"),i=ct(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&tt(t,"blob").then(t=>{e.setAttribute("src",window.URL.createObjectURL(t))}).catch(()=>{G(e)})})}const e=navigator.languages||[navigator.language||navigator.userLanguage||"en"],t=Te(e.map(e=>e.split("-")[0]));let i=(this.storage.get("language")||this.captions.language||this.config.captions.language||"auto").toLowerCase();"auto"===i&&([i]=t);let s=this.storage.get("captions")||this.captions.active;if(V.boolean(s)||({active:s}=this.config.captions),Object.assign(this.captions,{toggled:!1,active:s,language:i,languages:t}),this.isHTML5){const e=this.config.captions.update?"addtrack removetrack":"removetrack";ge.call(this,this.media.textTracks,e,dt.update.bind(this))}setTimeout(dt.update.bind(this),0)},update(){const e=dt.getTracks.call(this,!0),{active:t,language:i,meta:s,currentTrackNode:n}=this.captions,a=Boolean(e.find(e=>e.language===i));this.isHTML5&&this.isVideo&&e.filter(e=>!s.get(e)).forEach(e=>{this.debug.log("Track added",e),s.set(e,{default:"showing"===e.mode}),"showing"===e.mode&&(e.mode="hidden"),ge.call(this,e,"cuechange",()=>dt.updateCues.call(this))}),(a&&this.language!==i||!e.includes(n))&&(dt.setLanguage.call(this,i),dt.toggle.call(this,t&&a)),this.elements&&se(this.elements.container,this.config.classNames.captions.enabled,!V.empty(e)),V.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&<.setCaptionsMenu.call(this)},toggle(e,t=!0){if(!this.supported.ui)return;const{toggled:i}=this.captions,s=this.config.classNames.captions.active,n=V.nullOrUndefined(e)?!i:e;if(n!==i){if(t||(this.captions.active=n,this.storage.set({captions:n})),!this.language&&n&&!t){const e=dt.getTracks.call(this),t=dt.findTrack.call(this,[this.captions.language,...this.captions.languages],!0);return this.captions.language=t.language,void dt.set.call(this,e.indexOf(t))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=n),se(this.elements.container,s,n),this.captions.toggled=n,lt.updateSetting.call(this,"captions"),be.call(this,this.media,n?"captionsenabled":"captionsdisabled")}setTimeout(()=>{n&&this.captions.toggled&&(this.captions.currentTrackNode.mode="hidden")})},set(e,t=!0){const i=dt.getTracks.call(this);if(-1!==e)if(V.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;const s=i[e],{language:n}=s||{};this.captions.currentTrackNode=s,lt.updateSetting.call(this,"captions"),t||(this.captions.language=n,this.storage.set({language:n})),this.isVimeo&&this.embed.enableTextTrack(n),be.call(this,this.media,"languagechange")}dt.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&dt.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else dt.toggle.call(this,!1,t)},setLanguage(e,t=!0){if(!V.string(e))return void this.debug.warn("Invalid language argument",e);const i=e.toLowerCase();this.captions.language=i;const s=dt.getTracks.call(this),n=dt.findTrack.call(this,[i]);dt.set.call(this,s.indexOf(n),t)},getTracks(e=!1){const t=Array.from((this.media||{}).textTracks||[]);return t.filter(t=>!this.isHTML5||e||this.captions.meta.has(t)).filter(e=>["captions","subtitles"].includes(e.kind))},findTrack(e,t=!1){const i=dt.getTracks.call(this),s=e=>Number((this.captions.meta.get(e)||{}).default),n=Array.from(i).sort((e,t)=>s(t)-s(e));let a;return e.every(e=>(a=n.find(t=>t.language===e),!a)),a||(t?n[0]:void 0)},getCurrentTrack(){return dt.getTracks.call(this)[this.currentTrack]},getLabel(e){let t=e;return!V.track(t)&&ue.textTracks&&this.captions.toggled&&(t=dt.getCurrentTrack.call(this)),V.track(t)?V.empty(t.label)?V.empty(t.language)?Ge.get("enabled",this.config):e.language.toUpperCase():t.label:Ge.get("disabled",this.config)},updateCues(e){if(!this.supported.ui)return;if(!V.element(this.elements.captions))return void this.debug.warn("No captions element to render to");if(!V.nullOrUndefined(e)&&!Array.isArray(e))return void this.debug.warn("updateCues: Invalid input",e);let t=e;if(!t){const e=dt.getCurrentTrack.call(this);t=Array.from((e||{}).activeCues||[]).map(e=>e.getCueAsHTML()).map(Ye)}const i=t.map(e=>e.trim()).join("\n"),s=i!==this.elements.captions.innerHTML;if(s){Z(this.elements.captions);const e=Y("span",te(this.config.selectors.caption));e.innerHTML=i,this.elements.captions.appendChild(e),be.call(this,this.media,"cuechange")}}};var ut=dt;const pt={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.8.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",marker:"plyr__progress__marker",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id",hash:"data-plyr-embed-hash"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:"",withCredentials:!1},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1},mediaMetadata:{title:"",artist:"",album:"",artwork:[]},markers:{enabled:!1,points:[]}};var mt=pt;const gt={active:"picture-in-picture",inactive:"inline"};const ft={html5:"html5",youtube:"youtube",vimeo:"vimeo"},yt={audio:"audio",video:"video"};function bt(e){return/^(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?ft.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ft.vimeo:null}function vt(){}class wt{constructor(e=!1){this.enabled=window.console&&e,this.enabled&&this.log("Debugging enabled")}get log(){return this.enabled?Function.prototype.bind.call(console.log,console):vt}get warn(){return this.enabled?Function.prototype.bind.call(console.warn,console):vt}get error(){return this.enabled?Function.prototype.bind.call(console.error,console):vt}}class kt{constructor(e){(0,v.A)(this,"onChange",()=>{if(!this.supported)return;const e=this.player.elements.buttons.fullscreen;V.element(e)&&(e.pressed=this.active);const t=this.target===this.player.media?this.target:this.player.elements.container;be.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}),(0,v.A)(this,"toggleFallback",(e=!1)=>{if(e?this.scrollPosition={x:window.scrollX??0,y:window.scrollY??0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",se(this.target,this.player.config.classNames.fullscreen.fallback,e),He.isIos){let t=document.head.querySelector('meta[name="viewport"]');const i="viewport-fit=cover";t||(t=document.createElement("meta"),t.setAttribute("name","viewport"));const s=V.string(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!s,s||(t.content+=`,${i}`)):this.cleanupViewport&&(t.content=t.content.split(",").filter(e=>e.trim()!==i).join(","))}this.onChange()}),(0,v.A)(this,"trapFocus",e=>{if(He.isIos||He.isIPadOS||!this.active||"Tab"!==e.key)return;const t=document.activeElement,i=oe.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),[s]=i,n=i[i.length-1];t!==n||e.shiftKey?t===s&&e.shiftKey&&(n.focus(),e.preventDefault()):(s.focus(),e.preventDefault())}),(0,v.A)(this,"update",()=>{if(this.supported){let e;e=this.forceFallback?"Fallback (forced)":kt.nativeSupported?"Native":"Fallback",this.player.debug.log(`${e} fullscreen enabled`)}else this.player.debug.log("Fullscreen not supported and fallback disabled");se(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.supported)}),(0,v.A)(this,"enter",()=>{this.supported&&(He.isIos&&this.player.config.fullscreen.iosNative?this.player.isVimeo?this.player.embed.requestFullscreen():this.target.webkitEnterFullscreen():!kt.nativeSupported||this.forceFallback?this.toggleFallback(!0):this.prefix?V.empty(this.prefix)||this.target[`${this.prefix}Request${this.property}`]():this.target.requestFullscreen({navigationUI:"hide"}))}),(0,v.A)(this,"exit",()=>{if(this.supported)if(He.isIos&&this.player.config.fullscreen.iosNative)this.player.isVimeo?this.player.embed.exitFullscreen():this.target.webkitEnterFullscreen(),ke(this.player.play());else if(!kt.nativeSupported||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!V.empty(this.prefix)){const e="moz"===this.prefix?"Cancel":"Exit";document[`${this.prefix}${e}${this.property}`]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}),(0,v.A)(this,"toggle",()=>{this.active?this.exit():this.enter()}),this.player=e,this.prefix=kt.prefix,this.property=kt.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===e.config.fullscreen.fallback,this.player.elements.fullscreen=e.config.fullscreen.container&&re(this.player.elements.container,e.config.fullscreen.container),ge.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":`${this.prefix}fullscreenchange`,()=>{this.onChange()}),ge.call(this.player,this.player.elements.container,"dblclick",e=>{V.element(this.player.elements.controls)&&this.player.elements.controls.contains(e.target)||this.player.listeners.proxy(e,this.toggle,"fullscreen")}),ge.call(this,this.player.elements.container,"keydown",e=>this.trapFocus(e)),this.update()}static get nativeSupported(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}get useNative(){return kt.nativeSupported&&!this.forceFallback}static get prefix(){if(V.function(document.exitFullscreen))return"";let e="";const t=["webkit","moz","ms"];return t.some(t=>!(!V.function(document[`${t}ExitFullscreen`])&&!V.function(document[`${t}CancelFullScreen`]))&&(e=t,!0)),e}static get property(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}get supported(){return[this.player.config.fullscreen.enabled,this.player.isVideo,kt.nativeSupported||this.player.config.fullscreen.fallback,!this.player.isYouTube||kt.nativeSupported||!He.isIos||this.player.config.playsinline&&!this.player.config.fullscreen.iosNative].every(Boolean)}get active(){if(!this.supported)return!1;if(!kt.nativeSupported||this.forceFallback)return ne(this.target,this.player.config.classNames.fullscreen.fallback);const e=this.prefix?this.target.getRootNode()[`${this.prefix}${this.property}Element`]:this.target.getRootNode().fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}get target(){return He.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen??this.player.elements.container}}var Tt=kt;function Ct(e,t=1){return new Promise((i,s)=>{const n=new Image,a=()=>{delete n.onload,delete n.onerror,(n.naturalWidth>=t?i:s)(n)};Object.assign(n,{onload:a,onerror:a,src:e})})}const At={addStyleHook(){se(this.elements.container,this.config.selectors.container.replace(".",""),!0),se(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls(e=!1){e&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build(){if(this.listeners.media(),!this.supported.ui)return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`),void At.toggleNativeControls.call(this,!0);V.element(this.elements.controls)||(lt.inject.call(this),this.listeners.controls()),At.toggleNativeControls.call(this),this.isHTML5&&ut.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,lt.updateVolume.call(this),lt.timeUpdate.call(this),lt.durationUpdate.call(this),At.checkPlaying.call(this),se(this.elements.container,this.config.classNames.pip.supported,ue.pip&&this.isHTML5&&this.isVideo),se(this.elements.container,this.config.classNames.airplay.supported,ue.airplay&&this.isHTML5),se(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(()=>{be.call(this,this.media,"ready")},0),At.setTitle.call(this),this.poster&&At.setPoster.call(this,this.poster,!1).catch(()=>{}),this.config.duration&<.durationUpdate.call(this),this.config.mediaMetadata&<.setMediaMetadata.call(this)},setTitle(){let e=Ge.get("play",this.config);if(V.string(this.config.title)&&!V.empty(this.config.title)&&(e+=`, ${this.config.title}`),Array.from(this.elements.buttons.play||[]).forEach(t=>{t.setAttribute("aria-label",e)}),this.isEmbed){const e=le.call(this,"iframe");if(!V.element(e))return;const t=V.empty(this.config.title)?"video":this.config.title,i=Ge.get("frameTitle",this.config);e.setAttribute("title",i.replace("{title}",t))}},togglePoster(e){se(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster(e,t=!0){return t&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),we.call(this).then(()=>Ct(e)).catch(t=>{throw e===this.poster&&At.togglePoster.call(this,!1),t}).then(()=>{if(e!==this.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(()=>(Object.assign(this.elements.poster.style,{backgroundImage:`url('${e}')`,backgroundSize:""}),At.togglePoster.call(this,!0),e)))},checkPlaying(e){se(this.elements.container,this.config.classNames.playing,this.playing),se(this.elements.container,this.config.classNames.paused,this.paused),se(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(e=>{Object.assign(e,{pressed:this.playing}),e.setAttribute("aria-label",Ge.get(this.playing?"pause":"play",this.config))}),V.event(e)&&"timeupdate"===e.type||At.toggleControls.call(this)},checkLoading(e){this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(()=>{se(this.elements.container,this.config.classNames.loading,this.loading),At.toggleControls.call(this)},this.loading?250:0)},toggleControls(e){const{controls:t}=this.elements;if(t&&this.config.hideControls){const i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles(){Object.values({...this.media.style}).filter(e=>!V.empty(e)&&V.string(e)&&e.startsWith("--plyr")).forEach(e=>{this.elements.container.style.setProperty(e,this.media.style.getPropertyValue(e)),this.media.style.removeProperty(e)}),V.empty(this.media.style)&&this.media.removeAttribute("style")}};var St=At;class xt{constructor(e){(0,v.A)(this,"firstTouch",()=>{const{player:e}=this,{elements:t}=e;e.touch=!0,se(t.container,e.config.classNames.isTouch,!0)}),(0,v.A)(this,"global",(e=!0)=>{const{player:t}=this;t.config.keyboard.global&&me.call(t,window,"keydown keyup",this.handleKey,e,!1),me.call(t,document.body,"click",this.toggleMenu,e),ye.call(t,document.body,"touchstart",this.firstTouch)}),(0,v.A)(this,"container",()=>{const{player:e}=this,{config:t,elements:i,timers:s}=e;!t.keyboard.global&&t.keyboard.focused&&ge.call(e,i.container,"keydown keyup",this.handleKey,!1),ge.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",t=>{const{controls:n}=i;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);const a=["touchstart","touchmove","mousemove"].includes(t.type);let r=0;a&&(St.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(s.controls),s.controls=setTimeout(()=>St.toggleControls.call(e,!1),r)});const n=()=>{if(!e.isVimeo||e.config.vimeo.premium)return;const t=i.wrapper,{active:s}=e.fullscreen,[n,a]=Ee.call(e),r=Ae(`aspect-ratio: ${n} / ${a}`);if(!s)return void(r?(t.style.width=null,t.style.height=null):(t.style.maxWidth=null,t.style.margin=null));const[o,l]=Ie(),c=o/l>n/a;r?(t.style.width=c?"auto":"100%",t.style.height=c?"100%":"auto"):(t.style.maxWidth=c?l/a*n+"px":null,t.style.margin=c?"0 auto":null)},a=()=>{clearTimeout(s.resized),s.resized=setTimeout(n,50)};ge.call(e,i.container,"enterfullscreen exitfullscreen",t=>{const{target:s}=e.fullscreen;if(s!==i.container)return;if(!e.isEmbed&&V.empty(e.config.ratio))return;n();const r="enterfullscreen"===t.type?ge:fe;r.call(e,window,"resize",a)})}),(0,v.A)(this,"media",()=>{const{player:e}=this,{elements:t}=e;if(ge.call(e,e.media,"timeupdate seeking seeked",t=>lt.timeUpdate.call(e,t)),ge.call(e,e.media,"durationchange loadeddata loadedmetadata",t=>lt.durationUpdate.call(e,t)),ge.call(e,e.media,"ended",()=>{e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())}),ge.call(e,e.media,"progress playing seeking seeked",t=>lt.updateProgress.call(e,t)),ge.call(e,e.media,"volumechange",t=>lt.updateVolume.call(e,t)),ge.call(e,e.media,"playing play pause ended emptied timeupdate",t=>St.checkPlaying.call(e,t)),ge.call(e,e.media,"waiting canplay seeked playing",t=>St.checkLoading.call(e,t)),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){const i=le.call(e,`.${e.config.classNames.video}`);if(!V.element(i))return;ge.call(e,t.container,"click",s=>{const n=[t.container,i];(n.includes(s.target)||i.contains(s.target))&&(e.touch&&e.config.hideControls||(e.ended?(this.proxy(s,e.restart,"restart"),this.proxy(s,()=>{ke(e.play())},"play")):this.proxy(s,()=>{ke(e.togglePlay())},"play")))})}e.supported.ui&&e.config.disableContextMenu&&ge.call(e,t.wrapper,"contextmenu",e=>{e.preventDefault()},!1),ge.call(e,e.media,"volumechange",()=>{e.storage.set({volume:e.volume,muted:e.muted})}),ge.call(e,e.media,"ratechange",()=>{lt.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),ge.call(e,e.media,"qualitychange",t=>{lt.updateSetting.call(e,"quality",null,t.detail.quality)}),ge.call(e,e.media,"ready qualitychange",()=>{lt.setDownloadUrl.call(e)});const i=e.config.events.concat(["keyup","keydown"]).join(" ");ge.call(e,e.media,i,i=>{let{detail:s={}}=i;"error"===i.type&&(s=e.media.error),be.call(e,t.container,i.type,!0,s)})}),(0,v.A)(this,"proxy",(e,t,i)=>{const{player:s}=this,n=s.config.listeners[i],a=V.function(n);let r=!0;a&&(r=n.call(s,e)),!1!==r&&V.function(t)&&t.call(s,e)}),(0,v.A)(this,"bind",(e,t,i,s,n=!0)=>{const{player:a}=this,r=a.config.listeners[s],o=V.function(r);ge.call(a,e,t,e=>this.proxy(e,i,s),n&&!o)}),(0,v.A)(this,"controls",()=>{const{player:e}=this,{elements:t}=e,i=He.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach(t=>{this.bind(t,"click",()=>{ke(e.togglePlay())},"play")}),this.bind(t.buttons.restart,"click",e.restart,"restart"),this.bind(t.buttons.rewind,"click",()=>{e.lastSeekTime=Date.now(),e.rewind()},"rewind"),this.bind(t.buttons.fastForward,"click",()=>{e.lastSeekTime=Date.now(),e.forward()},"fastForward"),this.bind(t.buttons.mute,"click",()=>{e.muted=!e.muted},"mute"),this.bind(t.buttons.captions,"click",()=>e.toggleCaptions()),this.bind(t.buttons.download,"click",()=>{be.call(e,e.media,"download")},"download"),this.bind(t.buttons.fullscreen,"click",()=>{e.fullscreen.toggle()},"fullscreen"),this.bind(t.buttons.pip,"click",()=>{e.pip="toggle"},"pip"),this.bind(t.buttons.airplay,"click",e.airplay,"airplay"),this.bind(t.buttons.settings,"click",t=>{t.stopPropagation(),t.preventDefault(),lt.toggleMenu.call(e,t)},null,!1),this.bind(t.buttons.settings,"keyup",t=>{[" ","Enter"].includes(t.key)&&("Enter"!==t.key?(t.preventDefault(),t.stopPropagation(),lt.toggleMenu.call(e,t)):lt.focusFirstMenuItem.call(e,null,!0))},null,!1),this.bind(t.settings.menu,"keydown",t=>{"Escape"===t.key&<.toggleMenu.call(e,t)}),this.bind(t.inputs.seek,"mousedown mousemove",e=>{const i=t.progress.getBoundingClientRect(),s=e.pageX-e.clientX,n=100/i.width*(e.pageX-i.left-s);e.currentTarget.setAttribute("seek-value",n)}),this.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",t=>{const i=t.currentTarget,s="play-on-seeked";if(V.keyboardEvent(t)&&!["ArrowLeft","ArrowRight"].includes(t.key))return;e.lastSeekTime=Date.now();const n=i.hasAttribute(s),a=["mouseup","touchend","keyup"].includes(t.type);n&&a?(i.removeAttribute(s),ke(e.play())):!a&&e.playing&&(i.setAttribute(s,""),e.pause())}),He.isIos){const t=oe.call(e,'input[type="range"]');Array.from(t).forEach(e=>this.bind(e,i,e=>q(e.target)))}this.bind(t.inputs.seek,i,t=>{const i=t.currentTarget;let s=i.getAttribute("seek-value");V.empty(s)&&(s=i.value),i.removeAttribute("seek-value"),e.currentTime=s/i.max*e.duration},"seek"),this.bind(t.progress,"mouseenter mouseleave mousemove",t=>lt.updateSeekTooltip.call(e,t)),this.bind(t.progress,"mousemove touchmove",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startMove(t)}),this.bind(t.progress,"mouseleave touchend click",()=>{const{previewThumbnails:t}=e;t&&t.loaded&&t.endMove(!1,!0)}),this.bind(t.progress,"mousedown touchstart",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startScrubbing(t)}),this.bind(t.progress,"mouseup touchend",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.endScrubbing(t)}),He.isWebKit&&Array.from(oe.call(e,'input[type="range"]')).forEach(t=>{this.bind(t,"input",t=>lt.updateRangeFill.call(e,t.target))}),e.config.toggleInvert&&!V.element(t.display.duration)&&this.bind(t.display.currentTime,"click",()=>{0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,lt.timeUpdate.call(e))}),this.bind(t.inputs.volume,i,t=>{e.volume=t.target.value},"volume"),this.bind(t.controls,"mouseenter mouseleave",i=>{t.controls.hover=!e.touch&&"mouseenter"===i.type}),t.fullscreen&&Array.from(t.fullscreen.children).filter(e=>!e.contains(t.container)).forEach(i=>{this.bind(i,"mouseenter mouseleave",i=>{t.controls&&(t.controls.hover=!e.touch&&"mouseenter"===i.type)})}),this.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",e=>{t.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(t.controls,"focusin",()=>{const{config:i,timers:s}=e;se(t.controls,i.classNames.noTransition,!0),St.toggleControls.call(e,!0),setTimeout(()=>{se(t.controls,i.classNames.noTransition,!1)},0);const n=this.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(()=>St.toggleControls.call(e,!1),n)}),this.bind(t.inputs.volume,"wheel",t=>{const i=t.webkitDirectionInvertedFromDevice,[s,n]=[t.deltaX,-t.deltaY].map(e=>i?-e:e),a=Math.sign(Math.abs(s)>Math.abs(n)?s:n);e.increaseVolume(a/50);const{volume:r}=e.media;(1===a&&r<1||-1===a&&r>0)&&t.preventDefault()},"volume",!1)}),this.player=e,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}handleKey(e){const{player:t}=this,{elements:i}=t,{key:s,type:n,altKey:a,ctrlKey:r,metaKey:o,shiftKey:l}=e,c="keydown"===n,h=c&&s===this.lastKey;if(a||r||o||l)return;if(!s)return;const d=e=>{t.currentTime=t.duration/10*e};if(c){const n=document.activeElement;if(V.element(n)){const{editable:s}=t.config.selectors,{seek:a}=i.inputs;if(n!==a&&ae(n,s))return;if(" "===e.key&&ae(n,'button, [role^="menuitem"]'))return}const a=[" ","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","0","1","2","3","4","5","6","7","8","9","c","f","k","l","m"];switch(a.includes(s)&&(e.preventDefault(),e.stopPropagation()),s){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":h||d(Number.parseInt(s,10));break;case" ":case"k":h||ke(t.togglePlay());break;case"ArrowUp":t.increaseVolume(.1);break;case"ArrowDown":t.decreaseVolume(.1);break;case"m":h||(t.muted=!t.muted);break;case"ArrowRight":t.forward();break;case"ArrowLeft":t.rewind();break;case"f":t.fullscreen.toggle();break;case"c":h||t.toggleCaptions();break;case"l":t.loop=!t.loop;break;default:break}"Escape"===s&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=s}else this.lastKey=null}toggleMenu(e){lt.toggleMenu.call(this.player,e)}}var Mt=xt,Et=i(51583);function Lt(e){return new Promise((t,i)=>{Et(e,{success:t,error:i})})}function Pt(e){if(V.empty(e))return null;if(V.number(Number(e)))return e;const t=/^.*(vimeo.com\/|video\/)(\d+).*/,i=e.match(t);return i?i[2]:e}function It(e){const t=/^.*(vimeo.com\/|video\/)(\d+)(\?.*h=|\/)+([\d,a-f]+)/,i=e.match(t);return i&&5===i.length?i[4]:null}function $t(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,be.call(this,this.media,e?"play":"pause"))}const Nt={setup(){const e=this;se(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Le.call(e),V.object(window.Vimeo)?Nt.ready.call(e):Lt(e.config.urls.vimeo.sdk).then(()=>{Nt.ready.call(e)}).catch(t=>{e.debug.warn("Vimeo SDK (player.js) failed to load",t)})},ready(){const e=this,t=e.config.vimeo,{premium:i,referrerPolicy:s,...n}=t;let a=e.media.getAttribute("src"),r="";V.empty(a)?(a=e.media.getAttribute(e.config.attributes.embed.id),r=e.media.getAttribute(e.config.attributes.embed.hash)):r=It(a);const o=r?{h:r}:{};i&&Object.assign(n,{controls:!1,sidedock:!1});const l=ht({loop:e.config.loop.active,autoplay:e.autoplay,muted:e.muted,gesture:"media",playsinline:e.config.playsinline,...o,...n}),c=Pt(a),h=Y("iframe"),d=je(e.config.urls.vimeo.iframe,c,l);if(h.setAttribute("src",d),h.setAttribute("allowfullscreen",""),h.setAttribute("allow",["autoplay","fullscreen","picture-in-picture","encrypted-media","accelerometer","gyroscope"].join("; ")),V.empty(s)||h.setAttribute("referrerPolicy",s),i||!t.customControls)h.setAttribute("data-poster",e.poster),e.media=ee(h,e.media);else{const t=Y("div",{class:e.config.classNames.embedContainer,"data-poster":e.poster});t.appendChild(h),e.media=ee(t,e.media)}t.customControls||tt(je(e.config.urls.vimeo.api,d)).then(t=>{!V.empty(t)&&t.thumbnail_url&&St.setPoster.call(e,t.thumbnail_url).catch(()=>{})}),e.embed=new window.Vimeo.Player(h,{autopause:e.config.autopause,muted:e.muted}),e.media.paused=!0,e.media.currentTime=0,e.supported.ui&&e.embed.disableTextTrack(),e.media.play=()=>($t.call(e,!0),e.embed.play()),e.media.pause=()=>($t.call(e,!1),e.embed.pause()),e.media.stop=()=>{e.pause(),e.currentTime=0};let{currentTime:u}=e.media;Object.defineProperty(e.media,"currentTime",{get(){return u},set(t){const{embed:i,media:s,paused:n,volume:a}=e,r=n&&!i.hasPlayed;s.seeking=!0,be.call(e,s,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(()=>i.setCurrentTime(t)).then(()=>r&&i.pause()).then(()=>r&&i.setVolume(a)).catch(()=>{})}});let p=e.config.speed.selected;Object.defineProperty(e.media,"playbackRate",{get(){return p},set(t){e.embed.setPlaybackRate(t).then(()=>{p=t,be.call(e,e.media,"ratechange")}).catch(()=>{e.options.speed=[1]})}});let{volume:m}=e.config;Object.defineProperty(e.media,"volume",{get(){return m},set(t){e.embed.setVolume(t).then(()=>{m=t,be.call(e,e.media,"volumechange")})}});let{muted:g}=e.config;Object.defineProperty(e.media,"muted",{get(){return g},set(t){const i=!!V.boolean(t)&&t;e.embed.setMuted(!!i||e.config.muted).then(()=>{g=i,be.call(e,e.media,"volumechange")})}});let f,{loop:y}=e.config;Object.defineProperty(e.media,"loop",{get(){return y},set(t){const i=V.boolean(t)?t:e.config.loop.active;e.embed.setLoop(i).then(()=>{y=i})}}),e.embed.getVideoUrl().then(t=>{f=t,lt.setDownloadUrl.call(e)}).catch(e=>{this.debug.warn(e)}),Object.defineProperty(e.media,"currentSrc",{get(){return f}}),Object.defineProperty(e.media,"ended",{get(){return e.currentTime===e.duration}}),Promise.all([e.embed.getVideoWidth(),e.embed.getVideoHeight()]).then(t=>{const[i,s]=t;e.embed.ratio=Pe(i,s),Le.call(this)}),e.embed.setAutopause(e.config.autopause).then(t=>{e.config.autopause=t}),e.embed.getVideoTitle().then(t=>{e.config.title=t,St.setTitle.call(this)}),e.embed.getCurrentTime().then(t=>{u=t,be.call(e,e.media,"timeupdate")}),e.embed.getDuration().then(t=>{e.media.duration=t,be.call(e,e.media,"durationchange")}),e.embed.getTextTracks().then(t=>{e.media.textTracks=t,ut.setup.call(e)}),e.embed.on("cuechange",({cues:t=[]})=>{const i=t.map(e=>Ke(e.text));ut.updateCues.call(e,i)}),e.embed.on("loaded",()=>{if(e.embed.getPaused().then(t=>{$t.call(e,!t),t||be.call(e,e.media,"playing")}),V.element(e.embed.element)&&e.supported.ui){const t=e.embed.element;t.setAttribute("tabindex",-1)}}),e.embed.on("bufferstart",()=>{be.call(e,e.media,"waiting")}),e.embed.on("bufferend",()=>{be.call(e,e.media,"playing")}),e.embed.on("play",()=>{$t.call(e,!0),be.call(e,e.media,"playing")}),e.embed.on("pause",()=>{$t.call(e,!1)}),e.embed.on("timeupdate",t=>{e.media.seeking=!1,u=t.seconds,be.call(e,e.media,"timeupdate")}),e.embed.on("progress",t=>{e.media.buffered=t.percent,be.call(e,e.media,"progress"),1===Number.parseInt(t.percent,10)&&be.call(e,e.media,"canplaythrough"),e.embed.getDuration().then(t=>{t!==e.media.duration&&(e.media.duration=t,be.call(e,e.media,"durationchange"))})}),e.embed.on("seeked",()=>{e.media.seeking=!1,be.call(e,e.media,"seeked")}),e.embed.on("ended",()=>{e.media.paused=!0,be.call(e,e.media,"ended")}),e.embed.on("error",t=>{e.media.error=t,be.call(e,e.media,"error")}),t.customControls&&setTimeout(()=>St.build.call(e),0)}};var Dt=Nt;function Ft(e){if(V.empty(e))return null;const t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/,i=e.match(t);return i&&i[2]?i[2]:e}function _t(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,be.call(this,this.media,e?"play":"pause"))}function Rt(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}const Ot={setup(){if(se(this.elements.wrapper,this.config.classNames.embed,!0),V.object(window.YT)&&V.function(window.YT.Player))Ot.ready.call(this);else{const e=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{V.function(e)&&e(),Ot.ready.call(this)},Lt(this.config.urls.youtube.sdk).catch(e=>{this.debug.warn("YouTube API failed to load",e)})}},getTitle(e){const t=je(this.config.urls.youtube.api,e);tt(t).then(e=>{if(V.object(e)){const{title:t,height:i,width:s}=e;this.config.title=t,St.setTitle.call(this),this.embed.ratio=Pe(s,i)}Le.call(this)}).catch(()=>{Le.call(this)})},ready(){const e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(!V.empty(i)&&i.startsWith("youtube-"))return;let s=e.media.getAttribute("src");V.empty(s)&&(s=e.media.getAttribute(this.config.attributes.embed.id));const n=Ft(s),a=Ve(e.provider),r=Y("div",{id:a,"data-poster":t.customControls?e.poster:void 0});if(e.media=ee(r,e.media),t.customControls){const t=e=>`https://i.ytimg.com/vi/${n}/${e}default.jpg`;Ct(t("maxres"),121).catch(()=>Ct(t("sd"),121)).catch(()=>Ct(t("hq"))).then(t=>St.setPoster.call(e,t.src)).then(t=>{t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(()=>{})}e.embed=new window.YT.Player(e.media,{videoId:n,host:Rt(t),playerVars:z({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.playsinline&&!e.config.fullscreen.iosNative?1:0,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError(t){if(!e.media.error){const i=t.data,s={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occurred";e.media.error={code:i,message:s},be.call(e,e.media,"error")}},onPlaybackRateChange(t){const i=t.target;e.media.playbackRate=i.getPlaybackRate(),be.call(e,e.media,"ratechange")},onReady(i){if(V.function(e.media.play))return;const s=i.target;Ot.getTitle.call(e,n),e.media.play=()=>{_t.call(e,!0),s.playVideo()},e.media.pause=()=>{_t.call(e,!1),s.pauseVideo()},e.media.stop=()=>{s.stopVideo()},e.media.duration=s.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get(){return Number(s.getCurrentTime())},set(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,be.call(e,e.media,"seeking"),s.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get(){return s.getPlaybackRate()},set(e){s.setPlaybackRate(e)}});let{volume:a}=e.config;Object.defineProperty(e.media,"volume",{get(){return a},set(t){a=t,s.setVolume(100*a),be.call(e,e.media,"volumechange")}});let{muted:r}=e.config;Object.defineProperty(e.media,"muted",{get(){return r},set(t){const i=V.boolean(t)?t:r;r=i,s[i?"mute":"unMute"](),s.setVolume(100*a),be.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get(){return s.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get(){return e.currentTime===e.duration}});const o=s.getAvailablePlaybackRates();e.options.speed=o.filter(t=>e.config.speed.options.includes(t)),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),be.call(e,e.media,"timeupdate"),be.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(()=>{e.media.buffered=s.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBufferedSt.build.call(e),50)},onStateChange(i){const s=i.target;clearInterval(e.timers.playing);const n=e.media.seeking&&[1,2].includes(i.data);switch(n&&(e.media.seeking=!1,be.call(e,e.media,"seeked")),i.data){case-1:be.call(e,e.media,"timeupdate"),e.media.buffered=s.getVideoLoadedFraction(),be.call(e,e.media,"progress");break;case 0:_t.call(e,!1),e.media.loop?(s.stopVideo(),s.playVideo()):be.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(_t.call(e,!0),be.call(e,e.media,"playing"),e.timers.playing=setInterval(()=>{be.call(e,e.media,"timeupdate")},50),e.media.duration!==s.getDuration()&&(e.media.duration=s.getDuration(),be.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),_t.call(e,!1);break;case 3:be.call(e,e.media,"waiting");break;default:break}be.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}};var Bt=Ot;const Ht={setup(){this.media?(se(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),se(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&se(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Y("div",{class:this.config.classNames.video}),W(this.media,this.elements.wrapper),this.elements.poster=Y("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ne.setup.call(this):this.isYouTube?Bt.setup.call(this):this.isVimeo&&Dt.setup.call(this)):this.debug.warn("No media element found!")}};var Vt=Ht;function jt(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()}class qt{constructor(e){(0,v.A)(this,"load",()=>{this.enabled&&(V.object(window.google)&&V.object(window.google.ima)?this.ready():Lt(this.player.config.urls.googleIMA.sdk).then(()=>{this.ready()}).catch(()=>{this.trigger("error",new Error("Google IMA SDK failed to load"))}))}),(0,v.A)(this,"ready",()=>{this.enabled||jt(this),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(()=>{this.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}),(0,v.A)(this,"setupIMA",()=>{this.elements.container=Y("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,e=>this.onAdsManagerLoaded(e),!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,e=>this.onAdError(e),!1),this.requestAds()}),(0,v.A)(this,"requestAds",()=>{const{container:e}=this.player.elements;try{const t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(t){this.onAdError(t)}}),(0,v.A)(this,"pollCountdown",(e=!1)=>{if(!e)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");const t=()=>{const e=rt(Math.max(this.manager.getRemainingTime(),0)),t=`${Ge.get("advertisement",this.player.config)} - ${e}`;this.elements.container.setAttribute("data-badge-text",t)};this.countdownTimer=setInterval(t,100)}),(0,v.A)(this,"onAdsManagerLoaded",e=>{if(!this.enabled)return;const t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,this.manager=e.getAdsManager(this.player,t),this.cuePoints=this.manager.getCuePoints(),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,e=>this.onAdError(e)),Object.keys(google.ima.AdEvent.Type).forEach(e=>{this.manager.addEventListener(google.ima.AdEvent.Type[e],e=>this.onAdEvent(e))}),this.trigger("loaded")}),(0,v.A)(this,"addCuePoints",()=>{V.empty(this.cuePoints)||this.cuePoints.forEach(e=>{if(0!==e&&-1!==e&&e{const{container:t}=this.player.elements,i=e.getAd(),s=e.getAdData(),n=e=>{be.call(this.player,this.player.media,`ads${e.replace(/_/g,"").toLowerCase()}`)};switch(n(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`);break;default:break}}),(0,v.A)(this,"onAdError",e=>{this.cancel(),this.player.debug.warn("Ads error",e)}),(0,v.A)(this,"listeners",()=>{const{container:e}=this.player.elements;let t;this.player.on("canplay",()=>{this.addCuePoints()}),this.player.on("ended",()=>{this.loader.contentComplete()}),this.player.on("timeupdate",()=>{t=this.player.currentTime}),this.player.on("seeked",()=>{const e=this.player.currentTime;V.empty(this.cuePoints)||this.cuePoints.forEach((i,s)=>{t{this.manager&&this.manager.resize(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL)})}),(0,v.A)(this,"play",()=>{const{container:e}=this.player.elements;this.managerPromise||this.resumeContent(),this.managerPromise.then(()=>{this.manager.setVolume(this.player.volume),this.elements.displayContainer.initialize();try{this.initialized||(this.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),this.manager.start()),this.initialized=!0}catch(t){this.onAdError(t)}}).catch(()=>{})}),(0,v.A)(this,"resumeContent",()=>{this.elements.container.style.zIndex="",this.playing=!1,ke(this.player.media.play())}),(0,v.A)(this,"pauseContent",()=>{this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}),(0,v.A)(this,"cancel",()=>{this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}),(0,v.A)(this,"loadAds",()=>{this.managerPromise.then(()=>{this.manager&&this.manager.destroy(),this.managerPromise=new Promise(e=>{this.on("loaded",e),this.player.debug.log(this.manager)}),this.initialized=!1,this.requestAds()}).catch(()=>{})}),(0,v.A)(this,"trigger",(e,...t)=>{const i=this.events[e];V.array(i)&&i.forEach(e=>{V.function(e)&&e.apply(this,t)})}),(0,v.A)(this,"on",(e,t)=>(V.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this)),(0,v.A)(this,"startSafetyTimer",(e,t)=>{this.player.debug.log(`Safety timer invoked from: ${t}`),this.safetyTimer=setTimeout(()=>{this.cancel(),this.clearSafetyTimer("startSafetyTimer()")},e)}),(0,v.A)(this,"clearSafetyTimer",e=>{V.nullOrUndefined(this.safetyTimer)||(this.player.debug.log(`Safety timer cleared from: ${e}`),clearTimeout(this.safetyTimer),this.safetyTimer=null)}),this.player=e,this.config=e.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise((e,t)=>{this.on("loaded",e),this.on("error",t)}),this.load()}get enabled(){const{config:e}=this;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!V.empty(e.publisherId)||V.url(e.tagUrl))}get tagUrl(){const{config:e}=this;if(V.url(e.tagUrl))return e.tagUrl;const t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId},i="https://go.aniview.com/api/adserver6/vast/";return`${i}?${ht(t)}`}}var Ut=qt;function Xt(e=0,t=0,i=255){return Math.min(Math.max(e,t),i)}function zt(e){const t=[],i=e.split(/\r\n\r\n|\n\n|\r\r/);return i.forEach(e=>{const i={},s=e.split(/\r\n|\n|\r/);s.forEach(e=>{if(V.number(i.startTime)){if(!V.empty(e.trim())&&V.empty(i.text)){const t=e.trim().split("#xywh=");[i.text]=t,t[1]&&([i.x,i.y,i.w,i.h]=t[1].split(","))}}else{const t=e.match(/(\d{2})?:?(\d{2}):(\d{2}).(\d{2,3})( ?--> ?)(\d{2})?:?(\d{2}):(\d{2}).(\d{2,3})/);t&&(i.startTime=60*Number(t[1]||0)*60+60*Number(t[2])+Number(t[3])+Number(`0.${t[4]}`),i.endTime=60*Number(t[6]||0)*60+60*Number(t[7])+Number(t[8])+Number(`0.${t[9]}`))}}),i.text&&t.push(i)}),t}function Wt(e,t){const i=t.width/t.height,s={};return e>i?(s.width=t.width,s.height=1/e*t.width):(s.height=t.height,s.width=e*t.height),s}class Kt{constructor(e){(0,v.A)(this,"load",()=>{this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(()=>{this.enabled&&(this.render(),this.determineContainerAutoSizing(),this.listeners(),this.loaded=!0)})}),(0,v.A)(this,"getThumbnails",()=>new Promise(e=>{const{src:t}=this.player.config.previewThumbnails;if(V.empty(t))throw new Error("Missing previewThumbnails.src config attribute");const i=()=>{this.thumbnails.sort((e,t)=>e.height-t.height),this.player.debug.log("Preview thumbnails",this.thumbnails),e()};if(V.function(t))t(e=>{this.thumbnails=e,i()});else{const e=V.string(t)?[t]:t,s=e.map(e=>this.getThumbnail(e));Promise.all(s).then(i)}})),(0,v.A)(this,"getThumbnail",e=>new Promise(t=>{tt(e,void 0,this.player.config.previewThumbnails.withCredentials).then(i=>{const s={frames:zt(i),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));const n=new Image;n.onload=()=>{s.height=n.naturalHeight,s.width=n.naturalWidth,this.thumbnails.push(s),t()},n.src=s.urlPrefix+s.frames[0].text})})),(0,v.A)(this,"startMove",e=>{if(this.loaded&&V.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{const t=this.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(i/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.textContent=rt(this.seekTime);const s=this.player.config.markers?.points?.find(({time:e})=>e===Math.round(this.seekTime));s&&this.elements.thumb.time.insertAdjacentHTML("afterbegin",`${s.label}
`)}this.showImageAtCurrentTime()}}),(0,v.A)(this,"endMove",()=>{this.toggleThumbContainer(!1,!0)}),(0,v.A)(this,"startScrubbing",e=>{(V.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}),(0,v.A)(this,"endScrubbing",()=>{this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):ye.call(this.player,this.player.media,"timeupdate",()=>{this.mouseDown||this.toggleScrubbingContainer(!1)})}),(0,v.A)(this,"listeners",()=>{this.player.on("play",()=>{this.toggleThumbContainer(!1,!0)}),this.player.on("seeked",()=>{this.toggleThumbContainer(!1)}),this.player.on("timeupdate",()=>{this.lastTime=this.player.media.currentTime})}),(0,v.A)(this,"render",()=>{this.elements.thumb.container=Y("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Y("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);const e=Y("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Y("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.imageContainer.appendChild(e),V.element(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Y("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}),(0,v.A)(this,"destroy",()=>{this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}),(0,v.A)(this,"showImageAtCurrentTime",()=>{this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();const e=this.thumbnails[0].frames.findIndex(e=>this.seekTime>=e.startTime&&this.seekTime<=e.endTime),t=e>=0;let i=0;this.mouseDown||this.toggleThumbContainer(t),t&&(this.thumbnails.forEach((t,s)=>{this.loadedImages.includes(t.frames[e].text)&&(i=s)}),e!==this.showingThumb&&(this.showingThumb=e,this.loadImage(i)))}),(0,v.A)(this,"loadImage",(e=0)=>{const t=this.showingThumb,i=this.thumbnails[e],{urlPrefix:s}=i,n=i.frames[t],a=i.frames[t].text,r=s+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,n,e,t,a,!1),this.currentImageElement.dataset.index=t,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);const i=new Image;i.src=r,i.dataset.index=t,i.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log(`Loading image: ${r}`),i.onload=()=>this.showImage(i,n,e,t,a,!0),this.loadingImage=i,this.removeOldImages(i)}}),(0,v.A)(this,"showImage",(e,t,i,s,n,a=!0)=>{this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(n)||this.loadedImages.push(n)),this.preloadNearby(s,!0).then(this.preloadNearby(s,!1)).then(this.getHigherQuality(i,e,t,n))}),(0,v.A)(this,"removeOldImages",e=>{Array.from(this.currentImageContainer.children).forEach(t=>{if("img"!==t.tagName.toLowerCase())return;const i=this.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;const{currentImageContainer:e}=this;setTimeout(()=>{e.removeChild(t),this.player.debug.log(`Removing thumb: ${t.dataset.filename}`)},i)}})}),(0,v.A)(this,"preloadNearby",(e,t=!0)=>new Promise(i=>{setTimeout(()=>{const s=this.thumbnails[0].frames[e].text;if(this.showingThumbFilename===s){let n;n=t?this.thumbnails[0].frames.slice(e):this.thumbnails[0].frames.slice(0,e).reverse();let a=!1;n.forEach(e=>{const t=e.text;if(t!==s&&!this.loadedImages.includes(t)){a=!0,this.player.debug.log(`Preloading thumb filename: ${t}`);const{urlPrefix:e}=this.thumbnails[0],s=e+t,n=new Image;n.src=s,n.onload=()=>{this.player.debug.log(`Preloaded thumb filename: ${t}`),this.loadedImages.includes(t)||this.loadedImages.push(t),i()}}}),a||i()}},300)})),(0,v.A)(this,"getHigherQuality",(e,t,i,s)=>{if(e{this.showingThumbFilename===s&&(this.player.debug.log(`Showing higher quality thumb for: ${s}`),this.loadImage(e+1))},300)}}),(0,v.A)(this,"toggleThumbContainer",(e=!1,t=!1)=>{const i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}),(0,v.A)(this,"toggleScrubbingContainer",(e=!1)=>{const t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}),(0,v.A)(this,"determineContainerAutoSizing",()=>{(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}),(0,v.A)(this,"setThumbContainerSizeAndPos",()=>{const{imageContainer:e}=this.elements.thumb;if(this.sizeSpecifiedInCSS){if(e.clientHeight>20&&e.clientWidth<20){const t=Math.floor(e.clientHeight*this.thumbAspectRatio);e.style.width=`${t}px`}else if(e.clientHeight<20&&e.clientWidth>20){const t=Math.floor(e.clientWidth/this.thumbAspectRatio);e.style.height=`${t}px`}}else{const t=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);e.style.height=`${this.thumbContainerHeight}px`,e.style.width=`${t}px`}this.setThumbContainerPos()}),(0,v.A)(this,"setThumbContainerPos",()=>{const e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),{container:i}=this.elements.thumb,s=t.left-e.left+10,n=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2,r=Xt(a,s,n);i.style.left=`${r}px`,i.style.setProperty("--preview-arrow-offset",a-r+"px")}),(0,v.A)(this,"setScrubbingContainerSize",()=>{const{width:e,height:t}=Wt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});this.elements.scrubbing.container.style.width=`${e}px`,this.elements.scrubbing.container.style.height=`${t}px`}),(0,v.A)(this,"setImageSizeAndOffset",(e,t)=>{if(!this.usingSprites)return;const i=this.thumbContainerHeight/t.h;e.style.height=e.naturalHeight*i+"px",e.style.width=e.naturalWidth*i+"px",e.style.left=`-${t.x*i}px`,e.style.top=`-${t.y*i}px`}),this.player=e,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}get enabled(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}get currentImageContainer(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}get usingSprites(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}get thumbAspectRatio(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}get thumbContainerHeight(){if(this.mouseDown){const{height:e}=Wt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});return e}return this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}get currentImageElement(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement}set currentImageElement(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}var Yt=Kt;const Qt={insertElements(e,t){V.string(t)?J(e,this.media,{src:t}):V.array(t)&&t.forEach(t=>{J(e,this.media,t)})},change(e){X(e,"sources.length")?(Ne.cancelRequests.call(this),this.destroy(()=>{this.options.quality=[],G(this.media),this.media=null,V.element(this.elements.container)&&this.elements.container.removeAttribute("class");const{sources:t,type:i}=e,[{provider:s=ft.html5,src:n}]=t,a="html5"===s?i:"div",r="html5"===s?{}:{src:n};Object.assign(this,{provider:s,type:i,supported:ue.check(i,s,this.config.playsinline),media:Y(a,r)}),this.elements.container.appendChild(this.media),V.boolean(e.autoplay)&&(this.config.autoplay=e.autoplay),this.isHTML5&&(this.config.crossorigin&&this.media.setAttribute("crossorigin",""),this.config.autoplay&&this.media.setAttribute("autoplay",""),V.empty(e.poster)||(this.poster=e.poster),this.config.loop.active&&this.media.setAttribute("loop",""),this.config.muted&&this.media.setAttribute("muted",""),this.config.playsinline&&this.media.setAttribute("playsinline","")),St.addStyleHook.call(this),this.isHTML5&&Qt.insertElements.call(this,"source",t),this.config.title=e.title,Vt.setup.call(this),this.isHTML5&&Object.keys(e).includes("tracks")&&Qt.insertElements.call(this,"track",e.tracks),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&St.build.call(this),this.isHTML5&&this.media.load(),V.empty(e.previewThumbnails)||(Object.assign(this.config.previewThumbnails,e.previewThumbnails),this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))),this.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}};var Jt=Qt;class Gt{constructor(e,t){if((0,v.A)(this,"play",()=>V.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(()=>this.ads.play()).catch(()=>ke(this.media.play())),this.media.play()):null),(0,v.A)(this,"pause",()=>this.playing&&V.function(this.media.pause)?this.media.pause():null),(0,v.A)(this,"togglePlay",e=>{const t=V.boolean(e)?e:!this.playing;return t?this.play():this.pause()}),(0,v.A)(this,"stop",()=>{this.isHTML5?(this.pause(),this.restart()):V.function(this.media.stop)&&this.media.stop()}),(0,v.A)(this,"restart",()=>{this.currentTime=0}),(0,v.A)(this,"rewind",e=>{this.currentTime-=V.number(e)?e:this.config.seekTime}),(0,v.A)(this,"forward",e=>{this.currentTime+=V.number(e)?e:this.config.seekTime}),(0,v.A)(this,"increaseVolume",e=>{const t=this.media.muted?0:this.volume;this.volume=t+(V.number(e)?e:0)}),(0,v.A)(this,"decreaseVolume",e=>{this.increaseVolume(-e)}),(0,v.A)(this,"airplay",()=>{ue.airplay&&this.media.webkitShowPlaybackTargetPicker()}),(0,v.A)(this,"toggleControls",e=>{if(this.supported.ui&&!this.isAudio){const t=ne(this.elements.container,this.config.classNames.hideControls),i="undefined"===typeof e?void 0:!e,s=se(this.elements.container,this.config.classNames.hideControls,i);if(s&&V.array(this.config.controls)&&this.config.controls.includes("settings")&&!V.empty(this.config.settings)&<.toggleMenu.call(this,!1),s!==t){const e=s?"controlshidden":"controlsshown";be.call(this,this.media,e)}return!s}return!1}),(0,v.A)(this,"on",(e,t)=>{ge.call(this,this.elements.container,e,t)}),(0,v.A)(this,"once",(e,t)=>{ye.call(this,this.elements.container,e,t)}),(0,v.A)(this,"off",(e,t)=>{fe(this.elements.container,e,t)}),(0,v.A)(this,"destroy",(e,t=!1)=>{if(!this.ready)return;const i=()=>{document.body.style.overflow="",this.embed=null,t?(Object.keys(this.elements).length&&(G(this.elements.buttons.play),G(this.elements.captions),G(this.elements.controls),G(this.elements.wrapper),this.elements.buttons.play=null,this.elements.captions=null,this.elements.controls=null,this.elements.wrapper=null),V.function(e)&&e()):(ve.call(this),Ne.cancelRequests.call(this),ee(this.elements.original,this.elements.container),be.call(this,this.elements.original,"destroyed",!0),V.function(e)&&e.call(this.elements.original),this.ready=!1,setTimeout(()=>{this.elements=null,this.media=null},200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(St.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&V.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}),(0,v.A)(this,"supports",e=>ue.mime.call(this,e)),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=ue.touch,this.media=e,V.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||V.nodeList(this.media)||V.array(this.media))&&(this.media=this.media[0]),this.config=z({},mt,Gt.defaults,t||{},(()=>{try{return JSON.parse(this.media.getAttribute("data-plyr-config"))}catch{return{}}})()),this.elements={container:null,fullscreen:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new wt(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",ue),V.nullOrUndefined(this.media)||!V.element(this.media))return void this.debug.error("Setup failed: no suitable element passed");if(this.media.plyr)return void this.debug.warn("Target already setup");if(!this.config.enabled)return void this.debug.error("Setup failed: disabled by config");if(!ue.check().api)return void this.debug.error("Setup failed: no support");const i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;const s=this.media.tagName.toLowerCase();let n=null,a=null;switch(s){case"div":if(n=this.media.querySelector("iframe"),V.element(n)){if(a=ct(n.getAttribute("src")),this.provider=bt(a.toString()),this.elements.container=this.media,this.media=n,this.elements.container.className="",a.search.length){const e=["1","true"];e.includes(a.searchParams.get("autoplay"))&&(this.config.autoplay=!0),e.includes(a.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=e.includes(a.searchParams.get("playsinline")),this.config.youtube.hl=a.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(V.empty(this.provider)||!Object.values(ft).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=yt.video;break;case"video":case"audio":this.type=s,this.provider=ft.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=ue.check(this.type,this.provider),this.supported.api?(this.eventListeners=[],this.listeners=new Mt(this),this.storage=new et(this),this.media.plyr=this,V.element(this.elements.container)||(this.elements.container=Y("div"),W(this.media,this.elements.container)),St.migrateStyles.call(this),St.addStyleHook.call(this),Vt.setup.call(this),this.config.debug&&ge.call(this,this.elements.container,this.config.events.join(" "),e=>{this.debug.log(`event: ${e.type}`)}),this.fullscreen=new Tt(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&St.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ut(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",()=>ke(this.play())),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))):this.debug.error("Setup failed: no support")}get isHTML5(){return this.provider===ft.html5}get isEmbed(){return this.isYouTube||this.isVimeo}get isYouTube(){return this.provider===ft.youtube}get isVimeo(){return this.provider===ft.vimeo}get isVideo(){return this.type===yt.video}get isAudio(){return this.type===yt.audio}get playing(){return Boolean(this.ready&&!this.paused&&!this.ended)}get paused(){return Boolean(this.media.paused)}get stopped(){return Boolean(this.paused&&0===this.currentTime)}get ended(){return Boolean(this.media.ended)}set currentTime(e){if(!this.duration)return;const t=V.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log(`Seeking to ${this.currentTime} seconds`)}get currentTime(){return Number(this.media.currentTime)}get buffered(){const{buffered:e}=this.media;return V.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}get seeking(){return Boolean(this.media.seeking)}get duration(){const e=Number.parseFloat(this.config.duration),t=(this.media||{}).duration,i=V.number(t)&&t!==1/0?t:0;return e||i}set volume(e){let t=e;const i=1,s=0;V.string(t)&&(t=Number(t)),V.number(t)||(t=this.storage.get("volume")),V.number(t)||({volume:t}=this.config),t>i&&(t=i),t0&&(this.muted=!1)}get volume(){return Number(this.media.volume)}set muted(e){let t=e;V.boolean(t)||(t=this.storage.get("muted")),V.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t}get muted(){return Boolean(this.media.muted)}get hasAudio(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}set speed(e){let t=null;V.number(e)&&(t=e),V.number(t)||(t=this.storage.get("speed")),V.number(t)||(t=this.config.speed.selected);const{minimumSpeed:i,maximumSpeed:s}=this;t=Xt(t,i,s),this.config.speed.selected=t,setTimeout(()=>{this.media&&(this.media.playbackRate=t)},0)}get speed(){return Number(this.media.playbackRate)}get minimumSpeed(){return this.isYouTube?Math.min(...this.options.speed):this.isVimeo?.5:.0625}get maximumSpeed(){return this.isYouTube?Math.max(...this.options.speed):this.isVimeo?2:16}set quality(e){const t=this.config.quality,i=this.options.quality;if(!i.length)return;let s=[!V.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(V.number),n=!0;if(!i.includes(s)){const e=Ce(i,s);this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`),s=e,n=!1}t.selected=s,this.media.quality=s,n&&this.storage.set({quality:s})}get quality(){return this.media.quality}set loop(e){const t=V.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t}get loop(){return Boolean(this.media.loop)}set source(e){Jt.change.call(this,e)}get source(){return this.media.currentSrc}get download(){const{download:e}=this.config.urls;return V.url(e)?e:this.source}set download(e){V.url(e)&&(this.config.urls.download=e,lt.setDownloadUrl.call(this))}set poster(e){this.isVideo?St.setPoster.call(this,e,!1).catch(()=>{}):this.debug.warn("Poster can only be set for video")}get poster(){return this.isVideo?this.media.getAttribute("poster")||this.media.getAttribute("data-poster"):null}get ratio(){if(!this.isVideo)return null;const e=Me(Ee.call(this));return V.array(e)?e.join(":"):e}set ratio(e){this.isVideo?V.string(e)&&xe(e)?(this.config.ratio=Me(e),Le.call(this)):this.debug.error(`Invalid aspect ratio specified (${e})`):this.debug.warn("Aspect ratio can only be set for video")}set autoplay(e){this.config.autoplay=V.boolean(e)?e:this.config.autoplay}get autoplay(){return Boolean(this.config.autoplay)}toggleCaptions(e){ut.toggle.call(this,e,!1)}set currentTrack(e){ut.set.call(this,e,!1),ut.setup.call(this)}get currentTrack(){const{toggled:e,currentTrack:t}=this.captions;return e?t:-1}set language(e){ut.setLanguage.call(this,e,!1)}get language(){return(ut.getCurrentTrack.call(this)||{}).language}set pip(e){if(!ue.pip)return;const t=V.boolean(e)?e:!this.pip;V.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?gt.active:gt.inactive),V.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}get pip(){return ue.pip?V.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===gt.active:null}setPreviewThumbnails(e){this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),Object.assign(this.config.previewThumbnails,e),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))}static supported(e,t){return ue.check(e,t)}static loadSprite(e,t){return it(e,t)}static setup(e,t={}){let i=null;return V.string(e)?i=Array.from(document.querySelectorAll(e)):V.nodeList(e)?i=Array.from(e):V.array(e)&&(i=e.filter(V.element)),V.empty(i)?null:i.map(e=>new Gt(e,t))}}Gt.defaults=U(mt);var Zt=Gt;i(17642),i(58004),i(33853),i(45876),i(32475),i(15024),i(31698);const ei=new Set;let ti=null,ii="stop";function si(e){return e&&("AUDIO"===e.tagName||"VIDEO"===e.tagName)}function ni(e){if(si(e)){try{e.pause()}catch(t){}try{e.currentTime=0}catch(t){}try{e.removeAttribute("src")}catch(t){}try{e.load?.()}catch(t){}}}function ai(e=null){for(const t of ei)e&&t===e||ni(t);ti=e||null}let ri=!1;function oi(){ri||(ri=!0,document.addEventListener("visibilitychange",()=>{document.hidden&&ai(null)}),window.addEventListener("pagehide",()=>ai(null)))}function li(){return ii}function ci(e){["stop","sequence","loop"].includes(e)&&(ii=e)}var hi={name:"TransformMedia",props:{file:{type:Object,required:!0},src:{type:String,required:!0},isImage:{type:Boolean,default:!0},isVideo:{type:Boolean,default:!1},isAudio:{type:Boolean,default:!1},isActive:{type:Boolean,default:!1}},data(){return{pointers:new Map,scale:1,rotation:0,rotatePreview:0,tx:0,ty:0,naturalWidth:0,naturalHeight:0,startScale:1,startRotation:0,startTx:0,startTy:0,startCenter:null,startDist:0,startAngle:0,dragging:!1,dragStart:null,viewportRect:null,minScale:1,maxScale:4,gestureMode:null,edgeOverflow:0,edgeDir:0,player:null,audioCover:null,audioTitle:"",audioArtist:"",menuAdded:!1}},computed:{isActiveTransform(){return this.scale>1.001||this.pointers.size>=2||this.dragging},displayRotation(){return this.rotation+this.rotatePreview},rotateShrink(){const e=Math.min(1,Math.abs(this.rotatePreview)/90),t=Math.sin(Math.PI*e);return 1-.12*t},mediaStyle(){const e=this.scale*this.rotateShrink,t=this.pointers.size>0;return{transform:`translate3d(${this.tx}px, ${this.ty}px, 0) scale(${e}) rotate(${this.displayRotation}deg)`,transition:t?"none":"transform 0.25s ease",transformOrigin:"center center"}}},watch:{isActiveTransform(e){this.$emit(e?"lock":"unlock")},isActive(e){e?this.$nextTick(()=>this.initPlayer()):this.destroyPlayer()}},mounted(){this.isAudio&&this.initAudioInfo(),this.isActive&&this.$nextTick(()=>this.initPlayer())},beforeUnmount(){this.destroyPlayer(),this.audioCover&&(URL.revokeObjectURL(this.audioCover),this.audioCover=null)},methods:{initPlayer(){if(this.player)return;const e=this.$refs.videoEl||this.$refs.audioEl;if(!e)return;this.retryCount=0,this.maxRetries=3;const t=this.isAudio?["play","progress","current-time","mute","volume"]:["play","progress","current-time","mute","volume","fullscreen"];this.player=new Zt(e,{controls:t,autoplay:this.isVideo,resetOnEnd:!0}),e.addEventListener("error",()=>{this.retryCount{if(e&&this.src&&this.player){const t=this.src.split("?_retry=")[0],i=t+(t.includes("?")?"&":"?")+"_retry="+Date.now();e.src=i,e.load()}},500*this.retryCount))}),this.player.on("ready",()=>{this.tryAddCustomMenu()}),this.scheduleMenuRetry(),this.isAudio&&this.player.on("ended",this.onAudioEnded)},scheduleMenuRetry(){const e=t=>{t>=5||this.menuAdded||setTimeout(()=>{this.menuAdded||(this.tryAddCustomMenu(),e(t+1))},200*(t+1))};e(0)},tryAddCustomMenu(){if(this.menuAdded)return;if(!this.player?.elements?.controls)return;const e=this.player.elements.controls;e&&!e.querySelector(".plyr-custom-menu")&&(this.addCustomMenu(e),this.menuAdded=!0)},addCustomMenu(e){const t=li(),i=this.isAudio?`\n

\n \n \n \n ${this.$t("transformMedia.playMode")}\n \n \n \n
\n
\n
${this.$t("transformMedia.stopAfterPlay")}
\n
${this.$t("transformMedia.sequentialPlay")}
\n
${this.$t("transformMedia.loopSingle")}
\n
\n `:"",s=document.createElement("div");s.className="plyr-custom-menu",s.innerHTML=`\n \n
\n
\n \n \n \n ${this.$t("transformMedia.download")}\n
\n
\n \n \n \n \n ${this.$t("transformMedia.playbackSpeed")}\n \n \n \n
\n
\n
0.5x
\n
0.75x
\n
${this.$t("transformMedia.normalSpeed")}
\n
1.25x
\n
1.5x
\n
2x
\n
\n ${i}\n
\n `,e.appendChild(s),this.bindMenuEvents(s)},bindMenuEvents(e){const t=e.querySelector(".plyr-menu-btn"),i=e.querySelector(".plyr-menu-dropdown"),s=e.querySelector(".plyr-menu-speed"),n=e.querySelector(".plyr-speed-submenu"),a=e.querySelector('[data-action="download"]'),r=e.querySelector(".plyr-menu-playmode"),o=e.querySelector(".plyr-playmode-submenu");t.addEventListener("click",e=>{e.stopPropagation(),i.classList.toggle("show"),n.classList.remove("show"),o&&o.classList.remove("show")}),a.addEventListener("click",()=>{this.downloadMedia(),i.classList.remove("show")}),s.addEventListener("click",e=>{e.stopPropagation(),n.classList.toggle("show"),o&&o.classList.remove("show")}),e.querySelectorAll(".plyr-speed-option").forEach(t=>{t.addEventListener("click",()=>{const s=parseFloat(t.dataset.speed);this.player?.media&&(this.player.media.playbackRate=s),e.querySelectorAll(".plyr-speed-option").forEach(e=>e.classList.remove("active")),t.classList.add("active"),i.classList.remove("show"),n.classList.remove("show")})}),r&&o&&(r.addEventListener("click",e=>{e.stopPropagation(),o.classList.toggle("show"),n.classList.remove("show")}),e.querySelectorAll(".plyr-playmode-option").forEach(t=>{t.addEventListener("click",()=>{const s=t.dataset.mode;ci(s),e.querySelectorAll(".plyr-playmode-option").forEach(e=>e.classList.remove("active")),t.classList.add("active"),i.classList.remove("show"),o.classList.remove("show")})})),document.addEventListener("click",()=>{i.classList.remove("show"),n.classList.remove("show"),o&&o.classList.remove("show")})},downloadMedia(){const e=document.createElement("a");e.href=this.src,e.download=this.file?.name?.split("/").pop()||"download",e.click()},onAudioEnded(){const e=li();"loop"===e?this.player?.media&&(this.player.media.currentTime=0,this.player.play()):"sequence"===e&&this.$emit("audio-ended","next")},destroyPlayer(){const e=this.$refs.videoEl||this.$refs.audioEl;if(this.player){try{this.player.pause(),this.player.destroy()}catch(t){}this.player=null}if(e)try{e.pause(),e.currentTime=0,e.src="",e.load()}catch(t){}},stopAndCleanMedia(){this.destroyPlayer()},initAudioInfo(){const e=this.file?.name||this.src,t=e.split("/").pop().replace(/\.[^.]+$/,"");this.audioTitle=t,this.audioArtist="",this.audioCover=null,this.isActive&&this.tryReadMetadata()},async tryReadMetadata(){try{const e=await fetch(this.src),t=await e.blob(),i=await t.slice(0,131072).arrayBuffer(),s=new DataView(i);73===s.getUint8(0)&&68===s.getUint8(1)&&51===s.getUint8(2)&&this.parseID3v2(s,i)}catch(e){}},parseID3v2(e,t){const i=(127&e.getUint8(6))<<21|(127&e.getUint8(7))<<14|(127&e.getUint8(8))<<7|127&e.getUint8(9);let s=10;while(st.byteLength)break;const a=new Uint8Array(t,s+10,Math.min(n,t.byteLength-s-10));"TIT2"===i?this.audioTitle=this.decodeText(a)||this.audioTitle:"TPE1"===i?this.audioArtist=this.decodeText(a):"APIC"===i&&this.extractCover(a),s+=10+n}},decodeText(e){if(e.length<2)return"";const t=e[0],i=e.slice(1);try{if(0===t)return new TextDecoder("iso-8859-1").decode(i).replace(/\0/g,"");if(1===t)return new TextDecoder("utf-16").decode(i).replace(/\0/g,"");if(3===t)return new TextDecoder("utf-8").decode(i).replace(/\0/g,"")}catch(s){}return""},extractCover(e){try{let t=1;while(tt?t+this.rubberBand(e-t,i,.55):e<-t?-t-this.rubberBand(-t-e,i,.55):e},calcTwoPointer(){const e=Array.from(this.pointers.entries()).sort((e,t)=>e[0]-t[0]),t=e[0][1],i=e[1][1],s=i.x-t.x,n=i.y-t.y,a=Math.hypot(s,n),r=Math.atan2(n,s)*(180/Math.PI),o={x:(t.x+i.x)/2,y:(t.y+i.y)/2};return{dist:a,angle:r,center:o}},normalizeAngle(e){return e=(e%360+360)%360,e>180?e-360:e},onPointerDown(e){if(this.isImage){if(e.currentTarget.setPointerCapture?.(e.pointerId),this.viewportRect=this.getViewportRect(),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){const{dist:e,angle:t,center:i}=this.calcTwoPointer();return this.startDist=e,this.startAngle=t,this.startCenter=i,this.startScale=this.scale,this.startRotation=this.rotation,this.startTx=this.tx,this.startTy=this.ty,this.dragging=!1,this.gestureMode=null,void(this.rotatePreview=0)}this.scale>1.001&&(this.dragging=!0,this.dragStart={x:e.clientX,y:e.clientY},this.startTx=this.tx,this.startTy=this.ty)}},onPointerMove(e){if(this.isImage&&this.pointers.has(e.pointerId)){if(this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){e.preventDefault();const{dist:t,angle:i,center:s}=this.calcTwoPointer(),n=t/(this.startDist||t),a=Math.abs(n-1),r=this.normalizeAngle(i-this.startAngle),o=Math.abs(r);if(!this.gestureMode)if(o>=8)this.gestureMode="rotate";else{if(!(a>=.08))return;this.gestureMode="pinch"}if("rotate"===this.gestureMode)return this.scale=this.startScale,void(this.rotatePreview=this.clamp(r,-90,90));if("pinch"===this.gestureMode&&(this.scale=this.clamp(this.startScale*n,this.minScale,this.maxScale),this.rotatePreview=0),this.startCenter&&this.viewportRect){const e=this.startCenter.x-this.viewportRect.left-this.viewportRect.width/2,t=this.startCenter.y-this.viewportRect.top-this.viewportRect.height/2,i=s.x-this.viewportRect.left-this.viewportRect.width/2,n=s.y-this.viewportRect.top-this.viewportRect.height/2;this.tx=this.startTx+(i-e),this.ty=this.startTy+(n-t)}return}if(this.dragging&&this.scale>1.001){e.preventDefault();const t=e.clientX-this.dragStart.x,i=e.clientY-this.dragStart.y,s=this.startTx+t,n=this.startTy+i,{maxX:a,maxY:r,vw:o,vh:l}=this.getPanBounds();let c=0,h=0;s>a?(c=s-a,h=-1):s<-a&&(c=-a-s,h=1),this.edgeOverflow=c,this.edgeDir=h,this.tx=this.applyBoundWithRubber(s,a,o),this.ty=this.applyBoundWithRubber(n,r,l)}}},onPointerUp(e){if(this.isImage&&(this.pointers.has(e.pointerId)&&this.pointers.delete(e.pointerId),this.pointers.size<2&&"rotate"===this.gestureMode&&(this.finishRotate(),this.gestureMode=null),this.pointers.size<2&&(this.startCenter=null,this.startDist=0,this.startAngle=0,this.gestureMode=null),0===this.pointers.size)){if(this.dragging=!1,this.edgeOverflow>60&&0!==this.edgeDir){const e=this.edgeDir;return this.reset(),void this.$emit("edge-swipe",e)}if(this.edgeOverflow=0,this.edgeDir=0,this.scale<=1.001)this.scale=1,this.tx=0,this.ty=0;else{const{maxX:e,maxY:t}=this.getPanBounds();this.tx=Math.max(-e,Math.min(e,this.tx)),this.ty=Math.max(-t,Math.min(t,this.ty))}}},finishRotate(){const e=this.rotatePreview;let t=0;Math.abs(e)>=30&&(t=e>0?90:-90);const i=((this.rotation+t)%360+360)%360;this.rotation=i,this.rotatePreview=0,this.updateFillScale()},updateFillScale(){const e=this.rotation%360,t=90===e||270===e;t?(this.scale=2,this.tx=0,this.ty=0):(this.scale=1,this.tx=0,this.ty=0)},onDblClick(){this.isImage&&(this.scale>1.001?(this.scale=1,this.tx=0,this.ty=0):this.scale=2)}}},di=i(71241);const ui=(0,di.A)(hi,[["render",b],["__scopeId","data-v-095ac3fe"]]);var pi=ui,mi=i(6834);const gi={class:"public-browse"},fi={class:"header"},yi={class:"header-left"},bi={class:"logo",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank",rel:"noopener"},vi={class:"header-center"},wi={class:"breadcrumb"},ki=["onClick"],Ti={class:"header-right"},Ci=["placeholder"],Ai={class:"file-count"},Si={key:0,class:"loading-container"},xi={key:1,class:"error-container"},Mi={class:"error-credit"},Ei={key:2,class:"gallery-container",ref:"galleryContainer"},Li={key:0,class:"folders-section"},Pi={class:"folders-grid"},Ii=["onClick"],$i={class:"folder-name"},Ni={class:"waterfall",ref:"waterfall"},Di=["onClick"],Fi=["src","alt","onLoad"],_i=["src","onLoadedmetadata"],Ri={key:2,class:"audio-placeholder"},Oi={class:"audio-name"},Bi={key:3,class:"file-placeholder"},Hi={class:"file-name"},Vi={class:"overlay"},ji={class:"overlay-actions"},qi=["onClick","title"],Ui=["onClick","title"],Xi={key:1,class:"floating-page-indicator"},zi={ref:"loadTrigger",class:"load-trigger"},Wi={key:0,class:"loading-more"},Ki={key:1,class:"no-more"},Yi={key:2,class:"credit-link",href:"https://github.com/axibayuit-a11y",target:"_blank",rel:"noopener"},Qi=["src"],Ji=["src"],Gi=["src"],Zi={class:"swipe-hint"},es={key:2,class:"other-file-preview"},ts={class:"file-name"},is=["title"],ss={class:"page-indicator"};function ns(e,t,i,r,o,l){const c=mi.A,h=pi;return(0,s.uX)(),(0,s.CE)("div",gi,[(0,s.Lk)("header",fi,[(0,s.Lk)("div",yi,[(0,s.Lk)("a",bi,(0,a.v_)(l.siteName),1)]),(0,s.Lk)("div",vi,[(0,s.Lk)("div",wi,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:t[0]||(t[0]=(...e)=>l.goToRoot&&l.goToRoot(...e))},(0,a.v_)(l.rootDirName),1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.pathParts,(e,i)=>((0,s.uX)(),(0,s.CE)(s.FK,{key:i},[t[32]||(t[32]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>l.goToPath(i)},(0,a.v_)(e),9,ki)],64))),128))])]),(0,s.Lk)("div",Ti,[(0,s.Lk)("div",{class:(0,a.C4)(["search-box",{expanded:o.searchExpanded}])},[o.searchExpanded?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bo)((0,s.Lk)("input",{type:"text","onUpdate:modelValue":t[2]||(t[2]=e=>o.searchInput=e),onKeyup:t[3]||(t[3]=(0,n.jR)((...e)=>l.handleSearch&&l.handleSearch(...e),["enter"])),placeholder:e.$t("publicBrowse.searchPlaceholder"),class:"search-input",ref:"searchInputRef"},null,40,Ci),[[n.Jo,o.searchInput]]),(0,s.Lk)("span",{class:"search-icon",onClick:t[4]||(t[4]=(...e)=>l.handleSearch&&l.handleSearch(...e))},[...t[34]||(t[34]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:"16",height:"16"},[(0,s.Lk)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"})],-1)])])],64)):((0,s.uX)(),(0,s.CE)("span",{key:0,class:"search-icon",onClick:t[1]||(t[1]=(...e)=>l.toggleSearch&&l.toggleSearch(...e))},[...t[33]||(t[33]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:"20",height:"20"},[(0,s.Lk)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"})],-1)])]))],2),(0,s.bF)(c,{class:"theme-toggle-btn"}),(0,s.Lk)("span",Ai,(0,a.v_)(e.$t("publicBrowse.fileCount",{count:o.totalCount})),1)])]),o.loading&&0===o.files.length?((0,s.uX)(),(0,s.CE)("div",Si,[t[35]||(t[35]=(0,s.Lk)("div",{class:"loading-spinner"},null,-1)),(0,s.Lk)("p",null,(0,a.v_)(e.$t("publicBrowse.loading")),1)])):o.error?((0,s.uX)(),(0,s.CE)("div",xi,[(0,s.Lk)("p",null,(0,a.v_)(o.error),1),o.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[5]||(t[5]=(...e)=>l.loadFiles&&l.loadFiles(...e)),class:"retry-btn"},(0,a.v_)(e.$t("publicBrowse.retry")),1)):(0,s.Q3)("",!0),(0,s.Lk)("div",Mi,[(0,s.Lk)("p",null,(0,a.v_)(e.$t("publicBrowse.creditText")),1),t[36]||(t[36]=(0,s.Fv)('
',1))])])):((0,s.uX)(),(0,s.CE)("div",Ei,[l.folders.length>0?((0,s.uX)(),(0,s.CE)("div",Li,[(0,s.Lk)("div",Pi,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.folders,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"folder-card",onClick:t=>l.enterFolder(e.name)},[t[37]||(t[37]=(0,s.Lk)("div",{class:"folder-icon"},[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])],-1)),(0,s.Lk)("span",$i,(0,a.v_)(l.getFolderName(e.name)),1)],8,Ii))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",Ni,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.columns,(i,r)=>((0,s.uX)(),(0,s.CE)("div",{key:r,class:"waterfall-column"},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(i,i=>((0,s.uX)(),(0,s.CE)("div",{key:i.name,class:"waterfall-item",onClick:e=>l.openPreview(i)},[(0,s.Lk)("div",{class:(0,a.C4)(["image-wrapper",{loaded:i.loaded}])},[l.isImage(i)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(i.name),alt:i.name,loading:"lazy",onLoad:e=>l.onImageLoad(e,i),onError:t[6]||(t[6]=(...e)=>l.handleImageError&&l.handleImageError(...e))},null,40,Fi)):l.isVideo(i)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(i.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:e=>l.onVideoLoad(e,i),onPointerenter:t[7]||(t[7]=e=>"mouse"===e.pointerType&&e.target.play()),onPointerleave:t[8]||(t[8]=e=>"mouse"===e.pointerType&&e.target.pause())},null,40,_i)):l.isAudio(i)?((0,s.uX)(),(0,s.CE)("div",Ri,[t[38]||(t[38]=(0,s.Lk)("svg",{class:"audio-icon",viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})],-1)),(0,s.Lk)("span",Oi,(0,a.v_)(l.getFileName(i.name)),1)])):((0,s.uX)(),(0,s.CE)("div",Bi,[t[39]||(t[39]=(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"})],-1)),(0,s.Lk)("span",Hi,(0,a.v_)(l.getFileName(i.name)),1)])),(0,s.Lk)("div",Vi,[(0,s.Lk)("div",ji,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(e=>l.copyLink(i.name),["stop"]),title:e.$t("publicBrowse.copyLink")},[...t[40]||(t[40]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"})],-1)])],8,qi),(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(e=>l.downloadFile(i.name),["stop"]),title:e.$t("publicBrowse.downloadBtn")},[...t[41]||(t[41]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})],-1)])],8,Ui)])])],2)],8,Di))),128))]))),128))],512),l.mediaFiles.length>o.pageSize?((0,s.uX)(),(0,s.CE)("div",Xi,[(0,s.Lk)("span",null,(0,a.v_)(l.displayCurrentPage)+" / "+(0,a.v_)(l.totalPages),1)])):(0,s.Q3)("",!0),(0,s.Lk)("div",zi,[o.loading&&o.files.length>0?((0,s.uX)(),(0,s.CE)("div",Wi,[t[42]||(t[42]=(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1)),(0,s.Lk)("span",null,(0,a.v_)(e.$t("publicBrowse.loadingMore")),1)])):!o.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",Ki,(0,a.v_)(e.$t("publicBrowse.allLoaded")),1)):(0,s.Q3)("",!0),!o.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("a",Yi,(0,a.v_)(e.$t("publicBrowse.creditLink")),1)):(0,s.Q3)("",!0)],512)],512)),o.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:t[31]||(t[31]=(0,n.D$)((...e)=>l.closePreview&&l.closePreview(...e),["self"]))},[(0,s.Lk)("button",{class:"preview-close",onClick:t[9]||(t[9]=(0,n.D$)((...e)=>l.closePreview&&l.closePreview(...e),["stop"]))},[...t[43]||(t[43]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)])]),o.isMobile?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("div",{key:0,class:"preview-content",onClick:t[15]||(t[15]=(0,n.D$)(()=>{},["stop"])),onWheel:t[16]||(t[16]=(0,n.D$)((...e)=>l.handleWheel&&l.handleWheel(...e),["prevent"]))},[l.currentPreviewFile&&l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:"img-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),class:"preview-image",style:(0,a.Tr)(l.desktopImageStyle),draggable:"false",onMousedown:t[10]||(t[10]=(...e)=>l.onImageMouseDown&&l.onImageMouseDown(...e)),onMousemove:t[11]||(t[11]=(...e)=>l.onImageMouseMove&&l.onImageMouseMove(...e)),onMouseup:t[12]||(t[12]=(...e)=>l.onImageMouseUp&&l.onImageMouseUp(...e)),onMouseleave:t[13]||(t[13]=(...e)=>l.onImageMouseUp&&l.onImageMouseUp(...e))},null,44,Qi)):l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{ref:"desktopVideo",key:"video-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",class:"preview-video",style:(0,a.Tr)(l.desktopImageStyle),onPlay:t[14]||(t[14]=(...e)=>l.onDesktopVideoPlay&&l.onDesktopVideoPlay(...e))},null,44,Ji)):l.currentPreviewFile&&l.isAudio(l.currentPreviewFile)?((0,s.uX)(),(0,s.Wv)(h,{ref:"desktopAudio",key:"audio-"+l.currentPreviewFile.name,file:l.currentPreviewFile,src:l.getFileUrl(l.currentPreviewFile.name),"is-image":!1,"is-video":!1,"is-audio":!0,"is-active":!0,onAudioEnded:l.onAudioEnded},null,8,["file","src","onAudioEnded"])):(0,s.Q3)("",!0)],32)),o.isMobile?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"preview-content preview-content-mobile",onClick:t[27]||(t[27]=(0,n.D$)(()=>{},["stop"]))},[l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{ref:"mobileVideo",key:"m-video-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",playsinline:"","webkit-playsinline":"","x5-video-player-type":"h5","x5-video-player-fullscreen":"true",class:"mobile-video-native",onPlay:t[17]||(t[17]=(...e)=>l.onMobileMediaPlay&&l.onMobileMediaPlay(...e))},null,40,Gi)):l.currentPreviewFile&&l.isAudio(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"mobile-audio-wrap",onTouchstart:t[18]||(t[18]=(...e)=>l.onAudioSwipeStart&&l.onAudioSwipeStart(...e)),onTouchmove:t[19]||(t[19]=(...e)=>l.onAudioSwipeMove&&l.onAudioSwipeMove(...e)),onTouchend:t[20]||(t[20]=(...e)=>l.onAudioSwipeEnd&&l.onAudioSwipeEnd(...e))},[((0,s.uX)(),(0,s.Wv)(h,{ref:"mobileAudio",key:"m-audio-"+l.currentPreviewFile.name,file:l.currentPreviewFile,src:l.getFileUrl(l.currentPreviewFile.name),"is-image":!1,"is-video":!1,"is-audio":!0,"is-active":!0,onAudioEnded:l.onAudioEnded},null,8,["file","src","onAudioEnded"])),(0,s.Lk)("div",Zi,(0,a.v_)(e.$t("publicBrowse.swipeHint")),1)],32)):l.currentPreviewFile&&!l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("div",es,[t[44]||(t[44]=(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"})],-1)),(0,s.Lk)("span",ts,(0,a.v_)(l.getFileName(l.currentPreviewFile.name)),1)])):((0,s.uX)(),(0,s.CE)("div",{key:3,class:"swipe-viewport",ref:"mobileViewport",onTouchstart:t[24]||(t[24]=(...e)=>l.onSwipeStart&&l.onSwipeStart(...e)),onTouchmove:t[25]||(t[25]=(...e)=>l.onSwipeMove&&l.onSwipeMove(...e)),onTouchend:t[26]||(t[26]=(...e)=>l.onSwipeEnd&&l.onSwipeEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,a.Tr)(l.swipeTrackStyle),onTransitionend:t[23]||(t[23]=(...e)=>l.onSwipeTransitionEnd&&l.onSwipeTransitionEnd(...e))},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.swipeWindow,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{class:"swipe-slide",key:l.getSlideKey(e,i)},[e?((0,s.uX)(),(0,s.Wv)(h,{key:0,file:e,src:l.getFileUrl(e.name),"is-image":l.isImage(e),"is-video":!1,"is-audio":!1,"is-active":1===i,onLock:t[21]||(t[21]=e=>o.gestureLocked=!0),onUnlock:t[22]||(t[22]=e=>o.gestureLocked=!1),onEdgeSwipe:l.onEdgeSwipe},null,8,["file","src","is-image","is-active","onEdgeSwipe"])):(0,s.Q3)("",!0)]))),128))],36)],544))])):(0,s.Q3)("",!0),!o.isMobile&&o.previewIndex>0?((0,s.uX)(),(0,s.CE)("button",{key:2,class:"preview-prev",onClick:t[28]||(t[28]=(0,n.D$)((...e)=>l.prevImage&&l.prevImage(...e),["stop"]))},[...t[45]||(t[45]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})],-1)])])):(0,s.Q3)("",!0),!o.isMobile&&o.previewIndexl.nextImage&&l.nextImage(...e),["stop"]))},[...t[46]||(t[46]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})],-1)])])):(0,s.Q3)("",!0),o.isMobile?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("button",{key:4,class:"rotate-btn",onClick:t[30]||(t[30]=(0,n.D$)((...e)=>l.rotateImage&&l.rotateImage(...e),["stop"])),title:e.$t("publicBrowse.rotate90")},[...t[47]||(t[47]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M16.89 8.53l1.41-1.42C19.2 8.27 19.76 9.61 19.93 11h-2.02c-.14-.87-.49-1.72-1.02-2.47zM17.91 13h2.02c-.17 1.39-.72 2.73-1.62 3.89l-1.41-1.42c.52-.75.87-1.59 1.01-2.47zm-1.01 5.32c-1.16.9-2.51 1.44-3.9 1.61V17.9c.87-.15 1.71-.49 2.46-1.03l1.44 1.45zM11 4.07V1l4.55 4.55L11 10V6.09c-2.84.48-5 2.94-5 5.91s2.16 5.43 5 5.91v2.02c-3.95-.49-7-3.85-7-7.93s3.05-7.44 7-7.93z"})],-1)])],8,is)),(0,s.Lk)("div",ss,(0,a.v_)(o.previewIndex+1)+" / "+(0,a.v_)(l.mediaFiles.length),1)])):(0,s.Q3)("",!0)])}var as=i(94373),rs=i(60782),os={name:"PublicBrowse",components:{TransformMedia:pi,ToggleDark:mi.A},data(){return{files:[],allowedDirs:[],rootDir:"",currentPath:"",totalCount:0,loading:!1,error:null,canRetry:!0,hasMore:!0,previewVisible:!1,previewIndex:0,observer:null,pageSize:24,searchInput:"",searchKeyword:"",currentStartIndex:0,searchExpanded:!1,filterType:"",lastScrollY:0,scrollPage:0,columnCount:4,columnHeights:[0,0,0,0],imageRotation:0,imageScale:1,imageTx:0,imageTy:0,imageDragging:!1,imageDragStart:null,imageStartTx:0,imageStartTy:0,swipeX:0,swipeStartX:0,swipeStartY:0,swipeStartT:0,swipeActive:!1,swipeAnimating:!1,swipeDir:0,viewportW:0,gestureLocked:!1,audioSwipeStartX:0,audioSwipeStartT:0,audioSwipeActive:!1,isMobile:!1}},computed:{...(0,rs.L8)(["userConfig"]),siteName(){return this.userConfig?.siteTitle||"Sanyue ImgHub"},rootDirName(){return this.rootDir.split("/").filter(Boolean).pop()||this.$t("publicBrowse.rootDirectory")},pathParts(){if(!this.currentPath||!this.rootDir)return[];const e=this.currentPath.replace(this.rootDir,"").replace(/^\/+/,"");return e.split("/").filter(Boolean)},folders(){return this.files.filter(e=>e.isFolder)},mediaFiles(){return this.files.filter(e=>!e.isFolder)},totalPages(){return Math.ceil(this.totalCount/this.pageSize)},displayCurrentPage(){const e=Math.floor(this.currentStartIndex/this.pageSize)+1,t=Math.ceil(this.mediaFiles.length/this.pageSize);return Math.min(e+Math.floor(this.scrollPage*t),this.totalPages)},columns(){const e=Array.from({length:this.columnCount},()=>[]);for(const t of this.mediaFiles){const i=t.columnIndex??0;i0?this.mediaFiles[this.previewIndex-1]:null},nextPreviewFile(){return this.previewIndex1?this.imageDragging?"grabbing":"grab":"default"}},swipeWindow(){return[this.prevPreviewFile,this.currentPreviewFile,this.nextPreviewFile]},swipeTrackStyle(){const e=-this.viewportW,t=e+this.swipeX;return{transform:`translate3d(${t}px, 0, 0)`,transition:this.swipeAnimating?"transform 0.28s ease":"none"}}},watch:{"$route.params.dir":{handler(){this.initFromRoute()}}},mounted(){oi(),this.checkMobile(),this.initFromRoute(),this.setupIntersectionObserver(),this.updateColumnCount(),window.addEventListener("resize",this.updateColumnCount),window.addEventListener("resize",this.checkMobile),window.addEventListener("scroll",this.handleScroll)},beforeUnmount(){this.observer&&this.observer.disconnect(),window.removeEventListener("resize",this.updateColumnCount),window.removeEventListener("resize",this.checkMobile),window.removeEventListener("scroll",this.handleScroll)},methods:{handleSearch(){const e=this.searchInput.trim();if(!e)return this.searchKeyword="",this.filterType="",this.currentStartIndex=0,void this.resetAndLoad();const t=e.match(/^#(\d+)$/);if(t){const e=parseInt(t[1],10),i=Math.ceil(this.totalCount/this.pageSize),s=Math.min(Math.max(1,e),i||1);return this.currentStartIndex=(s-1)*this.pageSize,this.searchKeyword="",this.filterType="",this.searchInput="",void this.resetAndLoad()}const i={"图片":"image","图":"image",image:"image",img:"image","照片":"image","视频":"video",video:"video","影片":"video","电影":"video","音乐":"audio","音频":"audio",audio:"audio",music:"audio","歌曲":"audio"},s=e.toLowerCase();if(i[s])return this.filterType=i[s],this.searchKeyword="",this.currentStartIndex=0,void this.resetAndLoad();this.filterType="",this.searchKeyword=e,this.currentStartIndex=0,this.resetAndLoad()},resetAndLoad(){this.files=[],this.hasMore=!0,this.columnHeights=new Array(this.columnCount).fill(0),this.loadFiles().then(()=>{this.observeLoadTrigger()})},toggleSearch(){this.searchExpanded=!this.searchExpanded,this.searchExpanded&&this.$nextTick(()=>{this.$refs.searchInputRef?.focus()})},handleScroll(){const e=window.scrollY;this.searchExpanded&&e>this.lastScrollY+20&&(this.searchExpanded=!1),this.lastScrollY=e;const t=this.$refs.galleryContainer;if(t&&this.mediaFiles.length>0){t.getBoundingClientRect();const i=t.offsetTop,s=t.scrollHeight-window.innerHeight;if(s>0){const t=Math.max(0,e-i);this.scrollPage=Math.min(1,t/s)}else this.scrollPage=0}},checkMobile(){this.isMobile=window.innerWidth<=600},getSlideKey(e,t){return e?1===t?`${e.name}-${this.previewIndex}`:e.name:`empty-${t}`},updateColumnCount(){const e=window.innerWidth;let t;t=e<600?2:e<900?3:4,t!==this.columnCount&&(this.columnCount=t,this.columnHeights=new Array(this.columnCount).fill(0),this.mediaFiles.forEach(e=>{e.columnIndex=void 0,this.assignToColumn(e)}))},getShortestColumn(){let e=0,t=this.columnHeights[0];for(let i=1;i{const t=e[0];t.isIntersecting&&this.hasMore&&!this.loading&&this.loadMore()},{rootMargin:"200px"})},observeLoadTrigger(){this.$nextTick(()=>{this.$refs.loadTrigger&&this.observer&&this.observer.observe(this.$refs.loadTrigger)})},async initFromRoute(){const e=this.$route.params.dir||"",t=Array.isArray(e)?e.join("/"):e,i=t.split("/").filter(Boolean);this.rootDir=i[0]||"",this.currentPath=t,this.files=[],this.hasMore=!0,this.columnHeights=new Array(this.columnCount).fill(0),this.searchInput="",this.searchKeyword="",this.filterType="",this.currentStartIndex=0,await this.loadFiles(),this.observeLoadTrigger()},async loadFiles(){this.loading=!0,this.error=null,this.canRetry=!0;try{let e=`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&start=${this.currentStartIndex}&count=${this.pageSize}`;this.searchKeyword&&(e+=`&search=${encodeURIComponent(this.searchKeyword)}`),this.filterType&&(e+=`&type=${this.filterType}`);const t=await as.A.get(e);t.data.allowedDirs&&(this.allowedDirs=t.data.allowedDirs);const i=(t.data.directories||[]).map(e=>({name:e,isFolder:!0})),s=(t.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));s.forEach(e=>this.assignToColumn(e)),this.files=[...i,...s],this.totalCount=t.data.totalCount||this.files.length,this.hasMore=this.currentStartIndex+this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));s.forEach(e=>this.assignToColumn(e)),this.files.push(...s),this.hasMore=this.currentStartIndex+this.mediaFiles.length{t.src=e+"?_retry="+Date.now()},500*(i+1))}else t.style.display="none"},copyLink(e){const t=this.getFileUrl(e);navigator.clipboard?.writeText(t).then(()=>{this.showToast(this.$t("publicBrowse.copied"))}).catch(()=>{const e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast(this.$t("publicBrowse.copied"))})},showToast(e){const t=document.querySelector(".copy-toast");t&&t.remove();const i=document.createElement("div");i.className="copy-toast",i.textContent=e,document.body.appendChild(i),setTimeout(()=>i.classList.add("show"),10),setTimeout(()=>{i.classList.remove("show"),setTimeout(()=>i.remove(),300)},1500)},downloadFile(e){const t=document.createElement("a");t.href=this.getFileUrl(e),t.download=e.split("/").pop(),t.click()},openPreview(e){if(e.isFolder)return;ai(null);const t=this.mediaFiles.findIndex(t=>t.name===e.name);t>=0&&(this.previewIndex=t,this.previewVisible=!0,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0,this.gestureLocked=!1,document.body.style.overflow="hidden",this.$nextTick(()=>{this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth}))},closePreview(){ai(null),this.previewVisible=!1,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0,this.gestureLocked=!1,document.body.style.overflow=""},prevImage(){ai(null),this.previewIndex>0&&(this.previewIndex--,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0)},nextImage(){ai(null),this.previewIndex0?-.1:.1;let i=this.imageScale+t;i=Math.max(.5,Math.min(4,i)),this.imageScale=i,i<=1&&(this.imageTx=0,this.imageTy=0)},onImageMouseDown(e){this.imageScale<=1||(e.preventDefault(),this.imageDragging=!0,this.imageDragStart={x:e.clientX,y:e.clientY},this.imageStartTx=this.imageTx,this.imageStartTy=this.imageTy)},onImageMouseMove(e){if(!this.imageDragging)return;const t=e.clientX-this.imageDragStart.x,i=e.clientY-this.imageDragStart.y;this.imageTx=this.imageStartTx+t,this.imageTy=this.imageStartTy+i},onImageMouseUp(){this.imageDragging=!1},onSwipeStart(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0];this.swipeStartX=t.clientX,this.swipeStartY=t.clientY,this.swipeStartT=performance.now(),this.swipeX=0,this.swipeActive=!1,this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth},onSwipeMove(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0],i=t.clientX-this.swipeStartX,s=t.clientY-this.swipeStartY;if(!this.swipeActive){if(Math.abs(i)<8)return;if(Math.abs(i)<=Math.abs(s))return;this.swipeActive=!0}e.preventDefault();let n=i;0===this.previewIndex&&n>0?n=this.rubberBand(n,this.viewportW,.55):this.previewIndex===this.mediaFiles.length-1&&n<0&&(n=-this.rubberBand(-n,this.viewportW,.55)),this.swipeX=n},onSwipeEnd(){if(this.gestureLocked)return;if(this.swipeAnimating)return;if(!this.swipeActive)return void(this.swipeX=0);const e=Math.max(1,performance.now()-this.swipeStartT),t=this.swipeX/e,i=.2*this.viewportW;let s=0;(this.swipeX<=-i||t<=-.8)&&(s=1),(this.swipeX>=i||t>=.8)&&(s=-1),(-1===s&&0===this.previewIndex||1===s&&this.previewIndex===this.mediaFiles.length-1)&&(s=0),this.swipeDir=s,this.swipeAnimating=!0,this.swipeX=1===s?-this.viewportW:-1===s?+this.viewportW:0},onSwipeTransitionEnd(){this.swipeAnimating&&(1===this.swipeDir&&this.previewIndex++,-1===this.swipeDir&&this.previewIndex--,this.swipeAnimating=!1,this.swipeDir=0,this.swipeX=0)},rubberBand(e,t,i=.55){return e*t*i/(t+i*e)},onEdgeSwipe(e){-1===e&&0===this.previewIndex||1===e&&this.previewIndex===this.mediaFiles.length-1||(this.swipeDir=e,this.swipeAnimating=!0,1===e?this.swipeX=-this.viewportW:-1===e&&(this.swipeX=+this.viewportW))},onAudioSwipeStart(e){const t=e.touches[0];this.audioSwipeStartX=t.clientX,this.audioSwipeStartT=performance.now(),this.audioSwipeActive=!1},onAudioSwipeMove(e){if(!this.audioSwipeStartX)return;const t=e.touches[0],i=t.clientX-this.audioSwipeStartX;Math.abs(i)>30&&(this.audioSwipeActive=!0)},onAudioSwipeEnd(e){if(!this.audioSwipeActive)return void(this.audioSwipeStartX=0);const t=e.changedTouches[0],i=t.clientX-this.audioSwipeStartX,s=Math.max(1,performance.now()-this.audioSwipeStartT),n=i/s,a=80;i>a||n>.5?this.prevImage():(i<-a||n<-.5)&&this.nextImage(),this.audioSwipeStartX=0,this.audioSwipeActive=!1},onDesktopVideoPlay(e){ai(e.target)},onMobileMediaPlay(e){ai(e.target)},onAudioEnded(e){"next"===e&&this.previewIndex{setTimeout(()=>{const e=this.isMobile?this.$refs.mobileAudio:this.$refs.desktopAudio;e?.player&&e.player.play()},100)}))}}};const ls=(0,di.A)(os,[["render",ns],["__scopeId","data-v-5654d512"]]);var cs=ls},51583:function(e,t,i){var s,n,a;i(44114),function(i,r){n=[],s=r,a="function"===typeof s?s.apply(t,n):s,void 0===a||(e.exports=a)}(0,function(){var e=function(){},t={},i={},s={};function n(e,t){e=e.push?e:[e];var n,a,r,o,l=[],c=e.length,h=c;n=function(e,i){i.length&&l.push(e),h--,h||t(l)};while(c--)a=e[c],r=i[a],r?n(a,r):(o=s[a]=s[a]||[],o.push(n))}function a(e,t){if(e){var n=s[e];if(i[e]=t,n)while(n.length)n[0](e,t),n.splice(0,1)}}function r(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,s,n){var a,r,l,c=document,h=s.async,d=(s.numRetries||0)+1,u=s.before||e,p=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img|module|nomodule)!/,"");if(n=n||0,/(^css!|\.css$)/.test(p))l=c.createElement("link"),l.rel="stylesheet",l.href=m,a="hideFocus"in l,a&&l.relList&&(a=0,l.rel="preload",l.as="style");else if(/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(p))l=c.createElement("img"),l.src=m;else if(l=c.createElement("script"),l.src=m,l.async=void 0===h||h,r="noModule"in l,/^module!/.test(p)){if(!r)return i(t,"l");l.type="module"}else if(/^nomodule!/.test(p)&&r)return i(t,"l");l.onload=l.onerror=l.onbeforeload=function(e){var r=e.type[0];if(a)try{l.sheet.cssText.length||(r="e")}catch(c){18!=c.code&&(r="e")}if("e"==r){if(n+=1,n work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = { ...defaults, ...options };\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = { ...defaults, ...options };\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Remove useful CSS\n if (this.config.addCSS) {\n this.element.style.userSelect = '';\n this.element.style.webKitUserSelect = '';\n this.element.style.touchAction = '';\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n // eslint-disable-next-line no-param-reassign\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\nexport default { matches };\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default { getDecimalPlaces, round };\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type, { bubbles: true });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default { trigger };\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=466b2b5c&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=466b2b5c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-466b2b5c\"]])\n\nexport default __exports__","import { normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, withModifiers as _withModifiers, toDisplayString as _toDisplayString } from \"vue\";\nconst _hoisted_1 = [\"src\"];\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 2,\n class: \"video-placeholder\"\n};\nconst _hoisted_4 = {\n class: \"audio-cover\"\n};\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 1,\n class: \"audio-icon-large\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n};\nconst _hoisted_7 = {\n class: \"audio-info\"\n};\nconst _hoisted_8 = {\n class: \"audio-title\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"audio-artist\"\n};\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 4,\n class: \"audio-placeholder\"\n};\nconst _hoisted_12 = {\n class: \"audio-name\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"tm-viewport\",\n ref: \"viewport\",\n onPointerdown: _cache[3] || (_cache[3] = (...args) => $options.onPointerDown && $options.onPointerDown(...args)),\n onPointermove: _cache[4] || (_cache[4] = (...args) => $options.onPointerMove && $options.onPointerMove(...args)),\n onPointerup: _cache[5] || (_cache[5] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onPointercancel: _cache[6] || (_cache[6] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onDblclick: _cache[7] || (_cache[7] = _withModifiers((...args) => $options.onDblClick && $options.onDblClick(...args), [\"prevent\"]))\n }, [$props.isImage ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"tm-media\",\n src: $props.src,\n draggable: \"false\",\n style: _normalizeStyle($options.mediaStyle),\n onLoad: _cache[0] || (_cache[0] = (...args) => $options.onLoad && $options.onLoad(...args))\n }, null, 44, _hoisted_1)) : $props.isVideo && $props.isActive ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"tm-video-wrap\",\n onPointerdown: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"video\", {\n ref: \"videoEl\",\n class: \"plyr-video\",\n src: $props.src,\n playsinline: \"\"\n }, null, 8, _hoisted_2)], 32)) : $props.isVideo ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [...(_cache[8] || (_cache[8] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M8 5v14l11-7z\"\n })], -1)]))])) : $props.isAudio && $props.isActive ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"tm-audio-wrap\",\n onPointerdown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_4, [$data.audioCover ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $data.audioCover,\n class: \"cover-img\"\n }, null, 8, _hoisted_5)) : (_openBlock(), _createElementBlock(\"svg\", _hoisted_6, [...(_cache[9] || (_cache[9] = [_createElementVNode(\"path\", {\n d: \"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z\"\n }, null, -1)]))]))]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, _toDisplayString($data.audioTitle), 1), $data.audioArtist ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, _toDisplayString($data.audioArtist), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"audio\", {\n ref: \"audioEl\",\n class: \"plyr-audio\",\n src: $props.src\n }, null, 8, _hoisted_10)], 32)) : $props.isAudio ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_cache[10] || (_cache[10] = _createElementVNode(\"svg\", {\n class: \"audio-icon-large\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z\"\n })], -1)), _createElementVNode(\"span\", _hoisted_12, _toDisplayString($data.audioTitle), 1)])) : _createCommentVNode(\"\", true)], 544);\n}","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => typeof input === 'function';\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n\nfunction isElement(input) {\n return input !== null\n && typeof input === 'object'\n && input.nodeType === 1\n && typeof input.style === 'object'\n && typeof input.ownerDocument === 'object';\n}\n\nfunction isEmpty(input) {\n return isNullOrUndefined(input)\n || ((isString(input) || isArray(input) || isNodeList(input)) && !input.length)\n || (isObject(input) && !Object.keys(input).length);\n}\n\nfunction isUrl(input) {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n }\n catch {\n return false;\n }\n}\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element, delay) {\n setTimeout(() => {\n try {\n element.hidden = true;\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n element.hidden = false;\n }\n catch {}\n }, delay);\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach((key) => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n }\n else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) return;\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.textContent = text;\n }\n\n // Return built element\n return element;\n}\n\n// Insert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) return;\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) return;\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) return;\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) return {};\n\n const attributes = {};\n const existing = extend({}, existingAttributes);\n\n sel.split(',').forEach((s) => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n }\n else {\n attributes.class = className;\n }\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return extend(existing, attributes);\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) return;\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n element.hidden = hide;\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const { prototype } = Element;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const method\n = prototype.matches\n || prototype.webkitMatchesSelector\n || prototype.mozMatchesSelector\n || prototype.msMatchesSelector\n || match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, focusVisible = false) {\n if (!is.element(element)) return;\n\n // Set regular focus\n element.focus({ preventScroll: true, focusVisible });\n}\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider) {\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput;\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n pip: (() => {\n return (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n }\n catch {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n catch {}\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach((type) => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: { ...detail, plyr: this },\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach((item) => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport { closest } from './arrays';\nimport is from './is';\n\n// Check support for a CSS declaration\nexport function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n\n return window.CSS.supports(declaration);\n}\n\n// Standard/common aspect ratios\nconst standardRatios = [\n [1, 1],\n [4, 3],\n [3, 4],\n [5, 4],\n [4, 5],\n [3, 2],\n [2, 3],\n [16, 10],\n [10, 16],\n [16, 9],\n [9, 16],\n [21, 9],\n [9, 21],\n [32, 9],\n [9, 32],\n].reduce((out, [x, y]) => ({ ...out, [x / y]: [x, y] }), {});\n\n// Validate an aspect ratio\nexport function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\n// Reduce an aspect ratio to it's lowest form\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\n// Calculate an aspect ratio\nexport function getAspectRatio(input) {\n const parse = ratio => (validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n\n return reduceAspectRatio(ratio);\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n\n if (!is.array(ratio)) {\n return {};\n }\n\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = (100 / x) * y;\n\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n }\n else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * Number.parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n }\n else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n }\n else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n\n return { padding, ratio };\n}\n\n// Round an aspect ratio to closest standard ratio\nexport function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n}\n\n// Get the size of the viewport\n// https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\nexport function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n }\n else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState, playbackRate } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst isIE = Boolean(window.document.documentMode);\nconst isEdge = /Edge/.test(navigator.userAgent);\nconst isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent);\nconst isIPhone = /iPhone|iPod/i.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n// navigator.platform may be deprecated but this check is still required\nconst isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\nconst isIos = /iPad|iPhone|iPod/i.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n\nexport default {\n isIE,\n isEdge,\n isWebKit,\n isIPhone,\n isIPadOS,\n isIos,\n};\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) return input;\n\n return input.toString().replace(/\\{(\\d+)\\}/g, (_, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurrences of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.textContent;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) return false;\n const test = '___test';\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n }\n catch {\n return false;\n }\n }\n\n get = (key) => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) return null;\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n };\n\n set = (object) => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objects\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n catch { }\n };\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text', withCredentials = false) {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) return;\n\n // Set to true if needed for CORS\n if (withCredentials) {\n request.withCredentials = true;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n }\n catch {\n resolve(request.responseText);\n }\n }\n else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n request.responseType = responseType;\n request.send();\n }\n catch (error) {\n reject(error);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then((result) => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n try {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n catch {}\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n }\n else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n }\n catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\n 'focusable': 'false',\n }),\n );\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') };\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n }\n else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = (quality) => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach((quality) => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach((speed) => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, focusVisible = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, focusVisible);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n }\n else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n }\n else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n }\n else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', focusVisible = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = (event) => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, focusVisible);\n },\n\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach((type) => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n 'type': 'button',\n 'class': `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n 'role': 'menuitem',\n 'aria-haspopup': true,\n 'hidden': '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on.call(\n this,\n pane,\n 'keydown',\n (event) => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n }\n else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = (input) => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = (button) => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach((button) => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n }\n else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach((label) => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork,\n });\n }\n }\n catch {\n // Do nothing\n }\n },\n\n // Add markers\n setMarkers() {\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = this.config.markers?.points?.filter(({ time }) => time > 0 && time < this.duration);\n if (!points?.length) return;\n\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach((point) => {\n const markerElement = createElement(\n 'span',\n {\n class: this.config.classNames.marker,\n },\n '',\n );\n\n const left = `${(point.time / this.duration) * 100}%`;\n\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '',\n );\n\n containerFragment.appendChild(tipElement);\n }\n\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement,\n };\n\n this.elements.progress.appendChild(containerFragment);\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n }\n catch {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls)\n && this.config.controls.includes('settings')\n && this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach((track) => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null\n && url.hostname !== window.location.href.hostname\n && ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then((blob) => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.captions.language || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions') || this.captions.active;\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n\n if (track.mode === 'showing') {\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (\n is.array(this.config.controls)\n && this.config.controls.includes('settings')\n && this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n\n languages.every((language) => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.8.3/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash',\n },\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n withCredentials: false,\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: [],\n },\n\n // Markers\n markers: {\n enabled: false,\n points: [],\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nfunction noop() {}\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen\n = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n this.onChange();\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', (event) => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get nativeSupported() {\n return !!(\n document.fullscreenEnabled\n || document.webkitFullscreenEnabled\n || document.mozFullScreenEnabled\n || document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get useNative() {\n return Fullscreen.nativeSupported && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) return '';\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some((pre) => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is supported\n get supported() {\n return [\n // Fullscreen is enabled in config\n this.player.config.fullscreen.enabled,\n // Must be a video\n this.player.isVideo,\n // Either native is supported or fallback enabled\n Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,\n // YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline\n // must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback\n !this.player.isYouTube\n || Fullscreen.nativeSupported\n || !browser.isIos\n || (this.player.config.playsinline && !this.player.config.fullscreen.iosNative),\n ].every(Boolean);\n }\n\n // Get active state\n get active() {\n if (!this.supported) return false;\n\n // Fallback using classname\n if (!Fullscreen.nativeSupported || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix\n ? this.target.getRootNode().fullscreenElement\n : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.fullscreen ?? this.player.elements.container;\n }\n\n onChange = () => {\n if (!this.supported) return;\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n toggleFallback = (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX ?? 0,\n y: window.scrollY ?? 0,\n };\n }\n else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) viewport.content += `,${property}`;\n }\n else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS/iPadOS, not active, not the tab key\n if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n }\n else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n // Update UI\n update = () => {\n if (this.supported) {\n let mode;\n\n if (this.forceFallback) mode = 'Fallback (forced)';\n else if (Fullscreen.nativeSupported) mode = 'Native';\n else mode = 'Fallback';\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n }\n else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);\n };\n\n // Make an element fullscreen\n enter = () => {\n if (!this.supported) return;\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n }\n else {\n this.target.webkitEnterFullscreen();\n }\n }\n else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(true);\n }\n else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\n }\n else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n };\n\n // Bail from fullscreen\n exit = () => {\n if (!this.supported) return;\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.exitFullscreen();\n }\n else {\n this.target.webkitEnterFullscreen();\n }\n silencePromise(this.player.play());\n }\n else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(false);\n }\n else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n }\n else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n };\n\n // Toggle state\n toggle = () => {\n if (!this.active) this.enter();\n else this.exit();\n };\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/load-image';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n }\n else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach((button) => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch((error) => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n\n ui.togglePoster.call(this, true);\n\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach((target) => {\n Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(\n () => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, getViewportSize, supportsCSS } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const { key, type, altKey, ctrlKey, metaKey, shiftKey } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = (increment) => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.key === ' ' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = [\n ' ',\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n\n 'c',\n 'f',\n 'k',\n 'l',\n 'm',\n ];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(Number.parseInt(key, 10));\n }\n break;\n\n case ' ':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 'ArrowRight':\n player.forward();\n break;\n\n case 'ArrowLeft':\n player.rewind();\n break;\n\n case 'f':\n player.fullscreen.toggle();\n break;\n\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 'l':\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n }\n else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch = () => {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n };\n\n // Global window & document listeners\n global = (toggle = true) => {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n (event) => {\n const { controls: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = elements.wrapper;\n const { active } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n }\n else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n }\n else {\n target.style.maxWidth = overflow ? `${(viewportHeight / videoHeight) * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n };\n\n // Listen for media events\n media = () => {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', (event) => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n }\n else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n (event) => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', (event) => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, (event) => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n };\n\n // Run default and custom handlers\n proxy = (event, defaultHandler, customHandlerKey) => {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n };\n\n // Trigger custom and default handlers\n bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Listen for control events\n controls = () => {\n const { player } = this;\n const { elements } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach((button) => {\n this.bind(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n (event) => {\n if (![' ', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', (event) => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', (event) => {\n const rect = elements.progress.getBoundingClientRect();\n const scrollLeft = event.pageX - event.clientX;\n const percent = (100 / rect.width) * (event.pageX - rect.left - scrollLeft);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', (event) => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n }\n else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n (event) => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebKit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach((element) => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n (event) => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter(c => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', (event) => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n (event) => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n };\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { roundAspectRatio, setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n // eslint-disable-next-line regexp/optimal-quantifier-concatenation\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n const match = url.match(regex);\n return match ? match[2] : url;\n}\n\n// Try to extract a hash for private videos from the URL\nfunction parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n\n return found && found.length === 5 ? found[4] : null;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set initial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n }\n else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n }\n else {\n hash = parseHash(source);\n }\n const hashParam = hash ? { h: hash } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: player.config.playsinline,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams,\n });\n\n const id = parseId(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute(\n 'allow',\n ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '),\n );\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n }\n else {\n const wrapper = createElement('div', {\n 'class': player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setMuted(toggle ? true : player.config.muted).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then((value) => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n })\n .catch((error) => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then((dimensions) => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then((state) => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then((title) => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then((value) => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then((value) => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then((tracks) => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then((paused) => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', (data) => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', (data) => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (Number.parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then((value) => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', (detail) => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { roundAspectRatio, setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = url.match(regex);\n return match && match[2] ? match[2] : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n }\n else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the