From 61d2790a7cd84f2fd787ab4166c00615d03cb4b2 Mon Sep 17 00:00:00 2001 From: axibayuit Date: Thu, 1 Jan 2026 10:35:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E5=8D=A0=E4=BD=8D?= =?UTF-8?q?=E7=AC=A6=E6=98=BE=E7=A4=BA=E5=AE=8C=E6=95=B4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/262.033670d0.css | 1 + css/262.033670d0.css.gz | Bin 0 -> 2787 bytes css/760.931b4535.css | 1 - css/760.931b4535.css.gz | Bin 2514 -> 0 bytes index.html | 2 +- index.html.gz | Bin 511 -> 513 bytes js/262.ba4d4b57.js | 2 ++ js/262.ba4d4b57.js.gz | Bin 0 -> 9758 bytes js/262.ba4d4b57.js.map | 1 + js/262.ba4d4b57.js.map.gz | Bin 0 -> 26875 bytes js/760.a76249f2.js | 2 -- js/760.a76249f2.js.gz | Bin 8397 -> 0 bytes js/760.a76249f2.js.map | 1 - js/760.a76249f2.js.map.gz | Bin 22827 -> 0 bytes js/app.2ba98dec.js.gz | Bin 4905 -> 0 bytes js/app.2ba98dec.js.map.gz | Bin 15256 -> 0 bytes js/{app.2ba98dec.js => app.6573279d.js} | 4 ++-- js/app.6573279d.js.gz | Bin 0 -> 4905 bytes js/{app.2ba98dec.js.map => app.6573279d.js.map} | 2 +- js/app.6573279d.js.map.gz | Bin 0 -> 15258 bytes 20 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 css/262.033670d0.css create mode 100644 css/262.033670d0.css.gz delete mode 100644 css/760.931b4535.css delete mode 100644 css/760.931b4535.css.gz create mode 100644 js/262.ba4d4b57.js create mode 100644 js/262.ba4d4b57.js.gz create mode 100644 js/262.ba4d4b57.js.map create mode 100644 js/262.ba4d4b57.js.map.gz delete mode 100644 js/760.a76249f2.js delete mode 100644 js/760.a76249f2.js.gz delete mode 100644 js/760.a76249f2.js.map delete mode 100644 js/760.a76249f2.js.map.gz delete mode 100644 js/app.2ba98dec.js.gz delete mode 100644 js/app.2ba98dec.js.map.gz rename js/{app.2ba98dec.js => app.6573279d.js} (95%) create mode 100644 js/app.6573279d.js.gz rename js/{app.2ba98dec.js.map => app.6573279d.js.map} (98%) create mode 100644 js/app.6573279d.js.map.gz diff --git a/css/262.033670d0.css b/css/262.033670d0.css new file mode 100644 index 0000000..23d2026 --- /dev/null +++ b/css/262.033670d0.css @@ -0,0 +1 @@ +.tm-viewport[data-v-08fa832a]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tm-media[data-v-08fa832a]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-drag:none}.tm-audio[data-v-08fa832a]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:20px;padding:24px;width:100%;max-width:360px}.audio-cover[data-v-08fa832a]{width:200px;height:200px;border-radius:12px;overflow:hidden;background:hsla(0,0%,100%,.1);display:flex;align-items:center;justify-content:center;box-shadow:0 8px 32px rgba(0,0,0,.3)}.cover-img[data-v-08fa832a]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.audio-icon-large[data-v-08fa832a]{width:80px;height:80px;color:hsla(0,0%,100%,.4)}.audio-info[data-v-08fa832a]{text-align:center;width:100%}.audio-title[data-v-08fa832a]{font-size:18px;font-weight:600;color:#fff;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-artist[data-v-08fa832a]{font-size:14px;color:hsla(0,0%,100%,.6)}.audio-controls[data-v-08fa832a]{width:100%;display:flex;align-items:center;gap:16px}.ctrl-btn[data-v-08fa832a]{width:48px;height:48px;border-radius:50%;border:none;background:hsla(0,0%,100%,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .2s}.ctrl-btn[data-v-08fa832a]:hover{background:hsla(0,0%,100%,.25)}.ctrl-btn svg[data-v-08fa832a]{width:24px;height:24px}.progress-wrap[data-v-08fa832a]{flex:1;cursor:pointer}.progress-bar[data-v-08fa832a]{height:4px;background:hsla(0,0%,100%,.2);border-radius:2px;overflow:hidden}.progress-fill[data-v-08fa832a]{height:100%;background:#3b82f6;border-radius:2px;transition:width .1s linear}.time-display[data-v-08fa832a]{display:flex;justify-content:space-between;margin-top:6px;font-size:12px;color:hsla(0,0%,100%,.5)}.tm-audio audio[data-v-08fa832a]{display:none}.public-browse[data-v-8da85654]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-8da85654]{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px 32px;background:hsla(0,0%,6%,.95);backdrop-filter:blur(10px);border-bottom:1px solid #1a1a1a}.logo[data-v-8da85654]{font-size:20px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .2s}.logo[data-v-8da85654]:hover{opacity:.8}.breadcrumb[data-v-8da85654]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-8da85654]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-8da85654]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-8da85654]{color:#444}.file-count[data-v-8da85654]{color:#666;font-size:14px}.error-container[data-v-8da85654],.loading-container[data-v-8da85654]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.loading-spinner[data-v-8da85654]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-8da85654 1s linear infinite}.loading-spinner-small[data-v-8da85654]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-8da85654 1s linear infinite}@keyframes spin-8da85654{to{transform:rotate(1turn)}}.retry-btn[data-v-8da85654]{margin-top:20px;padding:10px 32px;background:#3b82f6;border:none;border-radius:8px;color:#fff;font-size:14px;cursor:pointer;transition:background .2s}.retry-btn[data-v-8da85654]:hover{background:#2563eb}.gallery-container[data-v-8da85654]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-8da85654]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-8da85654]{margin-bottom:24px}.folders-grid[data-v-8da85654]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-8da85654]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;background:#141414;border-radius:12px;border:1px solid #1a1a1a;cursor:pointer;transition:all .2s}.folder-card[data-v-8da85654]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-8da85654]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-8da85654]{width:100%;height:100%}.folder-name[data-v-8da85654]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-8da85654]{display:flex;gap:16px}.waterfall-column[data-v-8da85654]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-8da85654]{cursor:pointer}.image-wrapper[data-v-8da85654]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-8da85654]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-8da85654 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-8da85654]:before{display:none}.image-wrapper.loaded[data-v-8da85654]{min-height:auto}.image-wrapper img[data-v-8da85654],.image-wrapper video[data-v-8da85654]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-8da85654{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-8da85654]:hover{border-color:#333}.overlay[data-v-8da85654]{position:absolute;inset:0;background:linear-gradient(transparent 50%,rgba(0,0,0,.85));opacity:0;transition:opacity .2s;display:flex;align-items:flex-end;justify-content:flex-end;padding:12px;z-index:10}.image-wrapper:hover .overlay[data-v-8da85654]{opacity:1}.file-placeholder[data-v-8da85654]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#141414;color:#555;gap:12px;padding:16px;box-sizing:border-box}.file-placeholder svg[data-v-8da85654]{width:48px;height:48px}.file-name[data-v-8da85654]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.audio-placeholder[data-v-8da85654]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e,#16213e);gap:12px;padding:16px;box-sizing:border-box}.audio-icon[data-v-8da85654]{width:48px;height:48px;color:hsla(0,0%,100%,.6)}.audio-name[data-v-8da85654]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.overlay-actions[data-v-8da85654]{display:flex;gap:8px}.action-btn[data-v-8da85654]{width:32px;height:32px;border:none;border-radius:50%;background:hsla(0,0%,100%,.08);backdrop-filter:blur(8px);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6)}.action-btn svg[data-v-8da85654]{width:16px;height:16px}.action-btn[data-v-8da85654]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-8da85654]{display:flex;justify-content:center;align-items:center;padding:48px;min-height:100px}.loading-more[data-v-8da85654]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-8da85654]{color:#444;font-size:14px}.credit-link[data-v-8da85654]{display:block;margin-top:8px;color:#555;font-size:12px;text-decoration:none;transition:color .2s;text-align:center}.credit-link[data-v-8da85654]:hover{color:#888}.preview-modal[data-v-8da85654]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97)}.preview-content[data-v-8da85654],.preview-modal[data-v-8da85654]{display:flex;align-items:center;justify-content:center;overflow:hidden}.preview-content[data-v-8da85654]{width:100%;height:100%;padding:60px 80px;box-sizing:border-box}.swipe-viewport[data-v-8da85654]{width:100%;height:100%;overflow:hidden;position:relative}.swipe-track[data-v-8da85654]{width:300%;height:100%;display:flex;will-change:transform}.swipe-slide[data-v-8da85654]{width:33.333%;flex-shrink:0;height:100%;display:flex;align-items:center;justify-content:center}.preview-image[data-v-8da85654],.preview-video[data-v-8da85654]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.preview-close[data-v-8da85654]{position:fixed;top:20px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-close[data-v-8da85654]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-8da85654]{width:28px;height:28px}.page-indicator[data-v-8da85654]{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.6);color:hsla(0,0%,100%,.8);padding:8px 16px;border-radius:20px;font-size:14px;z-index:1010}.preview-next[data-v-8da85654],.preview-prev[data-v-8da85654]{position:fixed;top:50%;transform:translateY(-50%);background:hsla(0,0%,100%,.1);border:none;color:#fff;padding:16px;cursor:pointer;border-radius:50%;width:56px;height:56px;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-next[data-v-8da85654]:hover,.preview-prev[data-v-8da85654]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-8da85654],.preview-prev svg[data-v-8da85654]{width:32px;height:32px}.preview-prev[data-v-8da85654]{left:20px}.preview-next[data-v-8da85654]{right:20px}.rotate-btn[data-v-8da85654]{position:fixed;bottom:30px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.rotate-btn[data-v-8da85654]:hover{background:hsla(0,0%,100%,.2)}.rotate-btn svg[data-v-8da85654]{width:24px;height:24px}@media (max-width:768px){.desktop-only[data-v-8da85654]{display:none!important}.preview-content.mobile-only[data-v-8da85654]{display:block;padding:0;width:100%;height:100%;position:absolute;top:0;left:0}.page-indicator[data-v-8da85654]{bottom:40px}}@media (min-width:769px){.mobile-only[data-v-8da85654]{display:none!important}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-8da85654]{padding:12px}.waterfall-column[data-v-8da85654],.waterfall[data-v-8da85654]{gap:10px}.image-wrapper[data-v-8da85654]{border-radius:8px}}@media (max-width:600px){.header[data-v-8da85654]{padding:10px 12px}.header-left .logo[data-v-8da85654]{font-size:16px}.breadcrumb[data-v-8da85654]{font-size:12px}.breadcrumb-item[data-v-8da85654]{padding:4px 8px}.file-count[data-v-8da85654]{font-size:12px}.gallery-container[data-v-8da85654]{padding:6px}.waterfall-column[data-v-8da85654],.waterfall[data-v-8da85654]{gap:6px}.image-wrapper[data-v-8da85654]{border-radius:6px;min-height:120px}.folders-section[data-v-8da85654]{margin-bottom:12px}.folders-grid[data-v-8da85654]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-8da85654]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-8da85654]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-8da85654]{font-size:12px}.load-trigger[data-v-8da85654]{padding:24px;min-height:60px}}.copy-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:rgba(0,0,0,.8);color:#fff;padding:10px 24px;border-radius:20px;font-size:14px;opacity:0;transition:all .3s ease;z-index:9999;pointer-events:none}.copy-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}.public-browse.light-mode[data-v-8da85654]{background:#f5f5f5;color:#333}.light-mode .header[data-v-8da85654]{background:hsla(0,0%,100%,.95);border-bottom-color:#e0e0e0}.light-mode .logo[data-v-8da85654]{color:#333}.light-mode .breadcrumb-item[data-v-8da85654]{color:#666}.light-mode .breadcrumb-item[data-v-8da85654]:hover{background:#e8e8e8;color:#333}.light-mode .breadcrumb-sep[data-v-8da85654]{color:#ccc}.light-mode .error-container[data-v-8da85654],.light-mode .file-count[data-v-8da85654],.light-mode .loading-container[data-v-8da85654]{color:#999}.light-mode .loading-spinner-small[data-v-8da85654],.light-mode .loading-spinner[data-v-8da85654]{border-color:#ddd;border-top-color:#3b82f6}.light-mode .folder-card[data-v-8da85654]{background:#fff;border-color:#e0e0e0}.light-mode .folder-card[data-v-8da85654]:hover{background:#fafafa;border-color:#ccc}.light-mode .folder-icon[data-v-8da85654]{color:#999}.light-mode .folder-name[data-v-8da85654]{color:#666}.light-mode .image-wrapper[data-v-8da85654]{background:#fff;border-color:#e0e0e0}.light-mode .image-wrapper[data-v-8da85654]:before{background:linear-gradient(90deg,#f5f5f5 25%,#fff 50%,#f5f5f5 75%)}.light-mode .image-wrapper[data-v-8da85654]:hover{border-color:#ccc}.light-mode .file-placeholder[data-v-8da85654]{color:#ccc;background:#f5f5f5;color:#999}.light-mode .file-name[data-v-8da85654]{color:rgba(0,0,0,.6)}.light-mode .audio-placeholder[data-v-8da85654]{background:linear-gradient(135deg,#e8f4f8,#d4e5f7)}.light-mode .audio-icon[data-v-8da85654]{color:rgba(0,0,0,.4)}.light-mode .audio-name[data-v-8da85654]{color:rgba(0,0,0,.6)}.light-mode .no-more[data-v-8da85654]{color:#bbb}.light-mode .credit-link[data-v-8da85654]{color:#aaa}.light-mode .credit-link[data-v-8da85654]:hover{color:#666}.light-mode .loading-more[data-v-8da85654]{color:#999} \ No newline at end of file diff --git a/css/262.033670d0.css.gz b/css/262.033670d0.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..811718a3a5241343880ac1666d11fc7c2f679453 GIT binary patch literal 2787 zcmV<93LNzxiwFP!000023f)@UZmYN&eide_N=1qhkc3jWna7yX)?64ciKl>(ahh~h zdG{@wlMTj@?lq&WQKYp}g6;qC{bxI@1Roe(YeLz7GRPqK0B)GWaPPxEzpglA=g4#2 z=lG29>CD>i8E)zVenxqLZZRzIsREdxvWZeuF+}6PE)B!^CrC-fP{sPkj9k()fGNYI ziYii}7+g{Ejv2T#h=K+cC}rIbCHXObI(=|=SP4p$VK^tfgf}3O&;OKJ00fZaFO)Kn zV-|5jA+BQ0BZb6_!qa#%ykwZnPgbPE{{b1MsO35(#igtskl6{=k?+>GxQ1DVt5f73 z>RUWvto?Hzxb^Ms2&zCzJ`i0}sPFO}J8`ssB!p&&0tz#HX(G?BZ!zB?FUU1I<19l} zoWS(`M9HPfqH|Ng7kB4A?>G%R$FskSiG3F!$}AR&yAGCF7!DaaTeqN2cc zgPZtz#tea`hAE0Fa;32DX@ZpDh8c-EED9yCM@&|XlAnfuaUJ&2##)IvZEUJ9Nr6+4P;zYsUlL|8JO;V1Vnj?ZC8YRVrzIbkZ8}QWmM6bSC4JmMDJ$aCS?oL5YWX|BI9ua~K zPIuxGBruU0rkH)UrmQ`tGvn^X$O-RGLJ`bTdMT4RQCl43LB*CZ=y6Z+zDAv$xVf|i z991LXcwJ^wby~e>(llK^c<#oY{3HJ;Ae44#P(7!^6nQS zUjpYjp=Cq~gABcR>_RL1es?Hh^ivMbl9wG_y^_Flk2LdUDhpjgqOcPV@j*D8Y3jAn zFijL|?J(G*l5M02g1RG>1#Ygp02Q$tmot#5#uZdZM} zFirh&2~S8=3$-y>q^N)lf1n3j4k~yxNR_kNP;^4f6h#Tj2}NJM1^xPKJkSV}h7=cu zVq7(dMXpRp8#us;(~TUH z;1P5QS6D-eDkktGcgDh_ZO47t;4Ty$%QcvA0I14lv1IsRNLjdTj&qGw>d|qSTYS!-Rjjy zvfLYZwKv9q;3KH5Ebf$!~+{TLR;cJk&VWvyrWug6B`HM+4-vmxmbhSR>Tue`c(h(C&Y zFXgzJ+Ulq_38#W|!-eKj$a_nx8S-}<#0F>#%o{V;U=%=`(iw!dp_i=mz{h00NnwFr zJjb)!avv~?Pp8$^$O6+E@${D0CiP11k~7t}7)nCX_qt_rX`t&1Rb*lFvF9{flTwtm zcJRJTRGZ&Oje=0AQKs!-VTTz?35DYbRl=KCDG)cadow|u^1GA6Fy!rZ#K*#*BpECW zxlE34C>s(PsrRd7HFDPS_G*vYciPwFj4K3u)21|I1T!H^^TnZA%DXwCyBrgmE3VOO z#J;-!)CbR!;C^RDVfw!41C5jWE9NER8CEA04ffpc+Y~rMi~H`K{eJ&EnPL6!R|H0V zhz!#Ji-jWMZ<+c(elcP3*1!O_g6JkQ6SEq6hqTLx%!4z}R$|=pcw+N>^t%^57Uu$^ zgWzR^SsGhH(qs=)IP@iUeUU@dyokY7hEvE0UDZa{NZNBP6ewpxLYk)4?=Rr!D%HN? z{{njkD;61d*h z>6P3w+t8Zdnfm>rIN8w3{+f*nb-V@L2yXE@hdiKc$!}i;TvyiW9f`KaG+kX#>zN0x zB=Bk0*e_d{>`!-pKv}`h(N*xUs)9*L+j`jtXPPa$=9#8(jOmMs<=9*?&MTE$IhuPS z@(!j}*j@_h;=9U}yv>#-*jn>Jxj(Dis}N)4l+>Sq5!kSWI2LY9`z$F*^4rTt`aCeS zwMh{-KI!sTGxmp0 z)y;6{LSG$Ojw|D32RGNt^60N!qBafG#TzDS8-`sd%ny0Ed&&;zn7?X|Fkww5@St7& pUG~;G?n#oU3ykgdZV`lV`y#a^KC=(=&_Po9e*y9M8vbB4003esf0Y0L literal 0 HcmV?d00001 diff --git a/css/760.931b4535.css b/css/760.931b4535.css deleted file mode 100644 index 6da6c43..0000000 --- a/css/760.931b4535.css +++ /dev/null @@ -1 +0,0 @@ -.tm-viewport[data-v-09426418]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tm-media[data-v-09426418]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-drag:none}.tm-audio[data-v-09426418]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px;padding:20px}.audio-icon-large[data-v-09426418]{width:120px;height:120px;color:hsla(0,0%,100%,.6)}.audio-player[data-v-09426418]{width:100%;max-width:400px}.public-browse[data-v-9f48f6cc]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-9f48f6cc]{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px 32px;background:hsla(0,0%,6%,.95);backdrop-filter:blur(10px);border-bottom:1px solid #1a1a1a}.logo[data-v-9f48f6cc]{font-size:20px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .2s}.logo[data-v-9f48f6cc]:hover{opacity:.8}.breadcrumb[data-v-9f48f6cc]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-9f48f6cc]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-9f48f6cc]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-9f48f6cc]{color:#444}.file-count[data-v-9f48f6cc]{color:#666;font-size:14px}.error-container[data-v-9f48f6cc],.loading-container[data-v-9f48f6cc]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.loading-spinner[data-v-9f48f6cc]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-9f48f6cc 1s linear infinite}.loading-spinner-small[data-v-9f48f6cc]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-9f48f6cc 1s linear infinite}@keyframes spin-9f48f6cc{to{transform:rotate(1turn)}}.retry-btn[data-v-9f48f6cc]{margin-top:20px;padding:10px 32px;background:#3b82f6;border:none;border-radius:8px;color:#fff;font-size:14px;cursor:pointer;transition:background .2s}.retry-btn[data-v-9f48f6cc]:hover{background:#2563eb}.gallery-container[data-v-9f48f6cc]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-9f48f6cc]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-9f48f6cc]{margin-bottom:24px}.folders-grid[data-v-9f48f6cc]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-9f48f6cc]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;background:#141414;border-radius:12px;border:1px solid #1a1a1a;cursor:pointer;transition:all .2s}.folder-card[data-v-9f48f6cc]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-9f48f6cc]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-9f48f6cc]{width:100%;height:100%}.folder-name[data-v-9f48f6cc]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-9f48f6cc]{display:flex;gap:16px}.waterfall-column[data-v-9f48f6cc]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-9f48f6cc]{cursor:pointer}.image-wrapper[data-v-9f48f6cc]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-9f48f6cc]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-9f48f6cc 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-9f48f6cc]:before{display:none}.image-wrapper.loaded[data-v-9f48f6cc]{min-height:auto}.image-wrapper img[data-v-9f48f6cc],.image-wrapper video[data-v-9f48f6cc]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-9f48f6cc{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-9f48f6cc]:hover{border-color:#333}.overlay[data-v-9f48f6cc]{position:absolute;inset:0;background:linear-gradient(transparent 50%,rgba(0,0,0,.85));opacity:0;transition:opacity .2s;display:flex;align-items:flex-end;justify-content:flex-end;padding:12px;z-index:10}.image-wrapper:hover .overlay[data-v-9f48f6cc]{opacity:1}.file-placeholder[data-v-9f48f6cc]{width:100%;height:200px;display:flex;align-items:center;justify-content:center;background:#141414;color:#333}.file-placeholder svg[data-v-9f48f6cc]{width:56px;height:56px}.audio-placeholder[data-v-9f48f6cc]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e,#16213e);gap:12px;padding:16px;box-sizing:border-box}.audio-icon[data-v-9f48f6cc]{width:48px;height:48px;color:hsla(0,0%,100%,.6)}.audio-name[data-v-9f48f6cc]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.overlay-actions[data-v-9f48f6cc]{display:flex;gap:8px}.action-btn[data-v-9f48f6cc]{width:32px;height:32px;border:none;border-radius:50%;background:hsla(0,0%,100%,.08);backdrop-filter:blur(8px);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6)}.action-btn svg[data-v-9f48f6cc]{width:16px;height:16px}.action-btn[data-v-9f48f6cc]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-9f48f6cc]{display:flex;justify-content:center;align-items:center;padding:48px;min-height:100px}.loading-more[data-v-9f48f6cc]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-9f48f6cc]{color:#444;font-size:14px}.credit-link[data-v-9f48f6cc]{display:block;margin-top:8px;color:#555;font-size:12px;text-decoration:none;transition:color .2s;text-align:center}.credit-link[data-v-9f48f6cc]:hover{color:#888}.preview-modal[data-v-9f48f6cc]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97)}.preview-content[data-v-9f48f6cc],.preview-modal[data-v-9f48f6cc]{display:flex;align-items:center;justify-content:center;overflow:hidden}.preview-content[data-v-9f48f6cc]{width:100%;height:100%;padding:60px 80px;box-sizing:border-box}.swipe-viewport[data-v-9f48f6cc]{width:100%;height:100%;overflow:hidden;position:relative}.swipe-track[data-v-9f48f6cc]{width:300%;height:100%;display:flex;will-change:transform}.swipe-slide[data-v-9f48f6cc]{width:33.333%;flex-shrink:0;height:100%;display:flex;align-items:center;justify-content:center}.preview-image[data-v-9f48f6cc],.preview-video[data-v-9f48f6cc]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.preview-close[data-v-9f48f6cc]{position:fixed;top:20px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-close[data-v-9f48f6cc]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-9f48f6cc]{width:28px;height:28px}.page-indicator[data-v-9f48f6cc]{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.6);color:hsla(0,0%,100%,.8);padding:8px 16px;border-radius:20px;font-size:14px;z-index:1010}.preview-next[data-v-9f48f6cc],.preview-prev[data-v-9f48f6cc]{position:fixed;top:50%;transform:translateY(-50%);background:hsla(0,0%,100%,.1);border:none;color:#fff;padding:16px;cursor:pointer;border-radius:50%;width:56px;height:56px;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-next[data-v-9f48f6cc]:hover,.preview-prev[data-v-9f48f6cc]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-9f48f6cc],.preview-prev svg[data-v-9f48f6cc]{width:32px;height:32px}.preview-prev[data-v-9f48f6cc]{left:20px}.preview-next[data-v-9f48f6cc]{right:20px}.rotate-btn[data-v-9f48f6cc]{position:fixed;bottom:30px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.rotate-btn[data-v-9f48f6cc]:hover{background:hsla(0,0%,100%,.2)}.rotate-btn svg[data-v-9f48f6cc]{width:24px;height:24px}@media (max-width:768px){.desktop-only[data-v-9f48f6cc]{display:none!important}.preview-content.mobile-only[data-v-9f48f6cc]{display:block;padding:0;width:100%;height:100%;position:absolute;top:0;left:0}.page-indicator[data-v-9f48f6cc]{bottom:40px}}@media (min-width:769px){.mobile-only[data-v-9f48f6cc]{display:none!important}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-9f48f6cc]{padding:12px}.waterfall-column[data-v-9f48f6cc],.waterfall[data-v-9f48f6cc]{gap:10px}.image-wrapper[data-v-9f48f6cc]{border-radius:8px}}@media (max-width:600px){.header[data-v-9f48f6cc]{padding:10px 12px}.header-left .logo[data-v-9f48f6cc]{font-size:16px}.breadcrumb[data-v-9f48f6cc]{font-size:12px}.breadcrumb-item[data-v-9f48f6cc]{padding:4px 8px}.file-count[data-v-9f48f6cc]{font-size:12px}.gallery-container[data-v-9f48f6cc]{padding:6px}.waterfall-column[data-v-9f48f6cc],.waterfall[data-v-9f48f6cc]{gap:6px}.image-wrapper[data-v-9f48f6cc]{border-radius:6px;min-height:120px}.folders-section[data-v-9f48f6cc]{margin-bottom:12px}.folders-grid[data-v-9f48f6cc]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-9f48f6cc]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-9f48f6cc]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-9f48f6cc]{font-size:12px}.load-trigger[data-v-9f48f6cc]{padding:24px;min-height:60px}}.copy-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:rgba(0,0,0,.8);color:#fff;padding:10px 24px;border-radius:20px;font-size:14px;opacity:0;transition:all .3s ease;z-index:9999;pointer-events:none}.copy-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}.public-browse.light-mode[data-v-9f48f6cc]{background:#f5f5f5;color:#333}.light-mode .header[data-v-9f48f6cc]{background:hsla(0,0%,100%,.95);border-bottom-color:#e0e0e0}.light-mode .logo[data-v-9f48f6cc]{color:#333}.light-mode .breadcrumb-item[data-v-9f48f6cc]{color:#666}.light-mode .breadcrumb-item[data-v-9f48f6cc]:hover{background:#e8e8e8;color:#333}.light-mode .breadcrumb-sep[data-v-9f48f6cc]{color:#ccc}.light-mode .error-container[data-v-9f48f6cc],.light-mode .file-count[data-v-9f48f6cc],.light-mode .loading-container[data-v-9f48f6cc]{color:#999}.light-mode .loading-spinner-small[data-v-9f48f6cc],.light-mode .loading-spinner[data-v-9f48f6cc]{border-color:#ddd;border-top-color:#3b82f6}.light-mode .folder-card[data-v-9f48f6cc]{background:#fff;border-color:#e0e0e0}.light-mode .folder-card[data-v-9f48f6cc]:hover{background:#fafafa;border-color:#ccc}.light-mode .folder-icon[data-v-9f48f6cc]{color:#999}.light-mode .folder-name[data-v-9f48f6cc]{color:#666}.light-mode .image-wrapper[data-v-9f48f6cc]{background:#fff;border-color:#e0e0e0}.light-mode .image-wrapper[data-v-9f48f6cc]:before{background:linear-gradient(90deg,#f5f5f5 25%,#fff 50%,#f5f5f5 75%)}.light-mode .image-wrapper[data-v-9f48f6cc]:hover{border-color:#ccc}.light-mode .file-placeholder[data-v-9f48f6cc]{background:#f5f5f5;color:#ccc}.light-mode .audio-placeholder[data-v-9f48f6cc]{background:linear-gradient(135deg,#e8f4f8,#d4e5f7)}.light-mode .audio-icon[data-v-9f48f6cc]{color:rgba(0,0,0,.4)}.light-mode .audio-name[data-v-9f48f6cc]{color:rgba(0,0,0,.6)}.light-mode .no-more[data-v-9f48f6cc]{color:#bbb}.light-mode .credit-link[data-v-9f48f6cc]{color:#aaa}.light-mode .credit-link[data-v-9f48f6cc]:hover{color:#666}.light-mode .loading-more[data-v-9f48f6cc]{color:#999} \ No newline at end of file diff --git a/css/760.931b4535.css.gz b/css/760.931b4535.css.gz deleted file mode 100644 index 0bc5d99a12cb0dedec23ec57c101a12e769b42d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2514 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 diff --git a/index.html b/index.html index 408ae40..bad353a 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Sanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/index.html.gz b/index.html.gz index 1c15b365f0c53b3755300ab34438ba1d26294c57..c286dbdf9f1cfa2dec0e526ee2614fc521216f92 100644 GIT binary patch delta 499 zcmV1d!l+ ze2=8$2Sb{tfY5R8DtUOpDc_btRI)>5D%m3|(4C42xfBC8*^M}5JLZt#-@%Th_?`W{ z%|25f6x-UN08O6Jb1Ck=lxSLf1bNkCDMpL?K#`x-?XBUiG=Df+joC3+SZ~=XmnE$n zmY1TE&iWlhbfvJGynrrZQ;Nb-OL_3^S%nJ0Va7D*E_=VaS84Y~8EA48OYyN;)vM+5 z+=;=YqYZ2i$R{)R%1;BrUEh8kYRKRgdNLS2G}a+>l-T+ff>Yd3?9Ul@IPEE#^onkA z;#-`tEWq}veSa2eM}vXH6xGYItARU;uZVwGQAxJ!usRbii#aK0i(s(9c(B}H6p*4W zMe&dd-3@-1jpz-IFfIxUw9D_62&+{ zJusx>#Qxa6?S>i*Ve%IYdx|>H?wE4h2YtI(E0RMMg{mF$oeXscpEF2%r2wi1V|W$rWlJGikFzq6nB z*=Oo{#jf@!KvQ50T#AP;C7KqWK|ys`iqYY=r^v7Bw$89E4S$YKW3~?#E;x3|XGtrM z<&~(UcVPn&eJPx#Aizd!N>O-fDepsjRH6FbW5zUSo4sG%skC{c3^aL)rTEw^>*eL; zu@i$yN7u94Az#cqsxS=*4_*6ps3C)U=*VCU&^V7^DX|MJ^j>j8u{&nm;IyS^(iz?2 zz_&PJS%B+Q`+q9bo(2PnDXP=4tAQ=WGvXgkRFWNgtd4}sVou80A{cBi?kqPL1*E7; zQ9PwW+aYYS5rd(a^1Ib#eS34W&YzN~WHCeEqfmXHf2!4bWl*00_bWQAM5ohk%j?@~ zG|P3aQxfwg6HgwKMPzY~-Zi>fuI|=aUA=`V=F6|iOlp-3^x}Xcg|_;I7ZD**j1$xY zL)uU5kLy}H)L;lxxM0{)+&~|x$LJ^6I<_=0d{d)(oCkqH)gDa_-#w~?hZr0K(|$iL n44BK}&{Y=yg%~%2Gy4PIsWon_WHGBP_8<8lf8cZ7*aH9n8GP}W diff --git a/js/262.ba4d4b57.js b/js/262.ba4d4b57.js new file mode 100644 index 0000000..9b752cc --- /dev/null +++ b/js/262.ba4d4b57.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[262],{3262:function(e,t,i){i.r(t),i.d(t,{default:function(){return le}});var s=i(6768),o=i(5130),r=i(4232);const n=["src"],a=["src"],l={class:"audio-cover"},h=["src"],d={key:1,class:"audio-icon-large",viewBox:"0 0 24 24",fill:"currentColor"},c={class:"audio-info"},u={class:"audio-title"},p={key:0,class:"audio-artist"},g={class:"audio-controls"},m={key:0,viewBox:"0 0 24 24",fill:"currentColor"},v={key:1,viewBox:"0 0 24 24",fill:"currentColor"},w={class:"progress-bar"},f={class:"time-display"},y=["src"];function k(e,t,i,k,C,L){return(0,s.uX)(),(0,s.CE)("div",{class:"tm-viewport",ref:"viewport",onPointerdown:t[8]||(t[8]=(...e)=>L.onPointerDown&&L.onPointerDown(...e)),onPointermove:t[9]||(t[9]=(...e)=>L.onPointerMove&&L.onPointerMove(...e)),onPointerup:t[10]||(t[10]=(...e)=>L.onPointerUp&&L.onPointerUp(...e)),onPointercancel:t[11]||(t[11]=(...e)=>L.onPointerUp&&L.onPointerUp(...e)),onDblclick:t[12]||(t[12]=(0,o.D$)((...e)=>L.onDblClick&&L.onDblClick(...e),["prevent"]))},[i.isImage?((0,s.uX)(),(0,s.CE)("img",{key:0,class:"tm-media",src:i.src,draggable:"false",style:(0,r.Tr)(L.mediaStyle),onLoad:t[0]||(t[0]=(...e)=>L.onLoad&&L.onLoad(...e))},null,44,n)):i.isVideo?((0,s.uX)(),(0,s.CE)("video",{key:1,class:"tm-media",src:i.src,controls:"",autoplay:"",playsinline:"",style:(0,r.Tr)(L.mediaStyle)},null,12,a)):i.isAudio?((0,s.uX)(),(0,s.CE)("div",{key:2,class:"tm-audio",onPointerdown:t[6]||(t[6]=(0,o.D$)(()=>{},["stop"])),onPointermove:t[7]||(t[7]=(0,o.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",l,[C.audioCover?((0,s.uX)(),(0,s.CE)("img",{key:0,src:C.audioCover,class:"cover-img"},null,8,h)):((0,s.uX)(),(0,s.CE)("svg",d,[...t[13]||(t[13]=[(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",c,[(0,s.Lk)("div",u,(0,r.v_)(C.audioTitle),1),C.audioArtist?((0,s.uX)(),(0,s.CE)("div",p,(0,r.v_)(C.audioArtist),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",g,[(0,s.Lk)("button",{class:"ctrl-btn",onClick:t[1]||(t[1]=(...e)=>L.togglePlay&&L.togglePlay(...e))},[C.audioPlaying?((0,s.uX)(),(0,s.CE)("svg",v,[...t[15]||(t[15]=[(0,s.Lk)("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z"},null,-1)])])):((0,s.uX)(),(0,s.CE)("svg",m,[...t[14]||(t[14]=[(0,s.Lk)("path",{d:"M8 5v14l11-7z"},null,-1)])]))]),(0,s.Lk)("div",{class:"progress-wrap",onClick:t[2]||(t[2]=(...e)=>L.seekAudio&&L.seekAudio(...e))},[(0,s.Lk)("div",w,[(0,s.Lk)("div",{class:"progress-fill",style:(0,r.Tr)({width:C.audioProgress+"%"})},null,4)]),(0,s.Lk)("div",f,[(0,s.Lk)("span",null,(0,r.v_)(L.formatTime(C.audioCurrentTime)),1),(0,s.Lk)("span",null,(0,r.v_)(L.formatTime(C.audioDuration)),1)])])]),(0,s.Lk)("audio",{ref:"audioEl",src:i.src,onLoadedmetadata:t[3]||(t[3]=(...e)=>L.onAudioLoaded&&L.onAudioLoaded(...e)),onTimeupdate:t[4]||(t[4]=(...e)=>L.onTimeUpdate&&L.onTimeUpdate(...e)),onEnded:t[5]||(t[5]=e=>C.audioPlaying=!1)},null,40,y)],32)):(0,s.Q3)("",!0)],544)}i(6573),i(8100),i(7936),i(9577),i(1549),i(9797),i(9631),i(5623),i(4603),i(7566),i(8721);var C={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}},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,audioPlaying:!1,audioCurrentTime:0,audioDuration:0,audioProgress:0,audioCover:null,audioTitle:"",audioArtist:"",startDist:0,startAngle:0,dragging:!1,dragStart:null,viewportRect:null,minScale:1,maxScale:4,gestureMode:null,edgeOverflow:0,edgeDir:0}},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")},src:{immediate:!0,handler(e){this.isAudio&&e&&this.initAudioInfo()}}},mounted(){this.isAudio&&(this.initAudioInfo(),this.$nextTick(()=>{this.$refs.audioEl&&(this.$refs.audioEl.play().catch(()=>{}),this.audioPlaying=!0)}))},methods:{initAudioInfo(){const e=this.file?.name||this.src,t=e.split("/").pop().replace(/\.[^.]+$/,"");this.audioTitle=t,this.audioArtist="",this.audioCover=null,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;new TextDecoder("utf-8");while(st.byteLength)break;const r=new Uint8Array(t,s+10,Math.min(o,t.byteLength-s-10));"TIT2"===i?this.audioTitle=this.decodeText(r)||this.audioTitle:"TPE1"===i?this.audioArtist=this.decodeText(r):"APIC"===i&&this.extractCover(r),s+=10+o}},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(){Array.from(this.pointers.values());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,o=i.y-t.y,r=Math.hypot(s,o),n=Math.atan2(o,s)*(180/Math.PI),a={x:(t.x+i.x)/2,y:(t.y+i.y)/2};return{dist:r,angle:n,center:a}},normalizeAngle(e){return e=(e%360+360)%360,e>180?e-360:e},onPointerDown(e){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.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(),o=t/(this.startDist||t),r=Math.abs(o-1),n=this.normalizeAngle(i-this.startAngle),a=Math.abs(n),l=8,h=.08;if(!this.gestureMode)if(a>=l)this.gestureMode="rotate";else{if(!(r>=h))return;this.gestureMode="pinch"}if("rotate"===this.gestureMode)return this.scale=this.startScale,void(this.rotatePreview=this.clamp(n,-90,90));if("pinch"===this.gestureMode&&(this.scale=this.clamp(this.startScale*o,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,o=s.y-this.viewportRect.top-this.viewportRect.height/2;this.tx=this.startTx+(i-e),this.ty=this.startTy+(o-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,o=this.startTy+i,{maxX:r,maxY:n,vw:a,vh:l}=this.getPanBounds();let h=0,d=0;s>r?(h=s-r,d=-1):s<-r&&(h=-r-s,d=1),this.edgeOverflow=h,this.edgeDir=d,this.tx=this.applyBoundWithRubber(s,r,a),this.ty=this.applyBoundWithRubber(o,n,l)}}},onPointerUp(e){if(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,t=30;let i=0;Math.abs(e)>=t&&(i=e>0?90:-90);const s=((this.rotation+i)%360+360)%360;this.rotation=s,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.scale>1.001?(this.scale=1,this.tx=0,this.ty=0):this.scale=2}}},L=i(1241);const x=(0,L.A)(C,[["render",k],["__scopeId","data-v-08fa832a"]]);var b=x;const T={class:"header"},I={class:"header-left"},M={class:"header-center"},P={class:"breadcrumb"},E=["onClick"],F={class:"header-right"},S={class:"file-count"},D={key:0,class:"loading-container"},$={key:1,class:"error-container"},X={key:2,class:"gallery-container",ref:"galleryContainer"},A={key:0,class:"folders-section"},R={class:"folders-grid"},B=["onClick"],U={class:"folder-name"},z={class:"waterfall",ref:"waterfall"},V=["onClick"],H=["src","alt","onLoad"],W=["src","onLoadedmetadata"],_={class:"audio-name"},N={key:3,class:"file-placeholder"},Y={class:"file-name"},O={class:"overlay"},Q={class:"overlay-actions"},K=["onClick"],j=["onClick"],q={ref:"loadTrigger",class:"load-trigger"},G={key:0,class:"loading-more"},J={key:1,class:"no-more"},Z={key:2,class:"credit-link",href:"https://github.com/axibayuit-a11y",target:"_blank",rel:"noopener"},ee=["src"],te=["src"],ie={class:"page-indicator"};function se(e,t,i,n,a,l){const h=b;return(0,s.uX)(),(0,s.CE)("div",{class:(0,r.C4)(["public-browse",{"light-mode":a.isLightMode}])},[(0,s.Lk)("header",T,[(0,s.Lk)("div",I,[(0,s.Lk)("span",{class:"logo",onClick:t[0]||(t[0]=(...e)=>l.toggleTheme&&l.toggleTheme(...e)),title:"切换日夜模式"},(0,r.v_)(l.siteName),1)]),(0,s.Lk)("div",M,[(0,s.Lk)("div",P,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:t[1]||(t[1]=(...e)=>l.goToRoot&&l.goToRoot(...e))},(0,r.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[20]||(t[20]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>l.goToPath(i)},(0,r.v_)(e),9,E)],64))),128))])]),(0,s.Lk)("div",F,[(0,s.Lk)("span",S,(0,r.v_)(a.totalCount)+" 个文件",1)])]),a.loading&&0===a.files.length?((0,s.uX)(),(0,s.CE)("div",D,[...t[21]||(t[21]=[(0,s.Lk)("div",{class:"loading-spinner"},null,-1),(0,s.Lk)("p",null,"加载中...",-1)])])):a.error?((0,s.uX)(),(0,s.CE)("div",$,[(0,s.Lk)("p",null,(0,r.v_)(a.error),1),a.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[2]||(t[2]=(...e)=>l.loadFiles&&l.loadFiles(...e)),class:"retry-btn"},"重试")):(0,s.Q3)("",!0)])):((0,s.uX)(),(0,s.CE)("div",X,[l.folders.length>0?((0,s.uX)(),(0,s.CE)("div",A,[(0,s.Lk)("div",R,[((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[22]||(t[22]=(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",U,(0,r.v_)(l.getFolderName(e.name)),1)],8,B))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",z,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.columns,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:i,class:"waterfall-column"},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(e,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"waterfall-item",onClick:t=>l.openPreview(e)},[(0,s.Lk)("div",{class:(0,r.C4)(["image-wrapper",{loaded:e.loaded}])},[l.isImage(e)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(e.name),alt:e.name,loading:"lazy",onLoad:t=>l.onImageLoad(t,e),onError:t[3]||(t[3]=(...e)=>l.handleImageError&&l.handleImageError(...e))},null,40,H)):l.isVideo(e)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(e.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:t=>l.onVideoLoad(t,e),onMouseenter:t[4]||(t[4]=e=>e.target.play()),onMouseleave:t[5]||(t[5]=e=>e.target.pause())},null,40,W)):l.isAudio(e)?((0,s.uX)(),(0,s.CE)("div",{key:2,class:"audio-placeholder",onClick:t[6]||(t[6]=(0,o.D$)(()=>{},["stop"]))},[t[23]||(t[23]=(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",_,(0,r.v_)(l.getFileName(e.name)),1)])):((0,s.uX)(),(0,s.CE)("div",N,[t[24]||(t[24]=(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",Y,(0,r.v_)(l.getFileName(e.name)),1)])),(0,s.Lk)("div",O,[(0,s.Lk)("div",Q,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,o.D$)(t=>l.copyLink(e.name),["stop"]),title:"复制链接"},[...t[25]||(t[25]=[(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,K),(0,s.Lk)("button",{class:"action-btn",onClick:(0,o.D$)(t=>l.downloadFile(e.name),["stop"]),title:"下载"},[...t[26]||(t[26]=[(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,j)])])],2)],8,V))),128))]))),128))],512),(0,s.Lk)("div",q,[a.loading&&a.files.length>0?((0,s.uX)(),(0,s.CE)("div",G,[...t[27]||(t[27]=[(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1),(0,s.Lk)("span",null,"加载中...",-1)])])):!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",J," 已加载全部 ")):(0,s.Q3)("",!0),!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("a",Z," 林酱贡献 ")):(0,s.Q3)("",!0)],512)],512)),a.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:t[19]||(t[19]=(0,o.D$)((...e)=>l.closePreview&&l.closePreview(...e),["self"]))},[(0,s.Lk)("button",{class:"preview-close",onClick:t[7]||(t[7]=(0,o.D$)((...e)=>l.closePreview&&l.closePreview(...e),["stop"]))},[...t[28]||(t[28]=[(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)])]),(0,s.Lk)("div",{class:"preview-content desktop-only",onClick:t[8]||(t[8]=(0,o.D$)(()=>{},["stop"]))},[l.currentPreviewFile&&l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(l.currentPreviewFile.name),class:"preview-image",style:(0,r.Tr)(l.desktopImageStyle),draggable:"false"},null,12,ee)):l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",autoplay:"",class:"preview-video",style:(0,r.Tr)(l.desktopImageStyle)},null,12,te)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",{class:"preview-content mobile-only",onClick:t[15]||(t[15]=(0,o.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",{class:"swipe-viewport",ref:"mobileViewport",onTouchstart:t[12]||(t[12]=(...e)=>l.onSwipeStart&&l.onSwipeStart(...e)),onTouchmove:t[13]||(t[13]=(...e)=>l.onSwipeMove&&l.onSwipeMove(...e)),onTouchend:t[14]||(t[14]=(...e)=>l.onSwipeEnd&&l.onSwipeEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,r.Tr)(l.swipeTrackStyle),onTransitionend:t[11]||(t[11]=(...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":l.isVideo(e),"is-audio":l.isAudio(e),onLock:t[9]||(t[9]=e=>a.gestureLocked=!0),onUnlock:t[10]||(t[10]=e=>a.gestureLocked=!1),onEdgeSwipe:l.onEdgeSwipe},null,8,["file","src","is-image","is-video","is-audio","onEdgeSwipe"])):(0,s.Q3)("",!0)]))),128))],36)],544)]),a.previewIndex>0?((0,s.uX)(),(0,s.CE)("button",{key:0,class:"preview-prev desktop-only",onClick:t[16]||(t[16]=(0,o.D$)((...e)=>l.prevImage&&l.prevImage(...e),["stop"]))},[...t[29]||(t[29]=[(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),a.previewIndexl.nextImage&&l.nextImage(...e),["stop"]))},[...t[30]||(t[30]=[(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),(0,s.Lk)("button",{class:"rotate-btn desktop-only",onClick:t[18]||(t[18]=(0,o.D$)((...e)=>l.rotateImage&&l.rotateImage(...e),["stop"])),title:"旋转90°"},[...t[31]||(t[31]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z"})],-1)])]),(0,s.Lk)("div",ie,(0,r.v_)(a.previewIndex+1)+" / "+(0,r.v_)(l.mediaFiles.length),1)])):(0,s.Q3)("",!0)],2)}i(4114),i(8111),i(2489),i(7588),i(1701);var oe=i(4373),re=i(8401),ne={name:"PublicBrowse",components:{TransformMedia:b},data(){return{files:[],allowedDirs:[],rootDir:"",currentPath:"",totalCount:0,loading:!1,error:null,canRetry:!0,hasMore:!0,previewVisible:!1,previewIndex:0,observer:null,pageSize:24,columnCount:4,columnHeights:[0,0,0,0],imageRotation:0,swipeX:0,swipeStartX:0,swipeStartY:0,swipeStartT:0,swipeActive:!1,swipeAnimating:!1,swipeDir:0,viewportW:0,gestureLocked:!1,isLightMode:!1}},computed:{...(0,re.L8)(["userConfig"]),siteName(){return this.userConfig?.siteTitle||"公开相册"},rootDirName(){return this.rootDir.split("/").filter(Boolean).pop()||"根目录"},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)},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.previewIndex=10&&e<18}},toggleTheme(){this.isLightMode=!this.isLightMode,localStorage.setItem("publicBrowseTheme",this.isLightMode?"light":"dark")},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;if(!t)return this.error="请指定要浏览的目录,例如: /browse/landscape",void(this.canRetry=!1);const 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),await this.loadFiles(),this.observeLoadTrigger()},async loadFiles(){this.loading=!0,this.error=null,this.canRetry=!0;try{const e=await oe.A.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);e.data.allowedDirs&&(this.allowedDirs=e.data.allowedDirs);const t=(e.data.directories||[]).map(e=>({name:e,isFolder:!0})),i=(e.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files=[...t,...i],this.totalCount=e.data.totalCount||this.files.length,this.hasMore=this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files.push(...i),this.hasMore=this.mediaFiles.length{this.showToast("已复制")}).catch(()=>{const e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast("已复制")})},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;const t=this.mediaFiles.findIndex(t=>t.name===e.name);t>=0&&(this.previewIndex=t,this.previewVisible=!0,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow="hidden",this.$nextTick(()=>{this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth}))},closePreview(){this.previewVisible=!1,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow=""},prevImage(){this.previewIndex>0&&(this.previewIndex--,this.imageRotation=0)},nextImage(){this.previewIndex=360&&setTimeout(()=>{const e=this.$el.querySelector(".preview-image, .preview-video");e?(e.style.transition="none",this.imageRotation=0,e.offsetHeight,e.style.transition=""):this.imageRotation=0},300)},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 o=i;0===this.previewIndex&&o>0?o=this.rubberBand(o,this.viewportW,.55):this.previewIndex===this.mediaFiles.length-1&&o<0&&(o=-this.rubberBand(-o,this.viewportW,.55)),this.swipeX=o},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))}}};const ae=(0,L.A)(ne,[["render",se],["__scopeId","data-v-8da85654"]]);var le=ae}}]); +//# sourceMappingURL=262.ba4d4b57.js.map \ No newline at end of file diff --git a/js/262.ba4d4b57.js.gz b/js/262.ba4d4b57.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee333428e85e49407a538e90a6f3403b1836e30a GIT binary patch literal 9758 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 $options.onPointerDown && $options.onPointerDown(...args)),\n onPointermove: _cache[9] || (_cache[9] = (...args) => $options.onPointerMove && $options.onPointerMove(...args)),\n onPointerup: _cache[10] || (_cache[10] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onPointercancel: _cache[11] || (_cache[11] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onDblclick: _cache[12] || (_cache[12] = _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 ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n class: \"tm-media\",\n src: $props.src,\n controls: \"\",\n autoplay: \"\",\n playsinline: \"\",\n style: _normalizeStyle($options.mediaStyle)\n }, null, 12, _hoisted_2)) : $props.isAudio ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"tm-audio\",\n onPointerdown: _cache[6] || (_cache[6] = _withModifiers(() => {}, [\"stop\"])),\n onPointermove: _cache[7] || (_cache[7] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_3, [$data.audioCover ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $data.audioCover,\n class: \"cover-img\"\n }, null, 8, _hoisted_4)) : (_openBlock(), _createElementBlock(\"svg\", _hoisted_5, [...(_cache[13] || (_cache[13] = [_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_6, [_createElementVNode(\"div\", _hoisted_7, _toDisplayString($data.audioTitle), 1), $data.audioArtist ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, _toDisplayString($data.audioArtist), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"button\", {\n class: \"ctrl-btn\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.togglePlay && $options.togglePlay(...args))\n }, [!$data.audioPlaying ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_10, [...(_cache[14] || (_cache[14] = [_createElementVNode(\"path\", {\n d: \"M8 5v14l11-7z\"\n }, null, -1)]))])) : (_openBlock(), _createElementBlock(\"svg\", _hoisted_11, [...(_cache[15] || (_cache[15] = [_createElementVNode(\"path\", {\n d: \"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"\n }, null, -1)]))]))]), _createElementVNode(\"div\", {\n class: \"progress-wrap\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.seekAudio && $options.seekAudio(...args))\n }, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", {\n class: \"progress-fill\",\n style: _normalizeStyle({\n width: $data.audioProgress + '%'\n })\n }, null, 4)]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", null, _toDisplayString($options.formatTime($data.audioCurrentTime)), 1), _createElementVNode(\"span\", null, _toDisplayString($options.formatTime($data.audioDuration)), 1)])])]), _createElementVNode(\"audio\", {\n ref: \"audioEl\",\n src: $props.src,\n onLoadedmetadata: _cache[3] || (_cache[3] = (...args) => $options.onAudioLoaded && $options.onAudioLoaded(...args)),\n onTimeupdate: _cache[4] || (_cache[4] = (...args) => $options.onTimeUpdate && $options.onTimeUpdate(...args)),\n onEnded: _cache[5] || (_cache[5] = $event => $data.audioPlaying = false)\n }, null, 40, _hoisted_14)], 32)) : _createCommentVNode(\"\", true)], 544);\n}","import \"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.typed-array.with.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.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\";\nexport default {\n name: \"TransformMedia\",\n props: {\n file: {\n type: Object,\n required: true\n },\n src: {\n type: String,\n required: true\n },\n isImage: {\n type: Boolean,\n default: true\n },\n isVideo: {\n type: Boolean,\n default: false\n },\n isAudio: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n pointers: new Map(),\n // transform state\n scale: 1,\n rotation: 0,\n // 落地的旋转角度:0, 90, 180, 270\n rotatePreview: 0,\n // 旋转预览角度(-90~+90,跟手)\n tx: 0,\n ty: 0,\n // 图片原始尺寸\n naturalWidth: 0,\n naturalHeight: 0,\n // gesture start snapshots\n startScale: 1,\n startRotation: 0,\n startTx: 0,\n startTy: 0,\n startCenter: null,\n // 音频播放状态\n audioPlaying: false,\n audioCurrentTime: 0,\n audioDuration: 0,\n audioProgress: 0,\n audioCover: null,\n audioTitle: '',\n audioArtist: '',\n startDist: 0,\n startAngle: 0,\n // drag\n dragging: false,\n dragStart: null,\n viewportRect: null,\n // bounds\n minScale: 1,\n maxScale: 4,\n // 手势模式锁定:'pinch' | 'rotate' | null\n gestureMode: null,\n // 边界翻页相关\n edgeOverflow: 0,\n // 超出边界的累计距离\n edgeDir: 0 // 超出方向:-1左 +1右\n };\n },\n computed: {\n isActiveTransform() {\n return this.scale > 1.001 || this.pointers.size >= 2 || this.dragging;\n },\n // 实际显示的旋转角度 = 落地角度 + 预览角度\n displayRotation() {\n return this.rotation + this.rotatePreview;\n },\n // 旋转时缩小系数(中间最小,两端恢复)\n rotateShrink() {\n const p = Math.min(1, Math.abs(this.rotatePreview) / 90);\n const k = Math.sin(Math.PI * p);\n return 1 - 0.12 * k; // 最多缩小12%\n },\n mediaStyle() {\n const finalScale = this.scale * this.rotateShrink;\n const inGesture = this.pointers.size > 0;\n return {\n transform: `translate3d(${this.tx}px, ${this.ty}px, 0) scale(${finalScale}) rotate(${this.displayRotation}deg)`,\n transition: inGesture ? \"none\" : \"transform 0.25s ease\",\n transformOrigin: \"center center\"\n };\n }\n },\n watch: {\n isActiveTransform(v) {\n this.$emit(v ? \"lock\" : \"unlock\");\n },\n src: {\n immediate: true,\n handler(newSrc) {\n if (this.isAudio && newSrc) {\n this.initAudioInfo();\n }\n }\n }\n },\n mounted() {\n if (this.isAudio) {\n this.initAudioInfo();\n this.$nextTick(() => {\n if (this.$refs.audioEl) {\n this.$refs.audioEl.play().catch(() => {});\n this.audioPlaying = true;\n }\n });\n }\n },\n methods: {\n // 初始化音频信息\n initAudioInfo() {\n // 从文件名提取标题\n const fileName = this.file?.name || this.src;\n const name = fileName.split('/').pop().replace(/\\.[^.]+$/, '');\n this.audioTitle = name;\n this.audioArtist = '';\n this.audioCover = null;\n\n // 尝试读取 ID3 标签(如果浏览器支持)\n this.tryReadMetadata();\n },\n async tryReadMetadata() {\n try {\n const response = await fetch(this.src);\n const blob = await response.blob();\n const arrayBuffer = await blob.slice(0, 128 * 1024).arrayBuffer(); // 只读前128KB\n const dataView = new DataView(arrayBuffer);\n\n // 检查 ID3v2 标签\n if (dataView.getUint8(0) === 0x49 && dataView.getUint8(1) === 0x44 && dataView.getUint8(2) === 0x33) {\n this.parseID3v2(dataView, arrayBuffer);\n }\n } catch (e) {\n // 忽略错误,使用默认信息\n }\n },\n parseID3v2(dataView, arrayBuffer) {\n const size = (dataView.getUint8(6) & 0x7f) << 21 | (dataView.getUint8(7) & 0x7f) << 14 | (dataView.getUint8(8) & 0x7f) << 7 | dataView.getUint8(9) & 0x7f;\n let offset = 10;\n const decoder = new TextDecoder('utf-8');\n while (offset < Math.min(size + 10, arrayBuffer.byteLength - 10)) {\n const frameId = String.fromCharCode(dataView.getUint8(offset), dataView.getUint8(offset + 1), dataView.getUint8(offset + 2), dataView.getUint8(offset + 3));\n if (frameId === '\\0\\0\\0\\0') break;\n const frameSize = dataView.getUint8(offset + 4) << 24 | dataView.getUint8(offset + 5) << 16 | dataView.getUint8(offset + 6) << 8 | dataView.getUint8(offset + 7);\n if (frameSize <= 0 || frameSize > arrayBuffer.byteLength) break;\n const frameData = new Uint8Array(arrayBuffer, offset + 10, Math.min(frameSize, arrayBuffer.byteLength - offset - 10));\n if (frameId === 'TIT2') {\n // 标题\n this.audioTitle = this.decodeText(frameData) || this.audioTitle;\n } else if (frameId === 'TPE1') {\n // 艺术家\n this.audioArtist = this.decodeText(frameData);\n } else if (frameId === 'APIC') {\n // 封面图片\n this.extractCover(frameData);\n }\n offset += 10 + frameSize;\n }\n },\n decodeText(data) {\n if (data.length < 2) return '';\n const encoding = data[0];\n const textData = data.slice(1);\n try {\n if (encoding === 0) {\n return new TextDecoder('iso-8859-1').decode(textData).replace(/\\0/g, '');\n } else if (encoding === 1) {\n return new TextDecoder('utf-16').decode(textData).replace(/\\0/g, '');\n } else if (encoding === 3) {\n return new TextDecoder('utf-8').decode(textData).replace(/\\0/g, '');\n }\n } catch (e) {}\n return '';\n },\n extractCover(data) {\n try {\n let offset = 1; // 跳过编码字节\n // 跳过 MIME 类型\n while (offset < data.length && data[offset] !== 0) offset++;\n offset++; // 跳过 null\n offset++; // 跳过图片类型\n // 跳过描述\n while (offset < data.length && data[offset] !== 0) offset++;\n offset++;\n if (offset < data.length) {\n const imageData = data.slice(offset);\n const blob = new Blob([imageData], {\n type: 'image/jpeg'\n });\n this.audioCover = URL.createObjectURL(blob);\n }\n } catch (e) {}\n },\n onAudioLoaded() {\n if (this.$refs.audioEl) {\n this.audioDuration = this.$refs.audioEl.duration;\n }\n },\n onTimeUpdate() {\n if (this.$refs.audioEl) {\n this.audioCurrentTime = this.$refs.audioEl.currentTime;\n this.audioProgress = this.audioCurrentTime / this.audioDuration * 100 || 0;\n }\n },\n togglePlay() {\n if (!this.$refs.audioEl) return;\n if (this.audioPlaying) {\n this.$refs.audioEl.pause();\n } else {\n this.$refs.audioEl.play();\n }\n this.audioPlaying = !this.audioPlaying;\n },\n seekAudio(e) {\n if (!this.$refs.audioEl || !this.audioDuration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percent = x / rect.width;\n this.$refs.audioEl.currentTime = percent * this.audioDuration;\n },\n formatTime(seconds) {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n },\n onLoad(e) {\n // 记录图片原始尺寸\n const img = e.target;\n this.naturalWidth = img.naturalWidth;\n this.naturalHeight = img.naturalHeight;\n },\n reset() {\n this.scale = 1;\n this.rotation = 0;\n this.rotatePreview = 0;\n this.tx = 0;\n this.ty = 0;\n this.pointers.clear();\n this.dragging = false;\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n this.$emit(\"unlock\");\n },\n clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n getViewportRect() {\n return this.$refs.viewport?.getBoundingClientRect();\n },\n // 计算放大后允许的最大平移范围\n getPanBounds() {\n const rect = this.$refs.viewport?.getBoundingClientRect();\n if (!rect) return {\n maxX: 0,\n maxY: 0,\n vw: 0,\n vh: 0\n };\n const vw = rect.width,\n vh = rect.height;\n const img = this.$el.querySelector('img, video');\n let iw = img?.clientWidth || vw;\n let ih = img?.clientHeight || vh;\n\n // 90°/270° 旋转时,图片宽高交换\n const rot = this.rotation % 360;\n if (rot === 90 || rot === 270) {\n [iw, ih] = [ih, iw];\n }\n const sw = iw * this.scale;\n const sh = ih * this.scale;\n const maxX = Math.max(0, (sw - vw) / 2);\n const maxY = Math.max(0, (sh - vh) / 2);\n return {\n maxX,\n maxY,\n vw,\n vh\n };\n },\n // 应用边界阻尼\n applyBoundWithRubber(value, max, dimension) {\n if (value > max) {\n return max + this.rubberBand(value - max, dimension, 0.55);\n }\n if (value < -max) {\n return -max - this.rubberBand(-max - value, dimension, 0.55);\n }\n return value;\n },\n calcTwoPointer() {\n const pts = Array.from(this.pointers.values());\n // 按 pointerId 排序确保顺序一致\n const sorted = Array.from(this.pointers.entries()).sort((a, b) => a[0] - b[0]);\n const p0 = sorted[0][1],\n p1 = sorted[1][1];\n const dx = p1.x - p0.x;\n const dy = p1.y - p0.y;\n const dist = Math.hypot(dx, dy);\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n const center = {\n x: (p0.x + p1.x) / 2,\n y: (p0.y + p1.y) / 2\n };\n return {\n dist,\n angle,\n center\n };\n },\n // 角度归一化到 -180~180\n normalizeAngle(deg) {\n deg = (deg % 360 + 360) % 360;\n return deg > 180 ? deg - 360 : deg;\n },\n onPointerDown(e) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n this.viewportRect = this.getViewportRect();\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指开始:初始化 pinch/rotate 基准\n if (this.pointers.size === 2) {\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n this.startDist = dist;\n this.startAngle = angle;\n this.startCenter = center;\n this.startScale = this.scale;\n this.startRotation = this.rotation;\n this.startTx = this.tx;\n this.startTy = this.ty;\n this.dragging = false;\n this.gestureMode = null;\n this.rotatePreview = 0;\n return;\n }\n\n // 1指:如果已放大,则进入拖拽\n if (this.scale > 1.001) {\n this.dragging = true;\n this.dragStart = {\n x: e.clientX,\n y: e.clientY\n };\n this.startTx = this.tx;\n this.startTy = this.ty;\n }\n },\n onPointerMove(e) {\n if (!this.pointers.has(e.pointerId)) return;\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指:缩放 + 旋转(带死区锁定)\n if (this.pointers.size === 2) {\n e.preventDefault();\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n const scaleFactor = dist / (this.startDist || dist);\n const scaleChange = Math.abs(scaleFactor - 1);\n const deltaAngle = this.normalizeAngle(angle - this.startAngle);\n const angleChange = Math.abs(deltaAngle);\n\n // 阈值\n const rotateStartDeg = 8; // 8° 开始进入旋转模式\n const pinchStartScale = 0.08; // 8% 缩放变化开始进入缩放模式\n\n // 判断手势模式(只在第一次超过死区时锁定)\n // 优先判断旋转:角度变化超过8°就进入旋转模式(不管缩放)\n if (!this.gestureMode) {\n if (angleChange >= rotateStartDeg) {\n this.gestureMode = 'rotate';\n } else if (scaleChange >= pinchStartScale) {\n this.gestureMode = 'pinch';\n } else {\n return; // 还在死区内\n }\n }\n\n // 旋转模式:预览角跟手,限制在 -90~+90\n if (this.gestureMode === 'rotate') {\n this.scale = this.startScale; // 锁定缩放\n this.rotatePreview = this.clamp(deltaAngle, -90, 90);\n return;\n }\n\n // 缩放模式\n if (this.gestureMode === 'pinch') {\n this.scale = this.clamp(this.startScale * scaleFactor, this.minScale, this.maxScale);\n this.rotatePreview = 0;\n }\n\n // 跟随双指中心移动\n if (this.startCenter && this.viewportRect) {\n const cx0 = this.startCenter.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy0 = this.startCenter.y - this.viewportRect.top - this.viewportRect.height / 2;\n const cx1 = center.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy1 = center.y - this.viewportRect.top - this.viewportRect.height / 2;\n this.tx = this.startTx + (cx1 - cx0);\n this.ty = this.startTy + (cy1 - cy0);\n }\n return;\n }\n\n // 1指:拖拽(只在 scale>1 时)+ 边界阻尼 + 边界翻页检测\n if (this.dragging && this.scale > 1.001) {\n e.preventDefault();\n const dx = e.clientX - this.dragStart.x;\n const dy = e.clientY - this.dragStart.y;\n const rawX = this.startTx + dx;\n const rawY = this.startTy + dy;\n const {\n maxX,\n maxY,\n vw,\n vh\n } = this.getPanBounds();\n\n // 检测是否超出左右边界\n let overflow = 0;\n let dir = 0;\n if (rawX > maxX) {\n overflow = rawX - maxX;\n dir = -1; // 往右拖 = 上一页\n } else if (rawX < -maxX) {\n overflow = -maxX - rawX;\n dir = +1; // 往左拖 = 下一页\n }\n\n // 记录超出状态\n this.edgeOverflow = overflow;\n this.edgeDir = dir;\n this.tx = this.applyBoundWithRubber(rawX, maxX, vw);\n this.ty = this.applyBoundWithRubber(rawY, maxY, vh);\n }\n },\n onPointerUp(e) {\n if (this.pointers.has(e.pointerId)) this.pointers.delete(e.pointerId);\n\n // 两指结束:处理旋转吸附\n if (this.pointers.size < 2 && this.gestureMode === 'rotate') {\n this.finishRotate();\n this.gestureMode = null;\n }\n if (this.pointers.size < 2) {\n this.startCenter = null;\n this.startDist = 0;\n this.startAngle = 0;\n this.gestureMode = null;\n }\n if (this.pointers.size === 0) {\n this.dragging = false;\n\n // 检查是否触发边界翻页(超出60px触发)\n if (this.edgeOverflow > 60 && this.edgeDir !== 0) {\n const dir = this.edgeDir;\n // 翻页前先重置自身状态,解除 gestureLocked\n this.reset();\n this.$emit('edge-swipe', dir);\n return;\n }\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n\n // 缩放回到1附近,自动归位\n if (this.scale <= 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 放大状态:回弹到合法范围\n const {\n maxX,\n maxY\n } = this.getPanBounds();\n this.tx = Math.max(-maxX, Math.min(maxX, this.tx));\n this.ty = Math.max(-maxY, Math.min(maxY, this.ty));\n }\n }\n },\n // 松手后吸附到 0° 或 ±90°\n finishRotate() {\n const d = this.rotatePreview;\n const commitDeg = 30; // 超过30°就翻到90°\n\n let target = 0;\n if (Math.abs(d) >= commitDeg) {\n target = d > 0 ? 90 : -90;\n }\n\n // 计算新的落地角度\n const newRot = ((this.rotation + target) % 360 + 360) % 360;\n\n // 落地并重置预览角(transition 会自动处理动画)\n this.rotation = newRot;\n this.rotatePreview = 0;\n\n // 计算旋转后的铺满缩放\n this.updateFillScale();\n },\n // 旋转后铺满屏幕:90°/270°时放大到2倍(类似双击效果)\n updateFillScale() {\n const rot = this.rotation % 360;\n const isRotated = rot === 90 || rot === 270;\n if (isRotated) {\n // 90°/270° 时放大到2倍铺满\n this.scale = 2;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 0° 或 180° 恢复正常\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n }\n },\n onDblClick() {\n if (this.scale > 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n this.scale = 2;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./TransformMedia.vue?vue&type=template&id=08fa832a&scoped=true\"\nimport script from \"./TransformMedia.vue?vue&type=script&lang=js\"\nexport * from \"./TransformMedia.vue?vue&type=script&lang=js\"\n\nimport \"./TransformMedia.vue?vue&type=style&index=0&id=08fa832a&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-08fa832a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"header-center\"\n};\nconst _hoisted_4 = {\n class: \"breadcrumb\"\n};\nconst _hoisted_5 = [\"onClick\"];\nconst _hoisted_6 = {\n class: \"header-right\"\n};\nconst _hoisted_7 = {\n class: \"file-count\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"loading-container\"\n};\nconst _hoisted_9 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_10 = {\n key: 2,\n class: \"gallery-container\",\n ref: \"galleryContainer\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"folders-section\"\n};\nconst _hoisted_12 = {\n class: \"folders-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nconst _hoisted_14 = {\n class: \"folder-name\"\n};\nconst _hoisted_15 = {\n class: \"waterfall\",\n ref: \"waterfall\"\n};\nconst _hoisted_16 = [\"onClick\"];\nconst _hoisted_17 = [\"src\", \"alt\", \"onLoad\"];\nconst _hoisted_18 = [\"src\", \"onLoadedmetadata\"];\nconst _hoisted_19 = {\n class: \"audio-name\"\n};\nconst _hoisted_20 = {\n key: 3,\n class: \"file-placeholder\"\n};\nconst _hoisted_21 = {\n class: \"file-name\"\n};\nconst _hoisted_22 = {\n class: \"overlay\"\n};\nconst _hoisted_23 = {\n class: \"overlay-actions\"\n};\nconst _hoisted_24 = [\"onClick\"];\nconst _hoisted_25 = [\"onClick\"];\nconst _hoisted_26 = {\n ref: \"loadTrigger\",\n class: \"load-trigger\"\n};\nconst _hoisted_27 = {\n key: 0,\n class: \"loading-more\"\n};\nconst _hoisted_28 = {\n key: 1,\n class: \"no-more\"\n};\nconst _hoisted_29 = {\n key: 2,\n class: \"credit-link\",\n href: \"https://github.com/axibayuit-a11y\",\n target: \"_blank\",\n rel: \"noopener\"\n};\nconst _hoisted_30 = [\"src\"];\nconst _hoisted_31 = [\"src\"];\nconst _hoisted_32 = {\n class: \"page-indicator\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_TransformMedia = _resolveComponent(\"TransformMedia\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"public-browse\", {\n 'light-mode': $data.isLightMode\n }])\n }, [_createElementVNode(\"header\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", {\n class: \"logo\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleTheme && $options.toggleTheme(...args)),\n title: \"切换日夜模式\"\n }, _toDisplayString($options.siteName), 1)]), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goToRoot && $options.goToRoot(...args))\n }, _toDisplayString($options.rootDirName), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pathParts, (part, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: index\n }, [_cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"breadcrumb-sep\"\n }, \"/\", -1)), _createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: $event => $options.goToPath(index)\n }, _toDisplayString(part), 9, _hoisted_5)], 64);\n }), 128))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"span\", _hoisted_7, _toDisplayString($data.totalCount) + \" 个文件\", 1)])]), $data.loading && $data.files.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [...(_cache[21] || (_cache[21] = [_createElementVNode(\"div\", {\n class: \"loading-spinner\"\n }, null, -1), _createElementVNode(\"p\", null, \"加载中...\", -1)]))])) : $data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"p\", null, _toDisplayString($data.error), 1), $data.canRetry ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n onClick: _cache[2] || (_cache[2] = (...args) => $options.loadFiles && $options.loadFiles(...args)),\n class: \"retry-btn\"\n }, \"重试\")) : _createCommentVNode(\"\", true)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [$options.folders.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.folders, folder => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: folder.name,\n class: \"folder-card\",\n onClick: $event => $options.enterFolder(folder.name)\n }, [_cache[22] || (_cache[22] = _createElementVNode(\"div\", {\n class: \"folder-icon\"\n }, [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })])], -1)), _createElementVNode(\"span\", _hoisted_14, _toDisplayString($options.getFolderName(folder.name)), 1)], 8, _hoisted_13);\n }), 128))])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_15, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.columns, (column, colIndex) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: colIndex,\n class: \"waterfall-column\"\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(column, file => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: file.name,\n class: \"waterfall-item\",\n onClick: $event => $options.openPreview(file)\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"image-wrapper\", {\n loaded: file.loaded\n }])\n }, [$options.isImage(file) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl(file.name),\n alt: file.name,\n loading: \"lazy\",\n onLoad: $event => $options.onImageLoad($event, file),\n onError: _cache[3] || (_cache[3] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_17)) : $options.isVideo(file) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl(file.name),\n muted: \"\",\n loop: \"\",\n preload: \"metadata\",\n onLoadedmetadata: $event => $options.onVideoLoad($event, file),\n onMouseenter: _cache[4] || (_cache[4] = $event => $event.target.play()),\n onMouseleave: _cache[5] || (_cache[5] = $event => $event.target.pause())\n }, null, 40, _hoisted_18)) : $options.isAudio(file) ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"audio-placeholder\",\n onClick: _cache[6] || (_cache[6] = _withModifiers(() => {}, [\"stop\"]))\n }, [_cache[23] || (_cache[23] = _createElementVNode(\"svg\", {\n class: \"audio-icon\",\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_19, _toDisplayString($options.getFileName(file.name)), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_cache[24] || (_cache[24] = _createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)), _createElementVNode(\"span\", _hoisted_21, _toDisplayString($options.getFileName(file.name)), 1)])), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.copyLink(file.name), [\"stop\"]),\n title: \"复制链接\"\n }, [...(_cache[25] || (_cache[25] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)]))], 8, _hoisted_24), _createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.downloadFile(file.name), [\"stop\"]),\n title: \"下载\"\n }, [...(_cache[26] || (_cache[26] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"\n })], -1)]))], 8, _hoisted_25)])])], 2)], 8, _hoisted_16);\n }), 128))]);\n }), 128))], 512), _createElementVNode(\"div\", _hoisted_26, [$data.loading && $data.files.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [...(_cache[27] || (_cache[27] = [_createElementVNode(\"div\", {\n class: \"loading-spinner-small\"\n }, null, -1), _createElementVNode(\"span\", null, \"加载中...\", -1)]))])) : !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, \" 已加载全部 \")) : _createCommentVNode(\"\", true), !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"a\", _hoisted_29, \" 林酱贡献 \")) : _createCommentVNode(\"\", true)], 512)], 512)), $data.previewVisible ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"preview-modal\",\n onClick: _cache[19] || (_cache[19] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"self\"]))\n }, [_createElementVNode(\"button\", {\n class: \"preview-close\",\n onClick: _cache[7] || (_cache[7] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"stop\"]))\n }, [...(_cache[28] || (_cache[28] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)]))]), _createElementVNode(\"div\", {\n class: \"preview-content desktop-only\",\n onClick: _cache[8] || (_cache[8] = _withModifiers(() => {}, [\"stop\"]))\n }, [$options.currentPreviewFile && $options.isImage($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n class: \"preview-image\",\n style: _normalizeStyle($options.desktopImageStyle),\n draggable: \"false\"\n }, null, 12, _hoisted_30)) : $options.currentPreviewFile && $options.isVideo($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n controls: \"\",\n autoplay: \"\",\n class: \"preview-video\",\n style: _normalizeStyle($options.desktopImageStyle)\n }, null, 12, _hoisted_31)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", {\n class: \"preview-content mobile-only\",\n onClick: _cache[15] || (_cache[15] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-viewport\",\n ref: \"mobileViewport\",\n onTouchstart: _cache[12] || (_cache[12] = (...args) => $options.onSwipeStart && $options.onSwipeStart(...args)),\n onTouchmove: _cache[13] || (_cache[13] = (...args) => $options.onSwipeMove && $options.onSwipeMove(...args)),\n onTouchend: _cache[14] || (_cache[14] = (...args) => $options.onSwipeEnd && $options.onSwipeEnd(...args))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-track\",\n style: _normalizeStyle($options.swipeTrackStyle),\n onTransitionend: _cache[11] || (_cache[11] = (...args) => $options.onSwipeTransitionEnd && $options.onSwipeTransitionEnd(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.swipeWindow, (f, i) => {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"swipe-slide\",\n key: $options.getSlideKey(f, i)\n }, [f ? (_openBlock(), _createBlock(_component_TransformMedia, {\n key: 0,\n file: f,\n src: $options.getFileUrl(f.name),\n \"is-image\": $options.isImage(f),\n \"is-video\": $options.isVideo(f),\n \"is-audio\": $options.isAudio(f),\n onLock: _cache[9] || (_cache[9] = $event => $data.gestureLocked = true),\n onUnlock: _cache[10] || (_cache[10] = $event => $data.gestureLocked = false),\n onEdgeSwipe: $options.onEdgeSwipe\n }, null, 8, [\"file\", \"src\", \"is-image\", \"is-video\", \"is-audio\", \"onEdgeSwipe\"])) : _createCommentVNode(\"\", true)]);\n }), 128))], 36)], 544)]), $data.previewIndex > 0 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"preview-prev desktop-only\",\n onClick: _cache[16] || (_cache[16] = _withModifiers((...args) => $options.prevImage && $options.prevImage(...args), [\"stop\"]))\n }, [...(_cache[29] || (_cache[29] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), $data.previewIndex < $options.mediaFiles.length - 1 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 1,\n class: \"preview-next desktop-only\",\n onClick: _cache[17] || (_cache[17] = _withModifiers((...args) => $options.nextImage && $options.nextImage(...args), [\"stop\"]))\n }, [...(_cache[30] || (_cache[30] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), _createElementVNode(\"button\", {\n class: \"rotate-btn desktop-only\",\n onClick: _cache[18] || (_cache[18] = _withModifiers((...args) => $options.rotateImage && $options.rotateImage(...args), [\"stop\"])),\n title: \"旋转90°\"\n }, [...(_cache[31] || (_cache[31] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"\n })], -1)]))]), _createElementVNode(\"div\", _hoisted_32, _toDisplayString($data.previewIndex + 1) + \" / \" + _toDisplayString($options.mediaFiles.length), 1)])) : _createCommentVNode(\"\", true)], 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 axios from 'axios';\nimport { mapGetters } from 'vuex';\nimport TransformMedia from '@/components/TransformMedia.vue';\nexport default {\n name: 'PublicBrowse',\n components: {\n TransformMedia\n },\n data() {\n return {\n files: [],\n allowedDirs: [],\n rootDir: '',\n currentPath: '',\n totalCount: 0,\n loading: false,\n error: null,\n canRetry: true,\n hasMore: true,\n previewVisible: false,\n previewIndex: 0,\n observer: null,\n pageSize: 24,\n columnCount: 4,\n columnHeights: [0, 0, 0, 0],\n // 桌面端旋转\n imageRotation: 0,\n // 手机端滑动\n swipeX: 0,\n swipeStartX: 0,\n swipeStartY: 0,\n swipeStartT: 0,\n swipeActive: false,\n swipeAnimating: false,\n swipeDir: 0,\n viewportW: 0,\n // 手势锁定(子组件缩放/旋转时锁住轮播)\n gestureLocked: false,\n // 日夜模式\n isLightMode: false\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n siteName() {\n return this.userConfig?.siteTitle || '公开相册';\n },\n rootDirName() {\n return this.rootDir.split('/').filter(Boolean).pop() || '根目录';\n },\n pathParts() {\n if (!this.currentPath || !this.rootDir) return [];\n const relative = this.currentPath.replace(this.rootDir, '').replace(/^\\/+/, '');\n return relative.split('/').filter(Boolean);\n },\n folders() {\n return this.files.filter(f => f.isFolder);\n },\n mediaFiles() {\n return this.files.filter(f => !f.isFolder);\n },\n columns() {\n const cols = Array.from({\n length: this.columnCount\n }, () => []);\n for (const file of this.mediaFiles) {\n const idx = file.columnIndex ?? 0;\n if (idx < this.columnCount) {\n cols[idx].push(file);\n } else {\n cols[0].push(file);\n }\n }\n return cols;\n },\n currentPreviewFile() {\n return this.mediaFiles[this.previewIndex];\n },\n prevPreviewFile() {\n return this.previewIndex > 0 ? this.mediaFiles[this.previewIndex - 1] : null;\n },\n nextPreviewFile() {\n return this.previewIndex < this.mediaFiles.length - 1 ? this.mediaFiles[this.previewIndex + 1] : null;\n },\n desktopImageStyle() {\n return {\n transform: `rotate(${this.imageRotation}deg)`,\n transition: 'transform 0.3s ease'\n };\n },\n swipeWindow() {\n return [this.prevPreviewFile, this.currentPreviewFile, this.nextPreviewFile];\n },\n swipeTrackStyle() {\n // 默认停在中间那页(-viewportW)\n const base = -this.viewportW;\n const x = base + this.swipeX;\n return {\n transform: `translate3d(${x}px, 0, 0)`,\n transition: this.swipeAnimating ? 'transform 0.28s ease' : 'none'\n };\n }\n },\n watch: {\n '$route.params.dir': {\n handler() {\n this.initFromRoute();\n }\n }\n },\n mounted() {\n this.initTheme();\n this.initFromRoute();\n this.setupIntersectionObserver();\n this.updateColumnCount();\n window.addEventListener('resize', this.updateColumnCount);\n },\n beforeUnmount() {\n if (this.observer) {\n this.observer.disconnect();\n }\n window.removeEventListener('resize', this.updateColumnCount);\n },\n methods: {\n // 初始化主题:10:00-18:00 默认白天,其他时间默认黑夜\n initTheme() {\n const saved = localStorage.getItem('publicBrowseTheme');\n if (saved !== null) {\n this.isLightMode = saved === 'light';\n } else {\n const hour = new Date().getHours();\n this.isLightMode = hour >= 10 && hour < 18;\n }\n },\n toggleTheme() {\n this.isLightMode = !this.isLightMode;\n localStorage.setItem('publicBrowseTheme', this.isLightMode ? 'light' : 'dark');\n },\n // 生成 slide key,切换时让子组件重新挂载以重置 transform\n getSlideKey(f, i) {\n if (!f) return `empty-${i}`;\n // 中间那张用 previewIndex 作为 key 的一部分,确保切换时重新挂载\n if (i === 1) return `${f.name}-${this.previewIndex}`;\n return f.name;\n },\n updateColumnCount() {\n const width = window.innerWidth;\n let newCount;\n if (width < 600) {\n newCount = 2;\n } else if (width < 900) {\n newCount = 3;\n } else {\n newCount = 4;\n }\n if (newCount !== this.columnCount) {\n this.columnCount = newCount;\n this.columnHeights = new Array(this.columnCount).fill(0);\n this.mediaFiles.forEach(f => {\n f.columnIndex = undefined;\n this.assignToColumn(f);\n });\n }\n },\n getShortestColumn() {\n let minIndex = 0;\n let minHeight = this.columnHeights[0];\n for (let i = 1; i < this.columnCount; i++) {\n if (this.columnHeights[i] < minHeight) {\n minHeight = this.columnHeights[i];\n minIndex = i;\n }\n }\n return minIndex;\n },\n assignToColumn(file, height = 200) {\n const colIndex = this.getShortestColumn();\n file.columnIndex = colIndex;\n this.columnHeights[colIndex] += height;\n // 音频和其他文件直接标记为已加载(没有 load 事件)\n if (this.isAudio(file) || !this.isImage(file) && !this.isVideo(file)) {\n file.loaded = true;\n }\n },\n onImageLoad(event, file) {\n const img = event.target;\n const ratio = img.naturalHeight / img.naturalWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n onVideoLoad(event, file) {\n const video = event.target;\n const ratio = video.videoHeight / video.videoWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n setupIntersectionObserver() {\n this.observer = new IntersectionObserver(entries => {\n const entry = entries[0];\n if (entry.isIntersecting && this.hasMore && !this.loading) {\n this.loadMore();\n }\n }, {\n rootMargin: '200px'\n });\n },\n observeLoadTrigger() {\n this.$nextTick(() => {\n if (this.$refs.loadTrigger && this.observer) {\n this.observer.observe(this.$refs.loadTrigger);\n }\n });\n },\n async initFromRoute() {\n const dirParam = this.$route.params.dir || '';\n const dirPath = Array.isArray(dirParam) ? dirParam.join('/') : dirParam;\n if (!dirPath) {\n this.error = '请指定要浏览的目录,例如: /browse/landscape';\n this.canRetry = false;\n return;\n }\n const parts = dirPath.split('/').filter(Boolean);\n this.rootDir = parts[0];\n this.currentPath = dirPath;\n this.files = [];\n this.hasMore = true;\n this.columnHeights = new Array(this.columnCount).fill(0);\n await this.loadFiles();\n this.observeLoadTrigger();\n },\n async loadFiles() {\n this.loading = true;\n this.error = null;\n this.canRetry = true;\n try {\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);\n if (res.data.allowedDirs) {\n this.allowedDirs = res.data.allowedDirs;\n }\n const dirs = (res.data.directories || []).map(d => ({\n name: d,\n isFolder: true\n }));\n const files = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n files.forEach(f => this.assignToColumn(f));\n this.files = [...dirs, ...files];\n this.totalCount = res.data.totalCount || this.files.length;\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n if (err.response?.status === 403) {\n const msg = err.response?.data?.error || '';\n if (msg.includes('disabled')) {\n this.error = '公开浏览功能未启用';\n } else if (msg.includes('not allowed') || msg.includes('No public')) {\n this.error = '该目录不允许公开访问';\n } else {\n this.error = '访问被拒绝';\n }\n this.canRetry = false;\n } else {\n this.error = '加载失败,请重试';\n }\n } finally {\n this.loading = false;\n }\n },\n async loadMore() {\n if (this.loading || !this.hasMore) return;\n this.loading = true;\n try {\n const start = this.mediaFiles.length;\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&start=${start}&count=${this.pageSize}`);\n const moreFiles = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n moreFiles.forEach(f => this.assignToColumn(f));\n this.files.push(...moreFiles);\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n console.error('加载更多失败', err);\n } finally {\n this.loading = false;\n }\n },\n enterFolder(folderPath) {\n const newPath = folderPath.replace(/\\/+$/, '');\n this.$router.push(`/browse/${newPath}`);\n },\n goToRoot() {\n this.$router.push(`/browse/${this.rootDir}`);\n },\n goToPath(index) {\n const parts = this.pathParts.slice(0, index + 1);\n const newPath = this.rootDir + (parts.length ? '/' + parts.join('/') : '');\n this.$router.push(`/browse/${newPath}`);\n },\n getFolderName(path) {\n return path.split('/').filter(Boolean).pop() || path;\n },\n getFileUrl(name) {\n return `${window.location.origin}/file/${name}`;\n },\n isImage(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg', 'avif'].includes(ext);\n },\n isVideo(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['mp4', 'webm', 'ogg', 'mov'].includes(ext);\n },\n isAudio(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'].includes(ext);\n },\n getFileName(name) {\n return name.split('/').pop();\n },\n handleImageError(e) {\n e.target.style.display = 'none';\n },\n copyLink(name) {\n const url = this.getFileUrl(name);\n navigator.clipboard?.writeText(url).then(() => {\n this.showToast('已复制');\n }).catch(() => {\n const input = document.createElement('input');\n input.value = url;\n document.body.appendChild(input);\n input.select();\n document.execCommand('copy');\n document.body.removeChild(input);\n this.showToast('已复制');\n });\n },\n showToast(msg) {\n const existing = document.querySelector('.copy-toast');\n if (existing) existing.remove();\n const toast = document.createElement('div');\n toast.className = 'copy-toast';\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(() => toast.classList.add('show'), 10);\n setTimeout(() => {\n toast.classList.remove('show');\n setTimeout(() => toast.remove(), 300);\n }, 1500);\n },\n downloadFile(name) {\n const link = document.createElement('a');\n link.href = this.getFileUrl(name);\n link.download = name.split('/').pop();\n link.click();\n },\n openPreview(file) {\n if (file.isFolder) return;\n const mediaIndex = this.mediaFiles.findIndex(f => f.name === file.name);\n if (mediaIndex >= 0) {\n this.previewIndex = mediaIndex;\n this.previewVisible = true;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = 'hidden';\n this.$nextTick(() => {\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n });\n }\n },\n closePreview() {\n this.previewVisible = false;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = '';\n },\n prevImage() {\n if (this.previewIndex > 0) {\n this.previewIndex--;\n this.imageRotation = 0;\n }\n },\n nextImage() {\n if (this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n this.imageRotation = 0;\n }\n },\n rotateImage() {\n this.imageRotation += 90;\n // 动画结束后归一化(无动画)\n if (this.imageRotation >= 360) {\n setTimeout(() => {\n // 临时禁用 transition\n const el = this.$el.querySelector('.preview-image, .preview-video');\n if (el) {\n el.style.transition = 'none';\n this.imageRotation = 0;\n // 强制重绘后恢复 transition\n el.offsetHeight;\n el.style.transition = '';\n } else {\n this.imageRotation = 0;\n }\n }, 300);\n }\n },\n // 手机端滑动:开始\n onSwipeStart(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n this.swipeStartX = t.clientX;\n this.swipeStartY = t.clientY;\n this.swipeStartT = performance.now();\n this.swipeX = 0;\n this.swipeActive = false;\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n },\n // 手机端滑动:移动\n onSwipeMove(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n const dx = t.clientX - this.swipeStartX;\n const dy = t.clientY - this.swipeStartY;\n if (!this.swipeActive) {\n if (Math.abs(dx) < 8) return;\n if (Math.abs(dx) <= Math.abs(dy)) return;\n this.swipeActive = true;\n }\n e.preventDefault();\n let x = dx;\n // 边界阻尼:用 rubberBand 代替线性 *0.3\n if (this.previewIndex === 0 && x > 0) {\n x = this.rubberBand(x, this.viewportW, 0.55);\n } else if (this.previewIndex === this.mediaFiles.length - 1 && x < 0) {\n x = -this.rubberBand(-x, this.viewportW, 0.55);\n }\n this.swipeX = x;\n },\n // 手机端滑动:结束\n onSwipeEnd() {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n if (!this.swipeActive) {\n this.swipeX = 0;\n return;\n }\n const dt = Math.max(1, performance.now() - this.swipeStartT);\n const vx = this.swipeX / dt;\n const threshold = this.viewportW * 0.2;\n let dir = 0;\n if (this.swipeX <= -threshold || vx <= -0.8) dir = +1;\n if (this.swipeX >= threshold || vx >= 0.8) dir = -1;\n if (dir === -1 && this.previewIndex === 0 || dir === +1 && this.previewIndex === this.mediaFiles.length - 1) {\n dir = 0;\n }\n this.swipeDir = dir;\n this.swipeAnimating = true;\n if (dir === +1) this.swipeX = -this.viewportW;else if (dir === -1) this.swipeX = +this.viewportW;else this.swipeX = 0;\n },\n onSwipeTransitionEnd() {\n if (!this.swipeAnimating) return;\n if (this.swipeDir === +1) this.previewIndex++;\n if (this.swipeDir === -1) this.previewIndex--;\n this.swipeAnimating = false;\n this.swipeDir = 0;\n this.swipeX = 0;\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n // 放大状态下边界滑动翻页(带动画)\n onEdgeSwipe(dir) {\n // dir: +1 下一页, -1 上一页\n if (dir === -1 && this.previewIndex === 0 || dir === +1 && this.previewIndex === this.mediaFiles.length - 1) {\n return;\n }\n\n // 触发轮播动画\n this.swipeDir = dir;\n this.swipeAnimating = true;\n if (dir === +1) this.swipeX = -this.viewportW;else if (dir === -1) this.swipeX = +this.viewportW;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./PublicBrowse.vue?vue&type=template&id=8da85654&scoped=true\"\nimport script from \"./PublicBrowse.vue?vue&type=script&lang=js\"\nexport * from \"./PublicBrowse.vue?vue&type=script&lang=js\"\n\nimport \"./PublicBrowse.vue?vue&type=style&index=0&id=8da85654&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-8da85654\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","class","_hoisted_4","_hoisted_5","key","viewBox","fill","_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","ref","onPointerdown","args","onPointerDown","onPointermove","onPointerMove","onPointerup","onPointerUp","onPointercancel","onDblclick","onDblClick","isImage","src","draggable","style","mediaStyle","onLoad","isVideo","controls","autoplay","playsinline","isAudio","audioCover","d","audioTitle","audioArtist","onClick","togglePlay","audioPlaying","seekAudio","width","audioProgress","formatTime","audioCurrentTime","audioDuration","onLoadedmetadata","onAudioLoaded","onTimeupdate","onTimeUpdate","onEnded","$event","name","props","file","type","Object","required","String","Boolean","default","data","pointers","Map","scale","rotation","rotatePreview","tx","ty","naturalWidth","naturalHeight","startScale","startRotation","startTx","startTy","startCenter","startDist","startAngle","dragging","dragStart","viewportRect","minScale","maxScale","gestureMode","edgeOverflow","edgeDir","computed","isActiveTransform","this","size","displayRotation","rotateShrink","p","Math","min","abs","k","sin","PI","finalScale","inGesture","transform","transition","transformOrigin","watch","v","$emit","immediate","handler","newSrc","initAudioInfo","mounted","$nextTick","$refs","audioEl","play","catch","methods","fileName","split","pop","replace","tryReadMetadata","response","fetch","blob","arrayBuffer","slice","dataView","DataView","getUint8","parseID3v2","e","offset","TextDecoder","byteLength","frameId","fromCharCode","frameSize","frameData","Uint8Array","decodeText","extractCover","length","encoding","textData","decode","imageData","Blob","URL","createObjectURL","duration","currentTime","pause","rect","currentTarget","getBoundingClientRect","x","clientX","left","percent","seconds","isNaN","mins","floor","secs","toString","padStart","img","target","reset","clear","clamp","max","rubberBand","distance","dimension","constant","getViewportRect","viewport","getPanBounds","maxX","maxY","vw","vh","height","$el","querySelector","iw","clientWidth","ih","clientHeight","rot","sw","sh","applyBoundWithRubber","value","calcTwoPointer","Array","from","values","sorted","entries","sort","a","b","p0","p1","dx","dy","y","dist","hypot","angle","atan2","center","normalizeAngle","deg","setPointerCapture","pointerId","set","clientY","has","preventDefault","scaleFactor","scaleChange","deltaAngle","angleChange","rotateStartDeg","pinchStartScale","cx0","cy0","top","cx1","cy1","rawX","rawY","overflow","dir","delete","finishRotate","commitDeg","newRot","updateFillScale","isRotated","__exports__","_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","href","rel","_hoisted_30","_hoisted_31","_hoisted_32","_component_TransformMedia","isLightMode","toggleTheme","title","siteName","goToRoot","rootDirName","pathParts","part","index","goToPath","totalCount","loading","files","error","canRetry","loadFiles","folders","folder","enterFolder","getFolderName","columns","column","colIndex","openPreview","loaded","getFileUrl","alt","onImageLoad","onError","handleImageError","muted","loop","preload","onVideoLoad","onMouseenter","onMouseleave","getFileName","copyLink","downloadFile","hasMore","mediaFiles","previewVisible","closePreview","currentPreviewFile","desktopImageStyle","onTouchstart","onSwipeStart","onTouchmove","onSwipeMove","onTouchend","onSwipeEnd","swipeTrackStyle","onTransitionend","onSwipeTransitionEnd","swipeWindow","f","i","getSlideKey","onLock","gestureLocked","onUnlock","onEdgeSwipe","previewIndex","prevImage","nextImage","rotateImage","components","TransformMedia","allowedDirs","rootDir","currentPath","observer","pageSize","columnCount","columnHeights","imageRotation","swipeX","swipeStartX","swipeStartY","swipeStartT","swipeActive","swipeAnimating","swipeDir","viewportW","userConfig","siteTitle","filter","relative","isFolder","cols","idx","columnIndex","push","prevPreviewFile","nextPreviewFile","base","initFromRoute","initTheme","setupIntersectionObserver","updateColumnCount","window","addEventListener","beforeUnmount","disconnect","removeEventListener","saved","localStorage","getItem","hour","Date","getHours","setItem","innerWidth","newCount","forEach","undefined","assignToColumn","getShortestColumn","minIndex","minHeight","event","ratio","video","videoHeight","videoWidth","IntersectionObserver","entry","isIntersecting","loadMore","rootMargin","observeLoadTrigger","loadTrigger","observe","dirParam","$route","params","dirPath","isArray","join","parts","res","axios","get","encodeURIComponent","dirs","directories","map","metadata","err","status","msg","includes","start","moreFiles","console","folderPath","newPath","$router","path","location","origin","ext","toLowerCase","display","url","navigator","clipboard","writeText","then","showToast","input","document","createElement","body","appendChild","select","execCommand","removeChild","existing","remove","toast","className","textContent","setTimeout","classList","add","link","download","click","mediaIndex","findIndex","mobileViewport","el","offsetHeight","t","touches","performance","now","dt","vx","threshold"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/262.ba4d4b57.js.map.gz b/js/262.ba4d4b57.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..817f0550425268682a4019f9a1934f0c46995527 GIT binary patch literal 26875 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.onPointerDown&&u.onPointerDown(...e)),onPointermove:t[2]||(t[2]=(...e)=>u.onPointerMove&&u.onPointerMove(...e)),onPointerup:t[3]||(t[3]=(...e)=>u.onPointerUp&&u.onPointerUp(...e)),onPointercancel:t[4]||(t[4]=(...e)=>u.onPointerUp&&u.onPointerUp(...e)),onDblclick:t[5]||(t[5]=(0,o.D$)((...e)=>u.onDblClick&&u.onDblClick(...e),["prevent"]))},[i.isImage?((0,s.uX)(),(0,s.CE)("img",{key:0,class:"tm-media",src:i.src,draggable:"false",style:(0,r.Tr)(u.mediaStyle),onLoad:t[0]||(t[0]=(...e)=>u.onLoad&&u.onLoad(...e))},null,44,n)):i.isVideo?((0,s.uX)(),(0,s.CE)("video",{key:1,class:"tm-media",src:i.src,controls:"",autoplay:"",playsinline:"",style:(0,r.Tr)(u.mediaStyle)},null,12,a)):i.isAudio?((0,s.uX)(),(0,s.CE)("div",l,[t[6]||(t[6]=(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)("audio",{src:i.src,controls:"",autoplay:"",class:"audio-player"},null,8,h)])):(0,s.Q3)("",!0)],544)}var d={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}},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}},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")}},methods:{onLoad(e){const t=e.target;this.naturalWidth=t.naturalWidth,this.naturalHeight=t.naturalHeight},reset(){this.scale=1,this.rotation=0,this.rotatePreview=0,this.tx=0,this.ty=0,this.pointers.clear(),this.dragging=!1,this.edgeOverflow=0,this.edgeDir=0,this.$emit("unlock")},clamp(e,t,i){return Math.max(t,Math.min(i,e))},rubberBand(e,t,i=.55){return e*t*i/(t+i*e)},getViewportRect(){return this.$refs.viewport?.getBoundingClientRect()},getPanBounds(){const e=this.$refs.viewport?.getBoundingClientRect();if(!e)return{maxX:0,maxY:0,vw:0,vh:0};const t=e.width,i=e.height,s=this.$el.querySelector("img, video");let o=s?.clientWidth||t,r=s?.clientHeight||i;const n=this.rotation%360;90!==n&&270!==n||([o,r]=[r,o]);const a=o*this.scale,l=r*this.scale,h=Math.max(0,(a-t)/2),c=Math.max(0,(l-i)/2);return{maxX:h,maxY:c,vw:t,vh:i}},applyBoundWithRubber(e,t,i){return e>t?t+this.rubberBand(e-t,i,.55):e<-t?-t-this.rubberBand(-t-e,i,.55):e},calcTwoPointer(){Array.from(this.pointers.values());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,o=i.y-t.y,r=Math.hypot(s,o),n=Math.atan2(o,s)*(180/Math.PI),a={x:(t.x+i.x)/2,y:(t.y+i.y)/2};return{dist:r,angle:n,center:a}},normalizeAngle(e){return e=(e%360+360)%360,e>180?e-360:e},onPointerDown(e){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.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(),o=t/(this.startDist||t),r=Math.abs(o-1),n=this.normalizeAngle(i-this.startAngle),a=Math.abs(n),l=8,h=.08;if(!this.gestureMode)if(a>=l)this.gestureMode="rotate";else{if(!(r>=h))return;this.gestureMode="pinch"}if("rotate"===this.gestureMode)return this.scale=this.startScale,void(this.rotatePreview=this.clamp(n,-90,90));if("pinch"===this.gestureMode&&(this.scale=this.clamp(this.startScale*o,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,o=s.y-this.viewportRect.top-this.viewportRect.height/2;this.tx=this.startTx+(i-e),this.ty=this.startTy+(o-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,o=this.startTy+i,{maxX:r,maxY:n,vw:a,vh:l}=this.getPanBounds();let h=0,c=0;s>r?(h=s-r,c=-1):s<-r&&(h=-r-s,c=1),this.edgeOverflow=h,this.edgeDir=c,this.tx=this.applyBoundWithRubber(s,r,a),this.ty=this.applyBoundWithRubber(o,n,l)}}},onPointerUp(e){if(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,t=30;let i=0;Math.abs(e)>=t&&(i=e>0?90:-90);const s=((this.rotation+i)%360+360)%360;this.rotation=s,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.scale>1.001?(this.scale=1,this.tx=0,this.ty=0):this.scale=2}}},u=i(1241);const p=(0,u.A)(d,[["render",c],["__scopeId","data-v-09426418"]]);var g=p;const m={class:"header"},v={class:"header-left"},w={class:"header-center"},f={class:"breadcrumb"},k=["onClick"],y={class:"header-right"},C={class:"file-count"},L={key:0,class:"loading-container"},x={key:1,class:"error-container"},b={key:2,class:"gallery-container",ref:"galleryContainer"},I={key:0,class:"folders-section"},M={class:"folders-grid"},T=["onClick"],F={class:"folder-name"},S={class:"waterfall",ref:"waterfall"},P=["onClick"],X=["src","alt","onLoad"],E=["src","onLoadedmetadata"],D={class:"audio-name"},R={key:3,class:"file-placeholder"},$={class:"overlay"},A={class:"overlay-actions"},B=["onClick"],z=["onClick"],V={ref:"loadTrigger",class:"load-trigger"},W={key:0,class:"loading-more"},H={key:1,class:"no-more"},U={key:2,class:"credit-link",href:"https://github.com/axibayuit-a11y",target:"_blank",rel:"noopener"},_=["src"],Y=["src"],N={class:"page-indicator"};function O(e,t,i,n,a,l){const h=g;return(0,s.uX)(),(0,s.CE)("div",{class:(0,r.C4)(["public-browse",{"light-mode":a.isLightMode}])},[(0,s.Lk)("header",m,[(0,s.Lk)("div",v,[(0,s.Lk)("span",{class:"logo",onClick:t[0]||(t[0]=(...e)=>l.toggleTheme&&l.toggleTheme(...e)),title:"切换日夜模式"},(0,r.v_)(l.siteName),1)]),(0,s.Lk)("div",w,[(0,s.Lk)("div",f,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:t[1]||(t[1]=(...e)=>l.goToRoot&&l.goToRoot(...e))},(0,r.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[20]||(t[20]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>l.goToPath(i)},(0,r.v_)(e),9,k)],64))),128))])]),(0,s.Lk)("div",y,[(0,s.Lk)("span",C,(0,r.v_)(a.totalCount)+" 个文件",1)])]),a.loading&&0===a.files.length?((0,s.uX)(),(0,s.CE)("div",L,[...t[21]||(t[21]=[(0,s.Lk)("div",{class:"loading-spinner"},null,-1),(0,s.Lk)("p",null,"加载中...",-1)])])):a.error?((0,s.uX)(),(0,s.CE)("div",x,[(0,s.Lk)("p",null,(0,r.v_)(a.error),1),a.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[2]||(t[2]=(...e)=>l.loadFiles&&l.loadFiles(...e)),class:"retry-btn"},"重试")):(0,s.Q3)("",!0)])):((0,s.uX)(),(0,s.CE)("div",b,[l.folders.length>0?((0,s.uX)(),(0,s.CE)("div",I,[(0,s.Lk)("div",M,[((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[22]||(t[22]=(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",F,(0,r.v_)(l.getFolderName(e.name)),1)],8,T))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",S,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.columns,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:i,class:"waterfall-column"},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(e,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"waterfall-item",onClick:t=>l.openPreview(e)},[(0,s.Lk)("div",{class:(0,r.C4)(["image-wrapper",{loaded:e.loaded}])},[l.isImage(e)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(e.name),alt:e.name,loading:"lazy",onLoad:t=>l.onImageLoad(t,e),onError:t[3]||(t[3]=(...e)=>l.handleImageError&&l.handleImageError(...e))},null,40,X)):l.isVideo(e)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(e.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:t=>l.onVideoLoad(t,e),onMouseenter:t[4]||(t[4]=e=>e.target.play()),onMouseleave:t[5]||(t[5]=e=>e.target.pause())},null,40,E)):l.isAudio(e)?((0,s.uX)(),(0,s.CE)("div",{key:2,class:"audio-placeholder",onClick:t[6]||(t[6]=(0,o.D$)(()=>{},["stop"]))},[t[23]||(t[23]=(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",D,(0,r.v_)(l.getFileName(e.name)),1)])):((0,s.uX)(),(0,s.CE)("div",R,[...t[24]||(t[24]=[(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)("div",$,[(0,s.Lk)("div",A,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,o.D$)(t=>l.copyLink(e.name),["stop"]),title:"复制链接"},[...t[25]||(t[25]=[(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,B),(0,s.Lk)("button",{class:"action-btn",onClick:(0,o.D$)(t=>l.downloadFile(e.name),["stop"]),title:"下载"},[...t[26]||(t[26]=[(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,z)])])],2)],8,P))),128))]))),128))],512),(0,s.Lk)("div",V,[a.loading&&a.files.length>0?((0,s.uX)(),(0,s.CE)("div",W,[...t[27]||(t[27]=[(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1),(0,s.Lk)("span",null,"加载中...",-1)])])):!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",H," 已加载全部 ")):(0,s.Q3)("",!0),!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("a",U," 林酱贡献 ")):(0,s.Q3)("",!0)],512)],512)),a.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:t[19]||(t[19]=(0,o.D$)((...e)=>l.closePreview&&l.closePreview(...e),["self"]))},[(0,s.Lk)("button",{class:"preview-close",onClick:t[7]||(t[7]=(0,o.D$)((...e)=>l.closePreview&&l.closePreview(...e),["stop"]))},[...t[28]||(t[28]=[(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)])]),(0,s.Lk)("div",{class:"preview-content desktop-only",onClick:t[8]||(t[8]=(0,o.D$)(()=>{},["stop"]))},[l.currentPreviewFile&&l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(l.currentPreviewFile.name),class:"preview-image",style:(0,r.Tr)(l.desktopImageStyle),draggable:"false"},null,12,_)):l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",autoplay:"",class:"preview-video",style:(0,r.Tr)(l.desktopImageStyle)},null,12,Y)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",{class:"preview-content mobile-only",onClick:t[15]||(t[15]=(0,o.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",{class:"swipe-viewport",ref:"mobileViewport",onTouchstart:t[12]||(t[12]=(...e)=>l.onSwipeStart&&l.onSwipeStart(...e)),onTouchmove:t[13]||(t[13]=(...e)=>l.onSwipeMove&&l.onSwipeMove(...e)),onTouchend:t[14]||(t[14]=(...e)=>l.onSwipeEnd&&l.onSwipeEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,r.Tr)(l.swipeTrackStyle),onTransitionend:t[11]||(t[11]=(...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":l.isVideo(e),"is-audio":l.isAudio(e),onLock:t[9]||(t[9]=e=>a.gestureLocked=!0),onUnlock:t[10]||(t[10]=e=>a.gestureLocked=!1),onEdgeSwipe:l.onEdgeSwipe},null,8,["file","src","is-image","is-video","is-audio","onEdgeSwipe"])):(0,s.Q3)("",!0)]))),128))],36)],544)]),a.previewIndex>0?((0,s.uX)(),(0,s.CE)("button",{key:0,class:"preview-prev desktop-only",onClick:t[16]||(t[16]=(0,o.D$)((...e)=>l.prevImage&&l.prevImage(...e),["stop"]))},[...t[29]||(t[29]=[(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),a.previewIndexl.nextImage&&l.nextImage(...e),["stop"]))},[...t[30]||(t[30]=[(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),(0,s.Lk)("button",{class:"rotate-btn desktop-only",onClick:t[18]||(t[18]=(0,o.D$)((...e)=>l.rotateImage&&l.rotateImage(...e),["stop"])),title:"旋转90°"},[...t[31]||(t[31]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z"})],-1)])]),(0,s.Lk)("div",N,(0,r.v_)(a.previewIndex+1)+" / "+(0,r.v_)(l.mediaFiles.length),1)])):(0,s.Q3)("",!0)],2)}i(4114),i(8111),i(2489),i(7588),i(1701);var Q=i(4373),K=i(8401),j={name:"PublicBrowse",components:{TransformMedia:g},data(){return{files:[],allowedDirs:[],rootDir:"",currentPath:"",totalCount:0,loading:!1,error:null,canRetry:!0,hasMore:!0,previewVisible:!1,previewIndex:0,observer:null,pageSize:24,columnCount:4,columnHeights:[0,0,0,0],imageRotation:0,swipeX:0,swipeStartX:0,swipeStartY:0,swipeStartT:0,swipeActive:!1,swipeAnimating:!1,swipeDir:0,viewportW:0,gestureLocked:!1,isLightMode:!1}},computed:{...(0,K.L8)(["userConfig"]),siteName(){return this.userConfig?.siteTitle||"公开相册"},rootDirName(){return this.rootDir.split("/").filter(Boolean).pop()||"根目录"},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)},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.previewIndex=10&&e<18}},toggleTheme(){this.isLightMode=!this.isLightMode,localStorage.setItem("publicBrowseTheme",this.isLightMode?"light":"dark")},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;if(!t)return this.error="请指定要浏览的目录,例如: /browse/landscape",void(this.canRetry=!1);const 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),await this.loadFiles(),this.observeLoadTrigger()},async loadFiles(){this.loading=!0,this.error=null,this.canRetry=!0;try{const e=await Q.A.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);e.data.allowedDirs&&(this.allowedDirs=e.data.allowedDirs);const t=(e.data.directories||[]).map(e=>({name:e,isFolder:!0})),i=(e.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files=[...t,...i],this.totalCount=e.data.totalCount||this.files.length,this.hasMore=this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files.push(...i),this.hasMore=this.mediaFiles.length{this.showToast("已复制")}).catch(()=>{const e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast("已复制")})},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;const t=this.mediaFiles.findIndex(t=>t.name===e.name);t>=0&&(this.previewIndex=t,this.previewVisible=!0,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow="hidden",this.$nextTick(()=>{this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth}))},closePreview(){this.previewVisible=!1,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow=""},prevImage(){this.previewIndex>0&&(this.previewIndex--,this.imageRotation=0)},nextImage(){this.previewIndex=360&&setTimeout(()=>{const e=this.$el.querySelector(".preview-image, .preview-video");e?(e.style.transition="none",this.imageRotation=0,e.offsetHeight,e.style.transition=""):this.imageRotation=0},300)},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 o=i;0===this.previewIndex&&o>0?o=this.rubberBand(o,this.viewportW,.55):this.previewIndex===this.mediaFiles.length-1&&o<0&&(o=-this.rubberBand(-o,this.viewportW,.55)),this.swipeX=o},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))}}};const q=(0,u.A)(j,[["render",O],["__scopeId","data-v-9f48f6cc"]]);var G=q}}]); -//# sourceMappingURL=760.a76249f2.js.map \ No newline at end of file diff --git a/js/760.a76249f2.js.gz b/js/760.a76249f2.js.gz deleted file mode 100644 index cf4276749baa73fb1761c85cadb103aa8b92fea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8397 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 $options.onPointerDown && $options.onPointerDown(...args)),\n onPointermove: _cache[2] || (_cache[2] = (...args) => $options.onPointerMove && $options.onPointerMove(...args)),\n onPointerup: _cache[3] || (_cache[3] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onPointercancel: _cache[4] || (_cache[4] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onDblclick: _cache[5] || (_cache[5] = _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 ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n class: \"tm-media\",\n src: $props.src,\n controls: \"\",\n autoplay: \"\",\n playsinline: \"\",\n style: _normalizeStyle($options.mediaStyle)\n }, null, 12, _hoisted_2)) : $props.isAudio ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_cache[6] || (_cache[6] = _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(\"audio\", {\n src: $props.src,\n controls: \"\",\n autoplay: \"\",\n class: \"audio-player\"\n }, null, 8, _hoisted_4)])) : _createCommentVNode(\"\", true)], 544);\n}","export default {\n name: \"TransformMedia\",\n props: {\n file: {\n type: Object,\n required: true\n },\n src: {\n type: String,\n required: true\n },\n isImage: {\n type: Boolean,\n default: true\n },\n isVideo: {\n type: Boolean,\n default: false\n },\n isAudio: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n pointers: new Map(),\n // transform state\n scale: 1,\n rotation: 0,\n // 落地的旋转角度:0, 90, 180, 270\n rotatePreview: 0,\n // 旋转预览角度(-90~+90,跟手)\n tx: 0,\n ty: 0,\n // 图片原始尺寸\n naturalWidth: 0,\n naturalHeight: 0,\n // gesture start snapshots\n startScale: 1,\n startRotation: 0,\n startTx: 0,\n startTy: 0,\n startCenter: null,\n startDist: 0,\n startAngle: 0,\n // drag\n dragging: false,\n dragStart: null,\n viewportRect: null,\n // bounds\n minScale: 1,\n maxScale: 4,\n // 手势模式锁定:'pinch' | 'rotate' | null\n gestureMode: null,\n // 边界翻页相关\n edgeOverflow: 0,\n // 超出边界的累计距离\n edgeDir: 0 // 超出方向:-1左 +1右\n };\n },\n computed: {\n isActiveTransform() {\n return this.scale > 1.001 || this.pointers.size >= 2 || this.dragging;\n },\n // 实际显示的旋转角度 = 落地角度 + 预览角度\n displayRotation() {\n return this.rotation + this.rotatePreview;\n },\n // 旋转时缩小系数(中间最小,两端恢复)\n rotateShrink() {\n const p = Math.min(1, Math.abs(this.rotatePreview) / 90);\n const k = Math.sin(Math.PI * p);\n return 1 - 0.12 * k; // 最多缩小12%\n },\n mediaStyle() {\n const finalScale = this.scale * this.rotateShrink;\n const inGesture = this.pointers.size > 0;\n return {\n transform: `translate3d(${this.tx}px, ${this.ty}px, 0) scale(${finalScale}) rotate(${this.displayRotation}deg)`,\n transition: inGesture ? \"none\" : \"transform 0.25s ease\",\n transformOrigin: \"center center\"\n };\n }\n },\n watch: {\n isActiveTransform(v) {\n this.$emit(v ? \"lock\" : \"unlock\");\n }\n },\n methods: {\n onLoad(e) {\n // 记录图片原始尺寸\n const img = e.target;\n this.naturalWidth = img.naturalWidth;\n this.naturalHeight = img.naturalHeight;\n },\n reset() {\n this.scale = 1;\n this.rotation = 0;\n this.rotatePreview = 0;\n this.tx = 0;\n this.ty = 0;\n this.pointers.clear();\n this.dragging = false;\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n this.$emit(\"unlock\");\n },\n clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n getViewportRect() {\n return this.$refs.viewport?.getBoundingClientRect();\n },\n // 计算放大后允许的最大平移范围\n getPanBounds() {\n const rect = this.$refs.viewport?.getBoundingClientRect();\n if (!rect) return {\n maxX: 0,\n maxY: 0,\n vw: 0,\n vh: 0\n };\n const vw = rect.width,\n vh = rect.height;\n const img = this.$el.querySelector('img, video');\n let iw = img?.clientWidth || vw;\n let ih = img?.clientHeight || vh;\n\n // 90°/270° 旋转时,图片宽高交换\n const rot = this.rotation % 360;\n if (rot === 90 || rot === 270) {\n [iw, ih] = [ih, iw];\n }\n const sw = iw * this.scale;\n const sh = ih * this.scale;\n const maxX = Math.max(0, (sw - vw) / 2);\n const maxY = Math.max(0, (sh - vh) / 2);\n return {\n maxX,\n maxY,\n vw,\n vh\n };\n },\n // 应用边界阻尼\n applyBoundWithRubber(value, max, dimension) {\n if (value > max) {\n return max + this.rubberBand(value - max, dimension, 0.55);\n }\n if (value < -max) {\n return -max - this.rubberBand(-max - value, dimension, 0.55);\n }\n return value;\n },\n calcTwoPointer() {\n const pts = Array.from(this.pointers.values());\n // 按 pointerId 排序确保顺序一致\n const sorted = Array.from(this.pointers.entries()).sort((a, b) => a[0] - b[0]);\n const p0 = sorted[0][1],\n p1 = sorted[1][1];\n const dx = p1.x - p0.x;\n const dy = p1.y - p0.y;\n const dist = Math.hypot(dx, dy);\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n const center = {\n x: (p0.x + p1.x) / 2,\n y: (p0.y + p1.y) / 2\n };\n return {\n dist,\n angle,\n center\n };\n },\n // 角度归一化到 -180~180\n normalizeAngle(deg) {\n deg = (deg % 360 + 360) % 360;\n return deg > 180 ? deg - 360 : deg;\n },\n onPointerDown(e) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n this.viewportRect = this.getViewportRect();\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指开始:初始化 pinch/rotate 基准\n if (this.pointers.size === 2) {\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n this.startDist = dist;\n this.startAngle = angle;\n this.startCenter = center;\n this.startScale = this.scale;\n this.startRotation = this.rotation;\n this.startTx = this.tx;\n this.startTy = this.ty;\n this.dragging = false;\n this.gestureMode = null;\n this.rotatePreview = 0;\n return;\n }\n\n // 1指:如果已放大,则进入拖拽\n if (this.scale > 1.001) {\n this.dragging = true;\n this.dragStart = {\n x: e.clientX,\n y: e.clientY\n };\n this.startTx = this.tx;\n this.startTy = this.ty;\n }\n },\n onPointerMove(e) {\n if (!this.pointers.has(e.pointerId)) return;\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指:缩放 + 旋转(带死区锁定)\n if (this.pointers.size === 2) {\n e.preventDefault();\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n const scaleFactor = dist / (this.startDist || dist);\n const scaleChange = Math.abs(scaleFactor - 1);\n const deltaAngle = this.normalizeAngle(angle - this.startAngle);\n const angleChange = Math.abs(deltaAngle);\n\n // 阈值\n const rotateStartDeg = 8; // 8° 开始进入旋转模式\n const pinchStartScale = 0.08; // 8% 缩放变化开始进入缩放模式\n\n // 判断手势模式(只在第一次超过死区时锁定)\n // 优先判断旋转:角度变化超过8°就进入旋转模式(不管缩放)\n if (!this.gestureMode) {\n if (angleChange >= rotateStartDeg) {\n this.gestureMode = 'rotate';\n } else if (scaleChange >= pinchStartScale) {\n this.gestureMode = 'pinch';\n } else {\n return; // 还在死区内\n }\n }\n\n // 旋转模式:预览角跟手,限制在 -90~+90\n if (this.gestureMode === 'rotate') {\n this.scale = this.startScale; // 锁定缩放\n this.rotatePreview = this.clamp(deltaAngle, -90, 90);\n return;\n }\n\n // 缩放模式\n if (this.gestureMode === 'pinch') {\n this.scale = this.clamp(this.startScale * scaleFactor, this.minScale, this.maxScale);\n this.rotatePreview = 0;\n }\n\n // 跟随双指中心移动\n if (this.startCenter && this.viewportRect) {\n const cx0 = this.startCenter.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy0 = this.startCenter.y - this.viewportRect.top - this.viewportRect.height / 2;\n const cx1 = center.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy1 = center.y - this.viewportRect.top - this.viewportRect.height / 2;\n this.tx = this.startTx + (cx1 - cx0);\n this.ty = this.startTy + (cy1 - cy0);\n }\n return;\n }\n\n // 1指:拖拽(只在 scale>1 时)+ 边界阻尼 + 边界翻页检测\n if (this.dragging && this.scale > 1.001) {\n e.preventDefault();\n const dx = e.clientX - this.dragStart.x;\n const dy = e.clientY - this.dragStart.y;\n const rawX = this.startTx + dx;\n const rawY = this.startTy + dy;\n const {\n maxX,\n maxY,\n vw,\n vh\n } = this.getPanBounds();\n\n // 检测是否超出左右边界\n let overflow = 0;\n let dir = 0;\n if (rawX > maxX) {\n overflow = rawX - maxX;\n dir = -1; // 往右拖 = 上一页\n } else if (rawX < -maxX) {\n overflow = -maxX - rawX;\n dir = +1; // 往左拖 = 下一页\n }\n\n // 记录超出状态\n this.edgeOverflow = overflow;\n this.edgeDir = dir;\n this.tx = this.applyBoundWithRubber(rawX, maxX, vw);\n this.ty = this.applyBoundWithRubber(rawY, maxY, vh);\n }\n },\n onPointerUp(e) {\n if (this.pointers.has(e.pointerId)) this.pointers.delete(e.pointerId);\n\n // 两指结束:处理旋转吸附\n if (this.pointers.size < 2 && this.gestureMode === 'rotate') {\n this.finishRotate();\n this.gestureMode = null;\n }\n if (this.pointers.size < 2) {\n this.startCenter = null;\n this.startDist = 0;\n this.startAngle = 0;\n this.gestureMode = null;\n }\n if (this.pointers.size === 0) {\n this.dragging = false;\n\n // 检查是否触发边界翻页(超出60px触发)\n if (this.edgeOverflow > 60 && this.edgeDir !== 0) {\n const dir = this.edgeDir;\n // 翻页前先重置自身状态,解除 gestureLocked\n this.reset();\n this.$emit('edge-swipe', dir);\n return;\n }\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n\n // 缩放回到1附近,自动归位\n if (this.scale <= 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 放大状态:回弹到合法范围\n const {\n maxX,\n maxY\n } = this.getPanBounds();\n this.tx = Math.max(-maxX, Math.min(maxX, this.tx));\n this.ty = Math.max(-maxY, Math.min(maxY, this.ty));\n }\n }\n },\n // 松手后吸附到 0° 或 ±90°\n finishRotate() {\n const d = this.rotatePreview;\n const commitDeg = 30; // 超过30°就翻到90°\n\n let target = 0;\n if (Math.abs(d) >= commitDeg) {\n target = d > 0 ? 90 : -90;\n }\n\n // 计算新的落地角度\n const newRot = ((this.rotation + target) % 360 + 360) % 360;\n\n // 落地并重置预览角(transition 会自动处理动画)\n this.rotation = newRot;\n this.rotatePreview = 0;\n\n // 计算旋转后的铺满缩放\n this.updateFillScale();\n },\n // 旋转后铺满屏幕:90°/270°时放大到2倍(类似双击效果)\n updateFillScale() {\n const rot = this.rotation % 360;\n const isRotated = rot === 90 || rot === 270;\n if (isRotated) {\n // 90°/270° 时放大到2倍铺满\n this.scale = 2;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 0° 或 180° 恢复正常\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n }\n },\n onDblClick() {\n if (this.scale > 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n this.scale = 2;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./TransformMedia.vue?vue&type=template&id=09426418&scoped=true\"\nimport script from \"./TransformMedia.vue?vue&type=script&lang=js\"\nexport * from \"./TransformMedia.vue?vue&type=script&lang=js\"\n\nimport \"./TransformMedia.vue?vue&type=style&index=0&id=09426418&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-09426418\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"header-center\"\n};\nconst _hoisted_4 = {\n class: \"breadcrumb\"\n};\nconst _hoisted_5 = [\"onClick\"];\nconst _hoisted_6 = {\n class: \"header-right\"\n};\nconst _hoisted_7 = {\n class: \"file-count\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"loading-container\"\n};\nconst _hoisted_9 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_10 = {\n key: 2,\n class: \"gallery-container\",\n ref: \"galleryContainer\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"folders-section\"\n};\nconst _hoisted_12 = {\n class: \"folders-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nconst _hoisted_14 = {\n class: \"folder-name\"\n};\nconst _hoisted_15 = {\n class: \"waterfall\",\n ref: \"waterfall\"\n};\nconst _hoisted_16 = [\"onClick\"];\nconst _hoisted_17 = [\"src\", \"alt\", \"onLoad\"];\nconst _hoisted_18 = [\"src\", \"onLoadedmetadata\"];\nconst _hoisted_19 = {\n class: \"audio-name\"\n};\nconst _hoisted_20 = {\n key: 3,\n class: \"file-placeholder\"\n};\nconst _hoisted_21 = {\n class: \"overlay\"\n};\nconst _hoisted_22 = {\n class: \"overlay-actions\"\n};\nconst _hoisted_23 = [\"onClick\"];\nconst _hoisted_24 = [\"onClick\"];\nconst _hoisted_25 = {\n ref: \"loadTrigger\",\n class: \"load-trigger\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"loading-more\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"no-more\"\n};\nconst _hoisted_28 = {\n key: 2,\n class: \"credit-link\",\n href: \"https://github.com/axibayuit-a11y\",\n target: \"_blank\",\n rel: \"noopener\"\n};\nconst _hoisted_29 = [\"src\"];\nconst _hoisted_30 = [\"src\"];\nconst _hoisted_31 = {\n class: \"page-indicator\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_TransformMedia = _resolveComponent(\"TransformMedia\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"public-browse\", {\n 'light-mode': $data.isLightMode\n }])\n }, [_createElementVNode(\"header\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", {\n class: \"logo\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleTheme && $options.toggleTheme(...args)),\n title: \"切换日夜模式\"\n }, _toDisplayString($options.siteName), 1)]), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goToRoot && $options.goToRoot(...args))\n }, _toDisplayString($options.rootDirName), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pathParts, (part, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: index\n }, [_cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"breadcrumb-sep\"\n }, \"/\", -1)), _createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: $event => $options.goToPath(index)\n }, _toDisplayString(part), 9, _hoisted_5)], 64);\n }), 128))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"span\", _hoisted_7, _toDisplayString($data.totalCount) + \" 个文件\", 1)])]), $data.loading && $data.files.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [...(_cache[21] || (_cache[21] = [_createElementVNode(\"div\", {\n class: \"loading-spinner\"\n }, null, -1), _createElementVNode(\"p\", null, \"加载中...\", -1)]))])) : $data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"p\", null, _toDisplayString($data.error), 1), $data.canRetry ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n onClick: _cache[2] || (_cache[2] = (...args) => $options.loadFiles && $options.loadFiles(...args)),\n class: \"retry-btn\"\n }, \"重试\")) : _createCommentVNode(\"\", true)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [$options.folders.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.folders, folder => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: folder.name,\n class: \"folder-card\",\n onClick: $event => $options.enterFolder(folder.name)\n }, [_cache[22] || (_cache[22] = _createElementVNode(\"div\", {\n class: \"folder-icon\"\n }, [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })])], -1)), _createElementVNode(\"span\", _hoisted_14, _toDisplayString($options.getFolderName(folder.name)), 1)], 8, _hoisted_13);\n }), 128))])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_15, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.columns, (column, colIndex) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: colIndex,\n class: \"waterfall-column\"\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(column, file => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: file.name,\n class: \"waterfall-item\",\n onClick: $event => $options.openPreview(file)\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"image-wrapper\", {\n loaded: file.loaded\n }])\n }, [$options.isImage(file) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl(file.name),\n alt: file.name,\n loading: \"lazy\",\n onLoad: $event => $options.onImageLoad($event, file),\n onError: _cache[3] || (_cache[3] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_17)) : $options.isVideo(file) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl(file.name),\n muted: \"\",\n loop: \"\",\n preload: \"metadata\",\n onLoadedmetadata: $event => $options.onVideoLoad($event, file),\n onMouseenter: _cache[4] || (_cache[4] = $event => $event.target.play()),\n onMouseleave: _cache[5] || (_cache[5] = $event => $event.target.pause())\n }, null, 40, _hoisted_18)) : $options.isAudio(file) ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"audio-placeholder\",\n onClick: _cache[6] || (_cache[6] = _withModifiers(() => {}, [\"stop\"]))\n }, [_cache[23] || (_cache[23] = _createElementVNode(\"svg\", {\n class: \"audio-icon\",\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_19, _toDisplayString($options.getFileName(file.name)), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [...(_cache[24] || (_cache[24] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)]))])), _createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.copyLink(file.name), [\"stop\"]),\n title: \"复制链接\"\n }, [...(_cache[25] || (_cache[25] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)]))], 8, _hoisted_23), _createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.downloadFile(file.name), [\"stop\"]),\n title: \"下载\"\n }, [...(_cache[26] || (_cache[26] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"\n })], -1)]))], 8, _hoisted_24)])])], 2)], 8, _hoisted_16);\n }), 128))]);\n }), 128))], 512), _createElementVNode(\"div\", _hoisted_25, [$data.loading && $data.files.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [...(_cache[27] || (_cache[27] = [_createElementVNode(\"div\", {\n class: \"loading-spinner-small\"\n }, null, -1), _createElementVNode(\"span\", null, \"加载中...\", -1)]))])) : !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_27, \" 已加载全部 \")) : _createCommentVNode(\"\", true), !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"a\", _hoisted_28, \" 林酱贡献 \")) : _createCommentVNode(\"\", true)], 512)], 512)), $data.previewVisible ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"preview-modal\",\n onClick: _cache[19] || (_cache[19] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"self\"]))\n }, [_createElementVNode(\"button\", {\n class: \"preview-close\",\n onClick: _cache[7] || (_cache[7] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"stop\"]))\n }, [...(_cache[28] || (_cache[28] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n 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\"\n })], -1)]))]), _createElementVNode(\"div\", {\n class: \"preview-content desktop-only\",\n onClick: _cache[8] || (_cache[8] = _withModifiers(() => {}, [\"stop\"]))\n }, [$options.currentPreviewFile && $options.isImage($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n class: \"preview-image\",\n style: _normalizeStyle($options.desktopImageStyle),\n draggable: \"false\"\n }, null, 12, _hoisted_29)) : $options.currentPreviewFile && $options.isVideo($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n controls: \"\",\n autoplay: \"\",\n class: \"preview-video\",\n style: _normalizeStyle($options.desktopImageStyle)\n }, null, 12, _hoisted_30)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", {\n class: \"preview-content mobile-only\",\n onClick: _cache[15] || (_cache[15] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-viewport\",\n ref: \"mobileViewport\",\n onTouchstart: _cache[12] || (_cache[12] = (...args) => $options.onSwipeStart && $options.onSwipeStart(...args)),\n onTouchmove: _cache[13] || (_cache[13] = (...args) => $options.onSwipeMove && $options.onSwipeMove(...args)),\n onTouchend: _cache[14] || (_cache[14] = (...args) => $options.onSwipeEnd && $options.onSwipeEnd(...args))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-track\",\n style: _normalizeStyle($options.swipeTrackStyle),\n onTransitionend: _cache[11] || (_cache[11] = (...args) => $options.onSwipeTransitionEnd && $options.onSwipeTransitionEnd(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.swipeWindow, (f, i) => {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"swipe-slide\",\n key: $options.getSlideKey(f, i)\n }, [f ? (_openBlock(), _createBlock(_component_TransformMedia, {\n key: 0,\n file: f,\n src: $options.getFileUrl(f.name),\n \"is-image\": $options.isImage(f),\n \"is-video\": $options.isVideo(f),\n \"is-audio\": $options.isAudio(f),\n onLock: _cache[9] || (_cache[9] = $event => $data.gestureLocked = true),\n onUnlock: _cache[10] || (_cache[10] = $event => $data.gestureLocked = false),\n onEdgeSwipe: $options.onEdgeSwipe\n }, null, 8, [\"file\", \"src\", \"is-image\", \"is-video\", \"is-audio\", \"onEdgeSwipe\"])) : _createCommentVNode(\"\", true)]);\n }), 128))], 36)], 544)]), $data.previewIndex > 0 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"preview-prev desktop-only\",\n onClick: _cache[16] || (_cache[16] = _withModifiers((...args) => $options.prevImage && $options.prevImage(...args), [\"stop\"]))\n }, [...(_cache[29] || (_cache[29] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), $data.previewIndex < $options.mediaFiles.length - 1 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 1,\n class: \"preview-next desktop-only\",\n onClick: _cache[17] || (_cache[17] = _withModifiers((...args) => $options.nextImage && $options.nextImage(...args), [\"stop\"]))\n }, [...(_cache[30] || (_cache[30] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), _createElementVNode(\"button\", {\n class: \"rotate-btn desktop-only\",\n onClick: _cache[18] || (_cache[18] = _withModifiers((...args) => $options.rotateImage && $options.rotateImage(...args), [\"stop\"])),\n title: \"旋转90°\"\n }, [...(_cache[31] || (_cache[31] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"\n })], -1)]))]), _createElementVNode(\"div\", _hoisted_31, _toDisplayString($data.previewIndex + 1) + \" / \" + _toDisplayString($options.mediaFiles.length), 1)])) : _createCommentVNode(\"\", true)], 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 axios from 'axios';\nimport { mapGetters } from 'vuex';\nimport TransformMedia from '@/components/TransformMedia.vue';\nexport default {\n name: 'PublicBrowse',\n components: {\n TransformMedia\n },\n data() {\n return {\n files: [],\n allowedDirs: [],\n rootDir: '',\n currentPath: '',\n totalCount: 0,\n loading: false,\n error: null,\n canRetry: true,\n hasMore: true,\n previewVisible: false,\n previewIndex: 0,\n observer: null,\n pageSize: 24,\n columnCount: 4,\n columnHeights: [0, 0, 0, 0],\n // 桌面端旋转\n imageRotation: 0,\n // 手机端滑动\n swipeX: 0,\n swipeStartX: 0,\n swipeStartY: 0,\n swipeStartT: 0,\n swipeActive: false,\n swipeAnimating: false,\n swipeDir: 0,\n viewportW: 0,\n // 手势锁定(子组件缩放/旋转时锁住轮播)\n gestureLocked: false,\n // 日夜模式\n isLightMode: false\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n siteName() {\n return this.userConfig?.siteTitle || '公开相册';\n },\n rootDirName() {\n return this.rootDir.split('/').filter(Boolean).pop() || '根目录';\n },\n pathParts() {\n if (!this.currentPath || !this.rootDir) return [];\n const relative = this.currentPath.replace(this.rootDir, '').replace(/^\\/+/, '');\n return relative.split('/').filter(Boolean);\n },\n folders() {\n return this.files.filter(f => f.isFolder);\n },\n mediaFiles() {\n return this.files.filter(f => !f.isFolder);\n },\n columns() {\n const cols = Array.from({\n length: this.columnCount\n }, () => []);\n for (const file of this.mediaFiles) {\n const idx = file.columnIndex ?? 0;\n if (idx < this.columnCount) {\n cols[idx].push(file);\n } else {\n cols[0].push(file);\n }\n }\n return cols;\n },\n currentPreviewFile() {\n return this.mediaFiles[this.previewIndex];\n },\n prevPreviewFile() {\n return this.previewIndex > 0 ? this.mediaFiles[this.previewIndex - 1] : null;\n },\n nextPreviewFile() {\n return this.previewIndex < this.mediaFiles.length - 1 ? this.mediaFiles[this.previewIndex + 1] : null;\n },\n desktopImageStyle() {\n return {\n transform: `rotate(${this.imageRotation}deg)`,\n transition: 'transform 0.3s ease'\n };\n },\n swipeWindow() {\n return [this.prevPreviewFile, this.currentPreviewFile, this.nextPreviewFile];\n },\n swipeTrackStyle() {\n // 默认停在中间那页(-viewportW)\n const base = -this.viewportW;\n const x = base + this.swipeX;\n return {\n transform: `translate3d(${x}px, 0, 0)`,\n transition: this.swipeAnimating ? 'transform 0.28s ease' : 'none'\n };\n }\n },\n watch: {\n '$route.params.dir': {\n handler() {\n this.initFromRoute();\n }\n }\n },\n mounted() {\n this.initTheme();\n this.initFromRoute();\n this.setupIntersectionObserver();\n this.updateColumnCount();\n window.addEventListener('resize', this.updateColumnCount);\n },\n beforeUnmount() {\n if (this.observer) {\n this.observer.disconnect();\n }\n window.removeEventListener('resize', this.updateColumnCount);\n },\n methods: {\n // 初始化主题:10:00-18:00 默认白天,其他时间默认黑夜\n initTheme() {\n const saved = localStorage.getItem('publicBrowseTheme');\n if (saved !== null) {\n this.isLightMode = saved === 'light';\n } else {\n const hour = new Date().getHours();\n this.isLightMode = hour >= 10 && hour < 18;\n }\n },\n toggleTheme() {\n this.isLightMode = !this.isLightMode;\n localStorage.setItem('publicBrowseTheme', this.isLightMode ? 'light' : 'dark');\n },\n // 生成 slide key,切换时让子组件重新挂载以重置 transform\n getSlideKey(f, i) {\n if (!f) return `empty-${i}`;\n // 中间那张用 previewIndex 作为 key 的一部分,确保切换时重新挂载\n if (i === 1) return `${f.name}-${this.previewIndex}`;\n return f.name;\n },\n updateColumnCount() {\n const width = window.innerWidth;\n let newCount;\n if (width < 600) {\n newCount = 2;\n } else if (width < 900) {\n newCount = 3;\n } else {\n newCount = 4;\n }\n if (newCount !== this.columnCount) {\n this.columnCount = newCount;\n this.columnHeights = new Array(this.columnCount).fill(0);\n this.mediaFiles.forEach(f => {\n f.columnIndex = undefined;\n this.assignToColumn(f);\n });\n }\n },\n getShortestColumn() {\n let minIndex = 0;\n let minHeight = this.columnHeights[0];\n for (let i = 1; i < this.columnCount; i++) {\n if (this.columnHeights[i] < minHeight) {\n minHeight = this.columnHeights[i];\n minIndex = i;\n }\n }\n return minIndex;\n },\n assignToColumn(file, height = 200) {\n const colIndex = this.getShortestColumn();\n file.columnIndex = colIndex;\n this.columnHeights[colIndex] += height;\n // 音频文件直接标记为已加载(没有 load 事件)\n if (this.isAudio(file)) {\n file.loaded = true;\n }\n },\n onImageLoad(event, file) {\n const img = event.target;\n const ratio = img.naturalHeight / img.naturalWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n onVideoLoad(event, file) {\n const video = event.target;\n const ratio = video.videoHeight / video.videoWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n setupIntersectionObserver() {\n this.observer = new IntersectionObserver(entries => {\n const entry = entries[0];\n if (entry.isIntersecting && this.hasMore && !this.loading) {\n this.loadMore();\n }\n }, {\n rootMargin: '200px'\n });\n },\n observeLoadTrigger() {\n this.$nextTick(() => {\n if (this.$refs.loadTrigger && this.observer) {\n this.observer.observe(this.$refs.loadTrigger);\n }\n });\n },\n async initFromRoute() {\n const dirParam = this.$route.params.dir || '';\n const dirPath = Array.isArray(dirParam) ? dirParam.join('/') : dirParam;\n if (!dirPath) {\n this.error = '请指定要浏览的目录,例如: /browse/landscape';\n this.canRetry = false;\n return;\n }\n const parts = dirPath.split('/').filter(Boolean);\n this.rootDir = parts[0];\n this.currentPath = dirPath;\n this.files = [];\n this.hasMore = true;\n this.columnHeights = new Array(this.columnCount).fill(0);\n await this.loadFiles();\n this.observeLoadTrigger();\n },\n async loadFiles() {\n this.loading = true;\n this.error = null;\n this.canRetry = true;\n try {\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);\n if (res.data.allowedDirs) {\n this.allowedDirs = res.data.allowedDirs;\n }\n const dirs = (res.data.directories || []).map(d => ({\n name: d,\n isFolder: true\n }));\n const files = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n files.forEach(f => this.assignToColumn(f));\n this.files = [...dirs, ...files];\n this.totalCount = res.data.totalCount || this.files.length;\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n if (err.response?.status === 403) {\n const msg = err.response?.data?.error || '';\n if (msg.includes('disabled')) {\n this.error = '公开浏览功能未启用';\n } else if (msg.includes('not allowed') || msg.includes('No public')) {\n this.error = '该目录不允许公开访问';\n } else {\n this.error = '访问被拒绝';\n }\n this.canRetry = false;\n } else {\n this.error = '加载失败,请重试';\n }\n } finally {\n this.loading = false;\n }\n },\n async loadMore() {\n if (this.loading || !this.hasMore) return;\n this.loading = true;\n try {\n const start = this.mediaFiles.length;\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&start=${start}&count=${this.pageSize}`);\n const moreFiles = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n moreFiles.forEach(f => this.assignToColumn(f));\n this.files.push(...moreFiles);\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n console.error('加载更多失败', err);\n } finally {\n this.loading = false;\n }\n },\n enterFolder(folderPath) {\n const newPath = folderPath.replace(/\\/+$/, '');\n this.$router.push(`/browse/${newPath}`);\n },\n goToRoot() {\n this.$router.push(`/browse/${this.rootDir}`);\n },\n goToPath(index) {\n const parts = this.pathParts.slice(0, index + 1);\n const newPath = this.rootDir + (parts.length ? '/' + parts.join('/') : '');\n this.$router.push(`/browse/${newPath}`);\n },\n getFolderName(path) {\n return path.split('/').filter(Boolean).pop() || path;\n },\n getFileUrl(name) {\n return `${window.location.origin}/file/${name}`;\n },\n isImage(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg', 'avif'].includes(ext);\n },\n isVideo(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['mp4', 'webm', 'ogg', 'mov'].includes(ext);\n },\n isAudio(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'].includes(ext);\n },\n getFileName(name) {\n return name.split('/').pop();\n },\n handleImageError(e) {\n e.target.style.display = 'none';\n },\n copyLink(name) {\n const url = this.getFileUrl(name);\n navigator.clipboard?.writeText(url).then(() => {\n this.showToast('已复制');\n }).catch(() => {\n const input = document.createElement('input');\n input.value = url;\n document.body.appendChild(input);\n input.select();\n document.execCommand('copy');\n document.body.removeChild(input);\n this.showToast('已复制');\n });\n },\n showToast(msg) {\n const existing = document.querySelector('.copy-toast');\n if (existing) existing.remove();\n const toast = document.createElement('div');\n toast.className = 'copy-toast';\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(() => toast.classList.add('show'), 10);\n setTimeout(() => {\n toast.classList.remove('show');\n setTimeout(() => toast.remove(), 300);\n }, 1500);\n },\n downloadFile(name) {\n const link = document.createElement('a');\n link.href = this.getFileUrl(name);\n link.download = name.split('/').pop();\n link.click();\n },\n openPreview(file) {\n if (file.isFolder) return;\n const mediaIndex = this.mediaFiles.findIndex(f => f.name === file.name);\n if (mediaIndex >= 0) {\n this.previewIndex = mediaIndex;\n this.previewVisible = true;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = 'hidden';\n this.$nextTick(() => {\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n });\n }\n },\n closePreview() {\n this.previewVisible = false;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = '';\n },\n prevImage() {\n if (this.previewIndex > 0) {\n this.previewIndex--;\n this.imageRotation = 0;\n }\n },\n nextImage() {\n if (this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n this.imageRotation = 0;\n }\n },\n rotateImage() {\n this.imageRotation += 90;\n // 动画结束后归一化(无动画)\n if (this.imageRotation >= 360) {\n setTimeout(() => {\n // 临时禁用 transition\n const el = this.$el.querySelector('.preview-image, .preview-video');\n if (el) {\n el.style.transition = 'none';\n this.imageRotation = 0;\n // 强制重绘后恢复 transition\n el.offsetHeight;\n el.style.transition = '';\n } else {\n this.imageRotation = 0;\n }\n }, 300);\n }\n },\n // 手机端滑动:开始\n onSwipeStart(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n this.swipeStartX = t.clientX;\n this.swipeStartY = t.clientY;\n this.swipeStartT = performance.now();\n this.swipeX = 0;\n this.swipeActive = false;\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n },\n // 手机端滑动:移动\n onSwipeMove(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n const dx = t.clientX - this.swipeStartX;\n const dy = t.clientY - this.swipeStartY;\n if (!this.swipeActive) {\n if (Math.abs(dx) < 8) return;\n if (Math.abs(dx) <= Math.abs(dy)) return;\n this.swipeActive = true;\n }\n e.preventDefault();\n let x = dx;\n // 边界阻尼:用 rubberBand 代替线性 *0.3\n if (this.previewIndex === 0 && x > 0) {\n x = this.rubberBand(x, this.viewportW, 0.55);\n } else if (this.previewIndex === this.mediaFiles.length - 1 && x < 0) {\n x = -this.rubberBand(-x, this.viewportW, 0.55);\n }\n this.swipeX = x;\n },\n // 手机端滑动:结束\n onSwipeEnd() {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n if (!this.swipeActive) {\n this.swipeX = 0;\n return;\n }\n const dt = Math.max(1, performance.now() - this.swipeStartT);\n const vx = this.swipeX / dt;\n const threshold = this.viewportW * 0.2;\n let dir = 0;\n if (this.swipeX <= -threshold || vx <= -0.8) dir = +1;\n if (this.swipeX >= threshold || vx >= 0.8) dir = -1;\n if (dir === -1 && this.previewIndex === 0 || dir === +1 && this.previewIndex === this.mediaFiles.length - 1) {\n dir = 0;\n }\n this.swipeDir = dir;\n this.swipeAnimating = true;\n if (dir === +1) this.swipeX = -this.viewportW;else if (dir === -1) this.swipeX = +this.viewportW;else this.swipeX = 0;\n },\n onSwipeTransitionEnd() {\n if (!this.swipeAnimating) return;\n if (this.swipeDir === +1) this.previewIndex++;\n if (this.swipeDir === -1) this.previewIndex--;\n this.swipeAnimating = false;\n this.swipeDir = 0;\n this.swipeX = 0;\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n // 放大状态下边界滑动翻页(带动画)\n onEdgeSwipe(dir) {\n // dir: +1 下一页, -1 上一页\n if (dir === -1 && this.previewIndex === 0 || dir === +1 && this.previewIndex === this.mediaFiles.length - 1) {\n return;\n }\n\n // 触发轮播动画\n this.swipeDir = dir;\n this.swipeAnimating = true;\n if (dir === +1) this.swipeX = -this.viewportW;else if (dir === -1) this.swipeX = +this.viewportW;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./PublicBrowse.vue?vue&type=template&id=9f48f6cc&scoped=true\"\nimport script from \"./PublicBrowse.vue?vue&type=script&lang=js\"\nexport * from \"./PublicBrowse.vue?vue&type=script&lang=js\"\n\nimport \"./PublicBrowse.vue?vue&type=style&index=0&id=9f48f6cc&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-9f48f6cc\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","key","class","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","ref","onPointerdown","args","onPointerDown","onPointermove","onPointerMove","onPointerup","onPointerUp","onPointercancel","onDblclick","onDblClick","isImage","src","draggable","style","mediaStyle","onLoad","isVideo","controls","autoplay","playsinline","isAudio","viewBox","fill","d","name","props","file","type","Object","required","String","Boolean","default","data","pointers","Map","scale","rotation","rotatePreview","tx","ty","naturalWidth","naturalHeight","startScale","startRotation","startTx","startTy","startCenter","startDist","startAngle","dragging","dragStart","viewportRect","minScale","maxScale","gestureMode","edgeOverflow","edgeDir","computed","isActiveTransform","this","size","displayRotation","rotateShrink","p","Math","min","abs","k","sin","PI","finalScale","inGesture","transform","transition","transformOrigin","watch","v","$emit","methods","e","img","target","reset","clear","clamp","max","rubberBand","distance","dimension","constant","getViewportRect","$refs","viewport","getBoundingClientRect","getPanBounds","rect","maxX","maxY","vw","vh","width","height","$el","querySelector","iw","clientWidth","ih","clientHeight","rot","sw","sh","applyBoundWithRubber","value","calcTwoPointer","Array","from","values","sorted","entries","sort","a","b","p0","p1","dx","x","dy","y","dist","hypot","angle","atan2","center","normalizeAngle","deg","currentTarget","setPointerCapture","pointerId","set","clientX","clientY","has","preventDefault","scaleFactor","scaleChange","deltaAngle","angleChange","rotateStartDeg","pinchStartScale","cx0","left","cy0","top","cx1","cy1","rawX","rawY","overflow","dir","delete","finishRotate","commitDeg","newRot","updateFillScale","isRotated","__exports__","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_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","href","rel","_hoisted_29","_hoisted_30","_hoisted_31","_component_TransformMedia","isLightMode","onClick","toggleTheme","title","siteName","goToRoot","rootDirName","pathParts","part","index","$event","goToPath","totalCount","loading","files","length","error","canRetry","loadFiles","folders","folder","enterFolder","getFolderName","columns","column","colIndex","openPreview","loaded","getFileUrl","alt","onImageLoad","onError","handleImageError","muted","loop","preload","onLoadedmetadata","onVideoLoad","onMouseenter","play","onMouseleave","pause","getFileName","copyLink","downloadFile","hasMore","mediaFiles","previewVisible","closePreview","currentPreviewFile","desktopImageStyle","onTouchstart","onSwipeStart","onTouchmove","onSwipeMove","onTouchend","onSwipeEnd","swipeTrackStyle","onTransitionend","onSwipeTransitionEnd","swipeWindow","f","i","getSlideKey","onLock","gestureLocked","onUnlock","onEdgeSwipe","previewIndex","prevImage","nextImage","rotateImage","components","TransformMedia","allowedDirs","rootDir","currentPath","observer","pageSize","columnCount","columnHeights","imageRotation","swipeX","swipeStartX","swipeStartY","swipeStartT","swipeActive","swipeAnimating","swipeDir","viewportW","userConfig","siteTitle","split","filter","pop","relative","replace","isFolder","cols","idx","columnIndex","push","prevPreviewFile","nextPreviewFile","base","handler","initFromRoute","mounted","initTheme","setupIntersectionObserver","updateColumnCount","window","addEventListener","beforeUnmount","disconnect","removeEventListener","saved","localStorage","getItem","hour","Date","getHours","setItem","innerWidth","newCount","forEach","undefined","assignToColumn","getShortestColumn","minIndex","minHeight","event","ratio","video","videoHeight","videoWidth","IntersectionObserver","entry","isIntersecting","loadMore","rootMargin","observeLoadTrigger","$nextTick","loadTrigger","observe","dirParam","$route","params","dirPath","isArray","join","parts","res","axios","get","encodeURIComponent","dirs","directories","map","metadata","err","response","status","msg","includes","start","moreFiles","console","folderPath","newPath","$router","slice","path","location","origin","ext","toLowerCase","display","url","navigator","clipboard","writeText","then","showToast","catch","input","document","createElement","body","appendChild","select","execCommand","removeChild","existing","remove","toast","className","textContent","setTimeout","classList","add","link","download","click","mediaIndex","findIndex","mobileViewport","el","offsetHeight","t","touches","performance","now","dt","vx","threshold"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/760.a76249f2.js.map.gz b/js/760.a76249f2.js.map.gz deleted file mode 100644 index 09ba4b3764d50b8099442d31ffc53e153984abed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22827 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

FZvXt(}jl8bxcNApHZcl4|0_BSa8tXc3u!- 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 diff --git a/js/app.2ba98dec.js.gz b/js/app.2ba98dec.js.gz deleted file mode 100644 index 1d6d89dd880d4a488928a71c063f00ace805ffbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4905 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 bzFGzCDZd;hA`ZSaa8dPtY&j|Z=rI5Q>Qje$ diff --git a/js/app.2ba98dec.js.map.gz b/js/app.2ba98dec.js.map.gz deleted file mode 100644 index bac606aa63cca63dde67c04e2accbc8e44cdcdd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15256 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.withAuthCode){const t=a().get("authCode");t&&(e.headers["authCode"]=t)}return e},e=>Promise.reject(e)),l.interceptors.response.use(e=>e,e=>(e.config?.withAuthCode&&401===e.response?.status&&(i.nk.error("认证失败,请重新登录!"),s.A.push("/login")),Promise.reject(e))),t.A=l},3354:function(e,t,o){o(8111),o(7588);var n=o(5130),r=o(3888),a=o(4068),s=(o(9436),o(372),o(8950)),i=o(2353),l=o(292),u=o(6768);function c(e,t,o,n,r,a){const s=(0,u.g2)("router-view");return(0,u.uX)(),(0,u.Wv)(s)}var d=o(8401),p=o(3785),m={computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars()})},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return;(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setSiteIcon(){const e=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');e.forEach(e=>e.remove());const t=document.createElement("link"),o=document.createElement("link"),n=document.createElement("link");t.rel="icon",o.rel="apple-touch-icon",n.rel="mask-icon",this.useDarkMode?(t.href=this.userConfig?.siteIcon||"/logo-dark.png",o.href=this.userConfig?.siteIcon||"/logo-dark.png",n.href=this.userConfig?.siteIcon||"/logo-dark.png"):(t.href=this.userConfig?.siteIcon||"/logo.png",o.href=this.userConfig?.siteIcon||"/logo.png",n.href=this.userConfig?.siteIcon||"/logo.png"),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}}},f=o(1241);const h=(0,f.A)(m,[["render",c]]);var g=h,b=o(6915),k=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),v=(0,r.Zf)();C.component("font-awesome-icon",l.gc);for(const[M,E]of Object.entries(y))C.component(M,E);const A=()=>{const e=document.documentElement;let t;if(k.A.state.cusDarkMode&&null!==k.A.state.useDarkMode)t=k.A.state.useDarkMode;else{if(t=window.matchMedia("(prefers-color-scheme: dark)").matches,!t){const e=new Date,o=e.getHours();t=o>=22||o<6}k.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},U=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},w=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},S=(e,t)=>{const o=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');o.forEach(e=>e.remove());const n=document.createElement("link"),r=document.createElement("link"),a=document.createElement("link");n.rel="icon",r.rel="apple-touch-icon",a.rel="mask-icon",e?(n.href=t?.siteIcon||"/logo-dark.png",r.href=t?.siteIcon||"/logo-dark.png",a.href=t?.siteIcon||"/logo-dark.png"):(n.href=t?.siteIcon||"/logo.png",r.href=t?.siteIcon||"/logo.png",a.href=t?.siteIcon||"/logo.png"),document.head.appendChild(n),document.head.appendChild(r),document.head.appendChild(a)};k.A.dispatch("fetchUserConfig").then(()=>{A(),w(k.A.getters.userConfig),S(k.A.state.useDarkMode,k.A.getters.userConfig),k.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&k.A.state.cusDarkMode&&(U(t.useDarkMode),S(t.useDarkMode,k.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(k.A.state.useDarkMode,k.A.getters.userConfig))}),C.use(k.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(k.A).use(b.A).use(a.A).use(v).mount("#app")})},5507:function(e,t,o){o(8111),o(1701);var n=o(8401),r=o(457),a=o(5131);t.A=(0,n.y$)({state:{userConfig:null,bingWallPapers:[],credentials:null,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:!0,compressQuality:4,compressBar:5,serverCompress:!0},storeUploadChannel:"",storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.credentials,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,t){e.userConfig=t},setBingWallPapers(e,t){e.bingWallPapers=t},setCredentials(e,t){e.credentials=t},setUploadMethod(e,t){e.uploadMethod=t},setUploadCopyUrlForm(e,t){e.uploadCopyUrlForm=t},setCompressConfig(e,{key:t,value:o}){e.compressConfig[t]=o},setStoreUploadChannel(e,t){e.storeUploadChannel=t},setStoreUploadNameType(e,t){e.storeUploadNameType=t},setCustomUrlSettings(e,{key:t,value:o}){e.customUrlSettings[t]=o},setStoreAutoRetry(e,t){e.storeAutoRetry=t},setAdminUrlSettings(e,{key:t,value:o}){e.adminUrlSettings[t]=o},setUseDarkMode(e,t){e.useDarkMode=t},setCusDarkMode(e,t){e.cusDarkMode=t},setStoreUploadFolder(e,t){e.uploadFolder=t,localStorage.setItem("uploadFolder",t)},setStoreAutoReUpload(e,t){e.autoReUpload=t}},actions:{async fetchUserConfig({commit:e}){try{const t=await r.A.get("/api/userConfig");e("setUserConfig",t.data)}catch(t){console.log(t)}},async fetchBingWallPapers({commit:e}){try{const t=await r.A.get("/api/bing/wallpaper"),o=t.data.data,n=o.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(n.map(e=>new Promise((t,o)=>{const n=new Image;n.onload=t,n.onerror=o,n.src=e.url}))),e("setBingWallPapers",n)}catch(t){console.log(t)}}},modules:{},plugins:[(0,a.A)()]})},6915:function(e,t,o){o(4979);var n=o(8512),r=o(1219),a=o(4570),s=o.n(a),i=o(5507),l=o(457);const u=(e,t,o)=>{const n=i.A.getters.credentials;if(null===n&&"adminLogin"!==e.name){const e=btoa("unset:unset");l.A.get("/api/manage/check",{headers:{Authorization:"Basic "+e},withCredentials:!0}).then(t=>{if(200!==t.status)throw new Error("认证失败!");i.A.commit("setCredentials",e),o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"adminLogin"})})}else o()},c=(e,t,o)=>{let n=s().get("authCode");null===n&&"login"!==e.name?l.A.post("/api/login",{authCode:"unset"}).then(e=>{if(200!==e.status)throw new Error("认证失败!");s().set("authCode","unset","14d"),n="unset",o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"login"})}):o()},d=[{path:"/",name:"home",component:()=>Promise.all([o.e(171),o.e(747)]).then(o.bind(o,3695)),beforeEnter:c},{path:"/login",name:"login",component:()=>Promise.all([o.e(171),o.e(672)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(239),o.e(482)]).then(o.bind(o,1482)),beforeEnter:u},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(239),o.e(419)]).then(o.bind(o,8419)),beforeEnter:u},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(239),o.e(32)]).then(o.bind(o,8032)),beforeEnter:u},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(171),o.e(698)]).then(o.bind(o,3950))},{path:"/blockimg",name:"blockimg",component:()=>o.e(917).then(o.bind(o,4917))},{path:"/whiteliston",name:"whiteliston",component:()=>o.e(845).then(o.bind(o,7226))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>o.e(760).then(o.bind(o,6760))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],p=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=p}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,o),a.exports}o.m=e,function(){var e=[];o.O=function(t,n,r,a){if(!n){var s=1/0;for(c=0;c=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[n,r,a]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce(function(t,n){return o.f[n](e,t),t},[]))}}(),function(){o.u=function(e){return"js/"+e+"."+{32:"a8086e01",171:"833208d0",226:"577ea134",239:"32572dba",419:"99e00aec",482:"e302adaf",672:"11bec4e1",698:"77f859a8",747:"51eee506",760:"a76249f2",845:"6b4cb4a5",917:"5bf3db27"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{32:"3ae41ed4",226:"6548e7b4",239:"6563616d",419:"1d235d6e",482:"f42e1415",672:"aed3581b",698:"aed3581b",747:"e115ba5f",760:"931b4535",845:"6b45e8e3",917:"8529ad1e"}[e]+".css"}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="sanyue_imghub:";o.l=function(n,r,a,s){if(e[n])e[n].push(r);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),c=0;c{if(e.withAuthCode){const t=a().get("authCode");t&&(e.headers["authCode"]=t)}return e},e=>Promise.reject(e)),l.interceptors.response.use(e=>e,e=>(e.config?.withAuthCode&&401===e.response?.status&&(i.nk.error("认证失败,请重新登录!"),s.A.push("/login")),Promise.reject(e))),t.A=l},3354:function(e,t,o){o(8111),o(7588);var n=o(5130),r=o(3888),a=o(4068),s=(o(9436),o(372),o(8950)),i=o(2353),l=o(292),u=o(6768);function c(e,t,o,n,r,a){const s=(0,u.g2)("router-view");return(0,u.uX)(),(0,u.Wv)(s)}var d=o(8401),p=o(3785),m={computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars()})},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return;(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setSiteIcon(){const e=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');e.forEach(e=>e.remove());const t=document.createElement("link"),o=document.createElement("link"),n=document.createElement("link");t.rel="icon",o.rel="apple-touch-icon",n.rel="mask-icon",this.useDarkMode?(t.href=this.userConfig?.siteIcon||"/logo-dark.png",o.href=this.userConfig?.siteIcon||"/logo-dark.png",n.href=this.userConfig?.siteIcon||"/logo-dark.png"):(t.href=this.userConfig?.siteIcon||"/logo.png",o.href=this.userConfig?.siteIcon||"/logo.png",n.href=this.userConfig?.siteIcon||"/logo.png"),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}}},f=o(1241);const h=(0,f.A)(m,[["render",c]]);var g=h,b=o(6915),k=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),v=(0,r.Zf)();C.component("font-awesome-icon",l.gc);for(const[M,E]of Object.entries(y))C.component(M,E);const A=()=>{const e=document.documentElement;let t;if(k.A.state.cusDarkMode&&null!==k.A.state.useDarkMode)t=k.A.state.useDarkMode;else{if(t=window.matchMedia("(prefers-color-scheme: dark)").matches,!t){const e=new Date,o=e.getHours();t=o>=22||o<6}k.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},U=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},w=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},S=(e,t)=>{const o=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');o.forEach(e=>e.remove());const n=document.createElement("link"),r=document.createElement("link"),a=document.createElement("link");n.rel="icon",r.rel="apple-touch-icon",a.rel="mask-icon",e?(n.href=t?.siteIcon||"/logo-dark.png",r.href=t?.siteIcon||"/logo-dark.png",a.href=t?.siteIcon||"/logo-dark.png"):(n.href=t?.siteIcon||"/logo.png",r.href=t?.siteIcon||"/logo.png",a.href=t?.siteIcon||"/logo.png"),document.head.appendChild(n),document.head.appendChild(r),document.head.appendChild(a)};k.A.dispatch("fetchUserConfig").then(()=>{A(),w(k.A.getters.userConfig),S(k.A.state.useDarkMode,k.A.getters.userConfig),k.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&k.A.state.cusDarkMode&&(U(t.useDarkMode),S(t.useDarkMode,k.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(k.A.state.useDarkMode,k.A.getters.userConfig))}),C.use(k.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(k.A).use(b.A).use(a.A).use(v).mount("#app")})},5507:function(e,t,o){o(8111),o(1701);var n=o(8401),r=o(457),a=o(5131);t.A=(0,n.y$)({state:{userConfig:null,bingWallPapers:[],credentials:null,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:!0,compressQuality:4,compressBar:5,serverCompress:!0},storeUploadChannel:"",storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.credentials,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,t){e.userConfig=t},setBingWallPapers(e,t){e.bingWallPapers=t},setCredentials(e,t){e.credentials=t},setUploadMethod(e,t){e.uploadMethod=t},setUploadCopyUrlForm(e,t){e.uploadCopyUrlForm=t},setCompressConfig(e,{key:t,value:o}){e.compressConfig[t]=o},setStoreUploadChannel(e,t){e.storeUploadChannel=t},setStoreUploadNameType(e,t){e.storeUploadNameType=t},setCustomUrlSettings(e,{key:t,value:o}){e.customUrlSettings[t]=o},setStoreAutoRetry(e,t){e.storeAutoRetry=t},setAdminUrlSettings(e,{key:t,value:o}){e.adminUrlSettings[t]=o},setUseDarkMode(e,t){e.useDarkMode=t},setCusDarkMode(e,t){e.cusDarkMode=t},setStoreUploadFolder(e,t){e.uploadFolder=t,localStorage.setItem("uploadFolder",t)},setStoreAutoReUpload(e,t){e.autoReUpload=t}},actions:{async fetchUserConfig({commit:e}){try{const t=await r.A.get("/api/userConfig");e("setUserConfig",t.data)}catch(t){console.log(t)}},async fetchBingWallPapers({commit:e}){try{const t=await r.A.get("/api/bing/wallpaper"),o=t.data.data,n=o.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(n.map(e=>new Promise((t,o)=>{const n=new Image;n.onload=t,n.onerror=o,n.src=e.url}))),e("setBingWallPapers",n)}catch(t){console.log(t)}}},modules:{},plugins:[(0,a.A)()]})},6915:function(e,t,o){o(4979);var n=o(8512),r=o(1219),a=o(4570),s=o.n(a),i=o(5507),l=o(457);const u=(e,t,o)=>{const n=i.A.getters.credentials;if(null===n&&"adminLogin"!==e.name){const e=btoa("unset:unset");l.A.get("/api/manage/check",{headers:{Authorization:"Basic "+e},withCredentials:!0}).then(t=>{if(200!==t.status)throw new Error("认证失败!");i.A.commit("setCredentials",e),o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"adminLogin"})})}else o()},c=(e,t,o)=>{let n=s().get("authCode");null===n&&"login"!==e.name?l.A.post("/api/login",{authCode:"unset"}).then(e=>{if(200!==e.status)throw new Error("认证失败!");s().set("authCode","unset","14d"),n="unset",o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"login"})}):o()},d=[{path:"/",name:"home",component:()=>Promise.all([o.e(171),o.e(747)]).then(o.bind(o,3695)),beforeEnter:c},{path:"/login",name:"login",component:()=>Promise.all([o.e(171),o.e(672)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(239),o.e(482)]).then(o.bind(o,1482)),beforeEnter:u},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(239),o.e(419)]).then(o.bind(o,8419)),beforeEnter:u},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(239),o.e(32)]).then(o.bind(o,8032)),beforeEnter:u},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(171),o.e(698)]).then(o.bind(o,3950))},{path:"/blockimg",name:"blockimg",component:()=>o.e(917).then(o.bind(o,4917))},{path:"/whiteliston",name:"whiteliston",component:()=>o.e(845).then(o.bind(o,7226))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>o.e(262).then(o.bind(o,3262))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],p=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=p}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,o),a.exports}o.m=e,function(){var e=[];o.O=function(t,n,r,a){if(!n){var s=1/0;for(c=0;c=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[n,r,a]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce(function(t,n){return o.f[n](e,t),t},[]))}}(),function(){o.u=function(e){return"js/"+e+"."+{32:"a8086e01",171:"833208d0",226:"577ea134",239:"32572dba",262:"ba4d4b57",419:"99e00aec",482:"e302adaf",672:"11bec4e1",698:"77f859a8",747:"51eee506",845:"6b4cb4a5",917:"5bf3db27"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{32:"3ae41ed4",226:"6548e7b4",239:"6563616d",262:"033670d0",419:"1d235d6e",482:"f42e1415",672:"aed3581b",698:"aed3581b",747:"e115ba5f",845:"6b45e8e3",917:"8529ad1e"}[e]+".css"}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="sanyue_imghub:";o.l=function(n,r,a,s){if(e[n])e[n].push(r);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),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 bRzbfv=(GoyN${m(v5KbdX=rI5Q_*aSk literal 0 HcmV?d00001 diff --git a/js/app.2ba98dec.js.map b/js/app.6573279d.js.map similarity index 98% rename from js/app.2ba98dec.js.map rename to js/app.6573279d.js.map index fb54844..3f5b789 100644 --- a/js/app.2ba98dec.js.map +++ b/js/app.6573279d.js.map @@ -1 +1 @@ -{"version":3,"file":"js/app.2ba98dec.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?0365","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\nimport cookies from 'vue-cookies';\r\nimport router from '@/router/index';\r\nimport { ElMessage } from 'element-plus'\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n});\r\n\r\n// 请求拦截器\r\ninstance.interceptors.request.use(\r\n (config) => {\r\n // 如果配置中标记了withAuthCode,则添加authCode到header\r\n if (config.withAuthCode) {\r\n const authCode = cookies.get('authCode');\r\n if (authCode) {\r\n config.headers['authCode'] = authCode;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// 响应拦截器\r\ninstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n // 如果请求配置了withAuthCode且返回401,则跳转到登录页\r\n if (error.config?.withAuthCode && error.response?.status === 401) {\r\n ElMessage.error('认证失败,请重新登录!');\r\n router.push('/login');\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default instance;\r\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n return _openBlock(), _createBlock(_component_router_view);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nexport default {\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n });\n },\n watch: {\n useDarkMode() {\n this.setSiteIcon();\n }\n },\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setSiteIcon() {\n // 同时更改 icon apple-touch-icon 和 mask-icon\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\n existingIcons.forEach(icon => icon.remove());\n const iconLink = document.createElement('link');\n const appleIconLink = document.createElement('link');\n const maskIconLink = document.createElement('link');\n iconLink.rel = 'icon';\n appleIconLink.rel = 'apple-touch-icon';\n maskIconLink.rel = 'mask-icon';\n if (this.useDarkMode) {\n iconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n } else {\n iconLink.href = this.userConfig?.siteIcon || '/logo.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n }\n document.head.appendChild(iconLink);\n document.head.appendChild(appleIconLink);\n document.head.appendChild(maskIconLink);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=7d6c298a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7d6c298a&lang=css\"\nimport \"./App.vue?vue&type=style&index=1&id=7d6c298a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(head).mount('#app');\r\n})\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n credentials: null,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: true,\r\n compressQuality: 4,\r\n compressBar: 5,\r\n serverCompress: true,\r\n },\r\n storeUploadChannel: '',\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n credentials: state => state.credentials,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setCredentials(state, credentials) {\r\n state.credentials = credentials;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState()]\r\n})\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport cookies from 'vue-cookies'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n // 从store中获取凭据\r\n const credentials = store.getters.credentials\r\n if (credentials === null && to.name !== 'adminLogin') {\r\n // 尝试未设置密码的情况\r\n const credentials = btoa('unset:unset')\r\n axios.get('/api/manage/check', {\r\n headers: {\r\n 'Authorization': 'Basic ' + credentials\r\n },\r\n withCredentials: true\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n store.commit('setCredentials', credentials)\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'adminLogin' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n let authCode = cookies.get('authCode');\r\n if (authCode === null && to.name !== 'login') {\r\n // 尝试未设置密码的情况\r\n axios.post('/api/login', {\r\n authCode: 'unset'\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n cookies.set('authCode', 'unset', '14d')\r\n authCode = 'unset'\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'login' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"32\":\"a8086e01\",\"171\":\"833208d0\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"419\":\"99e00aec\",\"482\":\"e302adaf\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"747\":\"51eee506\",\"760\":\"a76249f2\",\"845\":\"6b4cb4a5\",\"917\":\"5bf3db27\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"32\":\"3ae41ed4\",\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"419\":\"1d235d6e\",\"482\":\"f42e1415\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"747\":\"e115ba5f\",\"760\":\"931b4535\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"32\":1,\"226\":1,\"239\":1,\"419\":1,\"482\":1,\"672\":1,\"698\":1,\"747\":1,\"760\":1,\"845\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(3354); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","interceptors","request","use","config","withAuthCode","authCode","cookies","headers","error","Promise","reject","response","status","ElMessage","router","push","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","computed","mounted","this","$nextTick","initOverlayScrollbars","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","existingIcons","querySelectorAll","forEach","icon","remove","iconLink","createElement","appleIconLink","maskIconLink","rel","href","userConfig","siteIcon","head","appendChild","__exports__","library","add","fas","app","createApp","App","createHead","component","FontAwesomeIcon","key","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","documentElement","isDarkMode","store","state","cusDarkMode","window","matchMedia","matches","now","Date","hour","getHours","commit","classList","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","dispatch","then","getters","subscribe","mutation","type","payload","ElementPlus","mount","catch","createStore","bingWallPapers","credentials","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","compressQuality","compressBar","serverCompress","storeUploadChannel","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","data","fetchBingWallPapers","wallpapers","map","wallpaper","url","all","resolve","img","Image","onload","onerror","src","modules","plugins","createPersistedState","adminAuthGuard","to","from","next","name","btoa","withCredentials","res","Error","err","userAuthGuard","post","routes","path","beforeEnter","createRouter","history","createWebHistory","process","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","code","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.6573279d.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?0365","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\nimport cookies from 'vue-cookies';\r\nimport router from '@/router/index';\r\nimport { ElMessage } from 'element-plus'\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n});\r\n\r\n// 请求拦截器\r\ninstance.interceptors.request.use(\r\n (config) => {\r\n // 如果配置中标记了withAuthCode,则添加authCode到header\r\n if (config.withAuthCode) {\r\n const authCode = cookies.get('authCode');\r\n if (authCode) {\r\n config.headers['authCode'] = authCode;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// 响应拦截器\r\ninstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n // 如果请求配置了withAuthCode且返回401,则跳转到登录页\r\n if (error.config?.withAuthCode && error.response?.status === 401) {\r\n ElMessage.error('认证失败,请重新登录!');\r\n router.push('/login');\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default instance;\r\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n return _openBlock(), _createBlock(_component_router_view);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nexport default {\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n });\n },\n watch: {\n useDarkMode() {\n this.setSiteIcon();\n }\n },\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setSiteIcon() {\n // 同时更改 icon apple-touch-icon 和 mask-icon\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\n existingIcons.forEach(icon => icon.remove());\n const iconLink = document.createElement('link');\n const appleIconLink = document.createElement('link');\n const maskIconLink = document.createElement('link');\n iconLink.rel = 'icon';\n appleIconLink.rel = 'apple-touch-icon';\n maskIconLink.rel = 'mask-icon';\n if (this.useDarkMode) {\n iconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n } else {\n iconLink.href = this.userConfig?.siteIcon || '/logo.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n }\n document.head.appendChild(iconLink);\n document.head.appendChild(appleIconLink);\n document.head.appendChild(maskIconLink);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=7d6c298a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7d6c298a&lang=css\"\nimport \"./App.vue?vue&type=style&index=1&id=7d6c298a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(head).mount('#app');\r\n})\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n credentials: null,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: true,\r\n compressQuality: 4,\r\n compressBar: 5,\r\n serverCompress: true,\r\n },\r\n storeUploadChannel: '',\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n credentials: state => state.credentials,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setCredentials(state, credentials) {\r\n state.credentials = credentials;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState()]\r\n})\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport cookies from 'vue-cookies'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n // 从store中获取凭据\r\n const credentials = store.getters.credentials\r\n if (credentials === null && to.name !== 'adminLogin') {\r\n // 尝试未设置密码的情况\r\n const credentials = btoa('unset:unset')\r\n axios.get('/api/manage/check', {\r\n headers: {\r\n 'Authorization': 'Basic ' + credentials\r\n },\r\n withCredentials: true\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n store.commit('setCredentials', credentials)\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'adminLogin' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n let authCode = cookies.get('authCode');\r\n if (authCode === null && to.name !== 'login') {\r\n // 尝试未设置密码的情况\r\n axios.post('/api/login', {\r\n authCode: 'unset'\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n cookies.set('authCode', 'unset', '14d')\r\n authCode = 'unset'\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'login' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"32\":\"a8086e01\",\"171\":\"833208d0\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"262\":\"ba4d4b57\",\"419\":\"99e00aec\",\"482\":\"e302adaf\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"747\":\"51eee506\",\"845\":\"6b4cb4a5\",\"917\":\"5bf3db27\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"32\":\"3ae41ed4\",\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"262\":\"033670d0\",\"419\":\"1d235d6e\",\"482\":\"f42e1415\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"747\":\"e115ba5f\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"32\":1,\"226\":1,\"239\":1,\"262\":1,\"419\":1,\"482\":1,\"672\":1,\"698\":1,\"747\":1,\"845\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(3354); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","interceptors","request","use","config","withAuthCode","authCode","cookies","headers","error","Promise","reject","response","status","ElMessage","router","push","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","computed","mounted","this","$nextTick","initOverlayScrollbars","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","existingIcons","querySelectorAll","forEach","icon","remove","iconLink","createElement","appleIconLink","maskIconLink","rel","href","userConfig","siteIcon","head","appendChild","__exports__","library","add","fas","app","createApp","App","createHead","component","FontAwesomeIcon","key","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","documentElement","isDarkMode","store","state","cusDarkMode","window","matchMedia","matches","now","Date","hour","getHours","commit","classList","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","dispatch","then","getters","subscribe","mutation","type","payload","ElementPlus","mount","catch","createStore","bingWallPapers","credentials","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","compressQuality","compressBar","serverCompress","storeUploadChannel","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","data","fetchBingWallPapers","wallpapers","map","wallpaper","url","all","resolve","img","Image","onload","onerror","src","modules","plugins","createPersistedState","adminAuthGuard","to","from","next","name","btoa","withCredentials","res","Error","err","userAuthGuard","post","routes","path","beforeEnter","createRouter","history","createWebHistory","process","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","code","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/app.6573279d.js.map.gz b/js/app.6573279d.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..efd3019132e8a7306793f281a36a3c82c9511ff2 GIT binary patch literal 15258 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