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 0000000..811718a Binary files /dev/null and b/css/262.033670d0.css.gz differ 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 0bc5d99..0000000 Binary files a/css/760.931b4535.css.gz and /dev/null differ 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 1c15b36..c286dbd 100644 Binary files a/index.html.gz and b/index.html.gz differ 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 0000000..ee33342 Binary files /dev/null and b/js/262.ba4d4b57.js.gz differ diff --git a/js/262.ba4d4b57.js.map b/js/262.ba4d4b57.js.map new file mode 100644 index 0000000..be6b2b9 --- /dev/null +++ b/js/262.ba4d4b57.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/262.ba4d4b57.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/TransformMedia.vue?9dda","webpack://sanyue_imghub/./src/components/TransformMedia.vue","webpack://sanyue_imghub/./src/components/TransformMedia.vue?c392","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?f366","webpack://sanyue_imghub/./src/views/PublicBrowse.vue","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?bab5"],"sourcesContent":["import { normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers } from \"vue\";\nconst _hoisted_1 = [\"src\"];\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n class: \"audio-cover\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = {\n key: 1,\n class: \"audio-icon-large\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n};\nconst _hoisted_6 = {\n class: \"audio-info\"\n};\nconst _hoisted_7 = {\n class: \"audio-title\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"audio-artist\"\n};\nconst _hoisted_9 = {\n class: \"audio-controls\"\n};\nconst _hoisted_10 = {\n key: 0,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n};\nconst _hoisted_11 = {\n key: 1,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n};\nconst _hoisted_12 = {\n class: \"progress-bar\"\n};\nconst _hoisted_13 = {\n class: \"time-display\"\n};\nconst _hoisted_14 = [\"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"tm-viewport\",\n ref: \"viewport\",\n onPointerdown: _cache[8] || (_cache[8] = (...args) => $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 0000000..817f055 Binary files /dev/null and b/js/262.ba4d4b57.js.map.gz differ diff --git a/js/760.a76249f2.js b/js/760.a76249f2.js deleted file mode 100644 index cbc7cc9..0000000 --- a/js/760.a76249f2.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[760],{6760:function(e,t,i){i.r(t),i.d(t,{default:function(){return G}});var s=i(6768),o=i(5130),r=i(4232);const n=["src"],a=["src"],l={key:2,class:"tm-audio"},h=["src"];function c(e,t,i,c,d,u){return(0,s.uX)(),(0,s.CE)("div",{class:"tm-viewport",ref:"viewport",onPointerdown:t[1]||(t[1]=(...e)=>u.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 cf42767..0000000 Binary files a/js/760.a76249f2.js.gz and /dev/null differ diff --git a/js/760.a76249f2.js.map b/js/760.a76249f2.js.map deleted file mode 100644 index 9a30c9a..0000000 --- a/js/760.a76249f2.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/760.a76249f2.js","mappings":"wMACA,MAAMA,EAAa,CAAC,OACdC,EAAa,CAAC,OACdC,EAAa,CACjBC,IAAK,EACLC,MAAO,YAEHC,EAAa,CAAC,OACb,SAASC,EAAOC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,OAAO,WAAc,QAAoB,MAAO,CAC9CR,MAAO,cACPS,IAAK,WACLC,cAAeN,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASI,eAAiBJ,EAASI,iBAAiBD,IAC1GE,cAAeT,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASM,eAAiBN,EAASM,iBAAiBH,IAC1GI,YAAaX,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASQ,aAAeR,EAASQ,eAAeL,IACpGM,gBAAiBb,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASQ,aAAeR,EAASQ,eAAeL,IACxGO,WAAYd,EAAO,KAAOA,EAAO,IAAK,QAAe,IAAIO,IAASH,EAASW,YAAcX,EAASW,cAAcR,GAAO,CAAC,cACvH,CAACN,EAAOe,UAAW,WAAc,QAAoB,MAAO,CAC7DrB,IAAK,EACLC,MAAO,WACPqB,IAAKhB,EAAOgB,IACZC,UAAW,QACXC,OAAO,QAAgBf,EAASgB,YAChCC,OAAQrB,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASiB,QAAUjB,EAASiB,UAAUd,KACpF,KAAM,GAAIf,IAAeS,EAAOqB,UAAW,WAAc,QAAoB,QAAS,CACvF3B,IAAK,EACLC,MAAO,WACPqB,IAAKhB,EAAOgB,IACZM,SAAU,GACVC,SAAU,GACVC,YAAa,GACbN,OAAO,QAAgBf,EAASgB,aAC/B,KAAM,GAAI3B,IAAeQ,EAAOyB,UAAW,WAAc,QAAoB,MAAOhC,EAAY,CAACM,EAAO,KAAOA,EAAO,IAAK,QAAoB,MAAO,CACvJJ,MAAO,mBACP+B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,4FACC,KAAK,QAAoB,QAAS,CACtCZ,IAAKhB,EAAOgB,IACZM,SAAU,GACVC,SAAU,GACV5B,MAAO,gBACN,KAAM,EAAGC,OAAiB,QAAoB,IAAI,IAAQ,IAC/D,CC5CA,OACEiC,KAAM,iBACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,UAAU,GAEZlB,IAAK,CACHgB,KAAMG,OACND,UAAU,GAEZnB,QAAS,CACPiB,KAAMI,QACNC,SAAS,GAEXhB,QAAS,CACPW,KAAMI,QACNC,SAAS,GAEXZ,QAAS,CACPO,KAAMI,QACNC,SAAS,IAGb,IAAAC,GACE,MAAO,CACLC,SAAU,IAAIC,IAEdC,MAAO,EACPC,SAAU,EAEVC,cAAe,EAEfC,GAAI,EACJC,GAAI,EAEJC,aAAc,EACdC,cAAe,EAEfC,WAAY,EACZC,cAAe,EACfC,QAAS,EACTC,QAAS,EACTC,YAAa,KACbC,UAAW,EACXC,WAAY,EAEZC,UAAU,EACVC,UAAW,KACXC,aAAc,KAEdC,SAAU,EACVC,SAAU,EAEVC,YAAa,KAEbC,aAAc,EAEdC,QAAS,EAEb,EACAC,SAAU,CACR,iBAAAC,GACE,OAAOC,KAAKxB,MAAQ,OAASwB,KAAK1B,SAAS2B,MAAQ,GAAKD,KAAKV,QAC/D,EAEA,eAAAY,GACE,OAAOF,KAAKvB,SAAWuB,KAAKtB,aAC9B,EAEA,YAAAyB,GACE,MAAMC,EAAIC,KAAKC,IAAI,EAAGD,KAAKE,IAAIP,KAAKtB,eAAiB,IAC/C8B,EAAIH,KAAKI,IAAIJ,KAAKK,GAAKN,GAC7B,OAAO,EAAI,IAAOI,CACpB,EACA,UAAAtD,GACE,MAAMyD,EAAaX,KAAKxB,MAAQwB,KAAKG,aAC/BS,EAAYZ,KAAK1B,SAAS2B,KAAO,EACvC,MAAO,CACLY,UAAW,eAAeb,KAAKrB,SAASqB,KAAKpB,kBAAkB+B,aAAsBX,KAAKE,sBAC1FY,WAAYF,EAAY,OAAS,uBACjCG,gBAAiB,gBAErB,GAEFC,MAAO,CACL,iBAAAjB,CAAkBkB,GAChBjB,KAAKkB,MAAMD,EAAI,OAAS,SAC1B,GAEFE,QAAS,CACP,MAAAhE,CAAOiE,GAEL,MAAMC,EAAMD,EAAEE,OACdtB,KAAKnB,aAAewC,EAAIxC,aACxBmB,KAAKlB,cAAgBuC,EAAIvC,aAC3B,EACA,KAAAyC,GACEvB,KAAKxB,MAAQ,EACbwB,KAAKvB,SAAW,EAChBuB,KAAKtB,cAAgB,EACrBsB,KAAKrB,GAAK,EACVqB,KAAKpB,GAAK,EACVoB,KAAK1B,SAASkD,QACdxB,KAAKV,UAAW,EAChBU,KAAKJ,aAAe,EACpBI,KAAKH,QAAU,EACfG,KAAKkB,MAAM,SACb,EACA,KAAAO,CAAMR,EAAGX,EAAKoB,GACZ,OAAOrB,KAAKqB,IAAIpB,EAAKD,KAAKC,IAAIoB,EAAKT,GACrC,EAEA,UAAAU,CAAWC,EAAUC,EAAWC,EAAW,KACzC,OAAOF,EAAWC,EAAYC,GAAYD,EAAYC,EAAWF,EACnE,EACA,eAAAG,GACE,OAAO/B,KAAKgC,MAAMC,UAAUC,uBAC9B,EAEA,YAAAC,GACE,MAAMC,EAAOpC,KAAKgC,MAAMC,UAAUC,wBAClC,IAAKE,EAAM,MAAO,CAChBC,KAAM,EACNC,KAAM,EACNC,GAAI,EACJC,GAAI,GAEN,MAAMD,EAAKH,EAAKK,MACdD,EAAKJ,EAAKM,OACNrB,EAAMrB,KAAK2C,IAAIC,cAAc,cACnC,IAAIC,EAAKxB,GAAKyB,aAAeP,EACzBQ,EAAK1B,GAAK2B,cAAgBR,EAG9B,MAAMS,EAAMjD,KAAKvB,SAAW,IAChB,KAARwE,GAAsB,MAARA,KACfJ,EAAIE,GAAM,CAACA,EAAIF,IAElB,MAAMK,EAAKL,EAAK7C,KAAKxB,MACf2E,EAAKJ,EAAK/C,KAAKxB,MACf6D,EAAOhC,KAAKqB,IAAI,GAAIwB,EAAKX,GAAM,GAC/BD,EAAOjC,KAAKqB,IAAI,GAAIyB,EAAKX,GAAM,GACrC,MAAO,CACLH,OACAC,OACAC,KACAC,KAEJ,EAEA,oBAAAY,CAAqBC,EAAO3B,EAAKG,GAC/B,OAAIwB,EAAQ3B,EACHA,EAAM1B,KAAK2B,WAAW0B,EAAQ3B,EAAKG,EAAW,KAEnDwB,GAAS3B,GACHA,EAAM1B,KAAK2B,YAAYD,EAAM2B,EAAOxB,EAAW,KAElDwB,CACT,EACA,cAAAC,GACcC,MAAMC,KAAKxD,KAAK1B,SAASmF,UAArC,MAEMC,EAASH,MAAMC,KAAKxD,KAAK1B,SAASqF,WAAWC,KAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,IACrEC,EAAKL,EAAO,GAAG,GACnBM,EAAKN,EAAO,GAAG,GACXO,EAAKD,EAAGE,EAAIH,EAAGG,EACfC,EAAKH,EAAGI,EAAIL,EAAGK,EACfC,EAAOhE,KAAKiE,MAAML,EAAIE,GACtBI,EAAQlE,KAAKmE,MAAML,EAAIF,IAAO,IAAM5D,KAAKK,IACzC+D,EAAS,CACbP,GAAIH,EAAGG,EAAIF,EAAGE,GAAK,EACnBE,GAAIL,EAAGK,EAAIJ,EAAGI,GAAK,GAErB,MAAO,CACLC,OACAE,QACAE,SAEJ,EAEA,cAAAC,CAAeC,GAEb,OADAA,GAAOA,EAAM,IAAM,KAAO,IACnBA,EAAM,IAAMA,EAAM,IAAMA,CACjC,EACA,aAAArI,CAAc8E,GASZ,GARAA,EAAEwD,cAAcC,oBAAoBzD,EAAE0D,WACtC9E,KAAKR,aAAeQ,KAAK+B,kBACzB/B,KAAK1B,SAASyG,IAAI3D,EAAE0D,UAAW,CAC7BZ,EAAG9C,EAAE4D,QACLZ,EAAGhD,EAAE6D,UAIoB,IAAvBjF,KAAK1B,SAAS2B,KAAY,CAC5B,MAAM,KACJoE,EAAI,MACJE,EAAK,OACLE,GACEzE,KAAKsD,iBAWT,OAVAtD,KAAKZ,UAAYiF,EACjBrE,KAAKX,WAAakF,EAClBvE,KAAKb,YAAcsF,EACnBzE,KAAKjB,WAAaiB,KAAKxB,MACvBwB,KAAKhB,cAAgBgB,KAAKvB,SAC1BuB,KAAKf,QAAUe,KAAKrB,GACpBqB,KAAKd,QAAUc,KAAKpB,GACpBoB,KAAKV,UAAW,EAChBU,KAAKL,YAAc,UACnBK,KAAKtB,cAAgB,EAEvB,CAGIsB,KAAKxB,MAAQ,QACfwB,KAAKV,UAAW,EAChBU,KAAKT,UAAY,CACf2E,EAAG9C,EAAE4D,QACLZ,EAAGhD,EAAE6D,SAEPjF,KAAKf,QAAUe,KAAKrB,GACpBqB,KAAKd,QAAUc,KAAKpB,GAExB,EACA,aAAApC,CAAc4E,GACZ,GAAKpB,KAAK1B,SAAS4G,IAAI9D,EAAE0D,WAAzB,CAOA,GANA9E,KAAK1B,SAASyG,IAAI3D,EAAE0D,UAAW,CAC7BZ,EAAG9C,EAAE4D,QACLZ,EAAGhD,EAAE6D,UAIoB,IAAvBjF,KAAK1B,SAAS2B,KAAY,CAC5BmB,EAAE+D,iBACF,MAAM,KACJd,EAAI,MACJE,EAAK,OACLE,GACEzE,KAAKsD,iBACH8B,EAAcf,GAAQrE,KAAKZ,WAAaiF,GACxCgB,EAAchF,KAAKE,IAAI6E,EAAc,GACrCE,EAAatF,KAAK0E,eAAeH,EAAQvE,KAAKX,YAC9CkG,EAAclF,KAAKE,IAAI+E,GAGvBE,EAAiB,EACjBC,EAAkB,IAIxB,IAAKzF,KAAKL,YACR,GAAI4F,GAAeC,EACjBxF,KAAKL,YAAc,aACd,MAAI0F,GAAeI,GAGxB,OAFAzF,KAAKL,YAAc,OAGrB,CAIF,GAAyB,WAArBK,KAAKL,YAGP,OAFAK,KAAKxB,MAAQwB,KAAKjB,gBAClBiB,KAAKtB,cAAgBsB,KAAKyB,MAAM6D,GAAa,GAAI,KAWnD,GANyB,UAArBtF,KAAKL,cACPK,KAAKxB,MAAQwB,KAAKyB,MAAMzB,KAAKjB,WAAaqG,EAAapF,KAAKP,SAAUO,KAAKN,UAC3EM,KAAKtB,cAAgB,GAInBsB,KAAKb,aAAea,KAAKR,aAAc,CACzC,MAAMkG,EAAM1F,KAAKb,YAAY+E,EAAIlE,KAAKR,aAAamG,KAAO3F,KAAKR,aAAaiD,MAAQ,EAC9EmD,EAAM5F,KAAKb,YAAYiF,EAAIpE,KAAKR,aAAaqG,IAAM7F,KAAKR,aAAakD,OAAS,EAC9EoD,EAAMrB,EAAOP,EAAIlE,KAAKR,aAAamG,KAAO3F,KAAKR,aAAaiD,MAAQ,EACpEsD,EAAMtB,EAAOL,EAAIpE,KAAKR,aAAaqG,IAAM7F,KAAKR,aAAakD,OAAS,EAC1E1C,KAAKrB,GAAKqB,KAAKf,SAAW6G,EAAMJ,GAChC1F,KAAKpB,GAAKoB,KAAKd,SAAW6G,EAAMH,EAClC,CACA,MACF,CAGA,GAAI5F,KAAKV,UAAYU,KAAKxB,MAAQ,MAAO,CACvC4C,EAAE+D,iBACF,MAAMlB,EAAK7C,EAAE4D,QAAUhF,KAAKT,UAAU2E,EAChCC,EAAK/C,EAAE6D,QAAUjF,KAAKT,UAAU6E,EAChC4B,EAAOhG,KAAKf,QAAUgF,EACtBgC,EAAOjG,KAAKd,QAAUiF,GACtB,KACJ9B,EAAI,KACJC,EAAI,GACJC,EAAE,GACFC,GACExC,KAAKmC,eAGT,IAAI+D,EAAW,EACXC,EAAM,EACNH,EAAO3D,GACT6D,EAAWF,EAAO3D,EAClB8D,GAAO,GACEH,GAAQ3D,IACjB6D,GAAY7D,EAAO2D,EACnBG,EAAM,GAIRnG,KAAKJ,aAAesG,EACpBlG,KAAKH,QAAUsG,EACfnG,KAAKrB,GAAKqB,KAAKoD,qBAAqB4C,EAAM3D,EAAME,GAChDvC,KAAKpB,GAAKoB,KAAKoD,qBAAqB6C,EAAM3D,EAAME,EAClD,CA1F2C,CA2F7C,EACA,WAAA9F,CAAY0E,GAcV,GAbIpB,KAAK1B,SAAS4G,IAAI9D,EAAE0D,YAAY9E,KAAK1B,SAAS8H,OAAOhF,EAAE0D,WAGvD9E,KAAK1B,SAAS2B,KAAO,GAA0B,WAArBD,KAAKL,cACjCK,KAAKqG,eACLrG,KAAKL,YAAc,MAEjBK,KAAK1B,SAAS2B,KAAO,IACvBD,KAAKb,YAAc,KACnBa,KAAKZ,UAAY,EACjBY,KAAKX,WAAa,EAClBW,KAAKL,YAAc,MAEM,IAAvBK,KAAK1B,SAAS2B,KAAY,CAI5B,GAHAD,KAAKV,UAAW,EAGZU,KAAKJ,aAAe,IAAuB,IAAjBI,KAAKH,QAAe,CAChD,MAAMsG,EAAMnG,KAAKH,QAIjB,OAFAG,KAAKuB,aACLvB,KAAKkB,MAAM,aAAciF,EAE3B,CAKA,GAJAnG,KAAKJ,aAAe,EACpBI,KAAKH,QAAU,EAGXG,KAAKxB,OAAS,MAChBwB,KAAKxB,MAAQ,EACbwB,KAAKrB,GAAK,EACVqB,KAAKpB,GAAK,MACL,CAEL,MAAM,KACJyD,EAAI,KACJC,GACEtC,KAAKmC,eACTnC,KAAKrB,GAAK0B,KAAKqB,KAAKW,EAAMhC,KAAKC,IAAI+B,EAAMrC,KAAKrB,KAC9CqB,KAAKpB,GAAKyB,KAAKqB,KAAKY,EAAMjC,KAAKC,IAAIgC,EAAMtC,KAAKpB,IAChD,CACF,CACF,EAEA,YAAAyH,GACE,MAAM1I,EAAIqC,KAAKtB,cACT4H,EAAY,GAElB,IAAIhF,EAAS,EACTjB,KAAKE,IAAI5C,IAAM2I,IACjBhF,EAAS3D,EAAI,EAAI,IAAM,IAIzB,MAAM4I,IAAWvG,KAAKvB,SAAW6C,GAAU,IAAM,KAAO,IAGxDtB,KAAKvB,SAAW8H,EAChBvG,KAAKtB,cAAgB,EAGrBsB,KAAKwG,iBACP,EAEA,eAAAA,GACE,MAAMvD,EAAMjD,KAAKvB,SAAW,IACtBgI,EAAoB,KAARxD,GAAsB,MAARA,EAC5BwD,GAEFzG,KAAKxB,MAAQ,EACbwB,KAAKrB,GAAK,EACVqB,KAAKpB,GAAK,IAGVoB,KAAKxB,MAAQ,EACbwB,KAAKrB,GAAK,EACVqB,KAAKpB,GAAK,EAEd,EACA,UAAA/B,GACMmD,KAAKxB,MAAQ,OACfwB,KAAKxB,MAAQ,EACbwB,KAAKrB,GAAK,EACVqB,KAAKpB,GAAK,GAEVoB,KAAKxB,MAAQ,CAEjB,I,UC9YJ,MAAMkI,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS9K,GAAQ,CAAC,YAAY,qBAEzF,QCRA,MAAM,EAAa,CACjBF,MAAO,UAEH,EAAa,CACjBA,MAAO,eAEH,EAAa,CACjBA,MAAO,iBAEH,EAAa,CACjBA,MAAO,cAEHiL,EAAa,CAAC,WACdC,EAAa,CACjBlL,MAAO,gBAEHmL,EAAa,CACjBnL,MAAO,cAEHoL,EAAa,CACjBrL,IAAK,EACLC,MAAO,qBAEHqL,EAAa,CACjBtL,IAAK,EACLC,MAAO,mBAEHsL,EAAc,CAClBvL,IAAK,EACLC,MAAO,oBACPS,IAAK,oBAED8K,EAAc,CAClBxL,IAAK,EACLC,MAAO,mBAEHwL,EAAc,CAClBxL,MAAO,gBAEHyL,EAAc,CAAC,WACfC,EAAc,CAClB1L,MAAO,eAEH2L,EAAc,CAClB3L,MAAO,YACPS,IAAK,aAEDmL,EAAc,CAAC,WACfC,EAAc,CAAC,MAAO,MAAO,UAC7BC,EAAc,CAAC,MAAO,oBACtBC,EAAc,CAClB/L,MAAO,cAEHgM,EAAc,CAClBjM,IAAK,EACLC,MAAO,oBAEHiM,EAAc,CAClBjM,MAAO,WAEHkM,EAAc,CAClBlM,MAAO,mBAEHmM,EAAc,CAAC,WACfC,EAAc,CAAC,WACfC,EAAc,CAClB5L,IAAK,cACLT,MAAO,gBAEHsM,EAAc,CAClBvM,IAAK,EACLC,MAAO,gBAEHuM,EAAc,CAClBxM,IAAK,EACLC,MAAO,WAEHwM,EAAc,CAClBzM,IAAK,EACLC,MAAO,cACPyM,KAAM,oCACN7G,OAAQ,SACR8G,IAAK,YAEDC,EAAc,CAAC,OACfC,EAAc,CAAC,OACfC,EAAc,CAClB7M,MAAO,kBAEF,SAAS,EAAOG,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,GAC1D,MAAMsM,EAA4B,EAClC,OAAO,WAAc,QAAoB,MAAO,CAC9C9M,OAAO,QAAgB,CAAC,gBAAiB,CACvC,aAAcO,EAAMwM,gBAErB,EAAC,QAAoB,SAAU,EAAY,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAoB,OAAQ,CACjH/M,MAAO,OACPgN,QAAS5M,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASyM,aAAezM,EAASyM,eAAetM,IAChGuM,MAAO,WACN,QAAiB1M,EAAS2M,UAAW,MAAM,QAAoB,MAAO,EAAY,EAAC,QAAoB,MAAO,EAAY,EAAC,QAAoB,OAAQ,CACxJnN,MAAO,kBACPgN,QAAS5M,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAAS4M,UAAY5M,EAAS4M,YAAYzM,MACzF,QAAiBH,EAAS6M,aAAc,KAAK,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY7M,EAAS8M,UAAW,CAACC,EAAMC,MACrI,WAAc,QAAoB,KAAW,CAClDzN,IAAKyN,GACJ,CAACpN,EAAO,MAAQA,EAAO,KAAM,QAAoB,OAAQ,CAC1DJ,MAAO,kBACN,KAAM,KAAK,QAAoB,OAAQ,CACxCA,MAAO,kBACPgN,QAASS,GAAUjN,EAASkN,SAASF,KACpC,QAAiBD,GAAO,EAAGtC,IAAc,MAC1C,WAAW,QAAoB,MAAOC,EAAY,EAAC,QAAoB,OAAQC,GAAY,QAAiB5K,EAAMoN,YAAc,OAAQ,OAAQpN,EAAMqN,SAAkC,IAAvBrN,EAAMsN,MAAMC,SAAgB,WAAc,QAAoB,MAAO1C,EAAY,IAAKhL,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CACjTJ,MAAO,mBACN,MAAO,IAAI,QAAoB,IAAK,KAAM,UAAW,QAAWO,EAAMwN,QAAS,WAAc,QAAoB,MAAO1C,EAAY,EAAC,QAAoB,IAAK,MAAM,QAAiB9K,EAAMwN,OAAQ,GAAIxN,EAAMyN,WAAY,WAAc,QAAoB,SAAU,CACtQjO,IAAK,EACLiN,QAAS5M,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASyN,WAAazN,EAASyN,aAAatN,IAC5FX,MAAO,aACN,QAAS,QAAoB,IAAI,QAAY,WAAc,QAAoB,MAAOsL,EAAa,CAAC9K,EAAS0N,QAAQJ,OAAS,IAAK,WAAc,QAAoB,MAAOvC,EAAa,EAAC,QAAoB,MAAOC,EAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYhL,EAAS0N,QAASC,KACnT,WAAc,QAAoB,MAAO,CAC9CpO,IAAKoO,EAAOjM,KACZlC,MAAO,cACPgN,QAASS,GAAUjN,EAAS4N,YAAYD,EAAOjM,OAC9C,CAAC9B,EAAO,MAAQA,EAAO,KAAM,QAAoB,MAAO,CACzDJ,MAAO,eACN,EAAC,QAAoB,MAAO,CAC7B+B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,6FACG,KAAK,QAAoB,OAAQyJ,GAAa,QAAiBlL,EAAS6N,cAAcF,EAAOjM,OAAQ,IAAK,EAAGuJ,KACnH,YAAa,QAAoB,IAAI,IAAO,QAAoB,MAAOE,EAAa,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYnL,EAAS8N,QAAS,CAACC,EAAQC,MAC/K,WAAc,QAAoB,MAAO,CAC9CzO,IAAKyO,EACLxO,MAAO,oBACN,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYuO,EAAQnM,KACvE,WAAc,QAAoB,MAAO,CAC9CrC,IAAKqC,EAAKF,KACVlC,MAAO,iBACPgN,QAASS,GAAUjN,EAASiO,YAAYrM,IACvC,EAAC,QAAoB,MAAO,CAC7BpC,OAAO,QAAgB,CAAC,gBAAiB,CACvC0O,OAAQtM,EAAKsM,WAEd,CAAClO,EAASY,QAAQgB,KAAS,WAAc,QAAoB,MAAO,CACrErC,IAAK,EACLsB,IAAKb,EAASmO,WAAWvM,EAAKF,MAC9B0M,IAAKxM,EAAKF,KACV0L,QAAS,OACTnM,OAAQgM,GAAUjN,EAASqO,YAAYpB,EAAQrL,GAC/C0M,QAAS1O,EAAO,KAAOA,EAAO,GAAK,IAAIO,IAASH,EAASuO,kBAAoBvO,EAASuO,oBAAoBpO,KACzG,KAAM,GAAIkL,IAAgBrL,EAASkB,QAAQU,KAAS,WAAc,QAAoB,QAAS,CAChGrC,IAAK,EACLsB,IAAKb,EAASmO,WAAWvM,EAAKF,MAC9B8M,MAAO,GACPC,KAAM,GACNC,QAAS,WACTC,iBAAkB1B,GAAUjN,EAAS4O,YAAY3B,EAAQrL,GACzDiN,aAAcjP,EAAO,KAAOA,EAAO,GAAKqN,GAAUA,EAAO7H,OAAO0J,QAChEC,aAAcnP,EAAO,KAAOA,EAAO,GAAKqN,GAAUA,EAAO7H,OAAO4J,UAC/D,KAAM,GAAI1D,IAAgBtL,EAASsB,QAAQM,KAAS,WAAc,QAAoB,MAAO,CAC9FrC,IAAK,EACLC,MAAO,oBACPgN,QAAS5M,EAAO,KAAOA,EAAO,IAAK,QAAe,OAAU,CAAC,WAC5D,CAACA,EAAO,MAAQA,EAAO,KAAM,QAAoB,MAAO,CACzDJ,MAAO,aACP+B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,4FACC,KAAK,QAAoB,OAAQ8J,GAAa,QAAiBvL,EAASiP,YAAYrN,EAAKF,OAAQ,QAAS,WAAc,QAAoB,MAAO8J,EAAa,IAAK5L,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CACjO2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,6FACC,SAAU,QAAoB,MAAOgK,EAAa,EAAC,QAAoB,MAAOC,EAAa,EAAC,QAAoB,SAAU,CAC9HlM,MAAO,aACPgN,SAAS,QAAeS,GAAUjN,EAASkP,SAAStN,EAAKF,MAAO,CAAC,SACjEgL,MAAO,QACN,IAAK9M,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,0NACC,MAAQ,EAAGkK,IAAc,QAAoB,SAAU,CAC3DnM,MAAO,aACPgN,SAAS,QAAeS,GAAUjN,EAASmP,aAAavN,EAAKF,MAAO,CAAC,SACrEgL,MAAO,MACN,IAAK9M,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,gDACC,MAAQ,EAAGmK,QAAmB,IAAK,EAAGR,KAC1C,UACF,OAAQ,MAAM,QAAoB,MAAOS,EAAa,CAAC9L,EAAMqN,SAAWrN,EAAMsN,MAAMC,OAAS,IAAK,WAAc,QAAoB,MAAOxB,EAAa,IAAKlM,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CACvNJ,MAAO,yBACN,MAAO,IAAI,QAAoB,OAAQ,KAAM,UAAW,SAAYO,EAAMqP,SAAWpP,EAASqP,WAAW/B,OAAS,IAAK,WAAc,QAAoB,MAAOvB,EAAa,aAAc,QAAoB,IAAI,IAAQhM,EAAMqP,SAAWpP,EAASqP,WAAW/B,OAAS,IAAK,WAAc,QAAoB,IAAKtB,EAAa,YAAa,QAAoB,IAAI,IAAQ,MAAO,MAAOjM,EAAMuP,iBAAkB,WAAc,QAAoB,MAAO,CAC/b/P,IAAK,EACLC,MAAO,gBACPgN,QAAS5M,EAAO,MAAQA,EAAO,KAAM,QAAe,IAAIO,IAASH,EAASuP,cAAgBvP,EAASuP,gBAAgBpP,GAAO,CAAC,WAC1H,EAAC,QAAoB,SAAU,CAChCX,MAAO,gBACPgN,QAAS5M,EAAO,KAAOA,EAAO,IAAK,QAAe,IAAIO,IAASH,EAASuP,cAAgBvP,EAASuP,gBAAgBpP,GAAO,CAAC,WACxH,IAAKP,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,4GACC,QAAS,QAAoB,MAAO,CACxCjC,MAAO,+BACPgN,QAAS5M,EAAO,KAAOA,EAAO,IAAK,QAAe,OAAU,CAAC,WAC5D,CAACI,EAASwP,oBAAsBxP,EAASY,QAAQZ,EAASwP,sBAAuB,WAAc,QAAoB,MAAO,CAC3HjQ,IAAK,EACLsB,IAAKb,EAASmO,WAAWnO,EAASwP,mBAAmB9N,MACrDlC,MAAO,gBACPuB,OAAO,QAAgBf,EAASyP,mBAChC3O,UAAW,SACV,KAAM,GAAIqL,IAAgBnM,EAASwP,oBAAsBxP,EAASkB,QAAQlB,EAASwP,sBAAuB,WAAc,QAAoB,QAAS,CACtJjQ,IAAK,EACLsB,IAAKb,EAASmO,WAAWnO,EAASwP,mBAAmB9N,MACrDP,SAAU,GACVC,SAAU,GACV5B,MAAO,gBACPuB,OAAO,QAAgBf,EAASyP,oBAC/B,KAAM,GAAIrD,KAAgB,QAAoB,IAAI,MAAS,QAAoB,MAAO,CACvF5M,MAAO,8BACPgN,QAAS5M,EAAO,MAAQA,EAAO,KAAM,QAAe,OAAU,CAAC,WAC9D,EAAC,QAAoB,MAAO,CAC7BJ,MAAO,iBACPS,IAAK,iBACLyP,aAAc9P,EAAO,MAAQA,EAAO,IAAM,IAAIO,IAASH,EAAS2P,cAAgB3P,EAAS2P,gBAAgBxP,IACzGyP,YAAahQ,EAAO,MAAQA,EAAO,IAAM,IAAIO,IAASH,EAAS6P,aAAe7P,EAAS6P,eAAe1P,IACtG2P,WAAYlQ,EAAO,MAAQA,EAAO,IAAM,IAAIO,IAASH,EAAS+P,YAAc/P,EAAS+P,cAAc5P,KAClG,EAAC,QAAoB,MAAO,CAC7BX,MAAO,cACPuB,OAAO,QAAgBf,EAASgQ,iBAChCC,gBAAiBrQ,EAAO,MAAQA,EAAO,IAAM,IAAIO,IAASH,EAASkQ,sBAAwBlQ,EAASkQ,wBAAwB/P,KAC3H,GAAE,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYH,EAASmQ,YAAa,CAACC,EAAGC,MACzF,WAAc,QAAoB,MAAO,CAC9C7Q,MAAO,cACPD,IAAKS,EAASsQ,YAAYF,EAAGC,IAC5B,CAACD,IAAK,WAAc,QAAa9D,EAA2B,CAC7D/M,IAAK,EACLqC,KAAMwO,EACNvP,IAAKb,EAASmO,WAAWiC,EAAE1O,MAC3B,WAAY1B,EAASY,QAAQwP,GAC7B,WAAYpQ,EAASkB,QAAQkP,GAC7B,WAAYpQ,EAASsB,QAAQ8O,GAC7BG,OAAQ3Q,EAAO,KAAOA,EAAO,GAAKqN,GAAUlN,EAAMyQ,eAAgB,GAClEC,SAAU7Q,EAAO,MAAQA,EAAO,IAAMqN,GAAUlN,EAAMyQ,eAAgB,GACtEE,YAAa1Q,EAAS0Q,aACrB,KAAM,EAAG,CAAC,OAAQ,MAAO,WAAY,WAAY,WAAY,kBAAmB,QAAoB,IAAI,OACzG,OAAQ,KAAM,OAAQ3Q,EAAM4Q,aAAe,IAAK,WAAc,QAAoB,SAAU,CAC9FpR,IAAK,EACLC,MAAO,4BACPgN,QAAS5M,EAAO,MAAQA,EAAO,KAAM,QAAe,IAAIO,IAASH,EAAS4Q,WAAa5Q,EAAS4Q,aAAazQ,GAAO,CAAC,WACpH,IAAKP,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,oDACC,SAAW,QAAoB,IAAI,GAAO1B,EAAM4Q,aAAe3Q,EAASqP,WAAW/B,OAAS,IAAK,WAAc,QAAoB,SAAU,CACjJ/N,IAAK,EACLC,MAAO,4BACPgN,QAAS5M,EAAO,MAAQA,EAAO,KAAM,QAAe,IAAIO,IAASH,EAAS6Q,WAAa7Q,EAAS6Q,aAAa1Q,GAAO,CAAC,WACpH,IAAKP,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,qDACC,SAAW,QAAoB,IAAI,IAAO,QAAoB,SAAU,CAC5EjC,MAAO,0BACPgN,QAAS5M,EAAO,MAAQA,EAAO,KAAM,QAAe,IAAIO,IAASH,EAAS8Q,aAAe9Q,EAAS8Q,eAAe3Q,GAAO,CAAC,UACzHuM,MAAO,SACN,IAAK9M,EAAO,MAAQA,EAAO,IAAM,EAAC,QAAoB,MAAO,CAC9D2B,QAAS,YACTC,KAAM,gBACL,EAAC,QAAoB,OAAQ,CAC9BC,EAAG,0WACC,QAAS,QAAoB,MAAO4K,GAAa,QAAiBtM,EAAM4Q,aAAe,GAAK,OAAQ,QAAiB3Q,EAASqP,WAAW/B,QAAS,OAAQ,QAAoB,IAAI,IAAQ,EAClM,C,gECjRA,GACE5L,KAAM,eACNqP,WAAY,CACVC,eAAc,GAEhB,IAAA7O,GACE,MAAO,CACLkL,MAAO,GACP4D,YAAa,GACbC,QAAS,GACTC,YAAa,GACbhE,WAAY,EACZC,SAAS,EACTG,MAAO,KACPC,UAAU,EACV4B,SAAS,EACTE,gBAAgB,EAChBqB,aAAc,EACdS,SAAU,KACVC,SAAU,GACVC,YAAa,EACbC,cAAe,CAAC,EAAG,EAAG,EAAG,GAEzBC,cAAe,EAEfC,OAAQ,EACRC,YAAa,EACbC,YAAa,EACbC,YAAa,EACbC,aAAa,EACbC,gBAAgB,EAChBC,SAAU,EACVC,UAAW,EAEXxB,eAAe,EAEfjE,aAAa,EAEjB,EACA3I,SAAU,KACL,QAAW,CAAC,eACf,QAAA+I,GACE,OAAO7I,KAAKmO,YAAYC,WAAa,MACvC,EACA,WAAArF,GACE,OAAO/I,KAAKoN,QAAQiB,MAAM,KAAKC,OAAOnQ,SAASoQ,OAAS,KAC1D,EACA,SAAAvF,GACE,IAAKhJ,KAAKqN,cAAgBrN,KAAKoN,QAAS,MAAO,GAC/C,MAAMoB,EAAWxO,KAAKqN,YAAYoB,QAAQzO,KAAKoN,QAAS,IAAIqB,QAAQ,OAAQ,IAC5E,OAAOD,EAASH,MAAM,KAAKC,OAAOnQ,QACpC,EACA,OAAAyL,GACE,OAAO5J,KAAKuJ,MAAM+E,OAAOhC,GAAKA,EAAEoC,SAClC,EACA,UAAAnD,GACE,OAAOvL,KAAKuJ,MAAM+E,OAAOhC,IAAMA,EAAEoC,SACnC,EACA,OAAA1E,GACE,MAAM2E,EAAOpL,MAAMC,KAAK,CACtBgG,OAAQxJ,KAAKwN,aACZ,IAAM,IACT,IAAK,MAAM1P,KAAQkC,KAAKuL,WAAY,CAClC,MAAMqD,EAAM9Q,EAAK+Q,aAAe,EAC5BD,EAAM5O,KAAKwN,YACbmB,EAAKC,GAAKE,KAAKhR,GAEf6Q,EAAK,GAAGG,KAAKhR,EAEjB,CACA,OAAO6Q,CACT,EACA,kBAAAjD,GACE,OAAO1L,KAAKuL,WAAWvL,KAAK6M,aAC9B,EACA,eAAAkC,GACE,OAAO/O,KAAK6M,aAAe,EAAI7M,KAAKuL,WAAWvL,KAAK6M,aAAe,GAAK,IAC1E,EACA,eAAAmC,GACE,OAAOhP,KAAK6M,aAAe7M,KAAKuL,WAAW/B,OAAS,EAAIxJ,KAAKuL,WAAWvL,KAAK6M,aAAe,GAAK,IACnG,EACA,iBAAAlB,GACE,MAAO,CACL9K,UAAW,UAAUb,KAAK0N,oBAC1B5M,WAAY,sBAEhB,EACA,WAAAuL,GACE,MAAO,CAACrM,KAAK+O,gBAAiB/O,KAAK0L,mBAAoB1L,KAAKgP,gBAC9D,EACA,eAAA9C,GAEE,MAAM+C,GAAQjP,KAAKkO,UACbhK,EAAI+K,EAAOjP,KAAK2N,OACtB,MAAO,CACL9M,UAAW,eAAeqD,aAC1BpD,WAAYd,KAAKgO,eAAiB,uBAAyB,OAE/D,GAEFhN,MAAO,CACL,oBAAqB,CACnB,OAAAkO,GACElP,KAAKmP,eACP,IAGJ,OAAAC,GACEpP,KAAKqP,YACLrP,KAAKmP,gBACLnP,KAAKsP,4BACLtP,KAAKuP,oBACLC,OAAOC,iBAAiB,SAAUzP,KAAKuP,kBACzC,EACA,aAAAG,GACM1P,KAAKsN,UACPtN,KAAKsN,SAASqC,aAEhBH,OAAOI,oBAAoB,SAAU5P,KAAKuP,kBAC5C,EACApO,QAAS,CAEP,SAAAkO,GACE,MAAMQ,EAAQC,aAAaC,QAAQ,qBACnC,GAAc,OAAVF,EACF7P,KAAKyI,YAAwB,UAAVoH,MACd,CACL,MAAMG,GAAO,IAAIC,MAAOC,WACxBlQ,KAAKyI,YAAcuH,GAAQ,IAAMA,EAAO,EAC1C,CACF,EACA,WAAArH,GACE3I,KAAKyI,aAAezI,KAAKyI,YACzBqH,aAAaK,QAAQ,oBAAqBnQ,KAAKyI,YAAc,QAAU,OACzE,EAEA,WAAA+D,CAAYF,EAAGC,GACb,OAAKD,EAEK,IAANC,EAAgB,GAAGD,EAAE1O,QAAQoC,KAAK6M,eAC/BP,EAAE1O,KAHM,SAAS2O,GAI1B,EACA,iBAAAgD,GACE,MAAM9M,EAAQ+M,OAAOY,WACrB,IAAIC,EAEFA,EADE5N,EAAQ,IACC,EACFA,EAAQ,IACN,EAEA,EAET4N,IAAarQ,KAAKwN,cACpBxN,KAAKwN,YAAc6C,EACnBrQ,KAAKyN,cAAgB,IAAIlK,MAAMvD,KAAKwN,aAAa9P,KAAK,GACtDsC,KAAKuL,WAAW+E,QAAQhE,IACtBA,EAAEuC,iBAAc0B,EAChBvQ,KAAKwQ,eAAelE,KAG1B,EACA,iBAAAmE,GACE,IAAIC,EAAW,EACXC,EAAY3Q,KAAKyN,cAAc,GACnC,IAAK,IAAIlB,EAAI,EAAGA,EAAIvM,KAAKwN,YAAajB,IAChCvM,KAAKyN,cAAclB,GAAKoE,IAC1BA,EAAY3Q,KAAKyN,cAAclB,GAC/BmE,EAAWnE,GAGf,OAAOmE,CACT,EACA,cAAAF,CAAe1S,EAAM4E,EAAS,KAC5B,MAAMwH,EAAWlK,KAAKyQ,oBACtB3S,EAAK+Q,YAAc3E,EACnBlK,KAAKyN,cAAcvD,IAAaxH,EAE5B1C,KAAKxC,QAAQM,KACfA,EAAKsM,QAAS,EAElB,EACA,WAAAG,CAAYqG,EAAO9S,GACjB,MAAMuD,EAAMuP,EAAMtP,OACZuP,EAAQxP,EAAIvC,cAAgBuC,EAAIxC,aAChC6D,EAAS,IAAMmO,OACIN,IAArBzS,EAAK+Q,aACP7O,KAAKwQ,eAAe1S,EAAM4E,GAE5B5E,EAAKsM,QAAS,CAChB,EACA,WAAAU,CAAY8F,EAAO9S,GACjB,MAAMgT,EAAQF,EAAMtP,OACduP,EAAQC,EAAMC,YAAcD,EAAME,WAClCtO,EAAS,IAAMmO,OACIN,IAArBzS,EAAK+Q,aACP7O,KAAKwQ,eAAe1S,EAAM4E,GAE5B5E,EAAKsM,QAAS,CAChB,EACA,yBAAAkF,GACEtP,KAAKsN,SAAW,IAAI2D,qBAAqBtN,IACvC,MAAMuN,EAAQvN,EAAQ,GAClBuN,EAAMC,gBAAkBnR,KAAKsL,UAAYtL,KAAKsJ,SAChDtJ,KAAKoR,YAEN,CACDC,WAAY,SAEhB,EACA,kBAAAC,GACEtR,KAAKuR,UAAU,KACTvR,KAAKgC,MAAMwP,aAAexR,KAAKsN,UACjCtN,KAAKsN,SAASmE,QAAQzR,KAAKgC,MAAMwP,cAGvC,EACA,mBAAMrC,GACJ,MAAMuC,EAAW1R,KAAK2R,OAAOC,OAAOzL,KAAO,GACrC0L,EAAUtO,MAAMuO,QAAQJ,GAAYA,EAASK,KAAK,KAAOL,EAC/D,IAAKG,EAGH,OAFA7R,KAAKyJ,MAAQ,uCACbzJ,KAAK0J,UAAW,GAGlB,MAAMsI,EAAQH,EAAQxD,MAAM,KAAKC,OAAOnQ,SACxC6B,KAAKoN,QAAU4E,EAAM,GACrBhS,KAAKqN,YAAcwE,EACnB7R,KAAKuJ,MAAQ,GACbvJ,KAAKsL,SAAU,EACftL,KAAKyN,cAAgB,IAAIlK,MAAMvD,KAAKwN,aAAa9P,KAAK,SAChDsC,KAAK2J,YACX3J,KAAKsR,oBACP,EACA,eAAM3H,GACJ3J,KAAKsJ,SAAU,EACftJ,KAAKyJ,MAAQ,KACbzJ,KAAK0J,UAAW,EAChB,IACE,MAAMuI,QAAYC,EAAA,EAAMC,IAAI,wBAAwBC,mBAAmBpS,KAAKqN,sBAAsBrN,KAAKuN,YACnG0E,EAAI5T,KAAK8O,cACXnN,KAAKmN,YAAc8E,EAAI5T,KAAK8O,aAE9B,MAAMkF,GAAQJ,EAAI5T,KAAKiU,aAAe,IAAIC,IAAI5U,IAAK,CACjDC,KAAMD,EACN+Q,UAAU,KAENnF,GAAS0I,EAAI5T,KAAKkL,OAAS,IAAIgJ,IAAIjG,IAAK,CAC5C1O,KAAM0O,EAAE1O,KACR8Q,UAAU,EACV8D,SAAUlG,EAAEkG,SACZ3D,iBAAa0B,KAEfhH,EAAM+G,QAAQhE,GAAKtM,KAAKwQ,eAAelE,IACvCtM,KAAKuJ,MAAQ,IAAI8I,KAAS9I,GAC1BvJ,KAAKqJ,WAAa4I,EAAI5T,KAAKgL,YAAcrJ,KAAKuJ,MAAMC,OACpDxJ,KAAKsL,QAAUtL,KAAKuL,WAAW/B,OAASxJ,KAAKqJ,UAC/C,CAAE,MAAOoJ,GACP,GAA6B,MAAzBA,EAAIC,UAAUC,OAAgB,CAChC,MAAMC,EAAMH,EAAIC,UAAUrU,MAAMoL,OAAS,GACrCmJ,EAAIC,SAAS,YACf7S,KAAKyJ,MAAQ,YACJmJ,EAAIC,SAAS,gBAAkBD,EAAIC,SAAS,aACrD7S,KAAKyJ,MAAQ,aAEbzJ,KAAKyJ,MAAQ,QAEfzJ,KAAK0J,UAAW,CAClB,MACE1J,KAAKyJ,MAAQ,UAEjB,CAAE,QACAzJ,KAAKsJ,SAAU,CACjB,CACF,EACA,cAAM8H,GACJ,IAAIpR,KAAKsJ,SAAYtJ,KAAKsL,QAA1B,CACAtL,KAAKsJ,SAAU,EACf,IACE,MAAMwJ,EAAQ9S,KAAKuL,WAAW/B,OACxByI,QAAYC,EAAA,EAAMC,IAAI,wBAAwBC,mBAAmBpS,KAAKqN,sBAAsByF,WAAe9S,KAAKuN,YAChHwF,GAAad,EAAI5T,KAAKkL,OAAS,IAAIgJ,IAAIjG,IAAK,CAChD1O,KAAM0O,EAAE1O,KACR8Q,UAAU,EACV8D,SAAUlG,EAAEkG,SACZ3D,iBAAa0B,KAEfwC,EAAUzC,QAAQhE,GAAKtM,KAAKwQ,eAAelE,IAC3CtM,KAAKuJ,MAAMuF,QAAQiE,GACnB/S,KAAKsL,QAAUtL,KAAKuL,WAAW/B,OAASxJ,KAAKqJ,UAC/C,CAAE,MAAOoJ,GACPO,QAAQvJ,MAAM,SAAUgJ,EAC1B,CAAE,QACAzS,KAAKsJ,SAAU,CACjB,CAlByC,CAmB3C,EACA,WAAAQ,CAAYmJ,GACV,MAAMC,EAAUD,EAAWxE,QAAQ,OAAQ,IAC3CzO,KAAKmT,QAAQrE,KAAK,WAAWoE,IAC/B,EACA,QAAApK,GACE9I,KAAKmT,QAAQrE,KAAK,WAAW9O,KAAKoN,UACpC,EACA,QAAAhE,CAASF,GACP,MAAM8I,EAAQhS,KAAKgJ,UAAUoK,MAAM,EAAGlK,EAAQ,GACxCgK,EAAUlT,KAAKoN,SAAW4E,EAAMxI,OAAS,IAAMwI,EAAMD,KAAK,KAAO,IACvE/R,KAAKmT,QAAQrE,KAAK,WAAWoE,IAC/B,EACA,aAAAnJ,CAAcsJ,GACZ,OAAOA,EAAKhF,MAAM,KAAKC,OAAOnQ,SAASoQ,OAAS8E,CAClD,EACA,UAAAhJ,CAAWzM,GACT,MAAO,GAAG4R,OAAO8D,SAASC,eAAe3V,GAC3C,EACA,OAAAd,CAAQgB,GACN,MAAM0V,EAAM1V,EAAKF,KAAKyQ,MAAM,KAAKE,MAAMkF,cACvC,MAAO,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,MAAO,MAAO,QAAQZ,SAASW,EAC9E,EACA,OAAApW,CAAQU,GACN,MAAM0V,EAAM1V,EAAKF,KAAKyQ,MAAM,KAAKE,MAAMkF,cACvC,MAAO,CAAC,MAAO,OAAQ,MAAO,OAAOZ,SAASW,EAChD,EACA,OAAAhW,CAAQM,GACN,MAAM0V,EAAM1V,EAAKF,KAAKyQ,MAAM,KAAKE,MAAMkF,cACvC,MAAO,CAAC,MAAO,MAAO,MAAO,OAAQ,MAAO,OAAOZ,SAASW,EAC9D,EACA,WAAArI,CAAYvN,GACV,OAAOA,EAAKyQ,MAAM,KAAKE,KACzB,EACA,gBAAA9D,CAAiBrJ,GACfA,EAAEE,OAAOrE,MAAMyW,QAAU,MAC3B,EACA,QAAAtI,CAASxN,GACP,MAAM+V,EAAM3T,KAAKqK,WAAWzM,GAC5BgW,UAAUC,WAAWC,UAAUH,GAAKI,KAAK,KACvC/T,KAAKgU,UAAU,SACdC,MAAM,KACP,MAAMC,EAAQC,SAASC,cAAc,SACrCF,EAAM7Q,MAAQsQ,EACdQ,SAASE,KAAKC,YAAYJ,GAC1BA,EAAMK,SACNJ,SAASK,YAAY,QACrBL,SAASE,KAAKI,YAAYP,GAC1BlU,KAAKgU,UAAU,QAEnB,EACA,SAAAA,CAAUpB,GACR,MAAM8B,EAAWP,SAASvR,cAAc,eACpC8R,GAAUA,EAASC,SACvB,MAAMC,EAAQT,SAASC,cAAc,OACrCQ,EAAMC,UAAY,aAClBD,EAAME,YAAclC,EACpBuB,SAASE,KAAKC,YAAYM,GAC1BG,WAAW,IAAMH,EAAMI,UAAUC,IAAI,QAAS,IAC9CF,WAAW,KACTH,EAAMI,UAAUL,OAAO,QACvBI,WAAW,IAAMH,EAAMD,SAAU,MAChC,KACL,EACA,YAAAtJ,CAAazN,GACX,MAAMsX,EAAOf,SAASC,cAAc,KACpCc,EAAK/M,KAAOnI,KAAKqK,WAAWzM,GAC5BsX,EAAKC,SAAWvX,EAAKyQ,MAAM,KAAKE,MAChC2G,EAAKE,OACP,EACA,WAAAjL,CAAYrM,GACV,GAAIA,EAAK4Q,SAAU,OACnB,MAAM2G,EAAarV,KAAKuL,WAAW+J,UAAUhJ,GAAKA,EAAE1O,OAASE,EAAKF,MAC9DyX,GAAc,IAChBrV,KAAK6M,aAAewI,EACpBrV,KAAKwL,gBAAiB,EACtBxL,KAAK0N,cAAgB,EACrB1N,KAAK0M,eAAgB,EACrByH,SAASE,KAAKpX,MAAMiJ,SAAW,SAC/BlG,KAAKuR,UAAU,KACbvR,KAAKkO,UAAYlO,KAAKgC,MAAMuT,gBAAgBrT,wBAAwBO,OAAS+M,OAAOY,aAG1F,EACA,YAAA3E,GACEzL,KAAKwL,gBAAiB,EACtBxL,KAAK0N,cAAgB,EACrB1N,KAAK0M,eAAgB,EACrByH,SAASE,KAAKpX,MAAMiJ,SAAW,EACjC,EACA,SAAA4G,GACM9M,KAAK6M,aAAe,IACtB7M,KAAK6M,eACL7M,KAAK0N,cAAgB,EAEzB,EACA,SAAAX,GACM/M,KAAK6M,aAAe7M,KAAKuL,WAAW/B,OAAS,IAC/CxJ,KAAK6M,eACL7M,KAAK0N,cAAgB,EAEzB,EACA,WAAAV,GACEhN,KAAK0N,eAAiB,GAElB1N,KAAK0N,eAAiB,KACxBqH,WAAW,KAET,MAAMS,EAAKxV,KAAK2C,IAAIC,cAAc,kCAC9B4S,GACFA,EAAGvY,MAAM6D,WAAa,OACtBd,KAAK0N,cAAgB,EAErB8H,EAAGC,aACHD,EAAGvY,MAAM6D,WAAa,IAEtBd,KAAK0N,cAAgB,GAEtB,IAEP,EAEA,YAAA7B,CAAazK,GACX,GAAIpB,KAAK0M,cAAe,OACxB,GAAI1M,KAAKgO,eAAgB,OACzB,MAAM0H,EAAItU,EAAEuU,QAAQ,GACpB3V,KAAK4N,YAAc8H,EAAE1Q,QACrBhF,KAAK6N,YAAc6H,EAAEzQ,QACrBjF,KAAK8N,YAAc8H,YAAYC,MAC/B7V,KAAK2N,OAAS,EACd3N,KAAK+N,aAAc,EACnB/N,KAAKkO,UAAYlO,KAAKgC,MAAMuT,gBAAgBrT,wBAAwBO,OAAS+M,OAAOY,UACtF,EAEA,WAAArE,CAAY3K,GACV,GAAIpB,KAAK0M,cAAe,OACxB,GAAI1M,KAAKgO,eAAgB,OACzB,MAAM0H,EAAItU,EAAEuU,QAAQ,GACd1R,EAAKyR,EAAE1Q,QAAUhF,KAAK4N,YACtBzJ,EAAKuR,EAAEzQ,QAAUjF,KAAK6N,YAC5B,IAAK7N,KAAK+N,YAAa,CACrB,GAAI1N,KAAKE,IAAI0D,GAAM,EAAG,OACtB,GAAI5D,KAAKE,IAAI0D,IAAO5D,KAAKE,IAAI4D,GAAK,OAClCnE,KAAK+N,aAAc,CACrB,CACA3M,EAAE+D,iBACF,IAAIjB,EAAID,EAEkB,IAAtBjE,KAAK6M,cAAsB3I,EAAI,EACjCA,EAAIlE,KAAK2B,WAAWuC,EAAGlE,KAAKkO,UAAW,KAC9BlO,KAAK6M,eAAiB7M,KAAKuL,WAAW/B,OAAS,GAAKtF,EAAI,IACjEA,GAAKlE,KAAK2B,YAAYuC,EAAGlE,KAAKkO,UAAW,MAE3ClO,KAAK2N,OAASzJ,CAChB,EAEA,UAAA+H,GACE,GAAIjM,KAAK0M,cAAe,OACxB,GAAI1M,KAAKgO,eAAgB,OACzB,IAAKhO,KAAK+N,YAER,YADA/N,KAAK2N,OAAS,GAGhB,MAAMmI,EAAKzV,KAAKqB,IAAI,EAAGkU,YAAYC,MAAQ7V,KAAK8N,aAC1CiI,EAAK/V,KAAK2N,OAASmI,EACnBE,EAA6B,GAAjBhW,KAAKkO,UACvB,IAAI/H,EAAM,GACNnG,KAAK2N,SAAWqI,GAAaD,IAAO,MAAK5P,EAAM,IAC/CnG,KAAK2N,QAAUqI,GAAaD,GAAM,MAAK5P,GAAO,KACrC,IAATA,GAAoC,IAAtBnG,KAAK6M,cAA8B,IAAR1G,GAAcnG,KAAK6M,eAAiB7M,KAAKuL,WAAW/B,OAAS,KACxGrD,EAAM,GAERnG,KAAKiO,SAAW9H,EAChBnG,KAAKgO,gBAAiB,EACNhO,KAAK2N,OAAT,IAARxH,GAA2BnG,KAAKkO,WAA4B,IAAT/H,GAA2BnG,KAAKkO,UAA6B,CACtH,EACA,oBAAA9B,GACOpM,KAAKgO,iBACY,IAAlBhO,KAAKiO,UAAiBjO,KAAK6M,gBACR,IAAnB7M,KAAKiO,UAAiBjO,KAAK6M,eAC/B7M,KAAKgO,gBAAiB,EACtBhO,KAAKiO,SAAW,EAChBjO,KAAK2N,OAAS,EAChB,EAEA,UAAAhM,CAAWC,EAAUC,EAAWC,EAAW,KACzC,OAAOF,EAAWC,EAAYC,GAAYD,EAAYC,EAAWF,EACnE,EAEA,WAAAgL,CAAYzG,IAEG,IAATA,GAAoC,IAAtBnG,KAAK6M,cAA8B,IAAR1G,GAAcnG,KAAK6M,eAAiB7M,KAAKuL,WAAW/B,OAAS,IAK1GxJ,KAAKiO,SAAW9H,EAChBnG,KAAKgO,gBAAiB,EACV,IAAR7H,EAAYnG,KAAK2N,QAAU3N,KAAKkO,WAA4B,IAAT/H,IAAYnG,KAAK2N,QAAU3N,KAAKkO,WACzF,IC9eJ,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://sanyue_imghub/./src/components/TransformMedia.vue?430b","webpack://sanyue_imghub/./src/components/TransformMedia.vue","webpack://sanyue_imghub/./src/components/TransformMedia.vue?c392","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?9198","webpack://sanyue_imghub/./src/views/PublicBrowse.vue","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?bab5"],"sourcesContent":["import { normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, withModifiers as _withModifiers } from \"vue\";\nconst _hoisted_1 = [\"src\"];\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 2,\n class: \"tm-audio\"\n};\nconst _hoisted_4 = [\"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"tm-viewport\",\n ref: \"viewport\",\n onPointerdown: _cache[1] || (_cache[1] = (...args) => $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 09ba4b3..0000000 Binary files a/js/760.a76249f2.js.map.gz and /dev/null differ diff --git a/js/app.2ba98dec.js.gz b/js/app.2ba98dec.js.gz deleted file mode 100644 index 1d6d89d..0000000 Binary files a/js/app.2ba98dec.js.gz and /dev/null differ diff --git a/js/app.2ba98dec.js.map.gz b/js/app.2ba98dec.js.map.gz deleted file mode 100644 index bac606a..0000000 Binary files a/js/app.2ba98dec.js.map.gz and /dev/null differ diff --git a/js/app.2ba98dec.js b/js/app.6573279d.js similarity index 95% rename from js/app.2ba98dec.js rename to js/app.6573279d.js index 38fdcd0..191b4d7 100644 --- a/js/app.2ba98dec.js +++ b/js/app.6573279d.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={457:function(e,t,o){o(4114);var n=o(4373),r=o(4570),a=o.n(r),s=o(6915),i=o(1219);const l=n.A.create({baseURL:"/"});l.interceptors.request.use(e=>{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(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"),c=0;c {\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 0000000..efd3019 Binary files /dev/null and b/js/app.6573279d.js.map.gz differ