diff --git a/frontend-dist/css/647.ba2aa3f5.css b/frontend-dist/css/36.5ae2c698.css similarity index 54% rename from frontend-dist/css/647.ba2aa3f5.css rename to frontend-dist/css/36.5ae2c698.css index 6d6e07d9..a1c61dee 100644 --- a/frontend-dist/css/647.ba2aa3f5.css +++ b/frontend-dist/css/36.5ae2c698.css @@ -1 +1 @@ -.history-container[data-v-7da2f8c2]{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2000;display:flex;flex-direction:column;color:var(--upload-text-color);clip-path:circle(0 at calc(100% - 200px) 50px);opacity:0;transition:clip-path .6s cubic-bezier(.4,0,.2,1),opacity .3s ease}.history-container[data-v-7da2f8c2]:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-container-bg-color);z-index:-1;will-change:transform;transform:translateZ(0)}.history-container.active[data-v-7da2f8c2]{clip-path:circle(150% at calc(100% - 200px) 50px);opacity:1}.history-header[data-v-7da2f8c2]{padding:20px 40px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--el-border-color-lighter)}.header-left[data-v-7da2f8c2]{display:flex;align-items:baseline;gap:15px}.header-left h2[data-v-7da2f8c2]{margin:0;font-size:24px;background:var(--upload-main-title-color);background-size:200% auto;background-clip:text;-webkit-background-clip:text;color:transparent;font-weight:700}.record-count[data-v-7da2f8c2]{color:var(--upload-text-color);font-size:14px;opacity:.8}.header-right[data-v-7da2f8c2]{display:flex;gap:10px}.header-right .el-button[data-v-7da2f8c2]{background-color:var(--toolbar-button-bg-color);box-shadow:var(--toolbar-button-shadow);border:none;color:var(--theme-toggle-color);transition:all .3s ease}.header-right .el-button[data-v-7da2f8c2]:hover{transform:scale(1.05);box-shadow:var(--toolbar-button-shadow-hover)}.header-right .el-button.el-button--danger[data-v-7da2f8c2]{background:#dc2626;color:#fff}.history-content[data-v-7da2f8c2]{flex:1;overflow-y:auto;padding:20px 40px}.grid-view[data-v-7da2f8c2]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:20px}.grid-item[data-v-7da2f8c2]{background:var(--toolbar-button-bg-color);border-radius:12px;overflow:hidden;box-shadow:var(--toolbar-button-shadow);transition:transform .3s ease,box-shadow .3s ease;border:1px solid var(--glass-border)}.grid-item[data-v-7da2f8c2]:hover{box-shadow:var(--toolbar-button-shadow-hover)}.grid-preview[data-v-7da2f8c2]{height:160px;position:relative;background:var(--el-fill-color-light);display:flex;align-items:center;justify-content:center;overflow:hidden}.grid-preview img[data-v-7da2f8c2],.grid-preview video[data-v-7da2f8c2]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper[data-v-7da2f8c2]{font-size:48px;color:var(--theme-toggle-color);opacity:.5}.grid-overlay[data-v-7da2f8c2]{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease}.grid-item:hover .grid-overlay[data-v-7da2f8c2]{opacity:1}.grid-actions[data-v-7da2f8c2]{display:flex;gap:15px}.grid-info[data-v-7da2f8c2]{padding:12px}.file-name[data-v-7da2f8c2]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;color:var(--upload-text-color)}.upload-time[data-v-7da2f8c2]{font-size:12px;color:var(--upload-text-color);opacity:.6}.list-view[data-v-7da2f8c2]{display:flex;flex-direction:column;gap:10px}.list-item[data-v-7da2f8c2]{display:flex;align-items:center;padding:12px 15px;background:var(--toolbar-button-bg-color);border-radius:12px;box-shadow:var(--toolbar-button-shadow);border:1px solid var(--glass-border);transition:all .3s ease}.list-item[data-v-7da2f8c2]:hover{transform:translateX(5px);box-shadow:var(--toolbar-button-shadow-hover)}.list-preview[data-v-7da2f8c2]{width:50px;height:50px;border-radius:8px;overflow:hidden;margin-right:15px;background:var(--el-fill-color-light);display:flex;align-items:center;justify-content:center;flex-shrink:0}.list-preview img[data-v-7da2f8c2],.list-preview video[data-v-7da2f8c2]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper-small[data-v-7da2f8c2]{font-size:24px;color:var(--theme-toggle-color);opacity:.5}.list-info[data-v-7da2f8c2]{flex:1;min-width:0;margin-right:20px}.file-url[data-v-7da2f8c2]{font-size:12px;color:var(--upload-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.6}.list-meta[data-v-7da2f8c2]{margin-right:20px;text-align:right;min-width:140px}.list-actions[data-v-7da2f8c2]{display:flex;gap:8px}.empty-state[data-v-7da2f8c2]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--upload-text-color);font-size:18px;opacity:.5}.empty-icon[data-v-7da2f8c2]{font-size:64px;margin-bottom:20px;color:var(--theme-toggle-color)}.history-content[data-v-7da2f8c2]::-webkit-scrollbar{width:8px}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-track{background:transparent}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:4px}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker)}.action-btn-view[data-v-7da2f8c2]{background-color:var(--toolbar-button-bg-color);box-shadow:var(--toolbar-button-shadow);border:none;color:var(--theme-toggle-color)}.action-btn-view[data-v-7da2f8c2]:hover{box-shadow:var(--toolbar-button-shadow-hover);color:var(--el-color-primary)}.history-group[data-v-7da2f8c2]{position:relative;padding-left:30px;border-left:2px solid var(--el-border-color-lighter);margin-left:10px;padding-bottom:30px}.history-group[data-v-7da2f8c2]:last-child{border-left:2px solid transparent}.timeline-header[data-v-7da2f8c2]{display:flex;align-items:center;margin-bottom:20px;position:relative}.timeline-dot[data-v-7da2f8c2]{position:absolute;left:-38px;width:14px;height:14px;border-radius:50%;background:var(--el-upload-dragger-uniform-color);box-shadow:none;z-index:2;box-sizing:border-box}.date-label[data-v-7da2f8c2]{font-size:20px;font-weight:700;background:var(--upload-main-title-color);background-size:200% auto;background-clip:text;-webkit-background-clip:text;color:transparent}.load-more-container[data-v-7da2f8c2]{display:flex;justify-content:center;padding:20px}.loading-indicator[data-v-7da2f8c2]{display:flex;align-items:center;gap:8px;color:var(--el-upload-dragger-uniform-color)}.load-more-hint[data-v-7da2f8c2],.no-more-hint[data-v-7da2f8c2]{color:var(--upload-text-color);opacity:.5;font-size:14px}.no-more-hint[data-v-7da2f8c2]{text-align:center;padding:20px}@media (max-width:768px){.history-header[data-v-7da2f8c2]{padding:15px 20px}.header-left h2[data-v-7da2f8c2]{font-size:20px}.history-content[data-v-7da2f8c2]{padding:15px 20px}.grid-view[data-v-7da2f8c2]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:15px}.grid-preview[data-v-7da2f8c2]{height:120px}.list-meta[data-v-7da2f8c2]{display:none}.list-info[data-v-7da2f8c2]{margin-right:10px}}.page-footer[data-v-08acbaa9]{display:flex;justify-content:center;align-items:center;width:100vw;color:var(--page-footer-text-color);font-size:large;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media (max-width:768px){.page-footer[data-v-08acbaa9]{font-size:small}}.footer-name[data-v-08acbaa9]{color:var(--page-footer-name-color);font-weight:700;text-decoration:none;position:relative;transition:all .3s ease}.footer-name[data-v-08acbaa9]:after{content:"";position:absolute;width:0;height:2px;bottom:-2px;left:0;background-color:var(--page-footer-name-color);transition:width .3s ease-in-out}.footer-name[data-v-08acbaa9]:hover:after{width:100%}.footer-link-icon[data-v-08acbaa9]{color:var(--page-footer-name-color);margin-left:5px;transition:transform .3s ease-in-out}.footer-link-icon[data-v-08acbaa9]:hover{transform:scale(1.2) rotate(-12deg)}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px;align-items:center;display:flex;height:32px;width:100%}.el-slider__runway{background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);cursor:pointer;flex:1;height:var(--el-slider-height);position:relative}.el-slider__runway.show-input{margin-right:30px;width:auto}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging,.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{transform:scale(1)}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{cursor:not-allowed}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{background-color:var(--el-slider-main-bg-color);border-bottom-left-radius:var(--el-slider-border-radius);border-top-left-radius:var(--el-slider-border-radius);height:var(--el-slider-height);position:absolute}.el-slider__button-wrapper{background-color:transparent;height:var(--el-slider-button-wrapper-size);line-height:normal;outline:none;position:absolute;text-align:center;top:var(--el-slider-button-wrapper-offset);transform:translateX(-50%);-webkit-user-select:none;user-select:none;width:var(--el-slider-button-wrapper-size);z-index:1}.el-slider__button-wrapper:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:grab}.el-slider__button-wrapper.dragging{cursor:grabbing}.el-slider__button{background-color:var(--el-color-white);border:2px solid var(--el-slider-main-bg-color);border-radius:50%;box-sizing:border-box;display:inline-block;height:var(--el-slider-button-size);transition:var(--el-transition-duration-fast);-webkit-user-select:none;user-select:none;vertical-align:middle;width:var(--el-slider-button-size)}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:grab}.el-slider__button.dragging{cursor:grabbing}.el-slider__stop{background-color:var(--el-slider-stop-bg-color);border-radius:var(--el-border-radius-circle);height:var(--el-slider-height);position:absolute;transform:translateX(-50%);width:var(--el-slider-height)}.el-slider__marks{height:100%;left:12px;top:0;width:18px}.el-slider__marks-text{color:var(--el-color-info);font-size:14px;margin-top:15px;position:absolute;transform:translateX(-50%);white-space:pre}.el-slider.is-vertical{display:inline-flex;flex:0;height:100%;position:relative;width:auto}.el-slider.is-vertical .el-slider__runway{height:100%;margin:0 16px;width:var(--el-slider-height)}.el-slider.is-vertical .el-slider__bar{border-radius:0 0 3px 3px;height:auto;width:var(--el-slider-height)}.el-slider.is-vertical .el-slider__button-wrapper{left:var(--el-slider-button-wrapper-offset);top:auto;transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{left:15px;margin-top:0;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}.channel-icon-wrapper[data-v-ce6ff2ce]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-ce6ff2ce] svg,.channel-svg-icon[data-v-ce6ff2ce]{width:1em;height:1em;fill:currentColor}.channel-icon-wrapper.channel-brand-telegram[data-v-ce6ff2ce]{color:#229ed9}.channel-icon-wrapper.channel-brand-cfr2[data-v-ce6ff2ce]{color:#f38020}.channel-icon-wrapper.channel-brand-s3[data-v-ce6ff2ce]{color:#f90}.channel-icon-wrapper.channel-brand-discord[data-v-ce6ff2ce]{color:#5865f2}.channel-icon-wrapper.channel-brand-huggingface[data-v-ce6ff2ce]{color:#ff9d00}.channel-icon-wrapper.channel-brand-webdav[data-v-ce6ff2ce]{color:#14b8a6}.upload-settings-dialog .radio-card-group.compact{gap:8px}.upload-settings-dialog .radio-card-group.compact .radio-card{padding:8px 12px;font-size:13px}.upload-settings-dialog .radio-card-group.compact .radio-card .el-radio__label{display:flex;align-items:center;gap:6px}.upload-settings-dialog .radio-card-group.compact .channel-icon{width:18px;font-size:18px;text-align:center;flex-shrink:0}.upload-settings-dialog .slider-item{flex-direction:column;align-items:flex-start;gap:12px}.upload-settings-dialog .slider-wrapper{display:flex;align-items:center;gap:12px;width:100%}.upload-settings-dialog .slider-wrapper .el-slider{flex:1;min-width:0}.upload-settings-dialog .slider-input{width:96px!important;flex-shrink:0}.upload-settings-dialog .slider-input .el-input__inner{text-align:center}.upload-settings-dialog .slider-input-wrapper{display:flex;align-items:center;gap:6px;flex-shrink:0}.upload-settings-dialog .slider-unit{font-size:13px;font-weight:500;color:var(--el-text-color-secondary)}@media (max-width:768px){.upload-settings-dialog .setting-item .radio-card-group.compact{width:100%}.upload-settings-dialog .radio-card-group.compact{flex-direction:row;display:grid;grid-template-columns:repeat(2,1fr);gap:8px;width:100%}.upload-settings-dialog .radio-card-group.compact .radio-card{width:100%;box-sizing:border-box;justify-content:center;flex:1}.upload-settings-dialog .radio-card-group.compact .radio-card .el-radio__label{justify-content:center}.upload-settings-dialog .slider-wrapper{gap:8px}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.upload-list-item[data-v-645a7810]{display:flex;align-items:center;justify-content:space-between;margin:8px 10px;border:1px solid var(--upload-list-item-border-color,rgba(37,99,235,.1));padding:10px 12px;border-radius:16px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item[data-v-645a7810]:hover{border-color:var(--upload-list-item-hover-border,rgba(37,99,235,.25));box-shadow:none}.upload-list-item-content[data-v-645a7810]{display:flex;flex-direction:column;margin-left:10px}.upload-list-item-action[data-v-645a7810]{display:flex;flex-direction:column;align-items:center;gap:6px}.upload-list-item-url-row[data-v-645a7810]{display:flex;flex-direction:row;align-items:center;width:38vw;gap:8px;margin-bottom:6px}.upload-list-item-url-row[data-v-645a7810]:last-child{margin-bottom:0}.upload-list-item-url[data-v-645a7810]{display:flex;flex-direction:column}.file-icon[data-v-645a7810]{font-size:30px;color:var(--upload-list-file-icon-color)}.upload-list-item-name-wrapper[data-v-645a7810]{display:flex;align-items:center;justify-content:center;padding:8px 16px;background:var(--file-name-bg,rgba(37,99,235,.05));border-radius:10px;margin-bottom:8px;border:1px solid var(--file-name-border,rgba(37,99,235,.12));transition:all .3s ease}.upload-list-item-name-wrapper[data-v-645a7810]:hover{background:var(--file-name-hover-bg,rgba(37,99,235,.09));border-color:var(--file-name-hover-border,rgba(37,99,235,.2))}.upload-list-item-name[data-v-645a7810]{font-size:14px;font-weight:600;max-width:28vw;color:var(--el-text-color-primary);letter-spacing:.3px;text-align:center}.upload-list-item-progress[data-v-645a7810]{margin-top:8px;width:28vw;padding:4px 8px;background:var(--progress-wrapper-bg,rgba(37,99,235,.04));border-radius:12px;border:1px solid var(--progress-wrapper-border,rgba(37,99,235,.1))}.upload-list-item-progress[data-v-645a7810] .el-progress{--el-color-primary:var(--primary-color)}.upload-list-item-progress[data-v-645a7810] .el-progress-bar{padding-right:0;margin-right:0}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__outer{height:10px!important;border-radius:8px;background:var(--progress-outer-bg,rgba(0,0,0,.045));box-shadow:none;overflow:hidden}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner{border-radius:8px;background:var(--primary-color)!important;box-shadow:none;position:relative;overflow:hidden;transition:width .3s ease}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:hsla(0,0%,100%,.12);pointer-events:none}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner:before{content:"";position:absolute;top:0;left:-100%;width:300%;height:100%;background:repeating-linear-gradient(45deg,transparent,transparent 8px,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 16px);animation:progressStripes-645a7810 1s linear infinite}.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner{background:#16a34a!important;background-size:200% 100%;box-shadow:none;animation:none}.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner:after,.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner:before{animation:none;background:none}.upload-list-item-progress[data-v-645a7810] .el-progress--exception .el-progress-bar__inner{background:#dc2626!important;background-size:200% 100%;box-shadow:none;animation:progressPulse-645a7810 1s ease-in-out infinite}.upload-list-item-progress[data-v-645a7810] .el-progress--exception .el-progress-bar__inner:before{animation:none;background:none}@keyframes progressStripes-645a7810{0%{transform:translateX(0)}to{transform:translateX(22.627px)}}@keyframes progressPulse-645a7810{0%,to{opacity:1}50%{opacity:.7}}.upload-list-item-url[data-v-645a7810] .el-input{transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper{border-radius:10px;box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1);background:var(--el-fill-color-blank);border:1px solid var(--el-border-color-lighter);overflow:hidden;position:relative;padding:0}.upload-list-item-url[data-v-645a7810] .el-input-group>.el-input__wrapper{border-radius:0 9px 9px 0!important}.upload-list-item-url[data-v-645a7810] .el-input__wrapper:hover{box-shadow:none;border-color:var(--el-color-primary-light-5)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper.is-focus{box-shadow:none;border-color:var(--el-color-primary)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper.is-focus:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(37,99,235,.08),transparent);animation:shimmer-645a7810 2s infinite;z-index:0}@keyframes shimmer-645a7810{0%{left:-100%}to{left:100%}}.upload-list-item-url[data-v-645a7810] .el-input__inner{font-size:13px;font-family:Courier New,Monaco,monospace;color:var(--el-text-color-regular);transition:all .3s ease;padding-left:12px;position:relative;z-index:1;border-radius:0 10px 10px 0}.upload-list-item-url[data-v-645a7810] .el-input__inner::-moz-selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-645a7810] .el-input__inner::selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend{background:var(--el-color-primary-light-9);color:var(--el-color-primary);font-weight:600;font-size:12px;border:none;padding:0 14px;margin:0;border-radius:9px 0 0 9px;box-shadow:none;transition:all .3s ease;letter-spacing:.5px;position:relative;z-index:1}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend:after{content:"";position:absolute;right:0;top:50%;transform:translateY(-50%);height:60%;width:1px;background:var(--el-color-primary-light-7);opacity:.3;transition:all .3s ease}.upload-list-item-url[data-v-645a7810] .el-input:hover .el-input-group__prepend{background:var(--el-color-primary-light-8)}.upload-list-item-url[data-v-645a7810] .el-input:hover .el-input-group__prepend:after{opacity:.5}.upload-list-item-url[data-v-645a7810] .el-input.is-focus .el-input-group__prepend{background:var(--el-color-primary);color:#fff;animation:prependPulse-645a7810 2s ease-in-out infinite}.upload-list-item-url[data-v-645a7810] .el-input.is-focus .el-input-group__prepend:after{background:hsla(0,0%,100%,.3);opacity:1}@keyframes prependPulse-645a7810{0%,to{opacity:1}50%{opacity:.95}}.modern-file-action-btn[data-v-645a7810]{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:10px;background:var(--upload-action-btn-bg);color:var(--upload-action-btn-color);box-shadow:var(--upload-action-btn-shadow);cursor:pointer;transition:background-color .22s ease,color .22s ease,transform .22s ease;font-size:16px;position:relative;overflow:hidden;margin:4px 0;outline:none}.modern-file-action-btn[data-v-645a7810]:before{content:"";position:absolute;inset:2px;border-radius:8px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-file-action-btn[data-v-645a7810]:hover{background:var(--upload-action-btn-hover-bg)}.modern-file-action-btn[data-v-645a7810]:hover:before{opacity:.08}.modern-file-action-btn[data-v-645a7810]:active{transform:scale(.96)}.modern-file-action-btn-primary[data-v-645a7810]{color:var(--upload-action-copy-color)}.modern-file-action-btn-danger[data-v-645a7810]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-file-action-btn-danger[data-v-645a7810]:hover{background:var(--upload-action-danger-hover-bg)}@media (max-width:768px){.upload-list-item[data-v-645a7810]{margin:5px 6px;padding:7px 8px;border-radius:12px}.upload-list-item-content[data-v-645a7810]{margin-left:2px}.upload-list-item-action[data-v-645a7810]{gap:3px}.upload-list-item-url-row[data-v-645a7810]{width:42vw;flex-direction:column;gap:4px;margin-bottom:4px}.upload-list-item-progress[data-v-645a7810]{width:32vw;margin-top:5px;padding:2px 5px;border-radius:9px}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__outer{height:6px!important}.upload-list-item-url[data-v-645a7810] .el-input__wrapper{border-radius:7px}.upload-list-item-url[data-v-645a7810] .el-input__inner{font-size:10px;padding-left:8px}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend{font-size:9px;padding:0 6px;border-radius:7px 0 0 7px}.modern-file-action-btn[data-v-645a7810]{width:26px;height:26px;margin:2px 0;border-radius:8px;font-size:12px}.upload-list-item-name-wrapper[data-v-645a7810]{padding:3px 8px;margin-bottom:5px;border-radius:7px}.upload-list-item-name[data-v-645a7810]{font-size:11px;width:32vw}}.el-upload{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;align-items:center;cursor:pointer;display:inline-flex;justify-content:center;outline:none}.el-upload.is-disabled{cursor:not-allowed}.el-upload.is-disabled:focus{color:inherit}.el-upload.is-disabled:focus,.el-upload.is-disabled:focus .el-upload-dragger{border-color:var(--el-border-color-darker)}.el-upload.is-disabled .el-upload-dragger{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-upload.is-disabled .el-upload-dragger .el-upload__text{color:var(--el-text-color-placeholder)}.el-upload.is-disabled .el-upload-dragger .el-upload__text em{color:var(--el-disabled-text-color)}.el-upload.is-disabled .el-upload-dragger:hover{border-color:var(--el-border-color-darker)}.el-upload__input{display:none}.el-upload__tip{color:var(--el-text-color-regular);font-size:12px;margin-top:7px}.el-upload iframe{filter:alpha(opacity=0);left:0;opacity:0;position:absolute;top:0;z-index:-1}.el-upload--picture-card{align-items:center;background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);border-radius:6px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:var(--el-upload-picture-card-size);justify-content:center;vertical-align:top;width:var(--el-upload-picture-card-size)}.el-upload--picture-card>i{color:var(--el-text-color-secondary);font-size:28px}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{color:var(--el-color-primary)}.el-upload:focus,.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);border-radius:6px;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:var(--el-upload-dragger-padding-vertical) var(--el-upload-dragger-padding-horizontal);position:relative;text-align:center}.el-upload-dragger .el-icon--upload{color:var(--el-text-color-placeholder);font-size:67px;line-height:50px;margin-bottom:16px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary);padding:calc(var(--el-upload-dragger-padding-vertical) - 1px) calc(var(--el-upload-dragger-padding-horizontal) - 1px)}.el-upload-list{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;list-style:none;margin:10px 0 0;padding:0;position:relative}.el-upload-list__item{border-radius:4px;box-sizing:border-box;color:var(--el-text-color-regular);font-size:14px;margin-bottom:5px;position:relative;transition:all .5s cubic-bezier(.55,0,.1,1);width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{color:var(--el-text-color-regular);cursor:pointer;display:none;opacity:.75;position:absolute;right:5px;top:50%;transform:translateY(-50%);transition:opacity var(--el-transition-duration)}.el-upload-list__item .el-icon--close:hover{color:var(--el-color-primary);opacity:1}.el-upload-list__item .el-icon--close-tip{color:var(--el-color-primary);cursor:pointer;display:none;font-size:12px;font-style:normal;opacity:1;position:absolute;right:5px;top:1px}.el-upload-list__item:hover{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{display:inline-flex;flex-direction:column;justify-content:center;margin-left:4px;width:calc(100% - 30px)}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon--close-tip,.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip{display:none}.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none;opacity:0}.el-upload-list__item-name{align-items:center;color:var(--el-text-color-regular);display:inline-flex;font-size:var(--el-font-size-base);padding:0 4px;text-align:center;transition:color var(--el-transition-duration)}.el-upload-list__item-name .el-icon{color:var(--el-text-color-secondary);margin-right:6px}.el-upload-list__item-file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-upload-list__item-status-label{align-items:center;display:none;height:100%;justify-content:center;line-height:inherit;position:absolute;right:5px;top:0;transition:opacity var(--el-transition-duration)}.el-upload-list__item-delete{color:var(--el-text-color-regular);display:none;font-size:12px;position:absolute;right:10px;top:0}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{display:inline-flex;flex-wrap:wrap;margin:0}.el-upload-list--picture-card .el-upload-list__item{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;display:inline-flex;height:var(--el-upload-list-picture-card-size);margin:0 8px 8px 0;overflow:hidden;padding:0;width:var(--el-upload-list-picture-card-size)}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:block;opacity:0}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{height:100%;object-fit:contain;width:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{background:var(--el-color-success);height:24px;right:-15px;text-align:center;top:-6px;transform:rotate(45deg);width:40px}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{align-items:center;background-color:var(--el-overlay-color-lighter);color:#fff;cursor:default;display:inline-flex;font-size:20px;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;transition:opacity var(--el-transition-duration);width:100%}.el-upload-list--picture-card .el-upload-list__item-actions span{cursor:pointer;display:none}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:16px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{color:inherit;font-size:inherit;position:static}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{bottom:auto;left:50%;top:50%;transform:translate(-50%,-50%);width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{align-items:center;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;display:flex;margin-top:10px;overflow:hidden;padding:10px;z-index:0}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{display:inline-flex;opacity:0}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{align-items:center;background-color:var(--el-color-white);display:inline-flex;height:70px;justify-content:center;object-fit:contain;position:relative;width:70px;z-index:1}.el-upload-list--picture .el-upload-list__item-status-label{background:var(--el-color-success);height:26px;position:absolute;right:-17px;text-align:center;top:-7px;transform:rotate(45deg);width:46px}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{cursor:default;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%;z-index:10}.el-upload-cover:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;height:100%;width:100%}.el-upload-cover__label{background:var(--el-color-success);height:24px;right:-15px;text-align:center;top:-6px;transform:rotate(45deg);width:40px}.el-upload-cover__label i{color:#fff;font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-cover__progress{display:inline-block;position:static;vertical-align:middle;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{height:100%;left:0;position:absolute;top:0;width:100%}.el-upload-cover__interact{background-color:var(--el-overlay-color-light);bottom:0;height:100%;left:0;position:absolute;text-align:center;width:100%}.el-upload-cover__interact .btn{color:#fff;cursor:pointer;display:inline-block;font-size:14px;margin-top:60px;transition:var(--el-transition-md-fade);vertical-align:middle}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{background-color:#fff;bottom:0;color:var(--el-text-color-primary);font-size:14px;font-weight:400;height:36px;left:0;line-height:36px;margin:0;overflow:hidden;padding:0 10px;position:absolute;text-align:left;text-overflow:ellipsis;white-space:nowrap;width:100%}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}@property --border-angle{syntax:"";initial-value:0deg;inherits:false}@keyframes borderRotate-97f23dbc{0%{--border-angle:0deg}to{--border-angle:360deg}}.upload-form[data-v-97f23dbc],.upload-list-card[data-v-97f23dbc]{display:flex;flex-direction:column;justify-content:center;align-items:center}.upload-list-card[data-v-97f23dbc]{width:55vw;height:7vh;margin-top:10px;border-radius:15px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)!important;transition:height .3s ease;overflow:hidden}.upload-list-card[data-v-97f23dbc] .el-card__body{padding:0;width:100%;overflow:hidden}.upload-list-container[data-v-97f23dbc]{width:55vw;height:7vh;transition:height .3s ease;overflow:hidden}@media (max-width:768px){.upload-list-card[data-v-97f23dbc],.upload-list-container[data-v-97f23dbc]{width:70vw}}.upload-list-card.upload-list-busy[data-v-97f23dbc],.upload-list-container.upload-list-busy[data-v-97f23dbc]{height:40vh}.upload-list-card.is-uploading[data-v-97f23dbc]{border:1px solid var(--el-upload-dragger-uniform-color,#2563eb)!important;box-shadow:none!important}.upload-card-wrapper[data-v-97f23dbc]{position:relative;overflow:visible}.upload-card-glow[data-v-97f23dbc]{position:absolute;width:200px;height:200px;border-radius:50%;background:radial-gradient(circle,rgba(96,165,250,.2) 0,transparent 70%);pointer-events:none;transform:translate(-50%,-50%);opacity:0;transition:opacity .3s ease;z-index:10}.upload-card[data-v-97f23dbc]{width:55vw;padding:20px;background:none}@media (max-width:768px){.upload-card[data-v-97f23dbc]{width:70vw}}.upload-card-busy[data-v-97f23dbc] .el-upload-dragger{height:17vh}[data-v-97f23dbc] .el-upload-dragger{display:flex;flex-direction:column;justify-content:center;align-items:center;height:45vh;border-radius:15px;border:1px solid var(--glass-border);opacity:.7;background-color:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:var(--glass-shadow)}[data-v-97f23dbc] .el-upload:focus .el-upload-dragger{border-color:var(--glass-border-hover)}[data-v-97f23dbc] .el-upload-dragger.is-dragover,[data-v-97f23dbc] .el-upload-dragger:hover{opacity:.7;box-shadow:var(--glass-shadow)}.is-uploading[data-v-97f23dbc] .el-upload-dragger{border-color:transparent!important}.upload-card.is-uploading[data-v-97f23dbc]{position:relative;background:none}.upload-card.is-uploading[data-v-97f23dbc]:before{content:"";position:absolute;top:20px;left:20px;right:20px;bottom:20px;border-radius:15px;padding:2px;background:conic-gradient(from var(--border-angle),transparent 0deg,transparent 30deg,var(--el-upload-dragger-uniform-color,#2563eb) 60deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 90deg,transparent 120deg,transparent 180deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 210deg,var(--el-upload-dragger-uniform-color,#2563eb) 240deg,transparent 270deg,transparent 1turn);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:borderRotate-97f23dbc 2s linear infinite;pointer-events:none;z-index:1}.el-upload__text[data-v-97f23dbc]{font-weight:700;font-size:medium;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}@media (max-width:768px){.el-upload__text[data-v-97f23dbc]{font-size:small}}.el-upload__text.upload-list-busy[data-v-97f23dbc]{font-size:small}.el-icon--upload[data-v-97f23dbc]{font-size:100px;transition:font-size .3s ease;color:#60a5fa}html.dark .el-icon--upload[data-v-97f23dbc]{color:#6b6b73}.el-upload__text[data-v-97f23dbc] em{color:#1d4ed8}html.dark .el-upload__text[data-v-97f23dbc] em{color:#93c5fd}.el-icon--upload.upload-list-busy[data-v-97f23dbc]{font-size:60px}@media (max-width:768px){.el-icon--upload[data-v-97f23dbc]{font-size:50px}.el-icon--upload.upload-list-busy[data-v-97f23dbc]{font-size:30px}}.paste-card[data-v-97f23dbc]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:45vh;border-radius:15px;border:var(--el-upload-dragger-border);box-shadow:none;opacity:.7;background-color:var(--el-upload-dragger-bg-color);transition:all .3s ease;box-sizing:border-box}.paste-card[data-v-97f23dbc]:hover{opacity:.8;box-shadow:var(--el-upload-dragger-hover-box-shadow)}.paste-card.is-uploading[data-v-97f23dbc]{position:relative;border-color:transparent!important;overflow:visible}.paste-card.is-uploading[data-v-97f23dbc]:before{content:"";position:absolute;inset:-4px;border-radius:15px;padding:2px;background:conic-gradient(from var(--border-angle),transparent 0deg,transparent 30deg,var(--el-upload-dragger-uniform-color,#2563eb) 60deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 90deg,transparent 120deg,transparent 180deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 210deg,var(--el-upload-dragger-uniform-color,#2563eb) 240deg,transparent 270deg,transparent 1turn);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:borderRotate-97f23dbc 2s linear infinite;pointer-events:none;z-index:1}.paste-card[data-v-97f23dbc] .el-card__body{padding:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.upload-card-busy.paste-card[data-v-97f23dbc]{height:17vh}.upload-card-textarea[data-v-97f23dbc]{width:50vw;height:70%;border-radius:16px;background:var(--textarea-bg,rgba(37,99,235,.02));transition:all .3s cubic-bezier(.4,0,.2,1);box-sizing:border-box;display:flex;position:relative}.upload-card-busy .upload-card-textarea[data-v-97f23dbc]{height:50%}.upload-card-textarea[data-v-97f23dbc]:before{content:"";position:absolute;inset:-1px;border-radius:17px;padding:1px;background:rgba(37,99,235,.2);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;opacity:.6;transition:opacity .3s ease}.upload-card-textarea[data-v-97f23dbc]:hover:before{opacity:1}.upload-card-textarea[data-v-97f23dbc]:focus-within:before{opacity:1;background:rgba(37,99,235,.4)}[data-v-97f23dbc] .el-textarea__inner{border-radius:16px;background:var(--textarea-inner-bg,rgba(0,0,0,.02));transition:all .3s cubic-bezier(.4,0,.2,1);resize:none;border:1px solid transparent;padding:16px 20px;font-size:14px;line-height:1.6;color:var(--el-text-color-primary)}[data-v-97f23dbc] .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-97f23dbc] .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-97f23dbc] .el-textarea__inner:hover{background:var(--textarea-inner-hover-bg,rgba(37,99,235,.03))}[data-v-97f23dbc] .el-textarea__inner:focus{border-color:transparent;box-shadow:none;background:var(--textarea-inner-focus-bg,rgba(37,99,235,.02))}.upload-card-textarea[data-v-97f23dbc] ::-webkit-scrollbar{width:6px;height:6px}.upload-card-textarea[data-v-97f23dbc] ::-webkit-scrollbar-track{background:transparent;border-radius:6px;margin:8px}.upload-card-textarea[data-v-97f23dbc] ::-webkit-scrollbar-thumb{background:rgba(37,99,235,.5);border-radius:6px;-webkit-transition:background .3s ease;transition:background .3s ease}.upload-card-textarea[data-v-97f23dbc] ::-webkit-scrollbar-thumb:hover{background:rgba(37,99,235,.7)}.paste-card-actions[data-v-97f23dbc]{display:flex;justify-content:space-between;align-items:center;width:50vw;gap:12px;margin-top:16px}.paste-card-upload-button[data-v-97f23dbc]{min-width:92px;height:38px;border-radius:10px!important;font-weight:600;font-size:14px;letter-spacing:.04em;color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 10%,transparent)!important;border:1px solid color-mix(in srgb,var(--primary-color) 36%,var(--glass-border))!important;box-shadow:none;transition:background-color .2s ease,border-color .2s ease,transform .2s ease!important}.paste-card-upload-button[data-v-97f23dbc]:hover{color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 14%,transparent)!important;border-color:color-mix(in srgb,var(--primary-color) 52%,var(--glass-border))!important;transform:translateY(-1px);box-shadow:none}.paste-card-upload-button[data-v-97f23dbc]:focus-visible{color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 14%,transparent)!important;border-color:color-mix(in srgb,var(--primary-color) 52%,var(--glass-border))!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 14%,transparent)!important}.paste-card-upload-button[data-v-97f23dbc]:active{transform:translateY(0);background:color-mix(in srgb,var(--primary-color) 18%,transparent)!important}.upload-card-busy .paste-card-upload-button[data-v-97f23dbc]{min-width:72px;height:32px;border-radius:8px!important;font-size:13px;letter-spacing:.02em}.upload-card-busy .paste-card-actions[data-v-97f23dbc]{margin-top:10px}.paste-card-method-group[data-v-97f23dbc]{position:relative;display:inline-flex;align-items:center;width:158px;height:38px;box-sizing:border-box;gap:2px;padding:3px;background:var(--glass-bg);border:1px solid var(--glass-border);border-radius:10px;overflow:hidden}.paste-card-method-group[data-v-97f23dbc]:before{content:"";position:absolute;top:3px;left:3px;width:calc(50% - 4px);height:calc(100% - 6px);border-radius:7px;background:color-mix(in srgb,var(--primary-color) 14%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--primary-color) 42%,var(--glass-border)) inset;transform:translateX(0);transition:transform .22s cubic-bezier(.4,0,.2,1);pointer-events:none}.paste-card-method-group.is-external[data-v-97f23dbc]:before{transform:translateX(calc(100% + 2px))}.paste-card-method-button[data-v-97f23dbc]{position:relative;z-index:1;display:inline-flex;flex:1 1 0;align-items:center;justify-content:center;min-width:0;height:30px;box-sizing:border-box;padding:0 14px;border:none;border-radius:7px;background:transparent;font-weight:500;font-size:13px;line-height:1;color:var(--el-text-color-secondary);cursor:pointer;transition:color .2s ease}.paste-card-method-button.is-active[data-v-97f23dbc],.paste-card-method-button[data-v-97f23dbc]:hover{color:var(--primary-color-accent)}.paste-card-method-button[data-v-97f23dbc]:focus-visible{outline:none;color:var(--primary-color-accent)}@media (max-width:768px){.paste-card[data-v-97f23dbc]{height:auto;min-height:30vh;padding:6px;border-radius:12px}.upload-card-busy.paste-card[data-v-97f23dbc]{height:auto;min-height:18vh;padding:5px}.upload-card-textarea[data-v-97f23dbc]{margin-top:4px;width:calc(100% - 4px)!important}.upload-card-textarea[data-v-97f23dbc]:before{border-radius:11px}[data-v-97f23dbc] .el-textarea__inner{border-radius:10px;padding:8px 10px;font-size:12px}.paste-card-actions[data-v-97f23dbc]{width:100%!important;margin-top:8px;gap:8px}.paste-card-upload-button[data-v-97f23dbc]{height:32px;min-width:64px;border-radius:8px!important;font-size:12px;letter-spacing:.02em;padding:0 12px}.paste-card-method-group[data-v-97f23dbc]{width:128px;height:32px;padding:3px;border-radius:9px}.paste-card-method-group[data-v-97f23dbc]:before{border-radius:6px}.paste-card-method-button[data-v-97f23dbc]{height:26px;padding:0 10px;font-size:11px;border-radius:6px}}.upload-list-dashboard[data-v-97f23dbc]{display:flex;justify-content:space-between;align-items:center;height:7vh;padding:0 15px;box-sizing:border-box;width:100%;min-width:0;position:sticky;top:0;z-index:1;background:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border);border-radius:16px;box-shadow:var(--glass-shadow);opacity:.7}[data-v-97f23dbc] .el-upload-dragger{position:relative;overflow:hidden}[data-v-97f23dbc] .el-upload-dragger:before{background-image:radial-gradient(2px 2px at 10% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 20% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 30% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 40% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 50% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 60% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 70% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 80% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 90% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 15% 70%,var(--el-upload-dragger-uniform-color) 50%,transparent 0);background-size:200px 200px}[data-v-97f23dbc] .el-upload-dragger:after,[data-v-97f23dbc] .el-upload-dragger:before{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;z-index:0;transition:opacity .6s ease}[data-v-97f23dbc] .el-upload-dragger:after{background-image:radial-gradient(3px 3px at 15% 15%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(3px 3px at 50% 50%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(3px 3px at 85% 85%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2.5px 2.5px at 35% 65%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2.5px 2.5px at 65% 35%,var(--el-upload-dragger-uniform-color) 50%,transparent 0);background-size:150px 150px}.upload-card[data-v-97f23dbc]:hover .el-upload-dragger:before{opacity:.3;animation:starScroll-97f23dbc 60s linear infinite}.upload-card[data-v-97f23dbc]:hover .el-upload-dragger:after{opacity:.6;animation:starScroll-97f23dbc 40s linear infinite,starPulse-97f23dbc 4s ease-in-out infinite}@keyframes starScroll-97f23dbc{0%{background-position:0 0}to{background-position:100px 100px}}@keyframes starPulse-97f23dbc{0%,to{opacity:.6}50%{opacity:.3}}.modern-action-group[data-v-97f23dbc]{display:flex;align-items:center;gap:5px;height:44px;box-sizing:border-box;padding:5px;background:var(--glass-bg);border-radius:12px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-group[data-v-97f23dbc]:hover{background:var(--glass-bg);border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-btn[data-v-97f23dbc]{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;border-radius:13px;background:var(--upload-action-btn-bg);color:var(--upload-action-btn-color);cursor:pointer;transition:background-color .22s ease,color .22s ease,box-shadow .22s ease,transform .22s ease;font-size:14px;box-shadow:var(--upload-action-btn-shadow);position:relative;overflow:hidden;outline:none!important}.modern-action-btn[data-v-97f23dbc]:focus,.modern-action-btn[data-v-97f23dbc]:focus-visible{outline:none!important}.modern-action-btn[data-v-97f23dbc]:before{content:"";position:absolute;inset:2px;border-radius:11px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-action-btn[data-v-97f23dbc]:hover{background:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.modern-action-btn[data-v-97f23dbc]:hover:before{opacity:.08}.modern-action-btn[data-v-97f23dbc]:active{transform:translateY(0) scale(.97);box-shadow:var(--upload-action-btn-active-shadow)}.modern-action-btn-copy[data-v-97f23dbc]{color:var(--upload-action-copy-color)}.modern-action-btn-retry[data-v-97f23dbc]{color:var(--upload-action-retry-color)}.modern-action-btn-danger[data-v-97f23dbc]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-action-btn-danger[data-v-97f23dbc]:hover{background:var(--upload-action-danger-hover-bg);box-shadow:var(--upload-action-danger-hover-shadow)}.modern-dropdown-item-content[data-v-97f23dbc]{display:flex;align-items:center;justify-content:space-between;width:100%;gap:12px;padding:4px 0}.modern-dropdown-item-content span[data-v-97f23dbc]{font-weight:500;color:var(--el-text-color-primary)}.upload-list-dashboard-title[data-v-97f23dbc]{font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px;height:44px;box-sizing:border-box;padding:0 14px;background:var(--dashboard-title-bg,rgba(37,99,235,.06));border:none;border-radius:12px;color:var(--el-text-color-primary)}.upload-list-dashboard-title .el-icon[data-v-97f23dbc]{font-size:16px;margin-right:4px;opacity:.85}@media (max-width:768px){.modern-action-group[data-v-97f23dbc]{height:34px;gap:2px;padding:2px;border-radius:9px}.modern-action-btn[data-v-97f23dbc]{width:28px;height:28px;border-radius:7px;font-size:11px}.upload-list-dashboard-title[data-v-97f23dbc]{height:34px;font-size:11px;padding:0 7px;border-radius:9px}.upload-list-dashboard-title .el-icon[data-v-97f23dbc]{font-size:13px;margin-right:1px}.upload-list-dashboard[data-v-97f23dbc]{padding:0 6px;gap:4px}.upload-list-dashboard-title[data-v-97f23dbc]{gap:3px;min-width:0;flex-shrink:1;overflow:hidden}.upload-list-dashboard-action[data-v-97f23dbc]{flex-shrink:0}}.logo-link[data-v-17f54292]{text-decoration:none;display:inline-block}.logo[data-v-17f54292]{transition:all .3s ease;border-radius:8px}.logo--fixed[data-v-17f54292]{position:fixed;top:20px;left:20px;z-index:100}.logo--relative[data-v-17f54292]{position:relative}.logo--absolute[data-v-17f54292]{position:absolute;top:5px;left:5px;z-index:100}.logo--static[data-v-17f54292]{position:static}.logo--small[data-v-17f54292]{height:50px;width:50px}.logo--normal[data-v-17f54292]{height:70px;width:70px}.logo--large[data-v-17f54292]{height:90px;width:90px}.logo--hover-enabled[data-v-17f54292]:hover{transform:scale(1.1) rotate(5deg);filter:drop-shadow(0 0 10px var(--logo-glow-color))}@media (max-width:768px){.logo--small[data-v-17f54292]{height:40px;width:40px}.logo--normal[data-v-17f54292]{height:60px;width:60px}.logo--large[data-v-17f54292]{height:75px;width:75px}}.logo[data-v-17f54292]:focus{outline:2px solid var(--el-color-primary);outline-offset:2px}.logo[data-v-17f54292]{filter:var(--logo-filter,none);opacity:var(--logo-opacity,1)}@media (prefers-color-scheme:dark){.logo[data-v-17f54292]{filter:var(--logo-dark-filter,brightness(.9))}}.directory-suggestion-input[data-v-28b8eda7]{width:100%;height:100%;position:relative}.suggestion-dropdown[data-v-28b8eda7]{position:absolute;top:calc(100% + 10px);left:0;width:100%;z-index:9999;border-radius:12px;border:1px solid var(--glass-border);background-color:var(--popper-bg-color);box-shadow:var(--popper-shadow);padding:6px 0;overflow:hidden}.suggestion-list[data-v-28b8eda7]{list-style:none;margin:0;padding:0;max-height:260px;overflow-y:auto}.suggestion-item[data-v-28b8eda7]{padding:8px 16px;font-size:13px;border-radius:6px;margin:2px 6px;cursor:pointer;transition:background-color .2s ease;text-align:left;color:var(--el-text-color-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion-item[data-v-28b8eda7]:hover{background-color:var(--el-fill-color-light)}#themeToggle[data-v-2122c62a]{border:1px solid var(--glass-border);cursor:pointer;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:12px;background-color:var(--glass-bg);box-shadow:none;transition:background-color .25s ease,border-color .25s ease,transform .25s ease}#themeToggle[data-v-2122c62a]:hover{border-color:var(--glass-border-hover)}#themeToggle[data-v-2122c62a]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-2122c62a]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-2122c62a]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-2122c62a]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-2122c62a]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-2122c62a]{transform:rotate(40deg)}.theme_toggle_g[data-v-2122c62a]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-2122c62a],.icon-fade-leave-active[data-v-2122c62a]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-2122c62a]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-2122c62a]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-2122c62a],.icon-fade-leave-from[data-v-2122c62a]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-2122c62a]{display:inline-block}.container[data-v-06705292]{background:var(--bg-color);min-height:100vh}.rotate[data-v-06705292]{animation:spin-06705292 2s ease-in-out}.scale[data-v-06705292]{animation:scale-06705292 .5s ease-in-out}@keyframes spin-06705292{0%{transform:rotate(0deg)}25%{transform:rotate(5deg)}50%{transform:rotate(0deg)}75%{transform:rotate(-3deg)}to{transform:rotate(0deg)}}@keyframes streamer-06705292{0%{background-position:200%}to{background-position:-200%}}@keyframes rotate-shake-06705292{0%{transform:rotate(0deg)}50%{transform:rotate(10deg)}to{transform:rotate(0deg)}}@keyframes shake-06705292{0%{transform:translateX(0)}50%{transform:translateX(-1px)}to{transform:translateX(0)}}@keyframes scale-06705292{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.desktop-only[data-v-06705292]{display:inline-block}.mobile-only[data-v-06705292]{display:none}@media (max-width:768px){.desktop-only[data-v-06705292]{display:none!important}.mobile-only[data-v-06705292]{display:flex!important}}.toggle-dark-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px;position:fixed;top:30px;right:80px;padding:0}.more-dropdown[data-v-06705292]{position:fixed;top:30px;right:30px;z-index:100}.more-dropdown .more-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;outline:none;padding:0}.more-dropdown .more-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-method-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;position:fixed;top:30px;right:130px;outline:none;padding:0}@media (max-width:768px){.upload-method-button[data-v-06705292]{width:2rem;height:2rem}}.upload-method-icon[data-v-06705292]{outline:none}.more-button .svg-inline--fa[data-v-06705292],.upload-method-button .svg-inline--fa[data-v-06705292]{font-size:1.5em}.directory-tree-trigger .svg-inline--fa[data-v-06705292]{font-size:1.2em}.mobile-more-dropdown[data-v-06705292]{position:fixed;top:30px;right:18px;z-index:100}.mobile-more-button[data-v-06705292]{width:2rem;height:2rem;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;outline:none;padding:0}.mobile-more-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-folder-container[data-v-06705292]{display:flex;align-items:center;position:fixed;top:30px;right:180px;z-index:100}.upload-folder-container.no-announcement[data-v-06705292]{right:180px}@media (max-width:768px){.upload-folder-container.no-announcement[data-v-06705292],.upload-folder-container[data-v-06705292]{right:58px}}.upload-folder[data-v-06705292]{width:100px;height:2.5rem;border-radius:12px;display:flex;align-items:center;box-sizing:border-box;transition:all .3s ease,width .4s ease}.upload-folder.active[data-v-06705292]{width:200px}@media (max-width:768px){.upload-folder[data-v-06705292]{width:80px;height:2rem}.upload-folder.active[data-v-06705292]{width:120px}}.directory-tree-trigger[data-v-06705292]{width:2.5rem;height:2.5rem;display:flex;justify-content:center;align-items:center;box-sizing:border-box;border:1px solid var(--glass-border);margin-left:10px;background-color:var(--glass-bg);box-shadow:var(--glass-shadow);color:var(--theme-toggle-color);border-radius:12px;outline:none;cursor:pointer;transition:background-color .25s ease,border-color .25s ease,transform .25s ease}.directory-tree-trigger[data-v-06705292]:hover{border-color:var(--glass-border-hover);transform:scale(1.05)}@media (max-width:768px){.directory-tree-trigger[data-v-06705292]{width:2rem;height:2rem}.directory-tree-trigger .svg-inline--fa[data-v-06705292]{font-size:1.1em}}.upload-folder[data-v-06705292] .inner-folder-input{width:100%;height:100%}.upload-folder[data-v-06705292] .el-input{height:100%;box-sizing:border-box}.upload-folder[data-v-06705292] .el-input__wrapper{border-radius:12px;background-color:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);height:100%;padding:0 10px;box-sizing:border-box;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease!important}.upload-folder[data-v-06705292] .el-input__wrapper:hover{background-color:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .upload-folder[data-v-06705292] .el-input__wrapper:hover{background-color:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}.upload-folder[data-v-06705292] .el-input__wrapper.is-focus,.upload-folder[data-v-06705292] .el-input__wrapper:focus-within{border-color:var(--glass-border);box-shadow:var(--glass-shadow)!important}.quick-toolbar[data-v-06705292]{--quick-toolbar-size:2.5rem;--quick-toolbar-button-size:calc(var(--quick-toolbar-size) - 6px);position:fixed;bottom:50px;right:30px;width:var(--quick-toolbar-size);box-sizing:border-box;display:flex;flex-direction:column;align-items:center;gap:0;z-index:200;padding:3px;border-radius:999px;border:1px solid var(--glass-border);background-color:var(--glass-bg);box-shadow:none;transition:background-color .24s ease,border-color .24s ease}.directory-tree-trigger[data-v-06705292],.mobile-more-button[data-v-06705292],.more-dropdown .more-button[data-v-06705292],.quick-toolbar[data-v-06705292],.toggle-dark-button[data-v-06705292],.upload-method-button[data-v-06705292]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.quick-toolbar-button[data-v-06705292]{width:var(--quick-toolbar-button-size);height:var(--quick-toolbar-button-size);border:none;transition:transform .22s ease,background-color .22s ease,box-shadow .22s ease,color .22s ease;margin-left:0;padding:0;border-radius:999px;background-color:transparent;box-shadow:none;color:var(--toolbar-button-color);outline:none}.quick-toolbar-actions[data-v-06705292]{display:grid;grid-template-rows:0fr;width:100%;margin-bottom:0;opacity:0;pointer-events:none;transform:translateY(12px);transform-origin:bottom center;transition:grid-template-rows .52s cubic-bezier(.16,1,.3,1),margin-bottom .52s cubic-bezier(.16,1,.3,1),opacity .32s ease,transform .52s cubic-bezier(.16,1,.3,1)}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-06705292]{grid-template-rows:1fr;margin-bottom:4px;opacity:1;pointer-events:auto;transform:translateY(0)}.quick-toolbar-actions-inner[data-v-06705292]{display:flex;flex-direction:column;align-items:center;gap:3px;min-height:0;overflow:hidden}.quick-toolbar-more.is-active[data-v-06705292]{background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-shadow)}.quick-toolbar-more[data-v-06705292]{margin-top:4px}.quick-toolbar-icon[data-v-06705292]{font-size:16px}.quick-toolbar-toggle-icon[data-v-06705292]{transform:rotate(180deg);transition:transform .32s ease}.quick-toolbar-more.is-active .quick-toolbar-toggle-icon[data-v-06705292]{transform:rotate(0deg)}.info-container[data-v-06705292]:hover,.quick-toolbar-button[data-v-06705292]:hover{transform:scale(1.05);background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.quick-toolbar[data-v-06705292]:hover{border-color:var(--glass-border-hover)}.quick-toolbar-button[data-v-06705292]:hover{transform:none}.toggle-dark-button[data-v-06705292]:hover,.upload-method-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-folder[data-v-06705292]:hover .el-input__wrapper{background-color:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .upload-folder[data-v-06705292]:hover .el-input__wrapper{background-color:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}@media (max-width:768px){.quick-toolbar[data-v-06705292]{--quick-toolbar-size:2rem;--quick-toolbar-button-size:calc(var(--quick-toolbar-size) - 4px);right:18px;bottom:max(72px,calc(6vh + 20px + env(safe-area-inset-bottom)));padding:2px}.quick-toolbar-actions[data-v-06705292]{margin-bottom:0}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-06705292]{margin-bottom:3px}.quick-toolbar-actions-inner[data-v-06705292]{gap:2px}.quick-toolbar-more[data-v-06705292]{margin-top:3px}.quick-toolbar-icon[data-v-06705292]{font-size:14px}}[data-v-06705292] .el-dialog{border-radius:12px;border:1px solid var(--glass-border);background-color:var(--dialog-bg-color);box-shadow:var(--dialog-box-shadow)}.dialog-action[data-v-06705292]{display:flex;justify-content:center;margin-top:20px}.header[data-v-06705292]{display:flex;justify-content:center;align-items:center;padding:15px;margin-top:5vh;color:var(--upload-header-color);-webkit-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;position:relative;top:-3vh;transition:all .3s ease}.title[data-v-06705292]{font-size:2.25rem;font-weight:400;font-family:Pacifico,Noto Sans SC,sans-serif;color:var(--upload-title-text-color);text-shadow:var(--upload-title-text-shadow);position:relative;padding-bottom:8px;cursor:pointer;transition:transform .4s cubic-bezier(.4,0,.2,1),filter .25s ease;animation:float-06705292 4s ease-in-out infinite;letter-spacing:3px}.title[data-v-06705292]:hover{transform:scale(1.08);filter:drop-shadow(0 0 20px var(--upload-title-hover-glow))}.title[data-v-06705292]:after{content:"";position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:0;height:3px;background:var(--upload-title-underline-bg);border-radius:3px;transition:width .5s cubic-bezier(.4,0,.2,1);box-shadow:var(--upload-title-underline-shadow)}.title[data-v-06705292]:hover:after{width:80%}.main-title[data-v-06705292]{color:var(--upload-main-title-color);text-decoration:none;display:inline-block;position:relative;filter:drop-shadow(0 0 8px rgba(255,255,255,.3));transition:opacity .16s ease}.title:hover .main-title[data-v-06705292]{opacity:0}.title[data-v-06705292]:hover{color:transparent;text-shadow:none}.title-crayon-text[data-v-06705292]{position:absolute;left:50%;top:-1px;z-index:2;width:-moz-max-content;width:max-content;pointer-events:none;white-space:nowrap;color:var(--upload-title-crayon-deep,#1d2129);opacity:0;-webkit-text-stroke:.35px var(--upload-title-crayon-edge);text-shadow:-1.2px .4px 0 var(--upload-title-crayon-burr),.9px -.7px 0 hsla(0,0%,100%,.24),1.5px .5px 0 var(--upload-title-crayon-dust),-1.7px -.6px 0 var(--upload-title-crayon-dust);transform:translateX(-50%) rotate(-.8deg);transform-origin:left 68%;clip-path:inset(-10px 100% -10px -10px);filter:saturate(1.08) contrast(1.06)}.title:hover .title-crayon-text[data-v-06705292]{animation:crayonWrite-06705292 .82s steps(18) forwards,crayonScratch-06705292 .16s steps(2) .82s 3}@keyframes float-06705292{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}@keyframes crayonWrite-06705292{0%{opacity:0;clip-path:inset(-10px 100% -10px -10px)}12%{opacity:.92}32%{clip-path:inset(-10px 68% -10px -10px)}47%{clip-path:inset(-10px 52% -10px -10px)}63%{clip-path:inset(-10px 34% -10px -10px)}78%{clip-path:inset(-10px 18% -10px -10px)}to{opacity:.92;clip-path:inset(-10px -10px -10px -10px)}}@keyframes crayonScratch-06705292{0%,to{transform:translateX(-50%) rotate(-.8deg)}50%{transform:translateX(calc(-50% + 1px)) rotate(-.45deg)}}@media (max-width:768px){.title[data-v-06705292]{font-size:1.55rem;letter-spacing:1px}.title[data-v-06705292]:hover{transform:scale(1.05)}}.upload-home[data-v-06705292]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:94vh;background-color:transparent}.upload[data-v-06705292]{margin-bottom:5px;position:relative;top:-3vh}@media (max-width:768px){.header[data-v-06705292]{padding:8px 15px 4px;top:-2.5vh}.title[data-v-06705292]{padding-bottom:5px}.upload[data-v-06705292]{top:-3.8vh}}.footer[data-v-06705292]{height:6vh} \ No newline at end of file +.history-container[data-v-7da2f8c2]{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2000;display:flex;flex-direction:column;color:var(--upload-text-color);clip-path:circle(0 at calc(100% - 200px) 50px);opacity:0;transition:clip-path .6s cubic-bezier(.4,0,.2,1),opacity .3s ease}.history-container[data-v-7da2f8c2]:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-container-bg-color);z-index:-1;will-change:transform;transform:translateZ(0)}.history-container.active[data-v-7da2f8c2]{clip-path:circle(150% at calc(100% - 200px) 50px);opacity:1}.history-header[data-v-7da2f8c2]{padding:20px 40px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--el-border-color-lighter)}.header-left[data-v-7da2f8c2]{display:flex;align-items:baseline;gap:15px}.header-left h2[data-v-7da2f8c2]{margin:0;font-size:24px;background:var(--upload-main-title-color);background-size:200% auto;background-clip:text;-webkit-background-clip:text;color:transparent;font-weight:700}.record-count[data-v-7da2f8c2]{color:var(--upload-text-color);font-size:14px;opacity:.8}.header-right[data-v-7da2f8c2]{display:flex;gap:10px}.header-right .el-button[data-v-7da2f8c2]{background-color:var(--toolbar-button-bg-color);box-shadow:var(--toolbar-button-shadow);border:none;color:var(--theme-toggle-color);transition:all .3s ease}.header-right .el-button[data-v-7da2f8c2]:hover{transform:scale(1.05);box-shadow:var(--toolbar-button-shadow-hover)}.header-right .el-button.el-button--danger[data-v-7da2f8c2]{background:#dc2626;color:#fff}.history-content[data-v-7da2f8c2]{flex:1;overflow-y:auto;padding:20px 40px}.grid-view[data-v-7da2f8c2]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:20px}.grid-item[data-v-7da2f8c2]{background:var(--toolbar-button-bg-color);border-radius:12px;overflow:hidden;box-shadow:var(--toolbar-button-shadow);transition:transform .3s ease,box-shadow .3s ease;border:1px solid var(--glass-border)}.grid-item[data-v-7da2f8c2]:hover{box-shadow:var(--toolbar-button-shadow-hover)}.grid-preview[data-v-7da2f8c2]{height:160px;position:relative;background:var(--el-fill-color-light);display:flex;align-items:center;justify-content:center;overflow:hidden}.grid-preview img[data-v-7da2f8c2],.grid-preview video[data-v-7da2f8c2]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper[data-v-7da2f8c2]{font-size:48px;color:var(--theme-toggle-color);opacity:.5}.grid-overlay[data-v-7da2f8c2]{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease}.grid-item:hover .grid-overlay[data-v-7da2f8c2]{opacity:1}.grid-actions[data-v-7da2f8c2]{display:flex;gap:15px}.grid-info[data-v-7da2f8c2]{padding:12px}.file-name[data-v-7da2f8c2]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;color:var(--upload-text-color)}.upload-time[data-v-7da2f8c2]{font-size:12px;color:var(--upload-text-color);opacity:.6}.list-view[data-v-7da2f8c2]{display:flex;flex-direction:column;gap:10px}.list-item[data-v-7da2f8c2]{display:flex;align-items:center;padding:12px 15px;background:var(--toolbar-button-bg-color);border-radius:12px;box-shadow:var(--toolbar-button-shadow);border:1px solid var(--glass-border);transition:all .3s ease}.list-item[data-v-7da2f8c2]:hover{transform:translateX(5px);box-shadow:var(--toolbar-button-shadow-hover)}.list-preview[data-v-7da2f8c2]{width:50px;height:50px;border-radius:8px;overflow:hidden;margin-right:15px;background:var(--el-fill-color-light);display:flex;align-items:center;justify-content:center;flex-shrink:0}.list-preview img[data-v-7da2f8c2],.list-preview video[data-v-7da2f8c2]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper-small[data-v-7da2f8c2]{font-size:24px;color:var(--theme-toggle-color);opacity:.5}.list-info[data-v-7da2f8c2]{flex:1;min-width:0;margin-right:20px}.file-url[data-v-7da2f8c2]{font-size:12px;color:var(--upload-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.6}.list-meta[data-v-7da2f8c2]{margin-right:20px;text-align:right;min-width:140px}.list-actions[data-v-7da2f8c2]{display:flex;gap:8px}.empty-state[data-v-7da2f8c2]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--upload-text-color);font-size:18px;opacity:.5}.empty-icon[data-v-7da2f8c2]{font-size:64px;margin-bottom:20px;color:var(--theme-toggle-color)}.history-content[data-v-7da2f8c2]::-webkit-scrollbar{width:8px}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-track{background:transparent}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:4px}.history-content[data-v-7da2f8c2]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker)}.action-btn-view[data-v-7da2f8c2]{background-color:var(--toolbar-button-bg-color);box-shadow:var(--toolbar-button-shadow);border:none;color:var(--theme-toggle-color)}.action-btn-view[data-v-7da2f8c2]:hover{box-shadow:var(--toolbar-button-shadow-hover);color:var(--el-color-primary)}.history-group[data-v-7da2f8c2]{position:relative;padding-left:30px;border-left:2px solid var(--el-border-color-lighter);margin-left:10px;padding-bottom:30px}.history-group[data-v-7da2f8c2]:last-child{border-left:2px solid transparent}.timeline-header[data-v-7da2f8c2]{display:flex;align-items:center;margin-bottom:20px;position:relative}.timeline-dot[data-v-7da2f8c2]{position:absolute;left:-38px;width:14px;height:14px;border-radius:50%;background:var(--el-upload-dragger-uniform-color);box-shadow:none;z-index:2;box-sizing:border-box}.date-label[data-v-7da2f8c2]{font-size:20px;font-weight:700;background:var(--upload-main-title-color);background-size:200% auto;background-clip:text;-webkit-background-clip:text;color:transparent}.load-more-container[data-v-7da2f8c2]{display:flex;justify-content:center;padding:20px}.loading-indicator[data-v-7da2f8c2]{display:flex;align-items:center;gap:8px;color:var(--el-upload-dragger-uniform-color)}.load-more-hint[data-v-7da2f8c2],.no-more-hint[data-v-7da2f8c2]{color:var(--upload-text-color);opacity:.5;font-size:14px}.no-more-hint[data-v-7da2f8c2]{text-align:center;padding:20px}@media (max-width:768px){.history-header[data-v-7da2f8c2]{padding:15px 20px}.header-left h2[data-v-7da2f8c2]{font-size:20px}.history-content[data-v-7da2f8c2]{padding:15px 20px}.grid-view[data-v-7da2f8c2]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:15px}.grid-preview[data-v-7da2f8c2]{height:120px}.list-meta[data-v-7da2f8c2]{display:none}.list-info[data-v-7da2f8c2]{margin-right:10px}}.page-footer[data-v-08acbaa9]{display:flex;justify-content:center;align-items:center;width:100vw;color:var(--page-footer-text-color);font-size:large;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media (max-width:768px){.page-footer[data-v-08acbaa9]{font-size:small}}.footer-name[data-v-08acbaa9]{color:var(--page-footer-name-color);font-weight:700;text-decoration:none;position:relative;transition:all .3s ease}.footer-name[data-v-08acbaa9]:after{content:"";position:absolute;width:0;height:2px;bottom:-2px;left:0;background-color:var(--page-footer-name-color);transition:width .3s ease-in-out}.footer-name[data-v-08acbaa9]:hover:after{width:100%}.footer-link-icon[data-v-08acbaa9]{color:var(--page-footer-name-color);margin-left:5px;transition:transform .3s ease-in-out}.footer-link-icon[data-v-08acbaa9]:hover{transform:scale(1.2) rotate(-12deg)}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px;align-items:center;display:flex;height:32px;width:100%}.el-slider__runway{background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);cursor:pointer;flex:1;height:var(--el-slider-height);position:relative}.el-slider__runway.show-input{margin-right:30px;width:auto}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging,.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{transform:scale(1)}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{cursor:not-allowed}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{background-color:var(--el-slider-main-bg-color);border-bottom-left-radius:var(--el-slider-border-radius);border-top-left-radius:var(--el-slider-border-radius);height:var(--el-slider-height);position:absolute}.el-slider__button-wrapper{background-color:transparent;height:var(--el-slider-button-wrapper-size);line-height:normal;outline:none;position:absolute;text-align:center;top:var(--el-slider-button-wrapper-offset);transform:translateX(-50%);-webkit-user-select:none;user-select:none;width:var(--el-slider-button-wrapper-size);z-index:1}.el-slider__button-wrapper:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:grab}.el-slider__button-wrapper.dragging{cursor:grabbing}.el-slider__button{background-color:var(--el-color-white);border:2px solid var(--el-slider-main-bg-color);border-radius:50%;box-sizing:border-box;display:inline-block;height:var(--el-slider-button-size);transition:var(--el-transition-duration-fast);-webkit-user-select:none;user-select:none;vertical-align:middle;width:var(--el-slider-button-size)}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:grab}.el-slider__button.dragging{cursor:grabbing}.el-slider__stop{background-color:var(--el-slider-stop-bg-color);border-radius:var(--el-border-radius-circle);height:var(--el-slider-height);position:absolute;transform:translateX(-50%);width:var(--el-slider-height)}.el-slider__marks{height:100%;left:12px;top:0;width:18px}.el-slider__marks-text{color:var(--el-color-info);font-size:14px;margin-top:15px;position:absolute;transform:translateX(-50%);white-space:pre}.el-slider.is-vertical{display:inline-flex;flex:0;height:100%;position:relative;width:auto}.el-slider.is-vertical .el-slider__runway{height:100%;margin:0 16px;width:var(--el-slider-height)}.el-slider.is-vertical .el-slider__bar{border-radius:0 0 3px 3px;height:auto;width:var(--el-slider-height)}.el-slider.is-vertical .el-slider__button-wrapper{left:var(--el-slider-button-wrapper-offset);top:auto;transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{left:15px;margin-top:0;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}.channel-icon-wrapper[data-v-ce6ff2ce]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-ce6ff2ce] svg,.channel-svg-icon[data-v-ce6ff2ce]{width:1em;height:1em;fill:currentColor}.channel-icon-wrapper.channel-brand-telegram[data-v-ce6ff2ce]{color:#229ed9}.channel-icon-wrapper.channel-brand-cfr2[data-v-ce6ff2ce]{color:#f38020}.channel-icon-wrapper.channel-brand-s3[data-v-ce6ff2ce]{color:#f90}.channel-icon-wrapper.channel-brand-discord[data-v-ce6ff2ce]{color:#5865f2}.channel-icon-wrapper.channel-brand-huggingface[data-v-ce6ff2ce]{color:#ff9d00}.channel-icon-wrapper.channel-brand-webdav[data-v-ce6ff2ce]{color:#14b8a6}.upload-settings-dialog .radio-card-group.compact{gap:8px}.upload-settings-dialog .radio-card-group.compact .radio-card{padding:8px 12px;font-size:13px}.upload-settings-dialog .radio-card-group.compact .radio-card .el-radio__label{display:flex;align-items:center;gap:6px}.upload-settings-dialog .radio-card-group.compact .channel-icon{width:18px;font-size:18px;text-align:center;flex-shrink:0}.upload-settings-dialog .slider-item{flex-direction:column;align-items:flex-start;gap:12px}.upload-settings-dialog .slider-wrapper{display:flex;align-items:center;gap:12px;width:100%}.upload-settings-dialog .slider-wrapper .el-slider{flex:1;min-width:0}.upload-settings-dialog .slider-input{width:96px!important;flex-shrink:0}.upload-settings-dialog .slider-input .el-input__inner{text-align:center}.upload-settings-dialog .slider-input-wrapper{display:flex;align-items:center;gap:6px;flex-shrink:0}.upload-settings-dialog .slider-unit{font-size:13px;font-weight:500;color:var(--el-text-color-secondary)}@media (max-width:768px){.upload-settings-dialog .setting-item .radio-card-group.compact{width:100%}.upload-settings-dialog .radio-card-group.compact{flex-direction:row;display:grid;grid-template-columns:repeat(2,1fr);gap:8px;width:100%}.upload-settings-dialog .radio-card-group.compact .radio-card{width:100%;box-sizing:border-box;justify-content:center;flex:1}.upload-settings-dialog .radio-card-group.compact .radio-card .el-radio__label{justify-content:center}.upload-settings-dialog .slider-wrapper{gap:8px}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.upload-list-item[data-v-645a7810]{display:flex;align-items:center;justify-content:space-between;margin:8px 10px;border:1px solid var(--upload-list-item-border-color,rgba(37,99,235,.1));padding:10px 12px;border-radius:16px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item[data-v-645a7810]:hover{border-color:var(--upload-list-item-hover-border,rgba(37,99,235,.25));box-shadow:none}.upload-list-item-content[data-v-645a7810]{display:flex;flex-direction:column;margin-left:10px}.upload-list-item-action[data-v-645a7810]{display:flex;flex-direction:column;align-items:center;gap:6px}.upload-list-item-url-row[data-v-645a7810]{display:flex;flex-direction:row;align-items:center;width:38vw;gap:8px;margin-bottom:6px}.upload-list-item-url-row[data-v-645a7810]:last-child{margin-bottom:0}.upload-list-item-url[data-v-645a7810]{display:flex;flex-direction:column}.file-icon[data-v-645a7810]{font-size:30px;color:var(--upload-list-file-icon-color)}.upload-list-item-name-wrapper[data-v-645a7810]{display:flex;align-items:center;justify-content:center;padding:8px 16px;background:var(--file-name-bg,rgba(37,99,235,.05));border-radius:10px;margin-bottom:8px;border:1px solid var(--file-name-border,rgba(37,99,235,.12));transition:all .3s ease}.upload-list-item-name-wrapper[data-v-645a7810]:hover{background:var(--file-name-hover-bg,rgba(37,99,235,.09));border-color:var(--file-name-hover-border,rgba(37,99,235,.2))}.upload-list-item-name[data-v-645a7810]{font-size:14px;font-weight:600;max-width:28vw;color:var(--el-text-color-primary);letter-spacing:.3px;text-align:center}.upload-list-item-progress[data-v-645a7810]{margin-top:8px;width:28vw;padding:4px 8px;background:var(--progress-wrapper-bg,rgba(37,99,235,.04));border-radius:12px;border:1px solid var(--progress-wrapper-border,rgba(37,99,235,.1))}.upload-list-item-progress[data-v-645a7810] .el-progress{--el-color-primary:var(--primary-color)}.upload-list-item-progress[data-v-645a7810] .el-progress-bar{padding-right:0;margin-right:0}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__outer{height:10px!important;border-radius:8px;background:var(--progress-outer-bg,rgba(0,0,0,.045));box-shadow:none;overflow:hidden}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner{border-radius:8px;background:var(--primary-color)!important;box-shadow:none;position:relative;overflow:hidden;transition:width .3s ease}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:hsla(0,0%,100%,.12);pointer-events:none}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__inner:before{content:"";position:absolute;top:0;left:-100%;width:300%;height:100%;background:repeating-linear-gradient(45deg,transparent,transparent 8px,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 16px);animation:progressStripes-645a7810 1s linear infinite}.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner{background:#16a34a!important;background-size:200% 100%;box-shadow:none;animation:none}.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner:after,.upload-list-item-progress[data-v-645a7810] .el-progress--success .el-progress-bar__inner:before{animation:none;background:none}.upload-list-item-progress[data-v-645a7810] .el-progress--exception .el-progress-bar__inner{background:#dc2626!important;background-size:200% 100%;box-shadow:none;animation:progressPulse-645a7810 1s ease-in-out infinite}.upload-list-item-progress[data-v-645a7810] .el-progress--exception .el-progress-bar__inner:before{animation:none;background:none}@keyframes progressStripes-645a7810{0%{transform:translateX(0)}to{transform:translateX(22.627px)}}@keyframes progressPulse-645a7810{0%,to{opacity:1}50%{opacity:.7}}.upload-list-item-url[data-v-645a7810] .el-input{transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper{border-radius:10px;box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1);background:var(--el-fill-color-blank);border:1px solid var(--el-border-color-lighter);overflow:hidden;position:relative;padding:0}.upload-list-item-url[data-v-645a7810] .el-input-group>.el-input__wrapper{border-radius:0 9px 9px 0!important}.upload-list-item-url[data-v-645a7810] .el-input__wrapper:hover{box-shadow:none;border-color:var(--el-color-primary-light-5)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper.is-focus{box-shadow:none;border-color:var(--el-color-primary)}.upload-list-item-url[data-v-645a7810] .el-input__wrapper.is-focus:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(37,99,235,.08),transparent);animation:shimmer-645a7810 2s infinite;z-index:0}@keyframes shimmer-645a7810{0%{left:-100%}to{left:100%}}.upload-list-item-url[data-v-645a7810] .el-input__inner{font-size:13px;font-family:Courier New,Monaco,monospace;color:var(--el-text-color-regular);transition:all .3s ease;padding-left:12px;position:relative;z-index:1;border-radius:0 10px 10px 0}.upload-list-item-url[data-v-645a7810] .el-input__inner::-moz-selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-645a7810] .el-input__inner::selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend{background:var(--el-color-primary-light-9);color:var(--el-color-primary);font-weight:600;font-size:12px;border:none;padding:0 14px;margin:0;border-radius:9px 0 0 9px;box-shadow:none;transition:all .3s ease;letter-spacing:.5px;position:relative;z-index:1}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend:after{content:"";position:absolute;right:0;top:50%;transform:translateY(-50%);height:60%;width:1px;background:var(--el-color-primary-light-7);opacity:.3;transition:all .3s ease}.upload-list-item-url[data-v-645a7810] .el-input:hover .el-input-group__prepend{background:var(--el-color-primary-light-8)}.upload-list-item-url[data-v-645a7810] .el-input:hover .el-input-group__prepend:after{opacity:.5}.upload-list-item-url[data-v-645a7810] .el-input.is-focus .el-input-group__prepend{background:var(--el-color-primary);color:#fff;animation:prependPulse-645a7810 2s ease-in-out infinite}.upload-list-item-url[data-v-645a7810] .el-input.is-focus .el-input-group__prepend:after{background:hsla(0,0%,100%,.3);opacity:1}@keyframes prependPulse-645a7810{0%,to{opacity:1}50%{opacity:.95}}.modern-file-action-btn[data-v-645a7810]{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:10px;background:var(--upload-action-btn-bg);color:var(--upload-action-btn-color);box-shadow:var(--upload-action-btn-shadow);cursor:pointer;transition:background-color .22s ease,color .22s ease,transform .22s ease;font-size:16px;position:relative;overflow:hidden;margin:4px 0;outline:none}.modern-file-action-btn[data-v-645a7810]:before{content:"";position:absolute;inset:2px;border-radius:8px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-file-action-btn[data-v-645a7810]:hover{background:var(--upload-action-btn-hover-bg)}.modern-file-action-btn[data-v-645a7810]:hover:before{opacity:.08}.modern-file-action-btn[data-v-645a7810]:active{transform:scale(.96)}.modern-file-action-btn-primary[data-v-645a7810]{color:var(--upload-action-copy-color)}.modern-file-action-btn-danger[data-v-645a7810]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-file-action-btn-danger[data-v-645a7810]:hover{background:var(--upload-action-danger-hover-bg)}@media (max-width:768px){.upload-list-item[data-v-645a7810]{margin:5px 6px;padding:7px 8px;border-radius:12px}.upload-list-item-content[data-v-645a7810]{margin-left:2px}.upload-list-item-action[data-v-645a7810]{gap:3px}.upload-list-item-url-row[data-v-645a7810]{width:42vw;flex-direction:column;gap:4px;margin-bottom:4px}.upload-list-item-progress[data-v-645a7810]{width:32vw;margin-top:5px;padding:2px 5px;border-radius:9px}.upload-list-item-progress[data-v-645a7810] .el-progress-bar__outer{height:6px!important}.upload-list-item-url[data-v-645a7810] .el-input__wrapper{border-radius:7px}.upload-list-item-url[data-v-645a7810] .el-input__inner{font-size:10px;padding-left:8px}.upload-list-item-url[data-v-645a7810] .el-input-group__prepend{font-size:9px;padding:0 6px;border-radius:7px 0 0 7px}.modern-file-action-btn[data-v-645a7810]{width:26px;height:26px;margin:2px 0;border-radius:8px;font-size:12px}.upload-list-item-name-wrapper[data-v-645a7810]{padding:3px 8px;margin-bottom:5px;border-radius:7px}.upload-list-item-name[data-v-645a7810]{font-size:11px;width:32vw}}.el-upload{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;align-items:center;cursor:pointer;display:inline-flex;justify-content:center;outline:none}.el-upload.is-disabled{cursor:not-allowed}.el-upload.is-disabled:focus{color:inherit}.el-upload.is-disabled:focus,.el-upload.is-disabled:focus .el-upload-dragger{border-color:var(--el-border-color-darker)}.el-upload.is-disabled .el-upload-dragger{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-upload.is-disabled .el-upload-dragger .el-upload__text{color:var(--el-text-color-placeholder)}.el-upload.is-disabled .el-upload-dragger .el-upload__text em{color:var(--el-disabled-text-color)}.el-upload.is-disabled .el-upload-dragger:hover{border-color:var(--el-border-color-darker)}.el-upload__input{display:none}.el-upload__tip{color:var(--el-text-color-regular);font-size:12px;margin-top:7px}.el-upload iframe{filter:alpha(opacity=0);left:0;opacity:0;position:absolute;top:0;z-index:-1}.el-upload--picture-card{align-items:center;background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);border-radius:6px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:var(--el-upload-picture-card-size);justify-content:center;vertical-align:top;width:var(--el-upload-picture-card-size)}.el-upload--picture-card>i{color:var(--el-text-color-secondary);font-size:28px}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{color:var(--el-color-primary)}.el-upload:focus,.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);border-radius:6px;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:var(--el-upload-dragger-padding-vertical) var(--el-upload-dragger-padding-horizontal);position:relative;text-align:center}.el-upload-dragger .el-icon--upload{color:var(--el-text-color-placeholder);font-size:67px;line-height:50px;margin-bottom:16px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary);padding:calc(var(--el-upload-dragger-padding-vertical) - 1px) calc(var(--el-upload-dragger-padding-horizontal) - 1px)}.el-upload-list{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;list-style:none;margin:10px 0 0;padding:0;position:relative}.el-upload-list__item{border-radius:4px;box-sizing:border-box;color:var(--el-text-color-regular);font-size:14px;margin-bottom:5px;position:relative;transition:all .5s cubic-bezier(.55,0,.1,1);width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{color:var(--el-text-color-regular);cursor:pointer;display:none;opacity:.75;position:absolute;right:5px;top:50%;transform:translateY(-50%);transition:opacity var(--el-transition-duration)}.el-upload-list__item .el-icon--close:hover{color:var(--el-color-primary);opacity:1}.el-upload-list__item .el-icon--close-tip{color:var(--el-color-primary);cursor:pointer;display:none;font-size:12px;font-style:normal;opacity:1;position:absolute;right:5px;top:1px}.el-upload-list__item:hover{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{display:inline-flex;flex-direction:column;justify-content:center;margin-left:4px;width:calc(100% - 30px)}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon--close-tip,.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip{display:none}.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none;opacity:0}.el-upload-list__item-name{align-items:center;color:var(--el-text-color-regular);display:inline-flex;font-size:var(--el-font-size-base);padding:0 4px;text-align:center;transition:color var(--el-transition-duration)}.el-upload-list__item-name .el-icon{color:var(--el-text-color-secondary);margin-right:6px}.el-upload-list__item-file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-upload-list__item-status-label{align-items:center;display:none;height:100%;justify-content:center;line-height:inherit;position:absolute;right:5px;top:0;transition:opacity var(--el-transition-duration)}.el-upload-list__item-delete{color:var(--el-text-color-regular);display:none;font-size:12px;position:absolute;right:10px;top:0}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{display:inline-flex;flex-wrap:wrap;margin:0}.el-upload-list--picture-card .el-upload-list__item{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;display:inline-flex;height:var(--el-upload-list-picture-card-size);margin:0 8px 8px 0;overflow:hidden;padding:0;width:var(--el-upload-list-picture-card-size)}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:block;opacity:0}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{height:100%;object-fit:contain;width:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{background:var(--el-color-success);height:24px;right:-15px;text-align:center;top:-6px;transform:rotate(45deg);width:40px}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{align-items:center;background-color:var(--el-overlay-color-lighter);color:#fff;cursor:default;display:inline-flex;font-size:20px;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;transition:opacity var(--el-transition-duration);width:100%}.el-upload-list--picture-card .el-upload-list__item-actions span{cursor:pointer;display:none}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:16px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{color:inherit;font-size:inherit;position:static}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{bottom:auto;left:50%;top:50%;transform:translate(-50%,-50%);width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{align-items:center;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;display:flex;margin-top:10px;overflow:hidden;padding:10px;z-index:0}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{display:inline-flex;opacity:0}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{align-items:center;background-color:var(--el-color-white);display:inline-flex;height:70px;justify-content:center;object-fit:contain;position:relative;width:70px;z-index:1}.el-upload-list--picture .el-upload-list__item-status-label{background:var(--el-color-success);height:26px;position:absolute;right:-17px;text-align:center;top:-7px;transform:rotate(45deg);width:46px}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{cursor:default;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%;z-index:10}.el-upload-cover:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;height:100%;width:100%}.el-upload-cover__label{background:var(--el-color-success);height:24px;right:-15px;text-align:center;top:-6px;transform:rotate(45deg);width:40px}.el-upload-cover__label i{color:#fff;font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-cover__progress{display:inline-block;position:static;vertical-align:middle;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{height:100%;left:0;position:absolute;top:0;width:100%}.el-upload-cover__interact{background-color:var(--el-overlay-color-light);bottom:0;height:100%;left:0;position:absolute;text-align:center;width:100%}.el-upload-cover__interact .btn{color:#fff;cursor:pointer;display:inline-block;font-size:14px;margin-top:60px;transition:var(--el-transition-md-fade);vertical-align:middle}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{background-color:#fff;bottom:0;color:var(--el-text-color-primary);font-size:14px;font-weight:400;height:36px;left:0;line-height:36px;margin:0;overflow:hidden;padding:0 10px;position:absolute;text-align:left;text-overflow:ellipsis;white-space:nowrap;width:100%}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}@property --border-angle{syntax:"";initial-value:0deg;inherits:false}@keyframes borderRotate-fe1ea9cc{0%{--border-angle:0deg}to{--border-angle:360deg}}.upload-form[data-v-fe1ea9cc]{--upload-card-height:45vh;--upload-card-busy-height:17vh;--upload-list-height:7vh;--upload-list-busy-height:calc(var(--upload-card-height) - var(--upload-card-busy-height) + var(--upload-list-height));--upload-list-gap:10px;--upload-list-radius:15px;--upload-card-vertical-padding:40px;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;height:calc(var(--upload-card-height) + var(--upload-list-height) + var(--upload-list-gap) + var(--upload-card-vertical-padding))}.upload-list-card[data-v-fe1ea9cc]{width:55vw;height:var(--upload-list-height);margin-top:var(--upload-list-gap);display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:var(--upload-list-radius);background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)!important;transition:height .3s ease;overflow:hidden}.upload-list-card[data-v-fe1ea9cc] .el-card__body{padding:0;width:100%;height:100%;overflow:hidden}.upload-list-container[data-v-fe1ea9cc]{width:100%;height:100%;overflow:hidden}@media (max-width:768px){.upload-list-card[data-v-fe1ea9cc]{width:70vw}}.upload-list-card.upload-list-busy[data-v-fe1ea9cc]{height:var(--upload-list-busy-height)}.upload-card-wrapper[data-v-fe1ea9cc]{position:relative;overflow:visible}.upload-card-glow[data-v-fe1ea9cc]{position:absolute;width:200px;height:200px;border-radius:50%;background:radial-gradient(circle,rgba(96,165,250,.2) 0,transparent 70%);pointer-events:none;transform:translate(-50%,-50%);opacity:0;transition:opacity .3s ease;z-index:10}.upload-card[data-v-fe1ea9cc]{width:55vw;padding:20px;background:none}@media (max-width:768px){.upload-card[data-v-fe1ea9cc]{width:70vw}}.upload-card-busy[data-v-fe1ea9cc] .el-upload-dragger{height:var(--upload-card-busy-height)}[data-v-fe1ea9cc] .el-upload-dragger{display:flex;flex-direction:column;justify-content:center;align-items:center;height:var(--upload-card-height);border-radius:15px;border:1px solid var(--glass-border);opacity:.7;background-color:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:var(--glass-shadow);transition:height .3s ease,opacity .25s ease,border-color .25s ease,box-shadow .25s ease,background-color .25s ease}[data-v-fe1ea9cc] .el-upload:focus .el-upload-dragger{border-color:var(--glass-border-hover)}[data-v-fe1ea9cc] .el-upload-dragger.is-dragover,[data-v-fe1ea9cc] .el-upload-dragger:hover{opacity:.7;box-shadow:var(--glass-shadow)}.is-uploading[data-v-fe1ea9cc] .el-upload-dragger{border-color:transparent!important}.upload-card.is-uploading[data-v-fe1ea9cc]{position:relative;background:none}.upload-card.is-uploading[data-v-fe1ea9cc]:before{content:"";position:absolute;top:20px;left:20px;right:20px;bottom:20px;border-radius:15px;padding:2px;background:conic-gradient(from var(--border-angle),transparent 0deg,transparent 30deg,var(--el-upload-dragger-uniform-color,#2563eb) 60deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 90deg,transparent 120deg,transparent 180deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 210deg,var(--el-upload-dragger-uniform-color,#2563eb) 240deg,transparent 270deg,transparent 1turn);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:borderRotate-fe1ea9cc 2s linear infinite;pointer-events:none;z-index:1}.el-upload__text[data-v-fe1ea9cc]{font-weight:700;font-size:medium;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}@media (max-width:768px){.el-upload__text[data-v-fe1ea9cc]{font-size:small}}.el-upload__text.upload-list-busy[data-v-fe1ea9cc]{font-size:small}.el-icon--upload[data-v-fe1ea9cc]{font-size:100px;transition:font-size .3s ease;color:#60a5fa}html.dark .el-icon--upload[data-v-fe1ea9cc]{color:#6b6b73}.el-upload__text[data-v-fe1ea9cc] em{color:#1d4ed8}html.dark .el-upload__text[data-v-fe1ea9cc] em{color:#93c5fd}.el-icon--upload.upload-list-busy[data-v-fe1ea9cc]{font-size:60px}@media (max-width:768px){.el-icon--upload[data-v-fe1ea9cc]{font-size:50px}.el-icon--upload.upload-list-busy[data-v-fe1ea9cc]{font-size:30px}}.paste-card[data-v-fe1ea9cc]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:var(--upload-card-height);border-radius:15px;border:var(--el-upload-dragger-border);box-shadow:none;opacity:.7;background-color:var(--el-upload-dragger-bg-color);transition:all .3s ease;box-sizing:border-box}.paste-card[data-v-fe1ea9cc]:hover{opacity:.8;box-shadow:var(--el-upload-dragger-hover-box-shadow)}.paste-card.is-uploading[data-v-fe1ea9cc]{position:relative;border-color:transparent!important;overflow:visible}.paste-card.is-uploading[data-v-fe1ea9cc]:before{content:"";position:absolute;inset:-4px;border-radius:15px;padding:2px;background:conic-gradient(from var(--border-angle),transparent 0deg,transparent 30deg,var(--el-upload-dragger-uniform-color,#2563eb) 60deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 90deg,transparent 120deg,transparent 180deg,color-mix(in srgb,var(--el-upload-dragger-uniform-color,#2563eb) 70%,#fff) 210deg,var(--el-upload-dragger-uniform-color,#2563eb) 240deg,transparent 270deg,transparent 1turn);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:borderRotate-fe1ea9cc 2s linear infinite;pointer-events:none;z-index:1}.paste-card[data-v-fe1ea9cc] .el-card__body{padding:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.upload-card-busy.paste-card[data-v-fe1ea9cc]{height:var(--upload-card-busy-height)}.upload-card-textarea[data-v-fe1ea9cc]{width:50vw;height:70%;border-radius:16px;background:color-mix(in srgb,var(--primary-color) 4%,var(--glass-bg));border:1px solid var(--glass-border);box-shadow:none;transition:background-color .22s ease,border-color .22s ease,box-shadow .22s ease;box-sizing:border-box;display:flex;position:relative;overflow:hidden}.upload-card-busy .upload-card-textarea[data-v-fe1ea9cc]{height:50%}.upload-card-textarea[data-v-fe1ea9cc]:hover{background:color-mix(in srgb,var(--primary-color) 6%,var(--glass-bg));border-color:var(--glass-border-hover)}.upload-card-textarea[data-v-fe1ea9cc]:focus-within{background:color-mix(in srgb,var(--primary-color) 7%,var(--glass-bg));border-color:color-mix(in srgb,var(--primary-color) 45%,var(--glass-border));box-shadow:none}.upload-card-textarea[data-v-fe1ea9cc] .el-textarea__inner{border-radius:16px;background:transparent;transition:color .2s ease,background-color .2s ease;resize:none;border:none;box-shadow:none!important;padding:16px 20px;font-size:14px;line-height:1.6;color:var(--el-text-color-primary)}.upload-card-textarea[data-v-fe1ea9cc] .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}.upload-card-textarea[data-v-fe1ea9cc] .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}.upload-card-textarea[data-v-fe1ea9cc] .el-textarea__inner:focus{background:transparent;box-shadow:none!important}.upload-card-textarea[data-v-fe1ea9cc] ::-webkit-scrollbar{width:6px;height:6px}.upload-card-textarea[data-v-fe1ea9cc] ::-webkit-scrollbar-track{background:transparent;border-radius:6px;margin:8px}.upload-card-textarea[data-v-fe1ea9cc] ::-webkit-scrollbar-thumb{background:rgba(37,99,235,.5);border-radius:6px;-webkit-transition:background .3s ease;transition:background .3s ease}.upload-card-textarea[data-v-fe1ea9cc] ::-webkit-scrollbar-thumb:hover{background:rgba(37,99,235,.7)}.paste-card-actions[data-v-fe1ea9cc]{display:flex;justify-content:space-between;align-items:center;width:50vw;gap:12px;margin-top:16px}.paste-card-upload-button[data-v-fe1ea9cc]{min-width:92px;height:38px;border-radius:10px!important;font-weight:600;font-size:14px;letter-spacing:.04em;color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 10%,transparent)!important;border:1px solid color-mix(in srgb,var(--primary-color) 36%,var(--glass-border))!important;box-shadow:none;transition:background-color .2s ease,border-color .2s ease,transform .2s ease!important}.paste-card-upload-button[data-v-fe1ea9cc]:hover{color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 14%,transparent)!important;border-color:color-mix(in srgb,var(--primary-color) 52%,var(--glass-border))!important;transform:translateY(-1px);box-shadow:none}.paste-card-upload-button[data-v-fe1ea9cc]:focus-visible{color:var(--primary-color-accent)!important;background:color-mix(in srgb,var(--primary-color) 14%,transparent)!important;border-color:color-mix(in srgb,var(--primary-color) 52%,var(--glass-border))!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 14%,transparent)!important}.paste-card-upload-button[data-v-fe1ea9cc]:active{transform:translateY(0);background:color-mix(in srgb,var(--primary-color) 18%,transparent)!important}.upload-card-busy .paste-card-upload-button[data-v-fe1ea9cc]{min-width:72px;height:32px;border-radius:8px!important;font-size:13px;letter-spacing:.02em}.upload-card-busy .paste-card-actions[data-v-fe1ea9cc]{margin-top:10px}.paste-card-method-group[data-v-fe1ea9cc]{position:relative;display:inline-flex;align-items:center;width:158px;height:38px;box-sizing:border-box;gap:2px;padding:3px;background:var(--glass-bg);border:1px solid var(--glass-border);border-radius:10px;overflow:hidden}.paste-card-method-group[data-v-fe1ea9cc]:before{content:"";position:absolute;top:3px;left:3px;width:calc(50% - 4px);height:calc(100% - 6px);border-radius:7px;background:color-mix(in srgb,var(--primary-color) 14%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--primary-color) 42%,var(--glass-border)) inset;transform:translateX(0);transition:transform .22s cubic-bezier(.4,0,.2,1);pointer-events:none}.paste-card-method-group.is-external[data-v-fe1ea9cc]:before{transform:translateX(calc(100% + 2px))}.paste-card-method-button[data-v-fe1ea9cc]{position:relative;z-index:1;display:inline-flex;flex:1 1 0;align-items:center;justify-content:center;min-width:0;height:30px;box-sizing:border-box;padding:0 14px;border:none;border-radius:7px;background:transparent;font-weight:500;font-size:13px;line-height:1;color:var(--el-text-color-secondary);cursor:pointer;transition:color .2s ease}.paste-card-method-button.is-active[data-v-fe1ea9cc],.paste-card-method-button[data-v-fe1ea9cc]:hover{color:var(--primary-color-accent)}.paste-card-method-button[data-v-fe1ea9cc]:focus-visible{outline:none;color:var(--primary-color-accent)}@media (max-width:768px){.paste-card[data-v-fe1ea9cc]{height:auto;min-height:30vh;padding:6px;border-radius:12px}.upload-card-busy.paste-card[data-v-fe1ea9cc]{height:auto;min-height:18vh;padding:5px}.upload-card-textarea[data-v-fe1ea9cc]{margin-top:4px;width:calc(100% - 4px)!important}.upload-card-textarea[data-v-fe1ea9cc] .el-textarea__inner{border-radius:10px;padding:8px 10px;font-size:12px}.paste-card-actions[data-v-fe1ea9cc]{width:100%!important;margin-top:8px;gap:8px}.paste-card-upload-button[data-v-fe1ea9cc]{height:32px;min-width:64px;border-radius:8px!important;font-size:12px;letter-spacing:.02em;padding:0 12px}.paste-card-method-group[data-v-fe1ea9cc]{width:128px;height:32px;padding:3px;border-radius:9px}.paste-card-method-group[data-v-fe1ea9cc]:before{border-radius:6px}.paste-card-method-button[data-v-fe1ea9cc]{height:26px;padding:0 10px;font-size:11px;border-radius:6px}}.upload-list-dashboard[data-v-fe1ea9cc]{display:flex;justify-content:space-between;align-items:center;height:7vh;padding:0 15px;box-sizing:border-box;width:100%;min-width:0;position:sticky;top:0;z-index:1;background:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border);border-radius:var(--upload-list-radius);box-shadow:var(--glass-shadow);opacity:.7}[data-v-fe1ea9cc] .el-upload-dragger{position:relative;overflow:hidden}[data-v-fe1ea9cc] .el-upload-dragger:before{background-image:radial-gradient(2px 2px at 10% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 20% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 30% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 40% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 50% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 60% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 70% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 80% 30%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 90% 10%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2px 2px at 15% 70%,var(--el-upload-dragger-uniform-color) 50%,transparent 0);background-size:200px 200px}[data-v-fe1ea9cc] .el-upload-dragger:after,[data-v-fe1ea9cc] .el-upload-dragger:before{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;z-index:0;transition:opacity .6s ease}[data-v-fe1ea9cc] .el-upload-dragger:after{background-image:radial-gradient(3px 3px at 15% 15%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(3px 3px at 50% 50%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(3px 3px at 85% 85%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2.5px 2.5px at 35% 65%,var(--el-upload-dragger-uniform-color) 50%,transparent 0),radial-gradient(2.5px 2.5px at 65% 35%,var(--el-upload-dragger-uniform-color) 50%,transparent 0);background-size:150px 150px}.upload-card[data-v-fe1ea9cc]:hover .el-upload-dragger:before{opacity:.3;animation:starScroll-fe1ea9cc 60s linear infinite}.upload-card[data-v-fe1ea9cc]:hover .el-upload-dragger:after{opacity:.6;animation:starScroll-fe1ea9cc 40s linear infinite,starPulse-fe1ea9cc 4s ease-in-out infinite}@keyframes starScroll-fe1ea9cc{0%{background-position:0 0}to{background-position:100px 100px}}@keyframes starPulse-fe1ea9cc{0%,to{opacity:.6}50%{opacity:.3}}.modern-action-group[data-v-fe1ea9cc]{display:flex;align-items:center;gap:5px;height:44px;box-sizing:border-box;padding:5px;background:var(--glass-bg);border-radius:12px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-group[data-v-fe1ea9cc]:hover{background:var(--glass-bg);border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-btn[data-v-fe1ea9cc]{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;border-radius:13px;background:var(--upload-action-btn-bg);color:var(--upload-action-btn-color);cursor:pointer;transition:background-color .22s ease,color .22s ease,box-shadow .22s ease,transform .22s ease;font-size:14px;box-shadow:var(--upload-action-btn-shadow);position:relative;overflow:hidden;outline:none!important}.modern-action-btn[data-v-fe1ea9cc]:focus,.modern-action-btn[data-v-fe1ea9cc]:focus-visible{outline:none!important}.modern-action-btn[data-v-fe1ea9cc]:before{content:"";position:absolute;inset:2px;border-radius:11px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-action-btn[data-v-fe1ea9cc]:hover{background:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.modern-action-btn[data-v-fe1ea9cc]:hover:before{opacity:.08}.modern-action-btn[data-v-fe1ea9cc]:active{transform:translateY(0) scale(.97);box-shadow:var(--upload-action-btn-active-shadow)}.modern-action-btn-copy[data-v-fe1ea9cc]{color:var(--upload-action-copy-color)}.modern-action-btn-retry[data-v-fe1ea9cc]{color:var(--upload-action-retry-color)}.modern-action-btn-danger[data-v-fe1ea9cc]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-action-btn-danger[data-v-fe1ea9cc]:hover{background:var(--upload-action-danger-hover-bg);box-shadow:var(--upload-action-danger-hover-shadow)}.modern-dropdown-item-content[data-v-fe1ea9cc]{display:flex;align-items:center;justify-content:space-between;width:100%;gap:12px;padding:4px 0}.modern-dropdown-item-content span[data-v-fe1ea9cc]{font-weight:500;color:var(--el-text-color-primary)}.upload-list-dashboard-title[data-v-fe1ea9cc]{font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px;height:44px;box-sizing:border-box;padding:0 14px;background:var(--dashboard-title-bg,rgba(37,99,235,.06));border:none;border-radius:12px;color:var(--el-text-color-primary)}.upload-list-dashboard-title .el-icon[data-v-fe1ea9cc]{font-size:16px;margin-right:4px;opacity:.85}@media (max-width:768px){.modern-action-group[data-v-fe1ea9cc]{height:34px;gap:2px;padding:2px;border-radius:9px}.modern-action-btn[data-v-fe1ea9cc]{width:28px;height:28px;border-radius:7px;font-size:11px}.upload-list-dashboard-title[data-v-fe1ea9cc]{height:34px;font-size:11px;padding:0 7px;border-radius:9px}.upload-list-dashboard-title .el-icon[data-v-fe1ea9cc]{font-size:13px;margin-right:1px}.upload-list-dashboard[data-v-fe1ea9cc]{padding:0 6px;gap:4px}.upload-list-dashboard-title[data-v-fe1ea9cc]{gap:3px;min-width:0;flex-shrink:1;overflow:hidden}.upload-list-dashboard-action[data-v-fe1ea9cc]{flex-shrink:0}}.logo-link[data-v-17f54292]{text-decoration:none;display:inline-block}.logo[data-v-17f54292]{transition:all .3s ease;border-radius:8px}.logo--fixed[data-v-17f54292]{position:fixed;top:20px;left:20px;z-index:100}.logo--relative[data-v-17f54292]{position:relative}.logo--absolute[data-v-17f54292]{position:absolute;top:5px;left:5px;z-index:100}.logo--static[data-v-17f54292]{position:static}.logo--small[data-v-17f54292]{height:50px;width:50px}.logo--normal[data-v-17f54292]{height:70px;width:70px}.logo--large[data-v-17f54292]{height:90px;width:90px}.logo--hover-enabled[data-v-17f54292]:hover{transform:scale(1.1) rotate(5deg);filter:drop-shadow(0 0 10px var(--logo-glow-color))}@media (max-width:768px){.logo--small[data-v-17f54292]{height:40px;width:40px}.logo--normal[data-v-17f54292]{height:60px;width:60px}.logo--large[data-v-17f54292]{height:75px;width:75px}}.logo[data-v-17f54292]:focus{outline:2px solid var(--el-color-primary);outline-offset:2px}.logo[data-v-17f54292]{filter:var(--logo-filter,none);opacity:var(--logo-opacity,1)}@media (prefers-color-scheme:dark){.logo[data-v-17f54292]{filter:var(--logo-dark-filter,brightness(.9))}}.directory-suggestion-input[data-v-28b8eda7]{width:100%;height:100%;position:relative}.suggestion-dropdown[data-v-28b8eda7]{position:absolute;top:calc(100% + 10px);left:0;width:100%;z-index:9999;border-radius:12px;border:1px solid var(--glass-border);background-color:var(--popper-bg-color);box-shadow:var(--popper-shadow);padding:6px 0;overflow:hidden}.suggestion-list[data-v-28b8eda7]{list-style:none;margin:0;padding:0;max-height:260px;overflow-y:auto}.suggestion-item[data-v-28b8eda7]{padding:8px 16px;font-size:13px;border-radius:6px;margin:2px 6px;cursor:pointer;transition:background-color .2s ease;text-align:left;color:var(--el-text-color-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion-item[data-v-28b8eda7]:hover{background-color:var(--el-fill-color-light)}#themeToggle[data-v-2122c62a]{border:1px solid var(--glass-border);cursor:pointer;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:12px;background-color:var(--glass-bg);box-shadow:none;transition:background-color .25s ease,border-color .25s ease,transform .25s ease}#themeToggle[data-v-2122c62a]:hover{border-color:var(--glass-border-hover)}#themeToggle[data-v-2122c62a]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-2122c62a]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-2122c62a]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-2122c62a]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-2122c62a]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-2122c62a]{transform:rotate(40deg)}.theme_toggle_g[data-v-2122c62a]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-2122c62a],.icon-fade-leave-active[data-v-2122c62a]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-2122c62a]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-2122c62a]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-2122c62a],.icon-fade-leave-from[data-v-2122c62a]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-2122c62a]{display:inline-block}.container[data-v-06705292]{background:var(--bg-color);min-height:100vh}.rotate[data-v-06705292]{animation:spin-06705292 2s ease-in-out}.scale[data-v-06705292]{animation:scale-06705292 .5s ease-in-out}@keyframes spin-06705292{0%{transform:rotate(0deg)}25%{transform:rotate(5deg)}50%{transform:rotate(0deg)}75%{transform:rotate(-3deg)}to{transform:rotate(0deg)}}@keyframes streamer-06705292{0%{background-position:200%}to{background-position:-200%}}@keyframes rotate-shake-06705292{0%{transform:rotate(0deg)}50%{transform:rotate(10deg)}to{transform:rotate(0deg)}}@keyframes shake-06705292{0%{transform:translateX(0)}50%{transform:translateX(-1px)}to{transform:translateX(0)}}@keyframes scale-06705292{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.desktop-only[data-v-06705292]{display:inline-block}.mobile-only[data-v-06705292]{display:none}@media (max-width:768px){.desktop-only[data-v-06705292]{display:none!important}.mobile-only[data-v-06705292]{display:flex!important}}.toggle-dark-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px;position:fixed;top:30px;right:80px;padding:0}.more-dropdown[data-v-06705292]{position:fixed;top:30px;right:30px;z-index:100}.more-dropdown .more-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;outline:none;padding:0}.more-dropdown .more-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-method-button[data-v-06705292]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;position:fixed;top:30px;right:130px;outline:none;padding:0}@media (max-width:768px){.upload-method-button[data-v-06705292]{width:2rem;height:2rem}}.upload-method-icon[data-v-06705292]{outline:none}.more-button .svg-inline--fa[data-v-06705292],.upload-method-button .svg-inline--fa[data-v-06705292]{font-size:1.5em}.directory-tree-trigger .svg-inline--fa[data-v-06705292]{font-size:1.2em}.mobile-more-dropdown[data-v-06705292]{position:fixed;top:30px;right:18px;z-index:100}.mobile-more-button[data-v-06705292]{width:2rem;height:2rem;display:flex;justify-content:center;align-items:center;border:1px solid var(--glass-border);transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;color:var(--theme-toggle-color);border-radius:12px;outline:none;padding:0}.mobile-more-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-folder-container[data-v-06705292]{display:flex;align-items:center;position:fixed;top:30px;right:180px;z-index:100}.upload-folder-container.no-announcement[data-v-06705292]{right:180px}@media (max-width:768px){.upload-folder-container.no-announcement[data-v-06705292],.upload-folder-container[data-v-06705292]{right:58px}}.upload-folder[data-v-06705292]{width:100px;height:2.5rem;border-radius:12px;display:flex;align-items:center;box-sizing:border-box;transition:all .3s ease,width .4s ease}.upload-folder.active[data-v-06705292]{width:200px}@media (max-width:768px){.upload-folder[data-v-06705292]{width:80px;height:2rem}.upload-folder.active[data-v-06705292]{width:120px}}.directory-tree-trigger[data-v-06705292]{width:2.5rem;height:2.5rem;display:flex;justify-content:center;align-items:center;box-sizing:border-box;border:1px solid var(--glass-border);margin-left:10px;background-color:var(--glass-bg);box-shadow:var(--glass-shadow);color:var(--theme-toggle-color);border-radius:12px;outline:none;cursor:pointer;transition:background-color .25s ease,border-color .25s ease,transform .25s ease}.directory-tree-trigger[data-v-06705292]:hover{border-color:var(--glass-border-hover);transform:scale(1.05)}@media (max-width:768px){.directory-tree-trigger[data-v-06705292]{width:2rem;height:2rem}.directory-tree-trigger .svg-inline--fa[data-v-06705292]{font-size:1.1em}}.upload-folder[data-v-06705292] .inner-folder-input{width:100%;height:100%}.upload-folder[data-v-06705292] .el-input{height:100%;box-sizing:border-box}.upload-folder[data-v-06705292] .el-input__wrapper{border-radius:12px;background-color:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);height:100%;padding:0 10px;box-sizing:border-box;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease!important}.upload-folder[data-v-06705292] .el-input__wrapper:hover{background-color:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .upload-folder[data-v-06705292] .el-input__wrapper:hover{background-color:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}.upload-folder[data-v-06705292] .el-input__wrapper.is-focus,.upload-folder[data-v-06705292] .el-input__wrapper:focus-within{border-color:var(--glass-border);box-shadow:var(--glass-shadow)!important}.quick-toolbar[data-v-06705292]{--quick-toolbar-size:2.5rem;--quick-toolbar-button-size:calc(var(--quick-toolbar-size) - 6px);position:fixed;bottom:50px;right:30px;width:var(--quick-toolbar-size);box-sizing:border-box;display:flex;flex-direction:column;align-items:center;gap:0;z-index:200;padding:3px;border-radius:999px;border:1px solid var(--glass-border);background-color:var(--glass-bg);box-shadow:none;transition:background-color .24s ease,border-color .24s ease}.directory-tree-trigger[data-v-06705292],.mobile-more-button[data-v-06705292],.more-dropdown .more-button[data-v-06705292],.quick-toolbar[data-v-06705292],.toggle-dark-button[data-v-06705292],.upload-method-button[data-v-06705292]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.quick-toolbar-button[data-v-06705292]{width:var(--quick-toolbar-button-size);height:var(--quick-toolbar-button-size);border:none;transition:transform .22s ease,background-color .22s ease,box-shadow .22s ease,color .22s ease;margin-left:0;padding:0;border-radius:999px;background-color:transparent;box-shadow:none;color:var(--toolbar-button-color);outline:none}.quick-toolbar-actions[data-v-06705292]{display:grid;grid-template-rows:0fr;width:100%;margin-bottom:0;opacity:0;pointer-events:none;transform:translateY(12px);transform-origin:bottom center;transition:grid-template-rows .52s cubic-bezier(.16,1,.3,1),margin-bottom .52s cubic-bezier(.16,1,.3,1),opacity .32s ease,transform .52s cubic-bezier(.16,1,.3,1)}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-06705292]{grid-template-rows:1fr;margin-bottom:4px;opacity:1;pointer-events:auto;transform:translateY(0)}.quick-toolbar-actions-inner[data-v-06705292]{display:flex;flex-direction:column;align-items:center;gap:3px;min-height:0;overflow:hidden}.quick-toolbar-more.is-active[data-v-06705292]{background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-shadow)}.quick-toolbar-more[data-v-06705292]{margin-top:4px}.quick-toolbar-icon[data-v-06705292]{font-size:16px}.quick-toolbar-toggle-icon[data-v-06705292]{transform:rotate(180deg);transition:transform .32s ease}.quick-toolbar-more.is-active .quick-toolbar-toggle-icon[data-v-06705292]{transform:rotate(0deg)}.info-container[data-v-06705292]:hover,.quick-toolbar-button[data-v-06705292]:hover{transform:scale(1.05);background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.quick-toolbar[data-v-06705292]:hover{border-color:var(--glass-border-hover)}.quick-toolbar-button[data-v-06705292]:hover{transform:none}.toggle-dark-button[data-v-06705292]:hover,.upload-method-button[data-v-06705292]:hover{transform:scale(1.05);border-color:var(--glass-border-hover)}.upload-folder[data-v-06705292]:hover .el-input__wrapper{background-color:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .upload-folder[data-v-06705292]:hover .el-input__wrapper{background-color:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}@media (max-width:768px){.quick-toolbar[data-v-06705292]{--quick-toolbar-size:2rem;--quick-toolbar-button-size:calc(var(--quick-toolbar-size) - 4px);right:18px;bottom:max(72px,calc(6vh + 20px + env(safe-area-inset-bottom)));padding:2px}.quick-toolbar-actions[data-v-06705292]{margin-bottom:0}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-06705292]{margin-bottom:3px}.quick-toolbar-actions-inner[data-v-06705292]{gap:2px}.quick-toolbar-more[data-v-06705292]{margin-top:3px}.quick-toolbar-icon[data-v-06705292]{font-size:14px}}[data-v-06705292] .el-dialog{border-radius:12px;border:1px solid var(--glass-border);background-color:var(--dialog-bg-color);box-shadow:var(--dialog-box-shadow)}.dialog-action[data-v-06705292]{display:flex;justify-content:center;margin-top:20px}.header[data-v-06705292]{display:flex;justify-content:center;align-items:center;padding:15px;margin-top:5vh;color:var(--upload-header-color);-webkit-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;position:relative;top:-3vh;transition:all .3s ease}.title[data-v-06705292]{font-size:2.25rem;font-weight:400;font-family:Pacifico,Noto Sans SC,sans-serif;color:var(--upload-title-text-color);text-shadow:var(--upload-title-text-shadow);position:relative;padding-bottom:8px;cursor:pointer;transition:transform .4s cubic-bezier(.4,0,.2,1),filter .25s ease;animation:float-06705292 4s ease-in-out infinite;letter-spacing:3px}.title[data-v-06705292]:hover{transform:scale(1.08);filter:drop-shadow(0 0 20px var(--upload-title-hover-glow))}.title[data-v-06705292]:after{content:"";position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:0;height:3px;background:var(--upload-title-underline-bg);border-radius:3px;transition:width .5s cubic-bezier(.4,0,.2,1);box-shadow:var(--upload-title-underline-shadow)}.title[data-v-06705292]:hover:after{width:80%}.main-title[data-v-06705292]{color:var(--upload-main-title-color);text-decoration:none;display:inline-block;position:relative;filter:drop-shadow(0 0 8px rgba(255,255,255,.3));transition:opacity .16s ease}.title:hover .main-title[data-v-06705292]{opacity:0}.title[data-v-06705292]:hover{color:transparent;text-shadow:none}.title-crayon-text[data-v-06705292]{position:absolute;left:50%;top:-1px;z-index:2;width:-moz-max-content;width:max-content;pointer-events:none;white-space:nowrap;color:var(--upload-title-crayon-deep,#1d2129);opacity:0;-webkit-text-stroke:.35px var(--upload-title-crayon-edge);text-shadow:-1.2px .4px 0 var(--upload-title-crayon-burr),.9px -.7px 0 hsla(0,0%,100%,.24),1.5px .5px 0 var(--upload-title-crayon-dust),-1.7px -.6px 0 var(--upload-title-crayon-dust);transform:translateX(-50%) rotate(-.8deg);transform-origin:left 68%;clip-path:inset(-10px 100% -10px -10px);filter:saturate(1.08) contrast(1.06)}.title:hover .title-crayon-text[data-v-06705292]{animation:crayonWrite-06705292 .82s steps(18) forwards,crayonScratch-06705292 .16s steps(2) .82s 3}@keyframes float-06705292{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}@keyframes crayonWrite-06705292{0%{opacity:0;clip-path:inset(-10px 100% -10px -10px)}12%{opacity:.92}32%{clip-path:inset(-10px 68% -10px -10px)}47%{clip-path:inset(-10px 52% -10px -10px)}63%{clip-path:inset(-10px 34% -10px -10px)}78%{clip-path:inset(-10px 18% -10px -10px)}to{opacity:.92;clip-path:inset(-10px -10px -10px -10px)}}@keyframes crayonScratch-06705292{0%,to{transform:translateX(-50%) rotate(-.8deg)}50%{transform:translateX(calc(-50% + 1px)) rotate(-.45deg)}}@media (max-width:768px){.title[data-v-06705292]{font-size:1.55rem;letter-spacing:1px}.title[data-v-06705292]:hover{transform:scale(1.05)}}.upload-home[data-v-06705292]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:94vh;background-color:transparent}.upload[data-v-06705292]{margin-bottom:5px;position:relative;top:-3vh}@media (max-width:768px){.header[data-v-06705292]{padding:8px 15px 4px;top:-2.5vh}.title[data-v-06705292]{padding-bottom:5px}.upload[data-v-06705292]{top:-3.8vh}}.footer[data-v-06705292]{height:6vh} \ No newline at end of file diff --git a/frontend-dist/css/36.5ae2c698.css.gz b/frontend-dist/css/36.5ae2c698.css.gz new file mode 100644 index 00000000..1a13754c Binary files /dev/null and b/frontend-dist/css/36.5ae2c698.css.gz differ diff --git a/frontend-dist/css/647.ba2aa3f5.css.gz b/frontend-dist/css/647.ba2aa3f5.css.gz deleted file mode 100644 index 041bfd30..00000000 Binary files a/frontend-dist/css/647.ba2aa3f5.css.gz and /dev/null differ diff --git a/frontend-dist/css/app.47d7b210.css b/frontend-dist/css/app.fcec83ce.css similarity index 100% rename from frontend-dist/css/app.47d7b210.css rename to frontend-dist/css/app.fcec83ce.css diff --git a/frontend-dist/css/app.47d7b210.css.gz b/frontend-dist/css/app.fcec83ce.css.gz similarity index 100% rename from frontend-dist/css/app.47d7b210.css.gz rename to frontend-dist/css/app.fcec83ce.css.gz diff --git a/frontend-dist/index.html b/frontend-dist/index.html index 2b964ef5..c696aef7 100644 --- a/frontend-dist/index.html +++ b/frontend-dist/index.html @@ -1 +1 @@ -Sanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/frontend-dist/index.html.gz b/frontend-dist/index.html.gz index ee5b8143..6f389f2a 100644 Binary files a/frontend-dist/index.html.gz and b/frontend-dist/index.html.gz differ diff --git a/frontend-dist/js/36.1f3c2bdf.js b/frontend-dist/js/36.1f3c2bdf.js new file mode 100644 index 00000000..1e339b4d --- /dev/null +++ b/frontend-dist/js/36.1f3c2bdf.js @@ -0,0 +1,2 @@ +(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[36],{213:function(e,t,o){"use strict";o(85331),o(19104)},732:function(e,t,o){"use strict";o.d(t,{A:function(){return p}});var s=o(56768),a=o(24232);const i=["href","target"],l=["alt","src"];function n(e,t,o,n,r,d){return(0,s.uX)(),(0,s.CE)("a",{href:d.logoHref,target:o.target,class:(0,a.C4)(e.logo-e.link)},[(0,s.Lk)("img",{class:(0,a.C4)(d.logoClasses),alt:o.alt,src:d.logoUrl},null,10,l)],10,i)}var r=o(60782),d={name:"Logo",props:{href:{type:String,default:"https://github.com/MarSeventh/CloudFlare-ImgBed"},target:{type:String,default:"_blank",validator:e=>["_blank","_self","_parent","_top"].includes(e)},alt:{type:String,default:"Sanyue logo"},customSrc:{type:String,default:""},position:{type:String,default:"fixed",validator:e=>["fixed","relative","absolute","static"].includes(e)},size:{type:String,default:"normal",validator:e=>["small","normal","large"].includes(e)},enableHover:{type:Boolean,default:!0},useConfigLink:{type:Boolean,default:!1}},computed:{...(0,r.L8)(["userConfig"]),logoUrl(){return this.customSrc||this.userConfig?.logoUrl||o(33153)},logoHref(){return this.useConfigLink&&this.userConfig?.logoLink?this.userConfig.logoLink:this.href},logoClasses(){return{logo:!0,[`logo--${this.position}`]:!0,[`logo--${this.size}`]:!0,"logo--hover-enabled":this.enableHover}}}},c=o(71241);const u=(0,c.A)(d,[["render",n],["__scopeId","data-v-17f54292"]]);var p=u},1036:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return Ao}});var s=o(78507),a=(o(85331),o(213),o(80047)),i=(o(99648),o(56768)),l=o(24232);const n={class:"history-header"},r={class:"header-left"},d={class:"record-count"},c={class:"header-right"},u={class:"timeline-header"},p={class:"date-label"},h={key:0,class:"grid-view"},m={class:"grid-preview"},g=["src"],f=["src"],y={key:2,class:"file-icon-wrapper"},b={class:"grid-overlay"},k={class:"grid-actions"},v={class:"grid-info"},C=["title"],w={class:"upload-time"},F={key:1,class:"list-view"},L={class:"list-preview"},U=["src"],$=["src"],S={key:2,class:"file-icon-wrapper-small"},T={class:"list-info"},_=["title"],x=["title"],M={class:"list-meta"},A={class:"upload-time"},R={class:"list-actions"},D={key:0,class:"load-more-container"},E={key:0,class:"loading-indicator"},I={key:1,class:"load-more-hint"},N={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function z(e,t,o,z,W,V){const B=(0,i.g2)("font-awesome-icon"),H=a.S2,Q=s.R7;return(0,i.uX)(),(0,i.CE)("div",{class:(0,l.C4)(["history-container",{active:o.show}])},[(0,i.Lk)("div",n,[(0,i.Lk)("div",r,[(0,i.Lk)("h2",null,(0,l.v_)(e.$t("uploadHistory.title")),1),(0,i.Lk)("span",d,(0,l.v_)(e.$t("uploadHistory.totalRecords",{count:W.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(Q,{content:e.$t("uploadHistory.switchView"),placement:"bottom","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:V.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"grid"===W.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(Q,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:V.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"times"})]),_:1})])]),W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>V.handleScroll&&V.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(V.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,l.v_)(e.date),1)]),"grid"===W.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[V.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>V.handleImageError&&V.handleImageError(...e))},null,40,g)):V.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(B,{icon:"file",class:"file-icon"})])),(0,i.Lk)("div",b,[(0,i.Lk)("div",k,[(0,i.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>V.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>V.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>V.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,i.Lk)("div",v,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,l.v_)(e.name),9,C),(0,i.Lk)("div",w,(0,l.v_)(V.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[V.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>V.handleImageError&&V.handleImageError(...e))},null,40,U)):V.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(B,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,l.v_)(e.name),9,_),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,l.v_)(e.url),9,x)]),(0,i.Lk)("div",M,[(0,i.Lk)("div",A,(0,l.v_)(V.formatTime(e.time)),1)]),(0,i.Lk)("div",R,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>V.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>V.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>V.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),V.hasMore?((0,i.uX)(),(0,i.CE)("div",D,[W.loadingMore?((0,i.uX)(),(0,i.CE)("div",E,[(0,i.bF)(B,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",I,(0,l.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",N,(0,l.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(B,{icon:"history",class:"empty-icon"}),(0,i.Lk)("p",null,(0,l.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701);var W={name:"UploadHistory",props:{show:{type:Boolean,default:!1}},data(){return{historyList:[],allHistory:[],viewMode:"grid",pageSize:30,currentPage:0,loadingMore:!1,totalCount:0}},watch:{show(e){e&&this.resetAndLoad()}},computed:{hasMore(){return this.historyList.length{const o=new Date(t.time),s=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[s]||(e[s]=[]),e[s].push(t)}),Object.keys(e).sort((e,t)=>new Date(t)-new Date(e)).map(t=>({date:t,items:e[t]}))}},mounted(){const e=localStorage.getItem("historyViewMode");e&&(this.viewMode=e)},methods:{resetAndLoad(){this.historyList=[],this.currentPage=0,this.loadAllHistory(),this.loadMore()},loadAllHistory(){try{const e=JSON.parse(localStorage.getItem("uploadHistory")||"[]");this.allHistory=e.sort((e,t)=>t.time-e.time),this.totalCount=this.allHistory.length}catch(e){console.error("Failed to load history",e),this.allHistory=[],this.totalCount=0}},loadMore(){!this.loadingMore&&this.hasMore&&(this.loadingMore=!0,setTimeout(()=>{const e=this.currentPage*this.pageSize,t=e+this.pageSize,o=this.allHistory.slice(e,t);this.historyList=[...this.historyList,...o],this.currentPage++,this.loadingMore=!1},50))},handleScroll(e){const t=e.target,o=t.scrollTop,s=t.scrollHeight,a=t.clientHeight;s-o-a<100&&this.loadMore()},toggleViewMode(){this.viewMode="grid"===this.viewMode?"list":"grid",localStorage.setItem("historyViewMode",this.viewMode)},clearHistory(){this.$confirm(this.$t("uploadHistory.clearConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=[],this.allHistory=[],this.totalCount=0,this.currentPage=0,localStorage.removeItem("uploadHistory"),this.$message.success(this.$t("uploadHistory.recordsCleared"))}).catch(()=>{})},deleteItem(e){this.$confirm(this.$t("uploadHistory.deleteConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=this.historyList.filter(t=>t.time!==e.time),this.allHistory=this.allHistory.filter(t=>t.time!==e.time),this.totalCount=this.allHistory.length;try{localStorage.setItem("uploadHistory",JSON.stringify(this.allHistory)),this.$message.success(this.$t("uploadHistory.recordDeleted"))}catch(t){console.error("Failed to update history",t)}}).catch(()=>{})},isImage(e){const t=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},isVideo(e){const t=["mp4","webm","ogg","mkv"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},formatTime(e){const t=new Date(e),o=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),l=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${a} ${i}:${l}:${n}`},copyLink(e){navigator.clipboard.writeText(e).then(()=>{this.$message.success(this.$t("uploadHistory.linkCopied"))}).catch(()=>{this.$message.error(this.$t("uploadHistory.copyFailed"))})},openLink(e){window.open(e,"_blank")},handleImageError(e){e.target.src=o(96682)}}},V=o(71241);const B=(0,V.A)(W,[["render",z],["__scopeId","data-v-7da2f8c2"]]);var H=B,Q=o(86975),X=o(9267),q=(o(15616),o(81418)),O=(o(50333),o(74757)),j=o(55558),G=(o(10456),o(39623)),K=(o(29092),o(76018)),J=(o(96808),o(67819),o(66810)),Y=(o(34396),o(4885),o(97769));const Z={class:"dialog-section"},ee={class:"section-header"},te={class:"section-title"},oe={class:"section-content"},se={class:"setting-item"},ae={class:"setting-label"},ie={key:0,class:"setting-item"},le={class:"setting-label"},ne={class:"setting-item"},re={class:"setting-label"},de={class:"setting-item"},ce={class:"setting-label"},ue={class:"dialog-section"},pe={class:"section-header"},he={class:"section-title"},me={class:"section-content"},ge={class:"dialog-section"},fe={class:"section-header"},ye={class:"section-title"},be={class:"section-content"},ke={class:"setting-item"},ve={class:"setting-label"},Ce={class:"setting-item"},we={class:"setting-label"},Fe={key:0,class:"setting-item slider-item"},Le={class:"setting-label"},Ue={class:"slider-wrapper"},$e={class:"slider-input-wrapper"},Se={key:1,class:"setting-item slider-item"},Te={class:"setting-label"},_e={class:"slider-wrapper"},xe={class:"slider-input-wrapper"},Me={key:0,class:"dialog-section"},Ae={class:"section-header"},Re={class:"section-title"},De={class:"section-content"},Ee={class:"setting-item"},Ie={class:"setting-label"},Ne={class:"dialog-action"};function Pe(e,t,o,n,r,d){const c=Y.A,u=J.ll,p=J.MQ,h=(0,i.g2)("font-awesome-icon"),m=s.R7,g=K.P9,f=K.AV,y=G.WK,b=j.qi,k=O.B8,v=q.lq,C=a.S2,w=X.kZ;return(0,i.uX)(),(0,i.Wv)(w,{title:e.$t("uploadSettings.title"),modelValue:d.visible,"onUpdate:modelValue":t[12]||(t[12]=e=>d.visible=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog settings-dialog-scope upload-settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Z,[(0,i.Lk)("div",ee,[(0,i.Lk)("span",te,(0,l.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,i.Lk)("div",oe,[(0,i.Lk)("div",se,[(0,i.Lk)("span",ae,(0,l.v_)(e.$t("uploadSettings.channelType")),1),(0,i.bF)(p,{"model-value":o.uploadChannel,"onUpdate:modelValue":t[0]||(t[0]=t=>e.$emit("update:uploadChannel",t)),class:"radio-card-group compact"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"telegram",class:"channel-icon"}),t[13]||(t[13]=(0,i.Lk)("span",null,"TG",-1))]),_:1}),(0,i.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"cfr2",class:"channel-icon"}),t[14]||(t[14]=(0,i.Lk)("span",null,"R2",-1))]),_:1}),(0,i.bF)(u,{label:"s3",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"s3",class:"channel-icon"}),t[15]||(t[15]=(0,i.Lk)("span",null,"S3",-1))]),_:1}),(0,i.bF)(u,{label:"discord",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"discord",class:"channel-icon"}),t[16]||(t[16]=(0,i.Lk)("span",null,"DC",-1))]),_:1}),(0,i.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"huggingface",class:"channel-icon"}),t[17]||(t[17]=(0,i.Lk)("span",null,"HF",-1))]),_:1}),(0,i.bF)(u,{label:"webdav",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"webdav",class:"channel-icon"}),t[18]||(t[18]=(0,i.Lk)("span",null,"WD",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,i.uX)(),(0,i.CE)("div",ie,[(0,i.Lk)("span",le,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(f,{"model-value":o.channelName,"onUpdate:modelValue":t[1]||(t[1]=t=>e.$emit("update:channelName",t)),placeholder:e.$t("uploadSettings.autoSelect"),clearable:"",class:"setting-input"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(g,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,i.Q3)("",!0),(0,i.Lk)("div",ne,[(0,i.Lk)("span",re,(0,l.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,i.bF)(y,{"model-value":o.uploadFolder,"onUpdate:modelValue":d.handleUploadFolderInput,placeholder:e.$t("uploadSettings.uploadDirectoryPlaceholder"),class:"setting-input"},null,8,["model-value","onUpdate:modelValue","placeholder"])]),(0,i.Lk)("div",de,[(0,i.Lk)("span",ce,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(b,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,i.Lk)("div",ue,[(0,i.Lk)("div",pe,[(0,i.Lk)("span",he,(0,l.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,i.Lk)("div",me,[(0,i.bF)(p,{"model-value":o.uploadNameType,"onUpdate:modelValue":t[3]||(t[3]=t=>e.$emit("update:uploadNameType",t)),class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"default",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"cog",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,i.bF)(u,{label:"index",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"hashtag",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,i.bF)(u,{label:"origin",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"file-signature",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,i.bF)(u,{label:"short",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"compress-alt",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,i.Lk)("div",ge,[(0,i.Lk)("div",fe,[(0,i.Lk)("span",ye,(0,l.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,i.bF)(m,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",be,[(0,i.Lk)("div",ke,[(0,i.Lk)("span",ve,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(b,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,i.Lk)("div",Ce,[(0,i.Lk)("span",we,(0,l.v_)(e.$t("uploadSettings.fileCompress")),1),(0,i.bF)(b,{"model-value":o.customerCompress,"onUpdate:modelValue":t[5]||(t[5]=t=>e.$emit("update:customerCompress",t))},null,8,["model-value"])]),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",Fe,[(0,i.Lk)("span",Le,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Ue,[(0,i.bF)(k,{"model-value":o.compressBar,"onUpdate:modelValue":t[6]||(t[6]=t=>e.$emit("update:compressBar",t)),min:1,max:20,"format-tooltip":e=>`${e} MB`},null,8,["model-value","format-tooltip"]),(0,i.Lk)("div",$e,[(0,i.bF)(v,{"model-value":o.compressBar,"onUpdate:modelValue":t[7]||(t[7]=t=>e.$emit("update:compressBar",t)),min:1,max:20,step:1,"value-on-clear":1,class:"slider-input","controls-position":"right"},null,8,["model-value"]),t[19]||(t[19]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",Se,[(0,i.Lk)("span",Te,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",_e,[(0,i.bF)(k,{"model-value":o.compressQuality,"onUpdate:modelValue":t[8]||(t[8]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,"format-tooltip":e=>`${e} MB`},null,8,["model-value","max","format-tooltip"]),(0,i.Lk)("div",xe,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[20]||(t[20]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,i.uX)(),(0,i.CE)("div",Me,[(0,i.Lk)("div",Ae,[(0,i.Lk)("span",Re,(0,l.v_)(e.$t("uploadSettings.serverCompress")),1),(0,i.bF)(m,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",De,[(0,i.Lk)("div",Ee,[(0,i.Lk)("span",Ie,(0,l.v_)(e.$t("uploadSettings.enableCompress")),1),(0,i.bF)(b,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,i.Q3)("",!0),(0,i.Lk)("div",Ne,[(0,i.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"])}var ze={name:"UploadSettingsDialog",components:{ChannelIcon:Y.A},methods:{handleUploadFolderInput(e){e&&!e.startsWith("/")&&(e="/"+e),this.$emit("update:uploadFolder",e)}},props:{modelValue:{type:Boolean,default:!1},uploadChannel:{type:String,default:"telegram"},channelName:{type:String,default:""},currentChannelList:{type:Array,default:()=>[]},uploadFolder:{type:String,default:""},autoRetry:{type:Boolean,default:!0},uploadNameType:{type:String,default:"default"},convertToWebp:{type:Boolean,default:!1},customerCompress:{type:Boolean,default:!0},compressBar:{type:Number,default:5},compressQuality:{type:Number,default:4},serverCompress:{type:Boolean,default:!0}},emits:["update:modelValue","update:uploadChannel","update:channelName","update:uploadFolder","update:autoRetry","update:uploadNameType","update:convertToWebp","update:customerCompress","update:compressBar","update:compressQuality","update:serverCompress"],computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth>768?"50%":"90%"}}};const We=(0,V.A)(ze,[["render",Pe]]);var Ve=We,Be=o(88559),He=(o(85970),o(813)),Qe=(o(34896),o(69655)),Xe=(o(2893),o(74253));o(79899);const qe={class:"upload-list-item"},Oe=["href"],je={key:0,style:{width:"10vw","border-radius":"12px"},autoplay:"",muted:"",playsinline:"",loop:""},Ge=["src"],Ke=["src"],Je={key:2,style:{width:"10vw","border-radius":"12px"}},Ye={class:"upload-list-item-content"},Ze={class:"upload-list-item-name-wrapper"},et={key:0,class:"upload-list-item-url"},tt={class:"upload-list-item-url-row"},ot={class:"upload-list-item-url-row"},st={key:1,class:"upload-list-item-progress"},at={class:"upload-list-item-action"};function it(e,t,o,s,a,n){const r=(0,i.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=Qe.ve,p=(0,i.g2)("Link"),h=He.tk,m=(0,i.g2)("Delete");return(0,i.uX)(),(0,i.CE)("div",qe,[(0,i.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,i.uX)(),(0,i.CE)("video",je,[(0,i.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,Ge),t[7]||(t[7]=(0,i.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,i.uX)(),(0,i.CE)("img",{key:1,style:{width:"10vw","border-radius":"12px"},src:o.file.url,onError:t[0]||(t[0]=t=>e.$emit("preview-error",o.file))},null,40,Ke)):((0,i.uX)(),(0,i.CE)("div",Je,[(0,i.bF)(r,{icon:"file",class:"file-icon"})]))],8,Oe),(0,i.Lk)("div",Ye,[(0,i.Lk)("div",Ze,[(0,i.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,i.uX)(),(0,i.CE)("div",et,[(0,i.Lk)("div",tt,[(0,i.bF)(c,{modelValue:o.file.finalURL,"onUpdate:modelValue":t[1]||(t[1]=e=>o.file.finalURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[8]||(t[8]=[(0,i.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.mdURL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.file.mdURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,i.Lk)("div",ot,[(0,i.bF)(c,{modelValue:o.file.htmlURL,"onUpdate:modelValue":t[3]||(t[3]=e=>o.file.htmlURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[10]||(t[10]=[(0,i.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.ubbURL,"onUpdate:modelValue":t[4]||(t[4]=e=>o.file.ubbURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[11]||(t[11]=[(0,i.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,i.uX)(),(0,i.CE)("div",st,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",at,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var lt=o(57477);const nt=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp","raw","cr2","nef","dng","eps","ai","emf","wmf"],rt=["mp4","webm","ogg","mkv"];var dt={name:"UploadFileItem",components:{Link:lt.Link,Delete:lt.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return nt.includes(t)},isVideo(e){const t=e.split(".").pop().toLowerCase();return rt.includes(t)},truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,a;o>0?(s=e.substring(0,o),a=e.substring(o)):(s=e,a="");const i=a.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":s.substring(0,l)+"..."+s.slice(-4)+a},selectAllText(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("uploadForm.copyFailed")})})}}};const ct=(0,V.A)(dt,[["render",it],["__scopeId","data-v-645a7810"]]);var ut=ct,pt=o(62086),ht=(o(40670),o(88830),o(23597),o(70683)),mt=(o(95385),o(47358));const gt={class:"upload-form"},ft={class:"upload-card-glow",ref:"uploadCardGlow"},yt=["innerHTML"],bt={key:0,class:"upload-card"},kt={class:"paste-card-actions"},vt=["aria-label"],Ct=["aria-pressed"],wt=["aria-pressed"],Ft={class:"upload-list-container"},Lt={class:"upload-list-dashboard-action"},Ut={class:"modern-action-group"},$t={class:"modern-dropdown-item-content"},St={class:"modern-action-btn modern-action-btn-danger"};function Tt(e,t,n,r,d,c){const u=He.tk,p=mt.j5,h=G.WK,m=a.S2,g=ht.Ik,f=(0,i.g2)("List"),y=(0,i.g2)("Checked"),b=(0,i.g2)("Failed"),k=Xe.$g,v=(0,i.g2)("font-awesome-icon"),C=s.R7,w=j.qi,F=pt.c6,L=pt.Iy,U=pt.dW,$=ut,S=Be.kA;return(0,i.uX)(),(0,i.CE)("div",gt,[(0,i.Lk)("div",{class:"upload-card-wrapper",onMousemove:t[0]||(t[0]=(...e)=>c.handleUploadCardMouseMove&&c.handleUploadCardMouseMove(...e)),onMouseleave:t[1]||(t[1]=(...e)=>c.handleUploadCardMouseLeave&&c.handleUploadCardMouseLeave(...e))},[(0,i.Lk)("div",ft,null,512),"default"===n.uploadMethod?((0,i.uX)(),(0,i.Wv)(p,{key:0,class:(0,l.C4)(["upload-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}]),drag:"",multiple:"","http-request":c.uploadFile,onSuccess:c.handleSuccess,"on-error":c.handleError,"before-upload":c.beforeUpload,"on-progress":c.handleProgress,"file-list":d.fileList,"show-file-list":!1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{class:(0,l.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.Lk)("svg",{class:"upload-plus-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.25","stroke-linecap":"round","aria-hidden":"true"},[(0,i.Lk)("path",{d:"M12 7v10"}),(0,i.Lk)("path",{d:"M7 12h10"})],-1)])]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,l.C4)(["el-upload__text",{"upload-list-busy":d.fileList.length}]),innerHTML:e.$t("upload.dragUploadText")},null,10,yt)]),_:1},8,["class","http-request","onSuccess","on-error","before-upload","on-progress","file-list"])):(0,i.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,i.uX)(),(0,i.CE)("div",bt,[(0,i.bF)(g,{class:(0,l.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",kt,[(0,i.bF)(m,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.Lk)("div",{class:(0,l.C4)(["paste-card-method-group",{"is-external":"external"===d.pasteUploadMethod}]),role:"group","aria-label":e.$t("upload.switchUploadMethod")},[(0,i.Lk)("button",{class:(0,l.C4)(["paste-card-method-button",{"is-active":"save"===d.pasteUploadMethod}]),type:"button","aria-pressed":"save"===d.pasteUploadMethod,onClick:t[3]||(t[3]=e=>d.pasteUploadMethod="save")},(0,l.v_)(e.$t("upload.pasteSave")),11,Ct),(0,i.Lk)("button",{class:(0,l.C4)(["paste-card-method-button",{"is-active":"external"===d.pasteUploadMethod}]),type:"button","aria-pressed":"external"===d.pasteUploadMethod,onClick:t[4]||(t[4]=e=>d.pasteUploadMethod="external")},(0,l.v_)(e.$t("upload.pasteExternal")),11,wt)],10,vt)])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(g,{class:(0,l.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Ft,[(0,i.bF)(S,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,l.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,i.bF)(k,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(f)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(y)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(b)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",Lt,[(0,i.Lk)("div",Ut,[(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-copy",onClick:t[5]||(t[5]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(v,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(U,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(L,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)(F,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",$t,[(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(w,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[7]||(t[7]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-retry",onClick:t[6]||(t[6]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(v,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(U,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(L,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)(F,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)(F,{onClick:c.clearSuccessList},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",St,[(0,i.bF)(v,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)($,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[8]||(t[8]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])])]),_:1},8,["class"])])}o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979);var _t=o(457),xt=o(76334),Mt=o(60782);function At(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function Rt(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function Dt(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=At(e.srcID,e.name,t);Object.assign(e,o)})}const Et=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),It=(e,t)=>e>>>t|e<<32-t;function Nt(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=It(o[u-15],7)^It(o[u-15],18)^o[u-15]>>>3,t=It(o[u-2],17)^It(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,a,i,l,n,r,d,c]=t;for(let u=0;u<64;u++){const e=It(n,6)^It(n,11)^It(n,25),t=n&r^~n&d,p=c+e+t+Et[u]+o[u]>>>0,h=It(s,2)^It(s,13)^It(s,22),m=s&a^s&i^a&i,g=h+m>>>0;c=d,d=r,r=n,n=l+p>>>0,l=i,i=a,a=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+a>>>0,t[2]=t[2]+i>>>0,t[3]=t[3]+l>>>0,t[4]=t[4]+n>>>0,t[5]=t[5]+r>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+c>>>0}function Pt(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,s=0;return{update(a){s+=a.length;let i=0;if(o>0){const s=64-o,l=Math.min(s,a.length);t.set(a.subarray(0,l),o),o+=l,i=l,64===o&&(Nt(t,e),o=0)}while(i+64<=a.length)Nt(a.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),Nt(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(a/4294967296),!1),i.setUint32(60,a>>>0,!1),Nt(t,e);let l="";for(let t=0;t<8;t++)l+=e[t].toString(16).padStart(8,"0");return l}}}async function zt(e){const t=Pt(),o=4194304;let s=0;while(sthis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){Dt(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&Dt(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,Mt.L8)(["storeAutoReUpload"]),uploadSuccessCount(){return this.fileList.filter(e=>"done"===e.status||"success"===e.status).length},uploadErrorCount(){return this.fileList.filter(e=>"exception"===e.status).length},uploadingCount(){return this.fileList.filter(e=>"uploading"===e.status).length},waitingCount(){return this.uploadQueue.length},urlSize(){return window.innerWidth<768?"small":"default"},disableTooltip(){return window.innerWidth<768},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},pasteCardMethodButtonSize(){return this.fileList.length||window.innerWidth<768?"small":"medium"}},mounted(){document.addEventListener("paste",this.handlePaste),this.autoReUpload=this.storeAutoReUpload},beforeUnmount(){document.removeEventListener("paste",this.handlePaste),this.uploadQueue=[],this.fileList=[],this.activeUploads=0},methods:{truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,a;o>0?(s=e.substring(0,o),a=e.substring(o)):(s=e,a="");const i=a.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":s.substring(0,l)+"..."+s.slice(-4)+a},uploadFile(e){if(!this.fileList.find(t=>t.uid===e.file.uid))return;if(this.activeUploads>=this.maxConcurrentUploads){this.uploadQueue.push(e);const t=this.fileList.find(t=>t.uid===e.file.uid);return void(t&&(t.status="waiting"))}this.activeUploads++;const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.status="uploading");const o=this.fileList.find(t=>t.uid===e.file.uid),s=o?.uploadChannel||this.uploadChannel;if("external"===s)return void this.uploadSingleFile(e);if("huggingface"===s){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===s){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const a=20971520;e.file.size>a?this.uploadFileInChunks(e):this.uploadSingleFile(e)},processUploadQueue(){if(0===this.uploadQueue.length||this.activeUploads>=this.maxConcurrentUploads)return;const e=this.uploadQueue.shift();e&&this.fileList.find(t=>t.uid===e.file.uid)?this.uploadFile(e):this.processUploadQueue()},onUploadComplete(){this.activeUploads=Math.max(0,this.activeUploads-1),this.processUploadQueue(),0===this.activeUploads&&0===this.uploadQueue.length&&(this.uploading=!1)},async uploadSingleFile(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.serverCompress,s=t.uploadChannel||this.uploadChannel,a=this.autoRetry&&"external"!==s,i="external"===s?"default":this.uploadNameType,l=new AbortController;this.abortControllers.set(e.file.uid,l);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await zt(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,_t.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+a+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:l.signal,onUploadProgress:t=>{const o=Math.round(t.loaded/t.total*100);e.onProgress({percent:o,file:e.file})}}).then(t=>{e.onSuccess(t,e.file)}).catch(t=>{"CanceledError"!==t.name&&"ERR_CANCELED"!==t.code?t.response&&401!==t.response.status?(this.exceptionList.push(e),e.onError(t,e.file)):t.response||(this.exceptionList.push(e),e.onError(t,e.file)):console.log("上传已取消:",e.file.name)}).finally(()=>{this.abortControllers.delete(e.file.uid),this.onUploadComplete()})},async uploadFileInChunks(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.uploadChannel||this.uploadChannel,s=new AbortController;this.abortControllers.set(e.file.uid,s);const a="discord"===o?9437184:16777216,i=e.file.size,l=e.file.type||"application/octet-stream",n=Math.ceil(i/a),r=t.serverCompress,d=this.autoRetry&&"external"!==o,c="external"===o?"default":this.uploadNameType;let u=null;if("huggingface"===o)try{console.log("Computing SHA256 for HuggingFace chunked upload..."),u=await zt(e.file),console.log("SHA256 computed:",u)}catch(p){console.error("Failed to compute SHA256:",p)}try{const t=new FormData;t.append("originalFileName",e.file.name),t.append("originalFileType",l),t.append("totalChunks",n.toString());const h=await(0,_t.A)({url:"/upload?serverCompress="+r+"&uploadChannel="+o+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+c+"&autoRetry="+d+"&uploadFolder="+encodeURIComponent(this.uploadFolder)+"&initChunked=true",method:"post",data:t,withAuthCode:!0});if(!h.data.success)throw new Error(this.$t("uploadForm.chunkInitFailed")+": "+h.data.message);const m=h.data.uploadId;console.log("分块上传初始化成功,uploadId:",m);const g=this.fileList.find(t=>t.uid===e.file.uid);g&&(g.totalChunks=n,g.uploadId=m);const f=3,y=new Array(n).fill(0);let b=0,k=!1,v="",C=!1;const w=async t=>{if(k||C)return;const u=t*a,h=Math.min(u+a,i),g=e.file.slice(u,h),f=new FormData;f.append("file",g,`${e.file.name}.part${t.toString().padStart(3,"0")}`),f.append("chunkIndex",t.toString()),f.append("totalChunks",n.toString()),f.append("uploadId",m),f.append("originalFileName",e.file.name),f.append("originalFileType",l);let b=0;const w=3;while(b{if(k||C)return;const s=Math.round(o.loaded/o.total*100);y[t]=s;const a=Math.round(y.reduce((e,t)=>e+t,0)/n);e.onProgress({percent:a,file:e.file})}})}catch(p){if("CanceledError"===p.name||"ERR_CANCELED"===p.code)return C=!0,void console.log("分块上传已取消:",e.file.name);if(b++,console.warn(`分块 ${t+1}/${n} 上传失败 (重试 ${b}/${w}):`,p),b>=w)throw k=!0,v=`分块 ${t+1}/${n} 上传失败: ${p.message}`,new Error(v);await new Promise(e=>setTimeout(e,2e3*b))}}},F=[];for(let e=0;e{while(bt.uid===e.file.uid);t&&t.uploadId&&this.cleanupUploadResources(t.uploadId,t.totalChunks).then(()=>{console.log(`已清理分块上传失败的资源: ${t.uploadId}`)}).catch(e=>{console.warn("清理分块上传失败资源时出错:",e)}),p.response&&401!==p.response.status?(this.exceptionList.push(e),e.onError(p,e.file)):p.response||(this.exceptionList.push(e),e.onError(p,e.file))}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},handleRemove(e){this.abortControllers.has(e.uid)&&(this.abortControllers.get(e.uid).abort(),this.abortControllers.delete(e.uid)),this.uploadQueue=this.uploadQueue.filter(t=>t.file.uid!==e.uid),this.fileList=this.fileList.filter(t=>t.uid!==e.uid),this.$message({type:"info",message:this.$t("uploadForm.deleted",{name:this.truncateFilename(e.name)})})},async cleanupUploadResources(e,t=0){try{await(0,_t.A)({url:`/upload?cleanup=true&uploadId=${e}&totalChunks=${t}`,method:"get",withAuthCode:!0,timeout:5e3}),console.log(`清理上传资源成功: ${e}`)}catch(o){console.warn("清理上传资源失败:",o)}},handleSuccess(e,t){const o=this.fileList.find(e=>e.uid===t.uid);if(o)try{const s=o.uploadChannel||this.uploadChannel;if("external"!==s){const s=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+s;const a=At(s,t.name,this.rootUrl);Object.assign(o,a),o.srcID=s}o.progreess=100,o.status="success",this.saveToHistory(o),this.$message({type:"success",message:this.$t("uploadForm.uploadSuccess",{name:this.truncateFilename(t.name)})}),setTimeout(()=>{const e=this.fileList.find(e=>e.uid===t.uid);e&&(e.status="done")},1e3)}catch(s){this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception"}},saveToHistory(e){try{const t=JSON.parse(localStorage.getItem("uploadHistory")||"[]"),o={name:e.name,url:e.finalURL,time:Date.now(),type:e.name.split(".").pop().toLowerCase()};t.push(o),localStorage.setItem("uploadHistory",JSON.stringify(t))}catch(t){console.error("Failed to save history",t)}},handleError(e,t){const o=this.fileList.find(e=>e.uid===t.uid);o&&(this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception",this.autoReUpload&&this.scheduleAutoRetry())},handleCopy(e){const t=this.fileList.find(t=>t.uid===e.uid).status;"done"===t||"success"===t?(navigator.clipboard.writeText(Rt(e,this.selectedUrlForm)),this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})):this.$message({type:"warning",message:this.$t("uploadForm.fileNotUploaded")})},beforeUpload(e){return new Promise(async(t,o)=>{let s=e;const a=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(a)try{const t=await this.convertImageToWebp(e);t&&(s=t,console.log(`WebP转换成功: ${e.name} -> ${t.name}, 大小: ${(e.size/1024).toFixed(1)}KB -> ${(t.size/1024).toFixed(1)}KB`))}catch(r){console.warn("WebP转换失败,使用原文件:",r)}const i=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,l=s.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const s=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:s,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)xt.compressAccurately(s,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const a=new File([t],s.name,{type:t.type});a.uid=e.uid;const i=this.uploadCount++,l=this.serverCompress&&a.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(a,l):setTimeout(()=>{n(a,l),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(l){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!s.type.includes("image")||s.size/1024/1024<10);0===e?n(s,t):setTimeout(()=>{n(s,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))})},handleProgress(e){const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.progreess=e.percent)},copyAll(){const e=this.fileList.filter(e=>"done"===e.status||"success"===e.status).map(e=>Rt(e,this.selectedUrlForm)).join("\n");navigator.clipboard.writeText(e),this.$message({type:"success",message:this.$t("uploadForm.copyAllSuccess")})},clearFileList(){this.fileList.length>0?(this.abortControllers.forEach((e,t)=>{e.abort()}),this.abortControllers.clear(),this.uploadQueue=[],this.fileList=[],this.$message({type:"success",message:this.$t("uploadForm.fileListCleared")})):this.$message({type:"info",message:this.$t("uploadForm.fileListEmpty")})},clearSuccessList(){this.uploadSuccessCount>0?(this.fileList=this.fileList.filter(e=>"done"!==e.status&&"success"!==e.status),this.$message({type:"success",message:this.$t("uploadForm.successFilesCleared")})):this.$message({type:"info",message:this.$t("uploadForm.successFilesEmpty")})},handlePaste(e){if("INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName)return;const t=e.clipboardData.items;t.length>0&&this.uploadFromUrl(t)},handleUploadPasteUrls(){const e=this.pastedUrls.split("\n"),t=e.map(e=>e.trim()).filter(e=>""!==e).filter(e=>/^(https?:\/\/[^\s$.?#].[^\s]*)$/.test(e));if("save"===this.pasteUploadMethod)this.uploadFromUrl(t.map(e=>({kind:"string",getAsString:t=>{t(e)}})));else if("external"===this.pasteUploadMethod)for(let o=0;o`,l=`[img]${e}[/img]`,n=new File([],e.split("/").pop(),{type:"text/plain"});n.uid=Date.now()+o,n.url=e,this.fileList.push({uid:n.uid,name:n.name,url:e,finalURL:e,mdURL:a,htmlURL:i,ubbURL:l,srcID:e,status:"uploading",progreess:0,serverCompress:!1,uploadChannel:"external",retryCount:0}),this.uploadFile({file:n,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}},uploadFromUrl(e){for(let t=0;t{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}else"string"===e[t].kind&&e[t].getAsString(e=>{const o=/^(https?:\/\/[^\s$.?#].[^\s]*)$/;let s="";o.test(e)&&_t.A.post("/api/fetchRes",{url:e},{responseType:"blob",withAuthCode:!0}).then(o=>{o.headers["content-type"];if(200!=o.status)throw new Error("URL地址请求失败");{const i=o.headers["content-disposition"];if(i){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(i);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(a){s=""}}""===s&&(o=t.exec(i),null!=o&&o[1]&&(s=decodeURIComponent(o[1])))}if(""===s){const t=new URL(e);s=t.pathname.split("/").pop()}if(""===s){const o=new URL(e);let a=o.pathname.split(".").pop();(!a||""===a||a.length>10)&&(a="bin"),s="PastedFile"+Date.now()+t+"."+a}const l=o.data,n=new File([l],s,{type:l.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await zt(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),a=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,_t.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:a,channelName:this.channelName,uploadNameType:this.uploadNameType,uploadFolder:this.uploadFolder},withAuthCode:!0,signal:o.signal});if(!i.data.success)throw new Error(i.data.error||"Failed to get upload URL");const l=i.data;if(console.log("Upload info:",l),l.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(l.needsLfs&&l.uploadAction){const{href:t,header:s}=l.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,l,o);else{console.log("Uploading to S3 (basic)...");const a=await fetch(t,{method:"PUT",headers:s||{},body:e.file,signal:o.signal});if(!a.ok){const e=await a.text();throw new Error(`S3 upload failed: ${a.status} - ${e}`)}console.log("S3 upload complete")}}if(o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);e.onProgress({percent:95,file:e.file}),console.log("Committing file...");const n=await(0,_t.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:l.fullId,filePath:l.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:l.channelName},withAuthCode:!0,signal:o.signal});if(!n.data.success)throw new Error(n.data.error||"Failed to commit file");console.log("Upload complete:",n.data);const r={data:[{src:n.data.src}]};e.onSuccess(r,e.file)}catch(s){if("CanceledError"===s.name||"ERR_CANCELED"===s.code||"AbortError"===s.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",s),this.exceptionList.push(e),e.onError(s,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:s}=t,{href:a,header:i}=s,l=parseInt(i.chunk_size),n=Object.keys(i).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${l}`);const r=[],d=n.length;for(const u of n){if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");const t=parseInt(u)-1,s=t*l,a=Math.min(s+l,e.file.size),n=e.file.slice(s,a);console.log(`Uploading part ${u}/${d}`);const c=await fetch(i[u],{method:"PUT",body:n,signal:o?o.signal:void 0});if(!c.ok)throw new Error(`Failed to upload part ${u}: ${c.status}`);const p=c.headers.get("ETag");if(!p)throw new Error(`No ETag for part ${u}`);r.push({partNumber:parseInt(u),etag:p});const h=10+Math.round(parseInt(u)/d*80);e.onProgress({percent:h,file:e.file})}if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");console.log("Completing multipart upload...");const c=await fetch(a,{method:"POST",headers:{Accept:"application/vnd.git-lfs+json","Content-Type":"application/vnd.git-lfs+json"},body:JSON.stringify({oid:t.oid,parts:r}),signal:o?o.signal:void 0});if(!c.ok){const e=await c.text();throw new Error(`Multipart complete failed: ${c.status} - ${e}`)}console.log("Multipart upload complete")},async convertImageToWebp(e){return new Promise((t,o)=>{if(e.type.includes("gif")||e.type.includes("svg")||e.type.includes("webp"))return void t(null);const s=new Image,a=document.createElement("canvas"),i=a.getContext("2d");s.onload=()=>{a.width=s.width,a.height=s.height,i.drawImage(s,0,0),a.toBlob(a=>{if(a){const o=e.name,s=o.lastIndexOf("."),i=s>0?o.substring(0,s)+".webp":o+".webp",l=new File([a],i,{type:"image/webp"});l.uid=e.uid,t(l)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(s.src)},"image/webp",.92)},s.onerror=()=>{URL.revokeObjectURL(s.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},s.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),s=e.clientX-o.left,a=e.clientY-o.top;t.style.opacity="1",t.style.left=s+"px",t.style.top=a+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const Vt=(0,V.A)(Wt,[["render",Tt],["__scopeId","data-v-fe1ea9cc"]]);var Bt=Vt,Ht=o(732),Qt=o(33892),Xt=o(45130);const qt={class:"directory-suggestion-input",ref:"wrapperRef"},Ot={class:"suggestion-dropdown"},jt={class:"suggestion-list"},Gt=["title","onMousedown"];function Kt(e,t,o,s,a,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",qt,[(0,i.bF)(r,{ref:"inputRef",modelValue:n.inputValue,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputValue=e),placeholder:o.placeholder,onFocus:n.handleFocus,onBlur:n.handleBlur,onInput:n.handleInput},null,8,["modelValue","placeholder","onFocus","onBlur","onInput"]),(0,i.bo)((0,i.Lk)("div",Ot,[(0,i.Lk)("ul",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(a.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Xt.D$)(t=>n.selectItem(e),["prevent"])},(0,l.v_)(e.value),41,Gt))),128))])],512),[[Xt.aG,a.dropdownVisible&&a.suggestions.length>0]])],512)}var Jt={name:"DirectorySuggestionInput",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:""}},emits:["update:modelValue","focus","blur","select"],data(){return{directoryTreeRoot:null,directoryTreeLoaded:!1,directoryTreeLoading:!1,directoryChildrenMap:{},focusTime:null,dropdownVisible:!1,isFocused:!1,suggestions:[]}},computed:{inputValue:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}}},watch:{modelValue(){this.isFocused&&this.refreshSuggestions()}},methods:{handleFocus(){this.isFocused=!0,this.focusTime=Date.now(),this.ensureDirectoryTreeLoaded(),this.$emit("focus"),setTimeout(()=>{this.isFocused&&(this.refreshSuggestions(),this.dropdownVisible=!0)},500)},handleBlur(){this.isFocused=!1,this.dropdownVisible=!1,this.$emit("blur")},handleInput(e){this.$nextTick(()=>{this.refreshSuggestions(),this.isFocused&&(this.dropdownVisible=!0)})},selectItem(e){const t=e.value;this.inputValue=t,this.$emit("select",t);const o=this.normalizeDirectoryPath(t),s=this.directoryChildrenMap[o];s&&s.length>0?this.$nextTick(()=>{this.refreshSuggestions(),this.dropdownVisible=!0,this.$refs.inputRef?.focus()}):this.dropdownVisible=!1},refreshSuggestions(){this.suggestions=this.getDirectorySuggestions(this.modelValue||"")},normalizeDirectoryPath(e){if(!e)return"/";let t=e;return t.startsWith("/")||(t="/"+t),"/"===t||t.endsWith("/")||(t+="/"),t},buildDirectoryChildrenMap(e){const t={},o=e=>{const s=this.normalizeDirectoryPath(e.path),a=Array.isArray(e.children)?e.children:[];t[s]=a.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),a.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await _t.A.get("/api/directoryTree",{withAuthCode:!0}),t=e?.data?.tree;t&&(this.directoryTreeRoot=t,this.buildDirectoryChildrenMap(t),this.directoryTreeLoaded=!0)}catch(e){console.error("Failed to load directory tree for autocomplete:",e)}finally{this.directoryTreeLoading=!1}}},parseDirectoryQuery(e){const t=e&&e.startsWith("/")?e:`/${e||""}`,o=t.slice(1),s=o.split("/"),a=s[s.length-1]||"",i=s.slice(0,-1).filter(Boolean),l=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:a,parentPath:l}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),s=this.directoryChildrenMap[o]||[];if(!t)return s.slice(0,10).map(e=>({value:e.path}));const a=t.toLowerCase();return s.filter(e=>e.name.toLowerCase().startsWith(a)).slice(0,10).map(e=>({value:e.path}))}}};const Yt=(0,V.A)(Jt,[["render",Kt],["__scopeId","data-v-28b8eda7"]]);var Zt=Yt,eo=o(17879);const to={class:"container"},oo={class:"upload-home"},so={class:"quick-toolbar-actions"},ao={class:"quick-toolbar-actions-inner"},io={class:"header"},lo={class:"title"},no={class:"title-crayon-text","aria-hidden":"true"},ro={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},co={class:"dialog-section"},uo={class:"section-header"},po={class:"section-title"},ho={class:"section-content"},mo={class:"dialog-section"},go={class:"section-header"},fo={class:"section-title"},yo={class:"section-content"},bo={class:"setting-item"},ko={class:"setting-label"},vo={key:0,class:"setting-item"},Co={class:"setting-label"},wo={class:"dialog-action"},Fo=["innerHTML"],Lo={class:"dialog-footer"};function Uo(e,t,o,n,r,d){const c=eo.A,u=(0,i.g2)("font-awesome-icon"),p=a.S2,h=pt.c6,m=pt.Iy,g=pt.dW,f=Zt,y=G.WK,b=Qt.A,k=s.R7,v=Ht.A,C=Bt,w=J.ll,F=J.MQ,L=j.qi,U=X.kZ,$=Ve,S=Q.A,T=H;return(0,i.uX)(),(0,i.CE)("div",to,[(0,i.Lk)("div",oo,[(0,i.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,i.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,l.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,i.Lk)("div",{class:(0,l.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(f,{key:0,modelValue:r.uploadFolder,"onUpdate:modelValue":t[0]||(t[0]=e=>r.uploadFolder=e),class:"inner-folder-input",placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur,onSelect:d.handleDirectorySelect},null,8,["modelValue","placeholder","onFocus","onBlur","onSelect"])):((0,i.uX)(),(0,i.Wv)(y,{key:1,class:"inner-folder-input",modelValue:r.uploadFolder,"onUpdate:modelValue":t[1]||(t[1]=e=>r.uploadFolder=e),placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur},null,8,["modelValue","placeholder","onFocus","onBlur"]))],2),d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,i.k6)(()=>[(0,i.bF)(p,{class:"directory-tree-trigger"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,i.Q3)("",!0)],2),(0,i.bF)(k,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,i.k6)(()=>["default"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,i.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,i.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"toggleTheme"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,l.v_)(d.getThemeText()),1)]),_:1}),(0,i.bF)(h,{command:"toggleUploadMethod"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,l.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"mobile-more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,l.C4)(["quick-toolbar",{"is-expanded":r.isQuickToolbarOpen}]),onMouseleave:t[5]||(t[5]=(...e)=>d.handleQuickToolbarLeave&&d.handleQuickToolbarLeave(...e))},[(0,i.Lk)("div",so,[(0,i.Lk)("div",ao,[(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.logout"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[2]||(t[2]=e=>d.handleQuickToolbarCommand("logout"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"sign-out-alt",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.manage"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[3]||(t[3]=e=>d.handleQuickToolbarCommand("manage"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cog",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.linkFormat"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[4]||(t[4]=e=>d.handleQuickToolbarCommand("linkFormat"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"])])]),(0,i.bF)(k,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:d.openCompressDialog},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cloud-upload",class:"quick-toolbar-icon"})]),_:1},8,["onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(p,{class:(0,l.C4)(["quick-toolbar-button quick-toolbar-more",{"is-active":r.isQuickToolbarOpen}]),"aria-expanded":r.isQuickToolbarOpen,onMouseenter:d.handleQuickToolbarMoreEnter,onClick:d.toggleQuickToolbar},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"chevron-down",class:"quick-toolbar-icon quick-toolbar-toggle-icon"})]),_:1},8,["class","aria-expanded","onMouseenter","onClick"])],34),(0,i.bF)(v,{useConfigLink:!0}),(0,i.Lk)("div",io,[(0,i.Lk)("h1",lo,[(0,i.Lk)("span",no,(0,l.v_)(d.ownerName)+" ImgHub",1),(0,i.Lk)("a",ro,(0,l.v_)(d.ownerName),1),t[24]||(t[24]=(0,i.eW)(" ImgHub ",-1))])]),(0,i.bF)(C,{selectedUrlForm:r.selectedUrlForm,customerCompress:r.customerCompress,compressQuality:r.compressQuality,compressBar:r.compressBar,serverCompress:r.serverCompress,uploadChannel:r.uploadChannel,channelName:r.channelName,uploadNameType:r.uploadNameType,useCustomUrl:r.useCustomUrl,customUrlPrefix:r.customUrlPrefix,autoRetry:r.autoRetry,urlPrefix:d.urlPrefix,uploadMethod:r.uploadMethod,uploadFolder:r.uploadFolder,convertToWebp:r.convertToWebp,class:"upload"},null,8,["selectedUrlForm","customerCompress","compressQuality","compressBar","serverCompress","uploadChannel","channelName","uploadNameType","useCustomUrl","customUrlPrefix","autoRetry","urlPrefix","uploadMethod","uploadFolder","convertToWebp"]),(0,i.bF)(U,{title:e.$t("settings.linkFormatTitle"),modelValue:r.showUrlDialog,"onUpdate:modelValue":t[10]||(t[10]=e=>r.showUrlDialog=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog settings-dialog-scope"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",co,[(0,i.Lk)("div",uo,[(0,i.Lk)("span",po,(0,l.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",ho,[(0,i.bF)(F,{modelValue:r.selectedUrlForm,"onUpdate:modelValue":t[6]||(t[6]=e=>r.selectedUrlForm=e),onChange:d.changeUrlForm,class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(w,{value:"url",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,i.bF)(w,{value:"md",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code",class:"radio-icon"}),t[25]||(t[25]=(0,i.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,i.bF)(w,{value:"html",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[26]||(t[26]=(0,i.Lk)("span",null,"HTML",-1))]),_:1}),(0,i.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[27]||(t[27]=(0,i.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,i.Lk)("div",mo,[(0,i.Lk)("div",go,[(0,i.Lk)("span",fo,(0,l.v_)(e.$t("settings.customLink")),1),(0,i.bF)(k,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",yo,[(0,i.Lk)("div",bo,[(0,i.Lk)("span",ko,(0,l.v_)(e.$t("settings.enableCustom")),1),(0,i.bF)(L,{modelValue:r.useCustomUrl,"onUpdate:modelValue":t[7]||(t[7]=e=>r.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===r.useCustomUrl?((0,i.uX)(),(0,i.CE)("div",vo,[(0,i.Lk)("span",Co,(0,l.v_)(e.$t("settings.customPrefix")),1),(0,i.bF)(y,{modelValue:r.customUrlPrefix,"onUpdate:modelValue":t[8]||(t[8]=e=>r.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,i.Q3)("",!0)])]),(0,i.Lk)("div",wo,[(0,i.bF)(p,{type:"primary",onClick:t[9]||(t[9]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,i.bF)($,{modelValue:r.showCompressDialog,"onUpdate:modelValue":t[11]||(t[11]=e=>r.showCompressDialog=e),uploadChannel:r.uploadChannel,"onUpdate:uploadChannel":t[12]||(t[12]=e=>r.uploadChannel=e),channelName:r.channelName,"onUpdate:channelName":t[13]||(t[13]=e=>r.channelName=e),currentChannelList:d.currentChannelList,uploadFolder:r.uploadFolder,"onUpdate:uploadFolder":t[14]||(t[14]=e=>r.uploadFolder=e),autoRetry:r.autoRetry,"onUpdate:autoRetry":t[15]||(t[15]=e=>r.autoRetry=e),uploadNameType:r.uploadNameType,"onUpdate:uploadNameType":t[16]||(t[16]=e=>r.uploadNameType=e),convertToWebp:r.convertToWebp,"onUpdate:convertToWebp":t[17]||(t[17]=e=>r.convertToWebp=e),customerCompress:r.customerCompress,"onUpdate:customerCompress":t[18]||(t[18]=e=>r.customerCompress=e),compressBar:r.compressBar,"onUpdate:compressBar":t[19]||(t[19]=e=>r.compressBar=e),compressQuality:r.compressQuality,"onUpdate:compressQuality":t[20]||(t[20]=e=>r.compressQuality=e),serverCompress:r.serverCompress,"onUpdate:serverCompress":t[21]||(t[21]=e=>r.serverCompress=e)},null,8,["modelValue","uploadChannel","channelName","currentChannelList","uploadFolder","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","compressQuality","serverCompress"])]),(0,i.bF)(S,{class:"footer"}),(0,i.bF)(U,{title:e.$t("upload.announcementTitle"),modelValue:r.showAnnouncementDialog,"onUpdate:modelValue":t[22]||(t[22]=e=>r.showAnnouncementDialog=e),width:d.dialogWidth,"show-close":!1,"close-on-click-modal":!1,"close-on-press-escape":!1,center:""},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",Lo,[(0,i.bF)(p,{type:"primary",onClick:d.acknowledgeAnnouncement},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.announcementAck")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",{innerHTML:r.announcementContent},null,8,Fo)]),_:1},8,["title","modelValue","width"]),(0,i.bF)(T,{show:r.showHistory,onClose:t[23]||(t[23]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var $o=o(46638),So=o(48903),To=o(90144),_o=o(62388),xo={name:"UploadHome",mixins:[So.A],data(){return{selectedUrlForm:(0,To.KR)(""),showUrlDialog:!1,showCompressDialog:!1,customerCompress:!0,compressQuality:4,compressBar:5,convertToWebp:!1,serverCompress:!0,uploadChannel:"",channelName:"",availableChannels:{},uploadNameType:"",customUrlPrefix:"",useCustomUrl:"false",autoRetry:!0,useDefaultWallPaper:!1,uploadMethod:"default",uploadFolder:"",isFolderInputActive:!1,isQuickToolbarOpen:!1,isQuickToolbarPinned:!1,showAnnouncementDialog:!1,announcementContent:"",displayedAnnouncementRefreshAt:null,showHistory:!1,themeMode:"auto"}},watch:{customerCompress(e){this.updateCompressConfig("customerCompress",e)},compressQuality(e){this.updateCompressConfig("compressQuality",e)},compressBar(e){null===e||void 0===e||e<1?this.compressBar=1:(this.compressQuality>e&&(this.compressQuality=e),this.updateCompressConfig("compressBar",e))},serverCompress(e){this.updateCompressConfig("serverCompress",e)},convertToWebp(e){this.updateCompressConfig("convertToWebp",e)},uploadChannel(e){this.updateStoreUploadChannel(e);const t=this.availableChannels[e]||[],o=this.storeChannelName;o&&t.some(e=>e.name===o)?this.channelName=o:this.channelName=""},channelName(e){this.$store.commit("setStoreChannelName",e||"")},uploadNameType(e){this.updateStoreUploadNameType(e)},customUrlPrefix(e){this.$store.commit("setCustomUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setCustomUrlSettings",{key:"useCustomUrl",value:e})},autoRetry(e){this.$store.commit("setStoreAutoRetry",e)},uploadFolder(e){if(this.validateUploadFolder(e,!1)){const t=(0,_o.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,Mt.L8)(["userConfig","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeUploadNameType","customUrlSettings","storeAutoRetry","storeUploadMethod","storeUploadFolder"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},disableTooltip(){return window.innerWidth<768},urlPrefix(){return this.userConfig?.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},announcementAvailable(){return!!this.userConfig?.announcement},showDirectorySuggestions(){return this.userConfig?.showDirectorySuggestions??!1},currentChannelList(){return this.availableChannels[this.uploadChannel]||[]}},mounted(){this.initializeBackground("uploadBkImg",".container",!0,!0),this.selectedUrlForm=this.uploadCopyUrlForm||"url",this.customerCompress=this.compressConfig.customerCompress??this.parseBoolean(this.userConfig?.defaultCustomerCompress,!0),this.compressQuality=this.compressConfig.compressQuality??this.parseNumber(this.userConfig?.defaultCompressQuality,4),this.compressBar=this.compressConfig.compressBar??this.parseNumber(this.userConfig?.defaultCompressBar,5),this.serverCompress=this.compressConfig.serverCompress??!0,this.convertToWebp=this.compressConfig.convertToWebp??this.parseBoolean(this.userConfig?.defaultConvertToWebp,!1),this.uploadChannel=this.storeUploadChannel||this.userConfig?.defaultUploadChannel||"telegram",this.autoRetry=this.storeAutoRetry,this.uploadNameType=this.storeUploadNameType||this.userConfig?.defaultUploadNameType||"default",this.customUrlPrefix=this.customUrlSettings.customUrlPrefix,this.useCustomUrl=this.customUrlSettings.useCustomUrl,this.uploadMethod=this.storeUploadMethod,this.fetchAvailableChannels(),this.uploadFolder=this.storeUploadFolder||this.userConfig?.defaultUploadFolder||"";const e=this.$store.getters.cusDarkMode,t=this.$store.getters.useDarkMode;this.themeMode=e?t?"dark":"light":"auto",this.showAnnouncementIfNeeded()},components:{UploadForm:Bt,Footer:Q.A,ToggleDark:eo.A,Logo:Ht.A,UploadHistory:H,UploadSettingsDialog:Ve,DirectoryTreePicker:Qt.A,DirectorySuggestionInput:Zt},methods:{async fetchAvailableChannels(){try{const e=await _t.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,s=this.availableChannels[this.uploadChannel]||[];t&&s.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&s.some(e=>e.name===o)&&(this.channelName=o)}}catch(e){console.error("Failed to fetch available channels:",e)}},validateUploadFolder(e,t=!0){e&&!e.startsWith("/")&&(e="/"+e,this.uploadFolder=e);const o=(0,_o.G)(e,{strict:t});return!!o.valid||(this.$message.error(o.error),!1)},handleFolderInputFocus(){this.isFolderInputActive=!0},handleFolderInputBlur(){this.isFolderInputActive=!1,this.uploadFolder&&!this.uploadFolder.startsWith("/")&&(this.uploadFolder="/"+this.uploadFolder),this.validateUploadFolder(this.uploadFolder,!0)||this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})},handleManage(){this.$router.push("/dashboard")},parseBoolean(e,t){return void 0===e||null===e?t:"boolean"===typeof e?e:"string"===typeof e?"true"===e:t},parseNumber(e,t){if(void 0===e||null===e)return t;const o=parseFloat(e);return isNaN(o)?t:o},openUrlDialog(){this.showUrlDialog=!0},handleLogout(){_t.A.post("/api/auth/logout",{authType:"user"},{withCredentials:!0}).finally(()=>{this.$store.commit("setUserLoggedIn",!1),this.$router.push("/login"),this.$message.success(this.$t("upload.logoutSuccess"))})},changeUrlForm(){this.$store.commit("setUploadCopyUrlForm",this.selectedUrlForm)},openCompressDialog(){this.showCompressDialog=!0},updateCompressConfig(e,t){this.$store.commit("setCompressConfig",{key:e,value:t})},updateStoreUploadChannel(e){this.$store.commit("setStoreUploadChannel",e)},updateStoreUploadNameType(e){this.$store.commit("setStoreUploadNameType",e)},handleQuickToolbarMoreEnter(){this.isQuickToolbarOpen=!0},handleQuickToolbarLeave(){this.isQuickToolbarPinned||(this.isQuickToolbarOpen=!1)},toggleQuickToolbar(){this.isQuickToolbarPinned=!this.isQuickToolbarPinned,this.isQuickToolbarOpen=this.isQuickToolbarPinned},closeQuickToolbar(){this.isQuickToolbarPinned=!1,this.isQuickToolbarOpen=!1},handleQuickToolbarCommand(e){this.closeQuickToolbar(),"linkFormat"===e?this.openUrlDialog():"manage"===e?this.handleManage():"logout"===e&&this.handleLogout()},handleChangeUploadMethod(){this.uploadMethod="default"===this.uploadMethod?"paste":"default",this.$store.commit("setUploadMethod",this.uploadMethod)},handleMobileMenuCommand(e){if("toggleTheme"===e)"auto"===this.themeMode?(this.themeMode="light",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):"light"===this.themeMode?(this.themeMode="dark",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0)):(this.themeMode="auto",this.$store.commit("setCusDarkMode",!1));else if("toggleUploadMethod"===e)this.handleChangeUploadMethod();else if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,$o.xS)(e)}},handleDesktopMenuCommand(e){if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,$o.xS)(e)}},getThemeIcon(){return"auto"===this.themeMode?"sun":"light"===this.themeMode?"moon":"adjust"},getThemeText(){return"auto"===this.themeMode?this.$t("theme.lightMode"):"light"===this.themeMode?this.$t("theme.darkMode"):this.$t("theme.autoMode")},handleShowAnnouncement(){const e=this.userConfig?.announcement;e?this.openAnnouncement(e):this.$message.info(this.$t("upload.noAnnouncement"))},getAnnouncementRefreshAt(){const e=Number(this.userConfig?.announcementRefreshAt);return Number.isFinite(e)&&e>0?e:null},openAnnouncement(e){this.announcementContent=e,this.displayedAnnouncementRefreshAt=this.getAnnouncementRefreshAt(),this.showAnnouncementDialog=!0},showAnnouncementIfNeeded(){const e=this.userConfig?.announcement;if(!e)return;const t=this.getAnnouncementRefreshAt();if(t){const o=Number(localStorage.getItem("announcementAcknowledgedRefreshAt"));return void((!Number.isFinite(o)||t>o)&&this.openAnnouncement(e))}localStorage.getItem("announcementAcknowledgedAt")||this.openAnnouncement(e)},acknowledgeAnnouncement(){localStorage.setItem("announcementAcknowledgedAt",String(Date.now())),this.displayedAnnouncementRefreshAt&&localStorage.setItem("announcementAcknowledgedRefreshAt",String(this.displayedAnnouncementRefreshAt)),this.showAnnouncementDialog=!1},handleDirectorySelect(e){this.uploadFolder=e,this.validateUploadFolder(e,!0)&&this.$store.commit("setStoreUploadFolder",e)}}};const Mo=(0,V.A)(xo,[["render",Uo],["__scopeId","data-v-06705292"]]);var Ao=Mo},2893:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},10456:function(e,t,o){"use strict";o(85331)},11393:function(e,t,o){o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),function(t,o){e.exports=o()}(0,function(){return function(e){var t={};function o(s){if(t[s])return t[s].exports;var a=t[s]={i:s,l:!1,exports:{}};return e[s].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=e,o.c=t,o.d=function(e,t,s){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)o.d(s,a,function(t){return e[t]}.bind(null,a));return s},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";var s;function a(e){return["image/png","image/jpeg","image/gif"].some(t=>t===e)}o.r(t),o.d(t,"canvastoDataURL",function(){return l}),o.d(t,"canvastoFile",function(){return n}),o.d(t,"dataURLtoFile",function(){return d}),o.d(t,"dataURLtoImage",function(){return c}),o.d(t,"downloadFile",function(){return u}),o.d(t,"filetoDataURL",function(){return p}),o.d(t,"imagetoCanvas",function(){return m}),o.d(t,"urltoBlob",function(){return g}),o.d(t,"urltoImage",function(){return f}),o.d(t,"compress",function(){return b}),o.d(t,"compressAccurately",function(){return k}),o.d(t,"EImageType",function(){return s}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(s||(s={}));var i=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function l(e,t=.92,o=s.JPEG){return i(this,void 0,void 0,function*(){return a(o)||(o=s.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=s.JPEG){return new Promise(s=>e.toBlob(e=>s(e),o,t))}var r=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let s=o[0].match(/:(.*?);/)[1];const i=atob(o[1]);let l=i.length;const n=new Uint8Array(l);for(;l--;)n[l]=i.charCodeAt(l);return a(t)&&(s=t),new Blob([n],{type:s})})}function c(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),s.src=e})}function u(e,t){const o=document.createElement("a");o.href=window.URL.createObjectURL(e),o.download=t||Date.now().toString(36),document.body.appendChild(o);const s=document.createEvent("MouseEvents");s.initEvent("click",!1,!1),o.dispatchEvent(s),document.body.removeChild(o)}function p(e){return new Promise(t=>{const o=new FileReader;o.onloadend=e=>t(e.target.result),o.readAsDataURL(e)})}var h=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),s=document.createElement("canvas"),a=s.getContext("2d");let i,l;for(const e in o)Object.prototype.hasOwnProperty.call(o,e)&&(o[e]=Number(o[e]));if(o.scale){const t=o.scale>0&&o.scale<10?o.scale:1;l=e.width*t,i=e.height*t}else l=o.width||o.height*e.width/e.height||e.width,i=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=l,s.width=i):(s.height=i,s.width=l),o.orientation){case 3:a.rotate(180*Math.PI/180),a.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 6:a.rotate(90*Math.PI/180),a.drawImage(e,0,-s.width,s.height,s.width);break;case 8:a.rotate(270*Math.PI/180),a.drawImage(e,-s.height,0,s.height,s.width);break;case 2:a.translate(s.width,0),a.scale(-1,1),a.drawImage(e,0,0,s.width,s.height);break;case 4:a.translate(s.width,0),a.scale(-1,1),a.rotate(180*Math.PI/180),a.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 5:a.translate(s.width,0),a.scale(-1,1),a.rotate(90*Math.PI/180),a.drawImage(e,0,-s.width,s.height,s.width);break;case 7:a.translate(s.width,0),a.scale(-1,1),a.rotate(270*Math.PI/180),a.drawImage(e,-s.height,0,s.height,s.width);break;default:a.drawImage(e,0,0,s.width,s.height)}return s})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),s.src=e})}var y=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function b(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compress(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({quality:t})),t.quality=Number(t.quality),Number.isNaN(t.quality))return e;const o=yield p(e);let i=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;a(t.type)&&(n=t.type,i=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield l(u,t.quality,n),g=yield d(h,i);return g.size>e.size?e:g})}function k(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compressAccurately(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({size:t})),t.size=Number(t.size),Number.isNaN(t.size))return e;if(1024*t.size>e.size)return e;t.accuracy=Number(t.accuracy),(!t.accuracy||t.accuracy<.8||t.accuracy>.99)&&(t.accuracy=.95);const o=t.size*(2-t.accuracy)*1024,i=1024*t.size,n=t.size*t.accuracy*1024,r=yield p(e);let u=r.split(",")[0].match(/:(.*?);/)[1],h=s.JPEG;a(t.type)&&(h=t.type,u=t.type);const g=yield c(r),f=yield m(g,Object.assign({},t));let y,b=.5;const k=[null,null];for(let e=1;e<=7;e++){y=yield l(f,b,h);const t=.75*y.length;if(7===e){(ot)&&(y=[y,...k].filter(e=>e).sort((e,t)=>Math.abs(.75*e.length-i)-Math.abs(.75*t.length-i))[0]);break}if(ot))break;k[0]=y,b+=Math.pow(.5,e+1)}}const v=yield d(y,u);return v.size>e.size?e:v})}}])})},13378:function(e,t,o){"use strict";o(85331),o(38736),o(79899)},15616:function(e,t,o){"use strict";o(85331),o(97197)},17879:function(e,t,o){"use strict";o.d(t,{A:function(){return m}});var s=o(56768),a=o(45130),i=o(24232);const l={id:"themeMask"},n=["cx","cy","r"],r=["r"],d=["opacity"];function c(e,t,o,c,u,p){const h=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>p.handleToggleClick&&p.handleToggleClick(...e))},[(0,s.bF)(a.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[u.isAuto?((0,s.uX)(),(0,s.Wv)(h,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,i.C4)(["theme_toggle_svg",{dark:u.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",l,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:u.isDark?"50%":"100%",cy:u.isDark?"23%":"0%",r:u.isDark?"9":"5"},null,8,n)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:u.isDark?"9":"5",mask:"url(#themeMask)"},null,8,r),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:u.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,d)],2))]),_:1})])}var u={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},p=o(71241);const h=(0,p.A)(u,[["render",c],["__scopeId","data-v-2122c62a"]]);var m=h},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},23597:function(e,t,o){"use strict";o(85331)},30694:function(e,t,o){"use strict";o(85331)},33153:function(e,t,o){"use strict";e.exports=o.p+"img/logo.e8dbfa27.png"},33892:function(e,t,o){"use strict";o.d(t,{A:function(){return $}});var s=o(99114),a=(o(85331),o(30694),o(49385)),i=(o(37952),o(30650)),l=(o(19104),o(31802)),n=(o(13378),o(80047)),r=(o(99648),o(56768)),d=o(45130),c=o(24232);const u={class:"directory-tree-picker"},p={class:"tree-container"},h={key:0,class:"error-state"},m={class:"error-text"},g={class:"node-label"},f={class:"tree-container"},y={key:0,class:"error-state"},b={class:"error-text"},k={class:"node-label"};function v(e,t,o,v,C,w){const F=(0,r.g2)("font-awesome-icon"),L=n.S2,U=l.qk,$=i.Vc,S=a.pw,T=s.A;return(0,r.uX)(),(0,r.CE)("div",u,[w.isDesktop?((0,r.uX)(),(0,r.Wv)($,{key:0,visible:C.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>C.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,r.k6)(()=>[(0,r.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",p,[C.error?((0,r.uX)(),(0,r.CE)("div",h,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",m,(0,c.v_)(C.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRef",data:C.treeData,props:C.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",g,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,C.loading]])]),_:3},8,["visible"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,r.bF)(S,{modelValue:C.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>C.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",f,[C.error?((0,r.uX)(),(0,r.CE)("div",y,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",b,(0,c.v_)(C.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRefMobile",data:C.treeData,props:C.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",k,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,C.loading]])]),_:1},8,["modelValue","title"])],64))])}var C=o(457),w=o(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await C.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},L=o(71241);const U=(0,L.A)(F,[["render",v],["__scopeId","data-v-62eab69a"]]);var $=U},34396:function(e,t,o){"use strict";o(85331),o(4885)},34896:function(e,t,o){"use strict";o(85331)},37952:function(e,t,o){"use strict";o(85331),o(97197)},38736:function(e,t,o){"use strict";o(85331)},40670:function(e,t,o){"use strict";o(85331),o(99648),o(19104),o(85970)},50333:function(e,t,o){"use strict";o(85331),o(29092)},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return a}});var s=o(46638);function a(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:s.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:s.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:s.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:s.Ay.global.t("validation.consecutiveSlashNotAllowed")};const a=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return a.test(e)?{valid:!1,error:s.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},67819:function(e,t,o){"use strict";o(85331)},70797:function(e,t,o){"use strict";o.d(t,{A:function(){return l}});o(44114);var s=o(25507),a=o(16915);let i=!1;async function l(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||i||(i=!0,s.A.commit("setAdminLoggedIn",!1),a.A.push("/adminLogin").finally(()=>{i=!1})),o}},76334:function(e,t,o){e.exports=o(11393)},79899:function(e,t,o){"use strict";o(85331)},85970:function(e,t,o){"use strict";o(85331)},86975:function(e,t,o){"use strict";o.d(t,{A:function(){return p}});var s=o(56768),a=o(24232);const i={key:0,class:"page-footer"},l=["href"];function n(e,t,o,n,r,d){const c=(0,s.g2)("font-awesome-icon");return d.disableFooter?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("div",i,[(0,s.Lk)("p",null,[(0,s.eW)("© 2024-"+(0,a.v_)(d.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,s.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,s.eW)(" for You! ",-1)),(0,s.Lk)("a",{href:d.footerLink,target:"_blank"},[(0,s.bF)(c,{icon:"paper-plane",class:"footer-link-icon"})],8,l)])]))}var r=o(60782),d={name:"Footer",computed:{...(0,r.L8)(["userConfig"]),footerLink(){return this.userConfig?.footerLink||"https://github.com/MarSeventh"},thisYear(){return(new Date).getFullYear()},disableFooter(){return this.userConfig?.disableFooter||!1}}},c=o(71241);const u=(0,c.A)(d,[["render",n],["__scopeId","data-v-08acbaa9"]]);var p=u},88830:function(e,t,o){"use strict";o(85331)},95385:function(e,t,o){"use strict";o(85331)},96682:function(e,t,o){"use strict";e.exports=o.p+"img/404.8ed11fb3.png"},96808:function(e,t,o){"use strict";o(85331),o(18785),o(67819),o(85970),o(19104)},97769:function(e,t,o){"use strict";o.d(t,{A:function(){return u}});var s=o(56768);const a={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},i={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},l={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function n(e,t,o,n,r,d){const c=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("span",(0,s.v6)(e.$attrs,{class:["channel-icon-wrapper",`channel-brand-${o.type}`]}),["telegram"===o.type?((0,s.uX)(),(0,s.CE)("svg",a,[...t[0]||(t[0]=[(0,s.Lk)("path",{d:"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z"},null,-1)])])):"huggingface"===o.type?((0,s.uX)(),(0,s.CE)("svg",i,[...t[1]||(t[1]=[(0,s.Fv)('',9)])])):"webdav"===o.type?((0,s.uX)(),(0,s.CE)("svg",l,[...t[2]||(t[2]=[(0,s.Lk)("path",{d:"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z"},null,-1)])])):((0,s.uX)(),(0,s.Wv)(c,{key:3,icon:d.fontAwesomeIcon},null,8,["icon"]))],16)}var r={name:"ChannelIcon",inheritAttrs:!1,props:{type:{type:String,required:!0}},computed:{fontAwesomeIcon(){const e={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return e[this.type]||"server"}}},d=o(71241);const c=(0,d.A)(r,[["render",n],["__scopeId","data-v-ce6ff2ce"]]);var u=c}}]); +//# sourceMappingURL=36.1f3c2bdf.js.map \ No newline at end of file diff --git a/frontend-dist/js/36.1f3c2bdf.js.gz b/frontend-dist/js/36.1f3c2bdf.js.gz new file mode 100644 index 00000000..29c4f462 Binary files /dev/null and b/frontend-dist/js/36.1f3c2bdf.js.gz differ diff --git a/frontend-dist/js/36.1f3c2bdf.js.map b/frontend-dist/js/36.1f3c2bdf.js.map new file mode 100644 index 00000000..b0d91670 --- /dev/null +++ b/frontend-dist/js/36.1f3c2bdf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/36.1f3c2bdf.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?942e","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?d5f5","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?de1f","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?adb2","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?6ec5","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?420c","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?a5b6","webpack://sanyue_imghub/./src/utils/upload/urlBuilder.js","webpack://sanyue_imghub/./src/utils/upload/sha256.js","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?bdbd","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?6707","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?69c3","webpack://sanyue_imghub/./src/views/UploadHome.vue?fcf5","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00","webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/ToggleDark.vue?4a88","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/utils/pathValidator.js","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./node_modules/image-conversion/index.js","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?3436","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=7da2f8c2&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=7da2f8c2&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-7da2f8c2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog settings-dialog-scope upload-settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"telegram\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"cfr2\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"s3\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"discord\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"huggingface\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"webdav\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"webdav\",\n class: \"channel-icon\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"WD\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","import ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'UploadSettingsDialog',\n components: {\n ChannelIcon\n },\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=1c6b8366\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport \"@/styles/settings-dialog.css?vue&type=style&index=0&lang=css&external\"\nimport \"./UploadSettingsDialog.css?vue&type=style&index=1&lang=css&external\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=645a7810&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=645a7810&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-645a7810\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx, createVNode as _createVNode, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = [\"aria-pressed\"];\nconst _hoisted_8 = [\"aria-pressed\"];\nconst _hoisted_9 = {\n class: \"upload-list-container\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_11 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_12 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_13 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createElementVNode(\"svg\", {\n class: \"upload-plus-icon\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"1.25\",\n \"stroke-linecap\": \"round\",\n \"aria-hidden\": \"true\"\n }, [_createElementVNode(\"path\", {\n d: \"M12 7v10\"\n }), _createElementVNode(\"path\", {\n d: \"M7 12h10\"\n })], -1)]))]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"paste-card-method-group\", {\n 'is-external': $data.pasteUploadMethod === 'external'\n }]),\n role: \"group\",\n \"aria-label\": _ctx.$t('upload.switchUploadMethod')\n }, [_createElementVNode(\"button\", {\n class: _normalizeClass([\"paste-card-method-button\", {\n 'is-active': $data.pasteUploadMethod === 'save'\n }]),\n type: \"button\",\n \"aria-pressed\": $data.pasteUploadMethod === 'save',\n onClick: _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = 'save')\n }, _toDisplayString(_ctx.$t('upload.pasteSave')), 11, _hoisted_7), _createElementVNode(\"button\", {\n class: _normalizeClass([\"paste-card-method-button\", {\n 'is-active': $data.pasteUploadMethod === 'external'\n }]),\n type: \"button\",\n \"aria-pressed\": $data.pasteUploadMethod === 'external',\n onClick: _cache[4] || (_cache[4] = $event => $data.pasteUploadMethod = 'external')\n }, _toDisplayString(_ctx.$t('upload.pasteExternal')), 11, _hoisted_8)], 10, _hoisted_6)])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-copy\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-retry\",\n onClick: _cache[6] || (_cache[6] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_13, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[8] || (_cache[8] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])])]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.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.dom-exception.stack.js\";\nimport axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const fileType = file.file.type || 'application/octet-stream';\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', fileType);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', fileType);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', fileType);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=fe1ea9cc&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=fe1ea9cc&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-fe1ea9cc\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=28b8eda7&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=28b8eda7&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-28b8eda7\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"quick-toolbar-actions\"\n};\nconst _hoisted_4 = {\n class: \"quick-toolbar-actions-inner\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"title-crayon-text\",\n \"aria-hidden\": \"true\"\n};\nconst _hoisted_8 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_9 = {\n class: \"dialog-section\"\n};\nconst _hoisted_10 = {\n class: \"section-header\"\n};\nconst _hoisted_11 = {\n class: \"section-title\"\n};\nconst _hoisted_12 = {\n class: \"section-content\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"setting-item\"\n};\nconst _hoisted_18 = {\n class: \"setting-label\"\n};\nconst _hoisted_19 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_20 = {\n class: \"setting-label\"\n};\nconst _hoisted_21 = {\n class: \"dialog-action\"\n};\nconst _hoisted_22 = [\"innerHTML\"];\nconst _hoisted_23 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quick-toolbar\", {\n 'is-expanded': $data.isQuickToolbarOpen\n }]),\n onMouseleave: _cache[5] || (_cache[5] = (...args) => $options.handleQuickToolbarLeave && $options.handleQuickToolbarLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.logout'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[2] || (_cache[2] = $event => $options.handleQuickToolbarCommand('logout'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.manage'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[3] || (_cache[3] = $event => $options.handleQuickToolbarCommand('manage'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[4] || (_cache[4] = $event => $options.handleQuickToolbarCommand('linkFormat'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: $options.openCompressDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_button, {\n class: _normalizeClass([\"quick-toolbar-button quick-toolbar-more\", {\n 'is-active': $data.isQuickToolbarOpen\n }]),\n \"aria-expanded\": $data.isQuickToolbarOpen,\n onMouseenter: $options.handleQuickToolbarMoreEnter,\n onClick: $options.toggleQuickToolbar\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"quick-toolbar-icon quick-toolbar-toggle-icon\"\n })]),\n _: 1\n }, 8, [\"class\", \"aria-expanded\", \"onMouseenter\", \"onClick\"])], 34), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"span\", _hoisted_7, _toDisplayString($options.ownerName) + \" ImgHub\", 1), _createElementVNode(\"a\", _hoisted_8, _toDisplayString($options.ownerName), 1), _cache[24] || (_cache[24] = _createTextVNode(\" ImgHub \", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog settings-dialog-scope\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"span\", _hoisted_11, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[27] || (_cache[27] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"span\", _hoisted_18, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"span\", _hoisted_20, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_21, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[9] || (_cache[9] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[12] || (_cache[12] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[13] || (_cache[13] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[14] || (_cache[14] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[15] || (_cache[15] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[16] || (_cache[16] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[17] || (_cache[17] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[18] || (_cache[18] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[19] || (_cache[19] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[20] || (_cache[20] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[21] || (_cache[21] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_23, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.acknowledgeAnnouncement\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_22)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[23] || (_cache[23] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n isQuickToolbarOpen: false,\n isQuickToolbarPinned: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n displayedAnnouncementRefreshAt: null,\n // 当前弹窗所展示的公告版本\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', true, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n this.showAnnouncementIfNeeded();\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleQuickToolbarMoreEnter() {\n this.isQuickToolbarOpen = true;\n },\n handleQuickToolbarLeave() {\n if (!this.isQuickToolbarPinned) {\n this.isQuickToolbarOpen = false;\n }\n },\n toggleQuickToolbar() {\n this.isQuickToolbarPinned = !this.isQuickToolbarPinned;\n this.isQuickToolbarOpen = this.isQuickToolbarPinned;\n },\n closeQuickToolbar() {\n this.isQuickToolbarPinned = false;\n this.isQuickToolbarOpen = false;\n },\n handleQuickToolbarCommand(command) {\n this.closeQuickToolbar();\n if (command === 'linkFormat') {\n this.openUrlDialog();\n } else if (command === 'manage') {\n this.handleManage();\n } else if (command === 'logout') {\n this.handleLogout();\n }\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.openAnnouncement(announcement);\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n getAnnouncementRefreshAt() {\n const refreshAt = Number(this.userConfig?.announcementRefreshAt);\n return Number.isFinite(refreshAt) && refreshAt > 0 ? refreshAt : null;\n },\n openAnnouncement(announcement) {\n this.announcementContent = announcement;\n this.displayedAnnouncementRefreshAt = this.getAnnouncementRefreshAt();\n this.showAnnouncementDialog = true;\n },\n showAnnouncementIfNeeded() {\n const announcement = this.userConfig?.announcement;\n if (!announcement) return;\n const refreshAt = this.getAnnouncementRefreshAt();\n if (refreshAt) {\n const acknowledgedRefreshAt = Number(localStorage.getItem('announcementAcknowledgedRefreshAt'));\n if (!Number.isFinite(acknowledgedRefreshAt) || refreshAt > acknowledgedRefreshAt) {\n this.openAnnouncement(announcement);\n }\n return;\n }\n\n // 尚未产生刷新时间的旧公告在升级后再展示一次,确认后使用新版时间标记。\n if (!localStorage.getItem('announcementAcknowledgedAt')) {\n this.openAnnouncement(announcement);\n }\n },\n acknowledgeAnnouncement() {\n localStorage.setItem('announcementAcknowledgedAt', String(Date.now()));\n if (this.displayedAnnouncementRefreshAt) {\n localStorage.setItem('announcementAcknowledgedRefreshAt', String(this.displayedAnnouncementRefreshAt));\n }\n this.showAnnouncementDialog = false;\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=06705292&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=06705292&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-06705292\"]])\n\nexport default __exports__","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.imageConversion=e():t.imageConversion=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=0)}([function(t,e,n){\"use strict\";var r;function o(t){return[\"image/png\",\"image/jpeg\",\"image/gif\"].some(e=>e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=2122c62a&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=2122c62a&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-2122c62a\"]])\n\nexport default __exports__","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/**\r\n * 路径验证器模块\r\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\r\n */\r\nimport i18n from '@/locales'\r\n\r\n/**\r\n * 验证文件夹路径的合法性\r\n * @param {string} path - 要验证的路径\r\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\r\n * @returns {{ valid: boolean, error?: string }} 验证结果\r\n */\r\nexport function validateFolderPath(path, { strict = true } = {}) {\r\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\r\n if (!path || path.trim() === '') {\r\n return { valid: true };\r\n }\r\n \r\n // 如果路径仅为 \"/\",返回有效(表示根目录)\r\n if (path === '/') {\r\n return { valid: true };\r\n }\r\n \r\n // 检查路径是否以 \"/\" 开头\r\n if (!path.startsWith('/')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.pathMustStartWithSlash') \r\n };\r\n }\r\n\r\n // 检查路径穿越:包含 .. 的路径段\r\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.pathTraversalNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径中单独的 . 段\r\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\r\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\r\n if (dotPattern.test(path)) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.singleDotNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径是否包含连续的斜杠\r\n if (path.includes('//')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \r\n };\r\n }\r\n \r\n // 检查路径是否包含非法字符\r\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","module.exports = require(\"./build/conversion.js\");\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: ['channel-icon-wrapper', `channel-brand-${$props.type}`]\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=ce6ff2ce&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=ce6ff2ce&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-ce6ff2ce\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","key","_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","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_component_font_awesome_icon","_component_el_button","_component_el_tooltip","show","$t","count","totalCount","content","placement","circle","onClick","toggleViewMode","icon","viewMode","_","clearHistory","$event","$emit","historyList","length","ref","onScroll","args","handleScroll","groupedHistory","group","date","items","item","time","isImage","url","loading","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","title","formatTime","hasMore","loadingMore","spin","data","allHistory","pageSize","currentPage","watch","val","resetAndLoad","groups","forEach","Date","dateStr","getFullYear","getMonth","padStart","getDate","push","Object","keys","sort","a","b","map","mounted","savedMode","localStorage","getItem","methods","loadAllHistory","loadMore","history","JSON","parse","e","console","error","setTimeout","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","then","removeItem","$message","success","catch","filter","i","stringify","fileName","imageExtensions","extension","split","pop","toLowerCase","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","window","open","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_ChannelIcon","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","modelValue","visible","width","dialogWidth","uploadChannel","label","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","components","ChannelIcon","startsWith","Array","Number","emits","get","set","innerWidth","style","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","status","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_el_upload","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","viewBox","fill","stroke","d","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","role","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","f","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","assign","K","Uint32Array","rotr","x","n","processBlock","block","H","W","s0","s1","c","g","h","S1","temp1","S0","maj","temp2","createSha256","buffer","Uint8Array","bufferLength","totalLength","update","offset","needed","toCopy","Math","subarray","digest","bitLength","view","DataView","setUint32","floor","hex","toString","async","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","$nextTick","$refs","scrollContainer","setScrollTop","deep","immediate","$store","commit","location","protocol","host","document","addEventListener","handlePaste","storeAutoReUpload","beforeUnmount","removeEventListener","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","err","axios","encodeURIComponent","method","withAuthCode","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","response","finally","delete","fileSize","fileType","totalChunks","ceil","precomputedSha256","initFormData","initResponse","Error","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","Promise","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","now","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","URL","createObjectURL","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","trim","test","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","headers","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","blob","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","fetch","body","ok","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","undefined","etag","partNumber","progress","completeResponse","oid","img","Image","canvas","createElement","ctx","getContext","onload","height","drawImage","toBlob","originalName","newName","webpFile","revokeObjectURL","onerror","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","y","clientY","top","opacity","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","path","normalizedPath","normalizeDirectoryPath","children","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","node","parentPath","isArray","child","tree","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","trigger","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","source","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isQuickToolbarOpen","handleQuickToolbarLeave","handleQuickToolbarCommand","openCompressDialog","onMouseenter","handleQuickToolbarMoreEnter","toggleQuickToolbar","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","acknowledgeAnnouncement","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","isQuickToolbarPinned","displayedAnnouncementRefreshAt","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","some","updateStoreUploadNameType","validateUploadFolder","strictResult","strict","valid","storeUploadFolder","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","cusDarkMode","getters","useDarkMode","showAnnouncementIfNeeded","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","result","handleManage","$router","defaultValue","num","parseFloat","isNaN","openUrlDialog","handleLogout","authType","withCredentials","closeQuickToolbar","handleShowAnnouncement","next","openAnnouncement","info","getAnnouncementRefreshAt","refreshAt","announcementRefreshAt","isFinite","acknowledgedRefreshAt","t","module","exports","r","o","l","call","m","defineProperty","enumerable","Symbol","toStringTag","__esModule","create","bind","prototype","hasOwnProperty","p","s","w","PNG","JPEG","GIF","u","throw","done","apply","toDataURL","match","atob","charCodeAt","Blob","download","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","readAsDataURL","scale","orientation","rotate","PI","translate","quality","accuracy","abs","pow","v","id","handleToggleClick","mode","isAuto","isDark","cx","cy","mask","x1","y1","x2","y2","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","popoverVisible","transition","reference","$slots","fetchDirectoryTree","treeData","treeProps","currentDirectory","onNodeClick","handleNodeClick","expanded","openDrawer","drawerVisible","direction","windowWidth","newVal","treeRef","store","nodesMap","treeRefMobile","setCurrentKey","handleResize","fetchWithAuth","json","validateFolderPath","i18n","global","dotPattern","invalidChars","isRedirecting","options","credentials","router","disableFooter","thisYear","footerLink","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","cfr2","s3","discord"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/36.1f3c2bdf.js.map.gz b/frontend-dist/js/36.1f3c2bdf.js.map.gz new file mode 100644 index 00000000..ae0568d8 Binary files /dev/null and b/frontend-dist/js/36.1f3c2bdf.js.map.gz differ diff --git a/frontend-dist/js/647.6ed3341b.js b/frontend-dist/js/647.6ed3341b.js deleted file mode 100644 index d8e34a7d..00000000 --- a/frontend-dist/js/647.6ed3341b.js +++ /dev/null @@ -1,2 +0,0 @@ -(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[647],{213:function(e,t,o){"use strict";o(85331),o(19104)},732:function(e,t,o){"use strict";o.d(t,{A:function(){return p}});var s=o(56768),a=o(24232);const i=["href","target"],l=["alt","src"];function n(e,t,o,n,r,d){return(0,s.uX)(),(0,s.CE)("a",{href:d.logoHref,target:o.target,class:(0,a.C4)(e.logo-e.link)},[(0,s.Lk)("img",{class:(0,a.C4)(d.logoClasses),alt:o.alt,src:d.logoUrl},null,10,l)],10,i)}var r=o(60782),d={name:"Logo",props:{href:{type:String,default:"https://github.com/MarSeventh/CloudFlare-ImgBed"},target:{type:String,default:"_blank",validator:e=>["_blank","_self","_parent","_top"].includes(e)},alt:{type:String,default:"Sanyue logo"},customSrc:{type:String,default:""},position:{type:String,default:"fixed",validator:e=>["fixed","relative","absolute","static"].includes(e)},size:{type:String,default:"normal",validator:e=>["small","normal","large"].includes(e)},enableHover:{type:Boolean,default:!0},useConfigLink:{type:Boolean,default:!1}},computed:{...(0,r.L8)(["userConfig"]),logoUrl(){return this.customSrc||this.userConfig?.logoUrl||o(33153)},logoHref(){return this.useConfigLink&&this.userConfig?.logoLink?this.userConfig.logoLink:this.href},logoClasses(){return{logo:!0,[`logo--${this.position}`]:!0,[`logo--${this.size}`]:!0,"logo--hover-enabled":this.enableHover}}}},c=o(71241);const u=(0,c.A)(d,[["render",n],["__scopeId","data-v-17f54292"]]);var p=u},2893:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},10456:function(e,t,o){"use strict";o(85331)},11393:function(e,t,o){o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),function(t,o){e.exports=o()}(0,function(){return function(e){var t={};function o(s){if(t[s])return t[s].exports;var a=t[s]={i:s,l:!1,exports:{}};return e[s].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=e,o.c=t,o.d=function(e,t,s){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)o.d(s,a,function(t){return e[t]}.bind(null,a));return s},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";var s;function a(e){return["image/png","image/jpeg","image/gif"].some(t=>t===e)}o.r(t),o.d(t,"canvastoDataURL",function(){return l}),o.d(t,"canvastoFile",function(){return n}),o.d(t,"dataURLtoFile",function(){return d}),o.d(t,"dataURLtoImage",function(){return c}),o.d(t,"downloadFile",function(){return u}),o.d(t,"filetoDataURL",function(){return p}),o.d(t,"imagetoCanvas",function(){return m}),o.d(t,"urltoBlob",function(){return g}),o.d(t,"urltoImage",function(){return f}),o.d(t,"compress",function(){return b}),o.d(t,"compressAccurately",function(){return k}),o.d(t,"EImageType",function(){return s}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(s||(s={}));var i=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function l(e,t=.92,o=s.JPEG){return i(this,void 0,void 0,function*(){return a(o)||(o=s.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=s.JPEG){return new Promise(s=>e.toBlob(e=>s(e),o,t))}var r=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let s=o[0].match(/:(.*?);/)[1];const i=atob(o[1]);let l=i.length;const n=new Uint8Array(l);for(;l--;)n[l]=i.charCodeAt(l);return a(t)&&(s=t),new Blob([n],{type:s})})}function c(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),s.src=e})}function u(e,t){const o=document.createElement("a");o.href=window.URL.createObjectURL(e),o.download=t||Date.now().toString(36),document.body.appendChild(o);const s=document.createEvent("MouseEvents");s.initEvent("click",!1,!1),o.dispatchEvent(s),document.body.removeChild(o)}function p(e){return new Promise(t=>{const o=new FileReader;o.onloadend=e=>t(e.target.result),o.readAsDataURL(e)})}var h=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),s=document.createElement("canvas"),a=s.getContext("2d");let i,l;for(const e in o)Object.prototype.hasOwnProperty.call(o,e)&&(o[e]=Number(o[e]));if(o.scale){const t=o.scale>0&&o.scale<10?o.scale:1;l=e.width*t,i=e.height*t}else l=o.width||o.height*e.width/e.height||e.width,i=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=l,s.width=i):(s.height=i,s.width=l),o.orientation){case 3:a.rotate(180*Math.PI/180),a.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 6:a.rotate(90*Math.PI/180),a.drawImage(e,0,-s.width,s.height,s.width);break;case 8:a.rotate(270*Math.PI/180),a.drawImage(e,-s.height,0,s.height,s.width);break;case 2:a.translate(s.width,0),a.scale(-1,1),a.drawImage(e,0,0,s.width,s.height);break;case 4:a.translate(s.width,0),a.scale(-1,1),a.rotate(180*Math.PI/180),a.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 5:a.translate(s.width,0),a.scale(-1,1),a.rotate(90*Math.PI/180),a.drawImage(e,0,-s.width,s.height,s.width);break;case 7:a.translate(s.width,0),a.scale(-1,1),a.rotate(270*Math.PI/180),a.drawImage(e,-s.height,0,s.height,s.width);break;default:a.drawImage(e,0,0,s.width,s.height)}return s})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),s.src=e})}var y=function(e,t,o,s){return new(o||(o=Promise))(function(a,i){function l(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((s=s.apply(e,t||[])).next())})};function b(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compress(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({quality:t})),t.quality=Number(t.quality),Number.isNaN(t.quality))return e;const o=yield p(e);let i=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;a(t.type)&&(n=t.type,i=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield l(u,t.quality,n),g=yield d(h,i);return g.size>e.size?e:g})}function k(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compressAccurately(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({size:t})),t.size=Number(t.size),Number.isNaN(t.size))return e;if(1024*t.size>e.size)return e;t.accuracy=Number(t.accuracy),(!t.accuracy||t.accuracy<.8||t.accuracy>.99)&&(t.accuracy=.95);const o=t.size*(2-t.accuracy)*1024,i=1024*t.size,n=t.size*t.accuracy*1024,r=yield p(e);let u=r.split(",")[0].match(/:(.*?);/)[1],h=s.JPEG;a(t.type)&&(h=t.type,u=t.type);const g=yield c(r),f=yield m(g,Object.assign({},t));let y,b=.5;const k=[null,null];for(let e=1;e<=7;e++){y=yield l(f,b,h);const t=.75*y.length;if(7===e){(ot)&&(y=[y,...k].filter(e=>e).sort((e,t)=>Math.abs(.75*e.length-i)-Math.abs(.75*t.length-i))[0]);break}if(ot))break;k[0]=y,b+=Math.pow(.5,e+1)}}const v=yield d(y,u);return v.size>e.size?e:v})}}])})},13378:function(e,t,o){"use strict";o(85331),o(38736),o(79899)},15616:function(e,t,o){"use strict";o(85331),o(97197)},17879:function(e,t,o){"use strict";o.d(t,{A:function(){return m}});var s=o(56768),a=o(45130),i=o(24232);const l={id:"themeMask"},n=["cx","cy","r"],r=["r"],d=["opacity"];function c(e,t,o,c,u,p){const h=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>p.handleToggleClick&&p.handleToggleClick(...e))},[(0,s.bF)(a.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[u.isAuto?((0,s.uX)(),(0,s.Wv)(h,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,i.C4)(["theme_toggle_svg",{dark:u.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",l,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:u.isDark?"50%":"100%",cy:u.isDark?"23%":"0%",r:u.isDark?"9":"5"},null,8,n)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:u.isDark?"9":"5",mask:"url(#themeMask)"},null,8,r),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:u.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,d)],2))]),_:1})])}var u={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},p=o(71241);const h=(0,p.A)(u,[["render",c],["__scopeId","data-v-2122c62a"]]);var m=h},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},23597:function(e,t,o){"use strict";o(85331)},30694:function(e,t,o){"use strict";o(85331)},33153:function(e,t,o){"use strict";e.exports=o.p+"img/logo.e8dbfa27.png"},33892:function(e,t,o){"use strict";o.d(t,{A:function(){return $}});var s=o(99114),a=(o(85331),o(30694),o(49385)),i=(o(37952),o(30650)),l=(o(19104),o(31802)),n=(o(13378),o(80047)),r=(o(99648),o(56768)),d=o(45130),c=o(24232);const u={class:"directory-tree-picker"},p={class:"tree-container"},h={key:0,class:"error-state"},m={class:"error-text"},g={class:"node-label"},f={class:"tree-container"},y={key:0,class:"error-state"},b={class:"error-text"},k={class:"node-label"};function v(e,t,o,v,C,w){const F=(0,r.g2)("font-awesome-icon"),L=n.S2,U=l.qk,$=i.Vc,S=a.pw,T=s.A;return(0,r.uX)(),(0,r.CE)("div",u,[w.isDesktop?((0,r.uX)(),(0,r.Wv)($,{key:0,visible:C.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>C.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,r.k6)(()=>[(0,r.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",p,[C.error?((0,r.uX)(),(0,r.CE)("div",h,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",m,(0,c.v_)(C.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRef",data:C.treeData,props:C.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",g,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,C.loading]])]),_:3},8,["visible"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,r.bF)(S,{modelValue:C.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>C.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",f,[C.error?((0,r.uX)(),(0,r.CE)("div",y,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",b,(0,c.v_)(C.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRefMobile",data:C.treeData,props:C.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",k,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,C.loading]])]),_:1},8,["modelValue","title"])],64))])}var C=o(457),w=o(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await C.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},L=o(71241);const U=(0,L.A)(F,[["render",v],["__scopeId","data-v-62eab69a"]]);var $=U},34396:function(e,t,o){"use strict";o(85331),o(4885)},34896:function(e,t,o){"use strict";o(85331)},37952:function(e,t,o){"use strict";o(85331),o(97197)},38736:function(e,t,o){"use strict";o(85331)},40670:function(e,t,o){"use strict";o(85331),o(99648),o(19104),o(85970)},50333:function(e,t,o){"use strict";o(85331),o(29092)},51647:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return Mo}});var s=o(78507),a=(o(85331),o(213),o(80047)),i=(o(99648),o(56768)),l=o(24232);const n={class:"history-header"},r={class:"header-left"},d={class:"record-count"},c={class:"header-right"},u={class:"timeline-header"},p={class:"date-label"},h={key:0,class:"grid-view"},m={class:"grid-preview"},g=["src"],f=["src"],y={key:2,class:"file-icon-wrapper"},b={class:"grid-overlay"},k={class:"grid-actions"},v={class:"grid-info"},C=["title"],w={class:"upload-time"},F={key:1,class:"list-view"},L={class:"list-preview"},U=["src"],$=["src"],S={key:2,class:"file-icon-wrapper-small"},T={class:"list-info"},_=["title"],x=["title"],M={class:"list-meta"},A={class:"upload-time"},R={class:"list-actions"},D={key:0,class:"load-more-container"},E={key:0,class:"loading-indicator"},I={key:1,class:"load-more-hint"},N={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function z(e,t,o,z,W,V){const B=(0,i.g2)("font-awesome-icon"),H=a.S2,Q=s.R7;return(0,i.uX)(),(0,i.CE)("div",{class:(0,l.C4)(["history-container",{active:o.show}])},[(0,i.Lk)("div",n,[(0,i.Lk)("div",r,[(0,i.Lk)("h2",null,(0,l.v_)(e.$t("uploadHistory.title")),1),(0,i.Lk)("span",d,(0,l.v_)(e.$t("uploadHistory.totalRecords",{count:W.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(Q,{content:e.$t("uploadHistory.switchView"),placement:"bottom","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:V.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"grid"===W.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(Q,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:V.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"times"})]),_:1})])]),W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>V.handleScroll&&V.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(V.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,l.v_)(e.date),1)]),"grid"===W.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[V.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>V.handleImageError&&V.handleImageError(...e))},null,40,g)):V.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(B,{icon:"file",class:"file-icon"})])),(0,i.Lk)("div",b,[(0,i.Lk)("div",k,[(0,i.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>V.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>V.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>V.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,i.Lk)("div",v,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,l.v_)(e.name),9,C),(0,i.Lk)("div",w,(0,l.v_)(V.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[V.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>V.handleImageError&&V.handleImageError(...e))},null,40,U)):V.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(B,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,l.v_)(e.name),9,_),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,l.v_)(e.url),9,x)]),(0,i.Lk)("div",M,[(0,i.Lk)("div",A,(0,l.v_)(V.formatTime(e.time)),1)]),(0,i.Lk)("div",R,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>V.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>V.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>V.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),V.hasMore?((0,i.uX)(),(0,i.CE)("div",D,[W.loadingMore?((0,i.uX)(),(0,i.CE)("div",E,[(0,i.bF)(B,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",I,(0,l.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",N,(0,l.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(B,{icon:"history",class:"empty-icon"}),(0,i.Lk)("p",null,(0,l.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701);var W={name:"UploadHistory",props:{show:{type:Boolean,default:!1}},data(){return{historyList:[],allHistory:[],viewMode:"grid",pageSize:30,currentPage:0,loadingMore:!1,totalCount:0}},watch:{show(e){e&&this.resetAndLoad()}},computed:{hasMore(){return this.historyList.length{const o=new Date(t.time),s=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[s]||(e[s]=[]),e[s].push(t)}),Object.keys(e).sort((e,t)=>new Date(t)-new Date(e)).map(t=>({date:t,items:e[t]}))}},mounted(){const e=localStorage.getItem("historyViewMode");e&&(this.viewMode=e)},methods:{resetAndLoad(){this.historyList=[],this.currentPage=0,this.loadAllHistory(),this.loadMore()},loadAllHistory(){try{const e=JSON.parse(localStorage.getItem("uploadHistory")||"[]");this.allHistory=e.sort((e,t)=>t.time-e.time),this.totalCount=this.allHistory.length}catch(e){console.error("Failed to load history",e),this.allHistory=[],this.totalCount=0}},loadMore(){!this.loadingMore&&this.hasMore&&(this.loadingMore=!0,setTimeout(()=>{const e=this.currentPage*this.pageSize,t=e+this.pageSize,o=this.allHistory.slice(e,t);this.historyList=[...this.historyList,...o],this.currentPage++,this.loadingMore=!1},50))},handleScroll(e){const t=e.target,o=t.scrollTop,s=t.scrollHeight,a=t.clientHeight;s-o-a<100&&this.loadMore()},toggleViewMode(){this.viewMode="grid"===this.viewMode?"list":"grid",localStorage.setItem("historyViewMode",this.viewMode)},clearHistory(){this.$confirm(this.$t("uploadHistory.clearConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=[],this.allHistory=[],this.totalCount=0,this.currentPage=0,localStorage.removeItem("uploadHistory"),this.$message.success(this.$t("uploadHistory.recordsCleared"))}).catch(()=>{})},deleteItem(e){this.$confirm(this.$t("uploadHistory.deleteConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=this.historyList.filter(t=>t.time!==e.time),this.allHistory=this.allHistory.filter(t=>t.time!==e.time),this.totalCount=this.allHistory.length;try{localStorage.setItem("uploadHistory",JSON.stringify(this.allHistory)),this.$message.success(this.$t("uploadHistory.recordDeleted"))}catch(t){console.error("Failed to update history",t)}}).catch(()=>{})},isImage(e){const t=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},isVideo(e){const t=["mp4","webm","ogg","mkv"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},formatTime(e){const t=new Date(e),o=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),l=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${a} ${i}:${l}:${n}`},copyLink(e){navigator.clipboard.writeText(e).then(()=>{this.$message.success(this.$t("uploadHistory.linkCopied"))}).catch(()=>{this.$message.error(this.$t("uploadHistory.copyFailed"))})},openLink(e){window.open(e,"_blank")},handleImageError(e){e.target.src=o(96682)}}},V=o(71241);const B=(0,V.A)(W,[["render",z],["__scopeId","data-v-7da2f8c2"]]);var H=B,Q=o(86975),X=o(9267),q=(o(15616),o(81418)),O=(o(50333),o(74757)),j=o(55558),G=(o(10456),o(39623)),K=(o(29092),o(76018)),J=(o(96808),o(67819),o(66810)),Y=(o(34396),o(4885),o(97769));const Z={class:"dialog-section"},ee={class:"section-header"},te={class:"section-title"},oe={class:"section-content"},se={class:"setting-item"},ae={class:"setting-label"},ie={key:0,class:"setting-item"},le={class:"setting-label"},ne={class:"setting-item"},re={class:"setting-label"},de={class:"setting-item"},ce={class:"setting-label"},ue={class:"dialog-section"},pe={class:"section-header"},he={class:"section-title"},me={class:"section-content"},ge={class:"dialog-section"},fe={class:"section-header"},ye={class:"section-title"},be={class:"section-content"},ke={class:"setting-item"},ve={class:"setting-label"},Ce={class:"setting-item"},we={class:"setting-label"},Fe={key:0,class:"setting-item slider-item"},Le={class:"setting-label"},Ue={class:"slider-wrapper"},$e={class:"slider-input-wrapper"},Se={key:1,class:"setting-item slider-item"},Te={class:"setting-label"},_e={class:"slider-wrapper"},xe={class:"slider-input-wrapper"},Me={key:0,class:"dialog-section"},Ae={class:"section-header"},Re={class:"section-title"},De={class:"section-content"},Ee={class:"setting-item"},Ie={class:"setting-label"},Ne={class:"dialog-action"};function Pe(e,t,o,n,r,d){const c=Y.A,u=J.ll,p=J.MQ,h=(0,i.g2)("font-awesome-icon"),m=s.R7,g=K.P9,f=K.AV,y=G.WK,b=j.qi,k=O.B8,v=q.lq,C=a.S2,w=X.kZ;return(0,i.uX)(),(0,i.Wv)(w,{title:e.$t("uploadSettings.title"),modelValue:d.visible,"onUpdate:modelValue":t[12]||(t[12]=e=>d.visible=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog settings-dialog-scope upload-settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Z,[(0,i.Lk)("div",ee,[(0,i.Lk)("span",te,(0,l.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,i.Lk)("div",oe,[(0,i.Lk)("div",se,[(0,i.Lk)("span",ae,(0,l.v_)(e.$t("uploadSettings.channelType")),1),(0,i.bF)(p,{"model-value":o.uploadChannel,"onUpdate:modelValue":t[0]||(t[0]=t=>e.$emit("update:uploadChannel",t)),class:"radio-card-group compact"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"telegram",class:"channel-icon"}),t[13]||(t[13]=(0,i.Lk)("span",null,"TG",-1))]),_:1}),(0,i.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"cfr2",class:"channel-icon"}),t[14]||(t[14]=(0,i.Lk)("span",null,"R2",-1))]),_:1}),(0,i.bF)(u,{label:"s3",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"s3",class:"channel-icon"}),t[15]||(t[15]=(0,i.Lk)("span",null,"S3",-1))]),_:1}),(0,i.bF)(u,{label:"discord",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"discord",class:"channel-icon"}),t[16]||(t[16]=(0,i.Lk)("span",null,"DC",-1))]),_:1}),(0,i.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"huggingface",class:"channel-icon"}),t[17]||(t[17]=(0,i.Lk)("span",null,"HF",-1))]),_:1}),(0,i.bF)(u,{label:"webdav",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"webdav",class:"channel-icon"}),t[18]||(t[18]=(0,i.Lk)("span",null,"WD",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,i.uX)(),(0,i.CE)("div",ie,[(0,i.Lk)("span",le,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(f,{"model-value":o.channelName,"onUpdate:modelValue":t[1]||(t[1]=t=>e.$emit("update:channelName",t)),placeholder:e.$t("uploadSettings.autoSelect"),clearable:"",class:"setting-input"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(g,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,i.Q3)("",!0),(0,i.Lk)("div",ne,[(0,i.Lk)("span",re,(0,l.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,i.bF)(y,{"model-value":o.uploadFolder,"onUpdate:modelValue":d.handleUploadFolderInput,placeholder:e.$t("uploadSettings.uploadDirectoryPlaceholder"),class:"setting-input"},null,8,["model-value","onUpdate:modelValue","placeholder"])]),(0,i.Lk)("div",de,[(0,i.Lk)("span",ce,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(b,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,i.Lk)("div",ue,[(0,i.Lk)("div",pe,[(0,i.Lk)("span",he,(0,l.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,i.Lk)("div",me,[(0,i.bF)(p,{"model-value":o.uploadNameType,"onUpdate:modelValue":t[3]||(t[3]=t=>e.$emit("update:uploadNameType",t)),class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"default",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"cog",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,i.bF)(u,{label:"index",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"hashtag",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,i.bF)(u,{label:"origin",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"file-signature",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,i.bF)(u,{label:"short",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"compress-alt",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,i.Lk)("div",ge,[(0,i.Lk)("div",fe,[(0,i.Lk)("span",ye,(0,l.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,i.bF)(m,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",be,[(0,i.Lk)("div",ke,[(0,i.Lk)("span",ve,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(b,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,i.Lk)("div",Ce,[(0,i.Lk)("span",we,(0,l.v_)(e.$t("uploadSettings.fileCompress")),1),(0,i.bF)(b,{"model-value":o.customerCompress,"onUpdate:modelValue":t[5]||(t[5]=t=>e.$emit("update:customerCompress",t))},null,8,["model-value"])]),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",Fe,[(0,i.Lk)("span",Le,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Ue,[(0,i.bF)(k,{"model-value":o.compressBar,"onUpdate:modelValue":t[6]||(t[6]=t=>e.$emit("update:compressBar",t)),min:1,max:20,"format-tooltip":e=>`${e} MB`},null,8,["model-value","format-tooltip"]),(0,i.Lk)("div",$e,[(0,i.bF)(v,{"model-value":o.compressBar,"onUpdate:modelValue":t[7]||(t[7]=t=>e.$emit("update:compressBar",t)),min:1,max:20,step:1,"value-on-clear":1,class:"slider-input","controls-position":"right"},null,8,["model-value"]),t[19]||(t[19]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",Se,[(0,i.Lk)("span",Te,[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,i.bF)(m,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",_e,[(0,i.bF)(k,{"model-value":o.compressQuality,"onUpdate:modelValue":t[8]||(t[8]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,"format-tooltip":e=>`${e} MB`},null,8,["model-value","max","format-tooltip"]),(0,i.Lk)("div",xe,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[20]||(t[20]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,i.uX)(),(0,i.CE)("div",Me,[(0,i.Lk)("div",Ae,[(0,i.Lk)("span",Re,(0,l.v_)(e.$t("uploadSettings.serverCompress")),1),(0,i.bF)(m,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",De,[(0,i.Lk)("div",Ee,[(0,i.Lk)("span",Ie,(0,l.v_)(e.$t("uploadSettings.enableCompress")),1),(0,i.bF)(b,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,i.Q3)("",!0),(0,i.Lk)("div",Ne,[(0,i.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("uploadSettings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"])}var ze={name:"UploadSettingsDialog",components:{ChannelIcon:Y.A},methods:{handleUploadFolderInput(e){e&&!e.startsWith("/")&&(e="/"+e),this.$emit("update:uploadFolder",e)}},props:{modelValue:{type:Boolean,default:!1},uploadChannel:{type:String,default:"telegram"},channelName:{type:String,default:""},currentChannelList:{type:Array,default:()=>[]},uploadFolder:{type:String,default:""},autoRetry:{type:Boolean,default:!0},uploadNameType:{type:String,default:"default"},convertToWebp:{type:Boolean,default:!1},customerCompress:{type:Boolean,default:!0},compressBar:{type:Number,default:5},compressQuality:{type:Number,default:4},serverCompress:{type:Boolean,default:!0}},emits:["update:modelValue","update:uploadChannel","update:channelName","update:uploadFolder","update:autoRetry","update:uploadNameType","update:convertToWebp","update:customerCompress","update:compressBar","update:compressQuality","update:serverCompress"],computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth>768?"50%":"90%"}}};const We=(0,V.A)(ze,[["render",Pe]]);var Ve=We,Be=o(88559),He=(o(85970),o(813)),Qe=(o(34896),o(69655)),Xe=(o(2893),o(74253));o(79899);const qe={class:"upload-list-item"},Oe=["href"],je={key:0,style:{width:"10vw","border-radius":"12px"},autoplay:"",muted:"",playsinline:"",loop:""},Ge=["src"],Ke=["src"],Je={key:2,style:{width:"10vw","border-radius":"12px"}},Ye={class:"upload-list-item-content"},Ze={class:"upload-list-item-name-wrapper"},et={key:0,class:"upload-list-item-url"},tt={class:"upload-list-item-url-row"},ot={class:"upload-list-item-url-row"},st={key:1,class:"upload-list-item-progress"},at={class:"upload-list-item-action"};function it(e,t,o,s,a,n){const r=(0,i.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=Qe.ve,p=(0,i.g2)("Link"),h=He.tk,m=(0,i.g2)("Delete");return(0,i.uX)(),(0,i.CE)("div",qe,[(0,i.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,i.uX)(),(0,i.CE)("video",je,[(0,i.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,Ge),t[7]||(t[7]=(0,i.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,i.uX)(),(0,i.CE)("img",{key:1,style:{width:"10vw","border-radius":"12px"},src:o.file.url,onError:t[0]||(t[0]=t=>e.$emit("preview-error",o.file))},null,40,Ke)):((0,i.uX)(),(0,i.CE)("div",Je,[(0,i.bF)(r,{icon:"file",class:"file-icon"})]))],8,Oe),(0,i.Lk)("div",Ye,[(0,i.Lk)("div",Ze,[(0,i.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,i.uX)(),(0,i.CE)("div",et,[(0,i.Lk)("div",tt,[(0,i.bF)(c,{modelValue:o.file.finalURL,"onUpdate:modelValue":t[1]||(t[1]=e=>o.file.finalURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[8]||(t[8]=[(0,i.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.mdURL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.file.mdURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,i.Lk)("div",ot,[(0,i.bF)(c,{modelValue:o.file.htmlURL,"onUpdate:modelValue":t[3]||(t[3]=e=>o.file.htmlURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[10]||(t[10]=[(0,i.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.ubbURL,"onUpdate:modelValue":t[4]||(t[4]=e=>o.file.ubbURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[11]||(t[11]=[(0,i.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,i.uX)(),(0,i.CE)("div",st,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",at,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var lt=o(57477);const nt=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp","raw","cr2","nef","dng","eps","ai","emf","wmf"],rt=["mp4","webm","ogg","mkv"];var dt={name:"UploadFileItem",components:{Link:lt.Link,Delete:lt.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return nt.includes(t)},isVideo(e){const t=e.split(".").pop().toLowerCase();return rt.includes(t)},truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,a;o>0?(s=e.substring(0,o),a=e.substring(o)):(s=e,a="");const i=a.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":s.substring(0,l)+"..."+s.slice(-4)+a},selectAllText(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("uploadForm.copyFailed")})})}}};const ct=(0,V.A)(dt,[["render",it],["__scopeId","data-v-645a7810"]]);var ut=ct,pt=o(62086),ht=(o(40670),o(88830),o(23597),o(70683)),mt=(o(95385),o(47358));const gt={class:"upload-form"},ft={class:"upload-card-glow",ref:"uploadCardGlow"},yt=["innerHTML"],bt={key:0,class:"upload-card"},kt={class:"paste-card-actions"},vt=["aria-label"],Ct=["aria-pressed"],wt=["aria-pressed"],Ft={class:"upload-list-dashboard-action"},Lt={class:"modern-action-group"},Ut={class:"modern-dropdown-item-content"},$t={class:"modern-action-btn modern-action-btn-danger"};function St(e,t,n,r,d,c){const u=He.tk,p=mt.j5,h=G.WK,m=a.S2,g=ht.Ik,f=(0,i.g2)("List"),y=(0,i.g2)("Checked"),b=(0,i.g2)("Failed"),k=Xe.$g,v=(0,i.g2)("font-awesome-icon"),C=s.R7,w=j.qi,F=pt.c6,L=pt.Iy,U=pt.dW,$=ut,S=Be.kA;return(0,i.uX)(),(0,i.CE)("div",gt,[(0,i.Lk)("div",{class:"upload-card-wrapper",onMousemove:t[0]||(t[0]=(...e)=>c.handleUploadCardMouseMove&&c.handleUploadCardMouseMove(...e)),onMouseleave:t[1]||(t[1]=(...e)=>c.handleUploadCardMouseLeave&&c.handleUploadCardMouseLeave(...e))},[(0,i.Lk)("div",ft,null,512),"default"===n.uploadMethod?((0,i.uX)(),(0,i.Wv)(p,{key:0,class:(0,l.C4)(["upload-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}]),drag:"",multiple:"","http-request":c.uploadFile,onSuccess:c.handleSuccess,"on-error":c.handleError,"before-upload":c.beforeUpload,"on-progress":c.handleProgress,"file-list":d.fileList,"show-file-list":!1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{class:(0,l.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.Lk)("svg",{class:"upload-plus-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.25","stroke-linecap":"round","aria-hidden":"true"},[(0,i.Lk)("path",{d:"M12 7v10"}),(0,i.Lk)("path",{d:"M7 12h10"})],-1)])]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,l.C4)(["el-upload__text",{"upload-list-busy":d.fileList.length}]),innerHTML:e.$t("upload.dragUploadText")},null,10,yt)]),_:1},8,["class","http-request","onSuccess","on-error","before-upload","on-progress","file-list"])):(0,i.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,i.uX)(),(0,i.CE)("div",bt,[(0,i.bF)(g,{class:(0,l.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",kt,[(0,i.bF)(m,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.Lk)("div",{class:(0,l.C4)(["paste-card-method-group",{"is-external":"external"===d.pasteUploadMethod}]),role:"group","aria-label":e.$t("upload.switchUploadMethod")},[(0,i.Lk)("button",{class:(0,l.C4)(["paste-card-method-button",{"is-active":"save"===d.pasteUploadMethod}]),type:"button","aria-pressed":"save"===d.pasteUploadMethod,onClick:t[3]||(t[3]=e=>d.pasteUploadMethod="save")},(0,l.v_)(e.$t("upload.pasteSave")),11,Ct),(0,i.Lk)("button",{class:(0,l.C4)(["paste-card-method-button",{"is-active":"external"===d.pasteUploadMethod}]),type:"button","aria-pressed":"external"===d.pasteUploadMethod,onClick:t[4]||(t[4]=e=>d.pasteUploadMethod="external")},(0,l.v_)(e.$t("upload.pasteExternal")),11,wt)],10,vt)])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(g,{class:(0,l.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length,"is-uploading":d.uploading}])},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,l.C4)(["upload-list-container",{"upload-list-busy":d.fileList.length}])},[(0,i.bF)(S,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,l.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,i.bF)(k,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(f)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(y)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(u,null,{default:(0,i.k6)(()=>[(0,i.bF)(b)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",Ft,[(0,i.Lk)("div",Lt,[(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-copy",onClick:t[5]||(t[5]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(v,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(U,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(L,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)(F,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",Ut,[(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(w,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[7]||(t[7]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-retry",onClick:t[6]||(t[6]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(v,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(C,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top","show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(U,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(L,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)(F,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)(F,{onClick:c.clearSuccessList},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",$t,[(0,i.bF)(v,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)($,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[8]||(t[8]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979);var Tt=o(457),_t=o(76334),xt=o(60782);function Mt(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function At(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function Rt(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=Mt(e.srcID,e.name,t);Object.assign(e,o)})}const Dt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Et=(e,t)=>e>>>t|e<<32-t;function It(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=Et(o[u-15],7)^Et(o[u-15],18)^o[u-15]>>>3,t=Et(o[u-2],17)^Et(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,a,i,l,n,r,d,c]=t;for(let u=0;u<64;u++){const e=Et(n,6)^Et(n,11)^Et(n,25),t=n&r^~n&d,p=c+e+t+Dt[u]+o[u]>>>0,h=Et(s,2)^Et(s,13)^Et(s,22),m=s&a^s&i^a&i,g=h+m>>>0;c=d,d=r,r=n,n=l+p>>>0,l=i,i=a,a=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+a>>>0,t[2]=t[2]+i>>>0,t[3]=t[3]+l>>>0,t[4]=t[4]+n>>>0,t[5]=t[5]+r>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+c>>>0}function Nt(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,s=0;return{update(a){s+=a.length;let i=0;if(o>0){const s=64-o,l=Math.min(s,a.length);t.set(a.subarray(0,l),o),o+=l,i=l,64===o&&(It(t,e),o=0)}while(i+64<=a.length)It(a.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),It(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(a/4294967296),!1),i.setUint32(60,a>>>0,!1),It(t,e);let l="";for(let t=0;t<8;t++)l+=e[t].toString(16).padStart(8,"0");return l}}}async function Pt(e){const t=Nt(),o=4194304;let s=0;while(sthis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){Rt(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&Rt(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,xt.L8)(["storeAutoReUpload"]),uploadSuccessCount(){return this.fileList.filter(e=>"done"===e.status||"success"===e.status).length},uploadErrorCount(){return this.fileList.filter(e=>"exception"===e.status).length},uploadingCount(){return this.fileList.filter(e=>"uploading"===e.status).length},waitingCount(){return this.uploadQueue.length},urlSize(){return window.innerWidth<768?"small":"default"},disableTooltip(){return window.innerWidth<768},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},pasteCardMethodButtonSize(){return this.fileList.length||window.innerWidth<768?"small":"medium"}},mounted(){document.addEventListener("paste",this.handlePaste),this.autoReUpload=this.storeAutoReUpload},beforeUnmount(){document.removeEventListener("paste",this.handlePaste),this.uploadQueue=[],this.fileList=[],this.activeUploads=0},methods:{truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,a;o>0?(s=e.substring(0,o),a=e.substring(o)):(s=e,a="");const i=a.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":s.substring(0,l)+"..."+s.slice(-4)+a},uploadFile(e){if(!this.fileList.find(t=>t.uid===e.file.uid))return;if(this.activeUploads>=this.maxConcurrentUploads){this.uploadQueue.push(e);const t=this.fileList.find(t=>t.uid===e.file.uid);return void(t&&(t.status="waiting"))}this.activeUploads++;const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.status="uploading");const o=this.fileList.find(t=>t.uid===e.file.uid),s=o?.uploadChannel||this.uploadChannel;if("external"===s)return void this.uploadSingleFile(e);if("huggingface"===s){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===s){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const a=20971520;e.file.size>a?this.uploadFileInChunks(e):this.uploadSingleFile(e)},processUploadQueue(){if(0===this.uploadQueue.length||this.activeUploads>=this.maxConcurrentUploads)return;const e=this.uploadQueue.shift();e&&this.fileList.find(t=>t.uid===e.file.uid)?this.uploadFile(e):this.processUploadQueue()},onUploadComplete(){this.activeUploads=Math.max(0,this.activeUploads-1),this.processUploadQueue(),0===this.activeUploads&&0===this.uploadQueue.length&&(this.uploading=!1)},async uploadSingleFile(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.serverCompress,s=t.uploadChannel||this.uploadChannel,a=this.autoRetry&&"external"!==s,i="external"===s?"default":this.uploadNameType,l=new AbortController;this.abortControllers.set(e.file.uid,l);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Pt(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Tt.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+a+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:l.signal,onUploadProgress:t=>{const o=Math.round(t.loaded/t.total*100);e.onProgress({percent:o,file:e.file})}}).then(t=>{e.onSuccess(t,e.file)}).catch(t=>{"CanceledError"!==t.name&&"ERR_CANCELED"!==t.code?t.response&&401!==t.response.status?(this.exceptionList.push(e),e.onError(t,e.file)):t.response||(this.exceptionList.push(e),e.onError(t,e.file)):console.log("上传已取消:",e.file.name)}).finally(()=>{this.abortControllers.delete(e.file.uid),this.onUploadComplete()})},async uploadFileInChunks(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.uploadChannel||this.uploadChannel,s=new AbortController;this.abortControllers.set(e.file.uid,s);const a="discord"===o?9437184:16777216,i=e.file.size,l=e.file.type||"application/octet-stream",n=Math.ceil(i/a),r=t.serverCompress,d=this.autoRetry&&"external"!==o,c="external"===o?"default":this.uploadNameType;let u=null;if("huggingface"===o)try{console.log("Computing SHA256 for HuggingFace chunked upload..."),u=await Pt(e.file),console.log("SHA256 computed:",u)}catch(p){console.error("Failed to compute SHA256:",p)}try{const t=new FormData;t.append("originalFileName",e.file.name),t.append("originalFileType",l),t.append("totalChunks",n.toString());const h=await(0,Tt.A)({url:"/upload?serverCompress="+r+"&uploadChannel="+o+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+c+"&autoRetry="+d+"&uploadFolder="+encodeURIComponent(this.uploadFolder)+"&initChunked=true",method:"post",data:t,withAuthCode:!0});if(!h.data.success)throw new Error(this.$t("uploadForm.chunkInitFailed")+": "+h.data.message);const m=h.data.uploadId;console.log("分块上传初始化成功,uploadId:",m);const g=this.fileList.find(t=>t.uid===e.file.uid);g&&(g.totalChunks=n,g.uploadId=m);const f=3,y=new Array(n).fill(0);let b=0,k=!1,v="",C=!1;const w=async t=>{if(k||C)return;const u=t*a,h=Math.min(u+a,i),g=e.file.slice(u,h),f=new FormData;f.append("file",g,`${e.file.name}.part${t.toString().padStart(3,"0")}`),f.append("chunkIndex",t.toString()),f.append("totalChunks",n.toString()),f.append("uploadId",m),f.append("originalFileName",e.file.name),f.append("originalFileType",l);let b=0;const w=3;while(b{if(k||C)return;const s=Math.round(o.loaded/o.total*100);y[t]=s;const a=Math.round(y.reduce((e,t)=>e+t,0)/n);e.onProgress({percent:a,file:e.file})}})}catch(p){if("CanceledError"===p.name||"ERR_CANCELED"===p.code)return C=!0,void console.log("分块上传已取消:",e.file.name);if(b++,console.warn(`分块 ${t+1}/${n} 上传失败 (重试 ${b}/${w}):`,p),b>=w)throw k=!0,v=`分块 ${t+1}/${n} 上传失败: ${p.message}`,new Error(v);await new Promise(e=>setTimeout(e,2e3*b))}}},F=[];for(let e=0;e{while(bt.uid===e.file.uid);t&&t.uploadId&&this.cleanupUploadResources(t.uploadId,t.totalChunks).then(()=>{console.log(`已清理分块上传失败的资源: ${t.uploadId}`)}).catch(e=>{console.warn("清理分块上传失败资源时出错:",e)}),p.response&&401!==p.response.status?(this.exceptionList.push(e),e.onError(p,e.file)):p.response||(this.exceptionList.push(e),e.onError(p,e.file))}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},handleRemove(e){this.abortControllers.has(e.uid)&&(this.abortControllers.get(e.uid).abort(),this.abortControllers.delete(e.uid)),this.uploadQueue=this.uploadQueue.filter(t=>t.file.uid!==e.uid),this.fileList=this.fileList.filter(t=>t.uid!==e.uid),this.$message({type:"info",message:this.$t("uploadForm.deleted",{name:this.truncateFilename(e.name)})})},async cleanupUploadResources(e,t=0){try{await(0,Tt.A)({url:`/upload?cleanup=true&uploadId=${e}&totalChunks=${t}`,method:"get",withAuthCode:!0,timeout:5e3}),console.log(`清理上传资源成功: ${e}`)}catch(o){console.warn("清理上传资源失败:",o)}},handleSuccess(e,t){const o=this.fileList.find(e=>e.uid===t.uid);if(o)try{const s=o.uploadChannel||this.uploadChannel;if("external"!==s){const s=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+s;const a=Mt(s,t.name,this.rootUrl);Object.assign(o,a),o.srcID=s}o.progreess=100,o.status="success",this.saveToHistory(o),this.$message({type:"success",message:this.$t("uploadForm.uploadSuccess",{name:this.truncateFilename(t.name)})}),setTimeout(()=>{const e=this.fileList.find(e=>e.uid===t.uid);e&&(e.status="done")},1e3)}catch(s){this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception"}},saveToHistory(e){try{const t=JSON.parse(localStorage.getItem("uploadHistory")||"[]"),o={name:e.name,url:e.finalURL,time:Date.now(),type:e.name.split(".").pop().toLowerCase()};t.push(o),localStorage.setItem("uploadHistory",JSON.stringify(t))}catch(t){console.error("Failed to save history",t)}},handleError(e,t){const o=this.fileList.find(e=>e.uid===t.uid);o&&(this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception",this.autoReUpload&&this.scheduleAutoRetry())},handleCopy(e){const t=this.fileList.find(t=>t.uid===e.uid).status;"done"===t||"success"===t?(navigator.clipboard.writeText(At(e,this.selectedUrlForm)),this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})):this.$message({type:"warning",message:this.$t("uploadForm.fileNotUploaded")})},beforeUpload(e){return new Promise(async(t,o)=>{let s=e;const a=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(a)try{const t=await this.convertImageToWebp(e);t&&(s=t,console.log(`WebP转换成功: ${e.name} -> ${t.name}, 大小: ${(e.size/1024).toFixed(1)}KB -> ${(t.size/1024).toFixed(1)}KB`))}catch(r){console.warn("WebP转换失败,使用原文件:",r)}const i=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,l=s.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const s=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:s,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)_t.compressAccurately(s,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const a=new File([t],s.name,{type:t.type});a.uid=e.uid;const i=this.uploadCount++,l=this.serverCompress&&a.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(a,l):setTimeout(()=>{n(a,l),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(l){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!s.type.includes("image")||s.size/1024/1024<10);0===e?n(s,t):setTimeout(()=>{n(s,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))})},handleProgress(e){const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.progreess=e.percent)},copyAll(){const e=this.fileList.filter(e=>"done"===e.status||"success"===e.status).map(e=>At(e,this.selectedUrlForm)).join("\n");navigator.clipboard.writeText(e),this.$message({type:"success",message:this.$t("uploadForm.copyAllSuccess")})},clearFileList(){this.fileList.length>0?(this.abortControllers.forEach((e,t)=>{e.abort()}),this.abortControllers.clear(),this.uploadQueue=[],this.fileList=[],this.$message({type:"success",message:this.$t("uploadForm.fileListCleared")})):this.$message({type:"info",message:this.$t("uploadForm.fileListEmpty")})},clearSuccessList(){this.uploadSuccessCount>0?(this.fileList=this.fileList.filter(e=>"done"!==e.status&&"success"!==e.status),this.$message({type:"success",message:this.$t("uploadForm.successFilesCleared")})):this.$message({type:"info",message:this.$t("uploadForm.successFilesEmpty")})},handlePaste(e){if("INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName)return;const t=e.clipboardData.items;t.length>0&&this.uploadFromUrl(t)},handleUploadPasteUrls(){const e=this.pastedUrls.split("\n"),t=e.map(e=>e.trim()).filter(e=>""!==e).filter(e=>/^(https?:\/\/[^\s$.?#].[^\s]*)$/.test(e));if("save"===this.pasteUploadMethod)this.uploadFromUrl(t.map(e=>({kind:"string",getAsString:t=>{t(e)}})));else if("external"===this.pasteUploadMethod)for(let o=0;o`,l=`[img]${e}[/img]`,n=new File([],e.split("/").pop(),{type:"text/plain"});n.uid=Date.now()+o,n.url=e,this.fileList.push({uid:n.uid,name:n.name,url:e,finalURL:e,mdURL:a,htmlURL:i,ubbURL:l,srcID:e,status:"uploading",progreess:0,serverCompress:!1,uploadChannel:"external",retryCount:0}),this.uploadFile({file:n,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}},uploadFromUrl(e){for(let t=0;t{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}else"string"===e[t].kind&&e[t].getAsString(e=>{const o=/^(https?:\/\/[^\s$.?#].[^\s]*)$/;let s="";o.test(e)&&Tt.A.post("/api/fetchRes",{url:e},{responseType:"blob",withAuthCode:!0}).then(o=>{o.headers["content-type"];if(200!=o.status)throw new Error("URL地址请求失败");{const i=o.headers["content-disposition"];if(i){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(i);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(a){s=""}}""===s&&(o=t.exec(i),null!=o&&o[1]&&(s=decodeURIComponent(o[1])))}if(""===s){const t=new URL(e);s=t.pathname.split("/").pop()}if(""===s){const o=new URL(e);let a=o.pathname.split(".").pop();(!a||""===a||a.length>10)&&(a="bin"),s="PastedFile"+Date.now()+t+"."+a}const l=o.data,n=new File([l],s,{type:l.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await Pt(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),a=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,Tt.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:a,channelName:this.channelName,uploadNameType:this.uploadNameType,uploadFolder:this.uploadFolder},withAuthCode:!0,signal:o.signal});if(!i.data.success)throw new Error(i.data.error||"Failed to get upload URL");const l=i.data;if(console.log("Upload info:",l),l.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(l.needsLfs&&l.uploadAction){const{href:t,header:s}=l.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,l,o);else{console.log("Uploading to S3 (basic)...");const a=await fetch(t,{method:"PUT",headers:s||{},body:e.file,signal:o.signal});if(!a.ok){const e=await a.text();throw new Error(`S3 upload failed: ${a.status} - ${e}`)}console.log("S3 upload complete")}}if(o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);e.onProgress({percent:95,file:e.file}),console.log("Committing file...");const n=await(0,Tt.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:l.fullId,filePath:l.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:l.channelName},withAuthCode:!0,signal:o.signal});if(!n.data.success)throw new Error(n.data.error||"Failed to commit file");console.log("Upload complete:",n.data);const r={data:[{src:n.data.src}]};e.onSuccess(r,e.file)}catch(s){if("CanceledError"===s.name||"ERR_CANCELED"===s.code||"AbortError"===s.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",s),this.exceptionList.push(e),e.onError(s,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:s}=t,{href:a,header:i}=s,l=parseInt(i.chunk_size),n=Object.keys(i).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${l}`);const r=[],d=n.length;for(const u of n){if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");const t=parseInt(u)-1,s=t*l,a=Math.min(s+l,e.file.size),n=e.file.slice(s,a);console.log(`Uploading part ${u}/${d}`);const c=await fetch(i[u],{method:"PUT",body:n,signal:o?o.signal:void 0});if(!c.ok)throw new Error(`Failed to upload part ${u}: ${c.status}`);const p=c.headers.get("ETag");if(!p)throw new Error(`No ETag for part ${u}`);r.push({partNumber:parseInt(u),etag:p});const h=10+Math.round(parseInt(u)/d*80);e.onProgress({percent:h,file:e.file})}if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");console.log("Completing multipart upload...");const c=await fetch(a,{method:"POST",headers:{Accept:"application/vnd.git-lfs+json","Content-Type":"application/vnd.git-lfs+json"},body:JSON.stringify({oid:t.oid,parts:r}),signal:o?o.signal:void 0});if(!c.ok){const e=await c.text();throw new Error(`Multipart complete failed: ${c.status} - ${e}`)}console.log("Multipart upload complete")},async convertImageToWebp(e){return new Promise((t,o)=>{if(e.type.includes("gif")||e.type.includes("svg")||e.type.includes("webp"))return void t(null);const s=new Image,a=document.createElement("canvas"),i=a.getContext("2d");s.onload=()=>{a.width=s.width,a.height=s.height,i.drawImage(s,0,0),a.toBlob(a=>{if(a){const o=e.name,s=o.lastIndexOf("."),i=s>0?o.substring(0,s)+".webp":o+".webp",l=new File([a],i,{type:"image/webp"});l.uid=e.uid,t(l)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(s.src)},"image/webp",.92)},s.onerror=()=>{URL.revokeObjectURL(s.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},s.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),s=e.clientX-o.left,a=e.clientY-o.top;t.style.opacity="1",t.style.left=s+"px",t.style.top=a+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const Wt=(0,V.A)(zt,[["render",St],["__scopeId","data-v-97f23dbc"]]);var Vt=Wt,Bt=o(732),Ht=o(33892),Qt=o(45130);const Xt={class:"directory-suggestion-input",ref:"wrapperRef"},qt={class:"suggestion-dropdown"},Ot={class:"suggestion-list"},jt=["title","onMousedown"];function Gt(e,t,o,s,a,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",Xt,[(0,i.bF)(r,{ref:"inputRef",modelValue:n.inputValue,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputValue=e),placeholder:o.placeholder,onFocus:n.handleFocus,onBlur:n.handleBlur,onInput:n.handleInput},null,8,["modelValue","placeholder","onFocus","onBlur","onInput"]),(0,i.bo)((0,i.Lk)("div",qt,[(0,i.Lk)("ul",Ot,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(a.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Qt.D$)(t=>n.selectItem(e),["prevent"])},(0,l.v_)(e.value),41,jt))),128))])],512),[[Qt.aG,a.dropdownVisible&&a.suggestions.length>0]])],512)}var Kt={name:"DirectorySuggestionInput",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:""}},emits:["update:modelValue","focus","blur","select"],data(){return{directoryTreeRoot:null,directoryTreeLoaded:!1,directoryTreeLoading:!1,directoryChildrenMap:{},focusTime:null,dropdownVisible:!1,isFocused:!1,suggestions:[]}},computed:{inputValue:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}}},watch:{modelValue(){this.isFocused&&this.refreshSuggestions()}},methods:{handleFocus(){this.isFocused=!0,this.focusTime=Date.now(),this.ensureDirectoryTreeLoaded(),this.$emit("focus"),setTimeout(()=>{this.isFocused&&(this.refreshSuggestions(),this.dropdownVisible=!0)},500)},handleBlur(){this.isFocused=!1,this.dropdownVisible=!1,this.$emit("blur")},handleInput(e){this.$nextTick(()=>{this.refreshSuggestions(),this.isFocused&&(this.dropdownVisible=!0)})},selectItem(e){const t=e.value;this.inputValue=t,this.$emit("select",t);const o=this.normalizeDirectoryPath(t),s=this.directoryChildrenMap[o];s&&s.length>0?this.$nextTick(()=>{this.refreshSuggestions(),this.dropdownVisible=!0,this.$refs.inputRef?.focus()}):this.dropdownVisible=!1},refreshSuggestions(){this.suggestions=this.getDirectorySuggestions(this.modelValue||"")},normalizeDirectoryPath(e){if(!e)return"/";let t=e;return t.startsWith("/")||(t="/"+t),"/"===t||t.endsWith("/")||(t+="/"),t},buildDirectoryChildrenMap(e){const t={},o=e=>{const s=this.normalizeDirectoryPath(e.path),a=Array.isArray(e.children)?e.children:[];t[s]=a.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),a.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await Tt.A.get("/api/directoryTree",{withAuthCode:!0}),t=e?.data?.tree;t&&(this.directoryTreeRoot=t,this.buildDirectoryChildrenMap(t),this.directoryTreeLoaded=!0)}catch(e){console.error("Failed to load directory tree for autocomplete:",e)}finally{this.directoryTreeLoading=!1}}},parseDirectoryQuery(e){const t=e&&e.startsWith("/")?e:`/${e||""}`,o=t.slice(1),s=o.split("/"),a=s[s.length-1]||"",i=s.slice(0,-1).filter(Boolean),l=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:a,parentPath:l}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),s=this.directoryChildrenMap[o]||[];if(!t)return s.slice(0,10).map(e=>({value:e.path}));const a=t.toLowerCase();return s.filter(e=>e.name.toLowerCase().startsWith(a)).slice(0,10).map(e=>({value:e.path}))}}};const Jt=(0,V.A)(Kt,[["render",Gt],["__scopeId","data-v-28b8eda7"]]);var Yt=Jt,Zt=o(17879);const eo={class:"container"},to={class:"upload-home"},oo={class:"quick-toolbar-actions"},so={class:"quick-toolbar-actions-inner"},ao={class:"header"},io={class:"title"},lo={class:"title-crayon-text","aria-hidden":"true"},no={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},ro={class:"dialog-section"},co={class:"section-header"},uo={class:"section-title"},po={class:"section-content"},ho={class:"dialog-section"},mo={class:"section-header"},go={class:"section-title"},fo={class:"section-content"},yo={class:"setting-item"},bo={class:"setting-label"},ko={key:0,class:"setting-item"},vo={class:"setting-label"},Co={class:"dialog-action"},wo=["innerHTML"],Fo={class:"dialog-footer"};function Lo(e,t,o,n,r,d){const c=Zt.A,u=(0,i.g2)("font-awesome-icon"),p=a.S2,h=pt.c6,m=pt.Iy,g=pt.dW,f=Yt,y=G.WK,b=Ht.A,k=s.R7,v=Bt.A,C=Vt,w=J.ll,F=J.MQ,L=j.qi,U=X.kZ,$=Ve,S=Q.A,T=H;return(0,i.uX)(),(0,i.CE)("div",eo,[(0,i.Lk)("div",to,[(0,i.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,i.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,l.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,i.Lk)("div",{class:(0,l.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(f,{key:0,modelValue:r.uploadFolder,"onUpdate:modelValue":t[0]||(t[0]=e=>r.uploadFolder=e),class:"inner-folder-input",placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur,onSelect:d.handleDirectorySelect},null,8,["modelValue","placeholder","onFocus","onBlur","onSelect"])):((0,i.uX)(),(0,i.Wv)(y,{key:1,class:"inner-folder-input",modelValue:r.uploadFolder,"onUpdate:modelValue":t[1]||(t[1]=e=>r.uploadFolder=e),placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur},null,8,["modelValue","placeholder","onFocus","onBlur"]))],2),d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,i.k6)(()=>[(0,i.bF)(p,{class:"directory-tree-trigger"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,i.Q3)("",!0)],2),(0,i.bF)(k,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,i.k6)(()=>["default"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,i.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,i.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"toggleTheme"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,l.v_)(d.getThemeText()),1)]),_:1}),(0,i.bF)(h,{command:"toggleUploadMethod"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,l.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,l.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"mobile-more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,l.C4)(["quick-toolbar",{"is-expanded":r.isQuickToolbarOpen}]),onMouseleave:t[5]||(t[5]=(...e)=>d.handleQuickToolbarLeave&&d.handleQuickToolbarLeave(...e))},[(0,i.Lk)("div",oo,[(0,i.Lk)("div",so,[(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.logout"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[2]||(t[2]=e=>d.handleQuickToolbarCommand("logout"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"sign-out-alt",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.manage"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[3]||(t[3]=e=>d.handleQuickToolbarCommand("manage"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cog",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.linkFormat"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:t[4]||(t[4]=e=>d.handleQuickToolbarCommand("linkFormat"))},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"])])]),(0,i.bF)(k,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"left","hide-after":0,"show-after":1e3},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"quick-toolbar-button",onClick:d.openCompressDialog},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cloud-upload",class:"quick-toolbar-icon"})]),_:1},8,["onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(p,{class:(0,l.C4)(["quick-toolbar-button quick-toolbar-more",{"is-active":r.isQuickToolbarOpen}]),"aria-expanded":r.isQuickToolbarOpen,onMouseenter:d.handleQuickToolbarMoreEnter,onClick:d.toggleQuickToolbar},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"chevron-down",class:"quick-toolbar-icon quick-toolbar-toggle-icon"})]),_:1},8,["class","aria-expanded","onMouseenter","onClick"])],34),(0,i.bF)(v,{useConfigLink:!0}),(0,i.Lk)("div",ao,[(0,i.Lk)("h1",io,[(0,i.Lk)("span",lo,(0,l.v_)(d.ownerName)+" ImgHub",1),(0,i.Lk)("a",no,(0,l.v_)(d.ownerName),1),t[24]||(t[24]=(0,i.eW)(" ImgHub ",-1))])]),(0,i.bF)(C,{selectedUrlForm:r.selectedUrlForm,customerCompress:r.customerCompress,compressQuality:r.compressQuality,compressBar:r.compressBar,serverCompress:r.serverCompress,uploadChannel:r.uploadChannel,channelName:r.channelName,uploadNameType:r.uploadNameType,useCustomUrl:r.useCustomUrl,customUrlPrefix:r.customUrlPrefix,autoRetry:r.autoRetry,urlPrefix:d.urlPrefix,uploadMethod:r.uploadMethod,uploadFolder:r.uploadFolder,convertToWebp:r.convertToWebp,class:"upload"},null,8,["selectedUrlForm","customerCompress","compressQuality","compressBar","serverCompress","uploadChannel","channelName","uploadNameType","useCustomUrl","customUrlPrefix","autoRetry","urlPrefix","uploadMethod","uploadFolder","convertToWebp"]),(0,i.bF)(U,{title:e.$t("settings.linkFormatTitle"),modelValue:r.showUrlDialog,"onUpdate:modelValue":t[10]||(t[10]=e=>r.showUrlDialog=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog settings-dialog-scope"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ro,[(0,i.Lk)("div",co,[(0,i.Lk)("span",uo,(0,l.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",po,[(0,i.bF)(F,{modelValue:r.selectedUrlForm,"onUpdate:modelValue":t[6]||(t[6]=e=>r.selectedUrlForm=e),onChange:d.changeUrlForm,class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(w,{value:"url",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"radio-icon"}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,i.bF)(w,{value:"md",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code",class:"radio-icon"}),t[25]||(t[25]=(0,i.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,i.bF)(w,{value:"html",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[26]||(t[26]=(0,i.Lk)("span",null,"HTML",-1))]),_:1}),(0,i.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[27]||(t[27]=(0,i.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,i.Lk)("div",ho,[(0,i.Lk)("div",mo,[(0,i.Lk)("span",go,(0,l.v_)(e.$t("settings.customLink")),1),(0,i.bF)(k,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",fo,[(0,i.Lk)("div",yo,[(0,i.Lk)("span",bo,(0,l.v_)(e.$t("settings.enableCustom")),1),(0,i.bF)(L,{modelValue:r.useCustomUrl,"onUpdate:modelValue":t[7]||(t[7]=e=>r.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===r.useCustomUrl?((0,i.uX)(),(0,i.CE)("div",ko,[(0,i.Lk)("span",vo,(0,l.v_)(e.$t("settings.customPrefix")),1),(0,i.bF)(y,{modelValue:r.customUrlPrefix,"onUpdate:modelValue":t[8]||(t[8]=e=>r.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,i.Q3)("",!0)])]),(0,i.Lk)("div",Co,[(0,i.bF)(p,{type:"primary",onClick:t[9]||(t[9]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,i.bF)($,{modelValue:r.showCompressDialog,"onUpdate:modelValue":t[11]||(t[11]=e=>r.showCompressDialog=e),uploadChannel:r.uploadChannel,"onUpdate:uploadChannel":t[12]||(t[12]=e=>r.uploadChannel=e),channelName:r.channelName,"onUpdate:channelName":t[13]||(t[13]=e=>r.channelName=e),currentChannelList:d.currentChannelList,uploadFolder:r.uploadFolder,"onUpdate:uploadFolder":t[14]||(t[14]=e=>r.uploadFolder=e),autoRetry:r.autoRetry,"onUpdate:autoRetry":t[15]||(t[15]=e=>r.autoRetry=e),uploadNameType:r.uploadNameType,"onUpdate:uploadNameType":t[16]||(t[16]=e=>r.uploadNameType=e),convertToWebp:r.convertToWebp,"onUpdate:convertToWebp":t[17]||(t[17]=e=>r.convertToWebp=e),customerCompress:r.customerCompress,"onUpdate:customerCompress":t[18]||(t[18]=e=>r.customerCompress=e),compressBar:r.compressBar,"onUpdate:compressBar":t[19]||(t[19]=e=>r.compressBar=e),compressQuality:r.compressQuality,"onUpdate:compressQuality":t[20]||(t[20]=e=>r.compressQuality=e),serverCompress:r.serverCompress,"onUpdate:serverCompress":t[21]||(t[21]=e=>r.serverCompress=e)},null,8,["modelValue","uploadChannel","channelName","currentChannelList","uploadFolder","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","compressQuality","serverCompress"])]),(0,i.bF)(S,{class:"footer"}),(0,i.bF)(U,{title:e.$t("upload.announcementTitle"),modelValue:r.showAnnouncementDialog,"onUpdate:modelValue":t[22]||(t[22]=e=>r.showAnnouncementDialog=e),width:d.dialogWidth,"show-close":!1,"close-on-click-modal":!1,"close-on-press-escape":!1,center:""},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",Fo,[(0,i.bF)(p,{type:"primary",onClick:d.acknowledgeAnnouncement},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.announcementAck")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",{innerHTML:r.announcementContent},null,8,wo)]),_:1},8,["title","modelValue","width"]),(0,i.bF)(T,{show:r.showHistory,onClose:t[23]||(t[23]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var Uo=o(46638),$o=o(48903),So=o(90144),To=o(62388),_o={name:"UploadHome",mixins:[$o.A],data(){return{selectedUrlForm:(0,So.KR)(""),showUrlDialog:!1,showCompressDialog:!1,customerCompress:!0,compressQuality:4,compressBar:5,convertToWebp:!1,serverCompress:!0,uploadChannel:"",channelName:"",availableChannels:{},uploadNameType:"",customUrlPrefix:"",useCustomUrl:"false",autoRetry:!0,useDefaultWallPaper:!1,uploadMethod:"default",uploadFolder:"",isFolderInputActive:!1,isQuickToolbarOpen:!1,isQuickToolbarPinned:!1,showAnnouncementDialog:!1,announcementContent:"",displayedAnnouncementRefreshAt:null,showHistory:!1,themeMode:"auto"}},watch:{customerCompress(e){this.updateCompressConfig("customerCompress",e)},compressQuality(e){this.updateCompressConfig("compressQuality",e)},compressBar(e){null===e||void 0===e||e<1?this.compressBar=1:(this.compressQuality>e&&(this.compressQuality=e),this.updateCompressConfig("compressBar",e))},serverCompress(e){this.updateCompressConfig("serverCompress",e)},convertToWebp(e){this.updateCompressConfig("convertToWebp",e)},uploadChannel(e){this.updateStoreUploadChannel(e);const t=this.availableChannels[e]||[],o=this.storeChannelName;o&&t.some(e=>e.name===o)?this.channelName=o:this.channelName=""},channelName(e){this.$store.commit("setStoreChannelName",e||"")},uploadNameType(e){this.updateStoreUploadNameType(e)},customUrlPrefix(e){this.$store.commit("setCustomUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setCustomUrlSettings",{key:"useCustomUrl",value:e})},autoRetry(e){this.$store.commit("setStoreAutoRetry",e)},uploadFolder(e){if(this.validateUploadFolder(e,!1)){const t=(0,To.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,xt.L8)(["userConfig","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeUploadNameType","customUrlSettings","storeAutoRetry","storeUploadMethod","storeUploadFolder"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},disableTooltip(){return window.innerWidth<768},urlPrefix(){return this.userConfig?.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},announcementAvailable(){return!!this.userConfig?.announcement},showDirectorySuggestions(){return this.userConfig?.showDirectorySuggestions??!1},currentChannelList(){return this.availableChannels[this.uploadChannel]||[]}},mounted(){this.initializeBackground("uploadBkImg",".container",!0,!0),this.selectedUrlForm=this.uploadCopyUrlForm||"url",this.customerCompress=this.compressConfig.customerCompress??this.parseBoolean(this.userConfig?.defaultCustomerCompress,!0),this.compressQuality=this.compressConfig.compressQuality??this.parseNumber(this.userConfig?.defaultCompressQuality,4),this.compressBar=this.compressConfig.compressBar??this.parseNumber(this.userConfig?.defaultCompressBar,5),this.serverCompress=this.compressConfig.serverCompress??!0,this.convertToWebp=this.compressConfig.convertToWebp??this.parseBoolean(this.userConfig?.defaultConvertToWebp,!1),this.uploadChannel=this.storeUploadChannel||this.userConfig?.defaultUploadChannel||"telegram",this.autoRetry=this.storeAutoRetry,this.uploadNameType=this.storeUploadNameType||this.userConfig?.defaultUploadNameType||"default",this.customUrlPrefix=this.customUrlSettings.customUrlPrefix,this.useCustomUrl=this.customUrlSettings.useCustomUrl,this.uploadMethod=this.storeUploadMethod,this.fetchAvailableChannels(),this.uploadFolder=this.storeUploadFolder||this.userConfig?.defaultUploadFolder||"";const e=this.$store.getters.cusDarkMode,t=this.$store.getters.useDarkMode;this.themeMode=e?t?"dark":"light":"auto",this.showAnnouncementIfNeeded()},components:{UploadForm:Vt,Footer:Q.A,ToggleDark:Zt.A,Logo:Bt.A,UploadHistory:H,UploadSettingsDialog:Ve,DirectoryTreePicker:Ht.A,DirectorySuggestionInput:Yt},methods:{async fetchAvailableChannels(){try{const e=await Tt.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,s=this.availableChannels[this.uploadChannel]||[];t&&s.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&s.some(e=>e.name===o)&&(this.channelName=o)}}catch(e){console.error("Failed to fetch available channels:",e)}},validateUploadFolder(e,t=!0){e&&!e.startsWith("/")&&(e="/"+e,this.uploadFolder=e);const o=(0,To.G)(e,{strict:t});return!!o.valid||(this.$message.error(o.error),!1)},handleFolderInputFocus(){this.isFolderInputActive=!0},handleFolderInputBlur(){this.isFolderInputActive=!1,this.uploadFolder&&!this.uploadFolder.startsWith("/")&&(this.uploadFolder="/"+this.uploadFolder),this.validateUploadFolder(this.uploadFolder,!0)||this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})},handleManage(){this.$router.push("/dashboard")},parseBoolean(e,t){return void 0===e||null===e?t:"boolean"===typeof e?e:"string"===typeof e?"true"===e:t},parseNumber(e,t){if(void 0===e||null===e)return t;const o=parseFloat(e);return isNaN(o)?t:o},openUrlDialog(){this.showUrlDialog=!0},handleLogout(){Tt.A.post("/api/auth/logout",{authType:"user"},{withCredentials:!0}).finally(()=>{this.$store.commit("setUserLoggedIn",!1),this.$router.push("/login"),this.$message.success(this.$t("upload.logoutSuccess"))})},changeUrlForm(){this.$store.commit("setUploadCopyUrlForm",this.selectedUrlForm)},openCompressDialog(){this.showCompressDialog=!0},updateCompressConfig(e,t){this.$store.commit("setCompressConfig",{key:e,value:t})},updateStoreUploadChannel(e){this.$store.commit("setStoreUploadChannel",e)},updateStoreUploadNameType(e){this.$store.commit("setStoreUploadNameType",e)},handleQuickToolbarMoreEnter(){this.isQuickToolbarOpen=!0},handleQuickToolbarLeave(){this.isQuickToolbarPinned||(this.isQuickToolbarOpen=!1)},toggleQuickToolbar(){this.isQuickToolbarPinned=!this.isQuickToolbarPinned,this.isQuickToolbarOpen=this.isQuickToolbarPinned},closeQuickToolbar(){this.isQuickToolbarPinned=!1,this.isQuickToolbarOpen=!1},handleQuickToolbarCommand(e){this.closeQuickToolbar(),"linkFormat"===e?this.openUrlDialog():"manage"===e?this.handleManage():"logout"===e&&this.handleLogout()},handleChangeUploadMethod(){this.uploadMethod="default"===this.uploadMethod?"paste":"default",this.$store.commit("setUploadMethod",this.uploadMethod)},handleMobileMenuCommand(e){if("toggleTheme"===e)"auto"===this.themeMode?(this.themeMode="light",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):"light"===this.themeMode?(this.themeMode="dark",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0)):(this.themeMode="auto",this.$store.commit("setCusDarkMode",!1));else if("toggleUploadMethod"===e)this.handleChangeUploadMethod();else if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Uo.xS)(e)}},handleDesktopMenuCommand(e){if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Uo.xS)(e)}},getThemeIcon(){return"auto"===this.themeMode?"sun":"light"===this.themeMode?"moon":"adjust"},getThemeText(){return"auto"===this.themeMode?this.$t("theme.lightMode"):"light"===this.themeMode?this.$t("theme.darkMode"):this.$t("theme.autoMode")},handleShowAnnouncement(){const e=this.userConfig?.announcement;e?this.openAnnouncement(e):this.$message.info(this.$t("upload.noAnnouncement"))},getAnnouncementRefreshAt(){const e=Number(this.userConfig?.announcementRefreshAt);return Number.isFinite(e)&&e>0?e:null},openAnnouncement(e){this.announcementContent=e,this.displayedAnnouncementRefreshAt=this.getAnnouncementRefreshAt(),this.showAnnouncementDialog=!0},showAnnouncementIfNeeded(){const e=this.userConfig?.announcement;if(!e)return;const t=this.getAnnouncementRefreshAt();if(t){const o=Number(localStorage.getItem("announcementAcknowledgedRefreshAt"));return void((!Number.isFinite(o)||t>o)&&this.openAnnouncement(e))}localStorage.getItem("announcementAcknowledgedAt")||this.openAnnouncement(e)},acknowledgeAnnouncement(){localStorage.setItem("announcementAcknowledgedAt",String(Date.now())),this.displayedAnnouncementRefreshAt&&localStorage.setItem("announcementAcknowledgedRefreshAt",String(this.displayedAnnouncementRefreshAt)),this.showAnnouncementDialog=!1},handleDirectorySelect(e){this.uploadFolder=e,this.validateUploadFolder(e,!0)&&this.$store.commit("setStoreUploadFolder",e)}}};const xo=(0,V.A)(_o,[["render",Lo],["__scopeId","data-v-06705292"]]);var Mo=xo},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return a}});var s=o(46638);function a(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:s.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:s.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:s.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:s.Ay.global.t("validation.consecutiveSlashNotAllowed")};const a=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return a.test(e)?{valid:!1,error:s.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},67819:function(e,t,o){"use strict";o(85331)},70797:function(e,t,o){"use strict";o.d(t,{A:function(){return l}});o(44114);var s=o(25507),a=o(16915);let i=!1;async function l(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||i||(i=!0,s.A.commit("setAdminLoggedIn",!1),a.A.push("/adminLogin").finally(()=>{i=!1})),o}},76334:function(e,t,o){e.exports=o(11393)},79899:function(e,t,o){"use strict";o(85331)},85970:function(e,t,o){"use strict";o(85331)},86975:function(e,t,o){"use strict";o.d(t,{A:function(){return p}});var s=o(56768),a=o(24232);const i={key:0,class:"page-footer"},l=["href"];function n(e,t,o,n,r,d){const c=(0,s.g2)("font-awesome-icon");return d.disableFooter?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("div",i,[(0,s.Lk)("p",null,[(0,s.eW)("© 2024-"+(0,a.v_)(d.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,s.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,s.eW)(" for You! ",-1)),(0,s.Lk)("a",{href:d.footerLink,target:"_blank"},[(0,s.bF)(c,{icon:"paper-plane",class:"footer-link-icon"})],8,l)])]))}var r=o(60782),d={name:"Footer",computed:{...(0,r.L8)(["userConfig"]),footerLink(){return this.userConfig?.footerLink||"https://github.com/MarSeventh"},thisYear(){return(new Date).getFullYear()},disableFooter(){return this.userConfig?.disableFooter||!1}}},c=o(71241);const u=(0,c.A)(d,[["render",n],["__scopeId","data-v-08acbaa9"]]);var p=u},88830:function(e,t,o){"use strict";o(85331)},95385:function(e,t,o){"use strict";o(85331)},96682:function(e,t,o){"use strict";e.exports=o.p+"img/404.8ed11fb3.png"},96808:function(e,t,o){"use strict";o(85331),o(18785),o(67819),o(85970),o(19104)},97769:function(e,t,o){"use strict";o.d(t,{A:function(){return u}});var s=o(56768);const a={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},i={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},l={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function n(e,t,o,n,r,d){const c=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("span",(0,s.v6)(e.$attrs,{class:["channel-icon-wrapper",`channel-brand-${o.type}`]}),["telegram"===o.type?((0,s.uX)(),(0,s.CE)("svg",a,[...t[0]||(t[0]=[(0,s.Lk)("path",{d:"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z"},null,-1)])])):"huggingface"===o.type?((0,s.uX)(),(0,s.CE)("svg",i,[...t[1]||(t[1]=[(0,s.Fv)('',9)])])):"webdav"===o.type?((0,s.uX)(),(0,s.CE)("svg",l,[...t[2]||(t[2]=[(0,s.Lk)("path",{d:"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z"},null,-1)])])):((0,s.uX)(),(0,s.Wv)(c,{key:3,icon:d.fontAwesomeIcon},null,8,["icon"]))],16)}var r={name:"ChannelIcon",inheritAttrs:!1,props:{type:{type:String,required:!0}},computed:{fontAwesomeIcon(){const e={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return e[this.type]||"server"}}},d=o(71241);const c=(0,d.A)(r,[["render",n],["__scopeId","data-v-ce6ff2ce"]]);var u=c}}]); -//# sourceMappingURL=647.6ed3341b.js.map \ No newline at end of file diff --git a/frontend-dist/js/647.6ed3341b.js.gz b/frontend-dist/js/647.6ed3341b.js.gz deleted file mode 100644 index a3263123..00000000 Binary files a/frontend-dist/js/647.6ed3341b.js.gz and /dev/null differ diff --git a/frontend-dist/js/647.6ed3341b.js.map b/frontend-dist/js/647.6ed3341b.js.map deleted file mode 100644 index 2b1e4b4a..00000000 --- a/frontend-dist/js/647.6ed3341b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/647.6ed3341b.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/ToggleDark.vue?4a88","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?942e","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?d5f5","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?de1f","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?adb2","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?6ec5","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?420c","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?9f0d","webpack://sanyue_imghub/./src/utils/upload/urlBuilder.js","webpack://sanyue_imghub/./src/utils/upload/sha256.js","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?bdbd","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?6707","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?69c3","webpack://sanyue_imghub/./src/views/UploadHome.vue?fcf5","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00","webpack://sanyue_imghub/./src/utils/pathValidator.js","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./node_modules/image-conversion/index.js","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?3436","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.imageConversion=e():t.imageConversion=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=0)}([function(t,e,n){\"use strict\";var r;function o(t){return[\"image/png\",\"image/jpeg\",\"image/gif\"].some(e=>e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=2122c62a&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=2122c62a&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-2122c62a\"]])\n\nexport default __exports__","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=7da2f8c2&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=7da2f8c2&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-7da2f8c2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog settings-dialog-scope upload-settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"telegram\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"cfr2\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"s3\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"discord\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"huggingface\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"webdav\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_ChannelIcon, {\n type: \"webdav\",\n class: \"channel-icon\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"WD\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","import ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'UploadSettingsDialog',\n components: {\n ChannelIcon\n },\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=1c6b8366\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport \"@/styles/settings-dialog.css?vue&type=style&index=0&lang=css&external\"\nimport \"./UploadSettingsDialog.css?vue&type=style&index=1&lang=css&external\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=645a7810&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=645a7810&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-645a7810\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx, createVNode as _createVNode, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = [\"aria-pressed\"];\nconst _hoisted_8 = [\"aria-pressed\"];\nconst _hoisted_9 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_10 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_11 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_12 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createElementVNode(\"svg\", {\n class: \"upload-plus-icon\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"1.25\",\n \"stroke-linecap\": \"round\",\n \"aria-hidden\": \"true\"\n }, [_createElementVNode(\"path\", {\n d: \"M12 7v10\"\n }), _createElementVNode(\"path\", {\n d: \"M7 12h10\"\n })], -1)]))]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"paste-card-method-group\", {\n 'is-external': $data.pasteUploadMethod === 'external'\n }]),\n role: \"group\",\n \"aria-label\": _ctx.$t('upload.switchUploadMethod')\n }, [_createElementVNode(\"button\", {\n class: _normalizeClass([\"paste-card-method-button\", {\n 'is-active': $data.pasteUploadMethod === 'save'\n }]),\n type: \"button\",\n \"aria-pressed\": $data.pasteUploadMethod === 'save',\n onClick: _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = 'save')\n }, _toDisplayString(_ctx.$t('upload.pasteSave')), 11, _hoisted_7), _createElementVNode(\"button\", {\n class: _normalizeClass([\"paste-card-method-button\", {\n 'is-active': $data.pasteUploadMethod === 'external'\n }]),\n type: \"button\",\n \"aria-pressed\": $data.pasteUploadMethod === 'external',\n onClick: _cache[4] || (_cache[4] = $event => $data.pasteUploadMethod = 'external')\n }, _toDisplayString(_ctx.$t('upload.pasteExternal')), 11, _hoisted_8)], 10, _hoisted_6)])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-copy\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-retry\",\n onClick: _cache[6] || (_cache[6] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\",\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[8] || (_cache[8] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.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.dom-exception.stack.js\";\nimport axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const fileType = file.file.type || 'application/octet-stream';\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', fileType);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', fileType);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', fileType);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=97f23dbc&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=97f23dbc&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-97f23dbc\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=28b8eda7&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=28b8eda7&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-28b8eda7\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"quick-toolbar-actions\"\n};\nconst _hoisted_4 = {\n class: \"quick-toolbar-actions-inner\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"title-crayon-text\",\n \"aria-hidden\": \"true\"\n};\nconst _hoisted_8 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_9 = {\n class: \"dialog-section\"\n};\nconst _hoisted_10 = {\n class: \"section-header\"\n};\nconst _hoisted_11 = {\n class: \"section-title\"\n};\nconst _hoisted_12 = {\n class: \"section-content\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"setting-item\"\n};\nconst _hoisted_18 = {\n class: \"setting-label\"\n};\nconst _hoisted_19 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_20 = {\n class: \"setting-label\"\n};\nconst _hoisted_21 = {\n class: \"dialog-action\"\n};\nconst _hoisted_22 = [\"innerHTML\"];\nconst _hoisted_23 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quick-toolbar\", {\n 'is-expanded': $data.isQuickToolbarOpen\n }]),\n onMouseleave: _cache[5] || (_cache[5] = (...args) => $options.handleQuickToolbarLeave && $options.handleQuickToolbarLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.logout'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[2] || (_cache[2] = $event => $options.handleQuickToolbarCommand('logout'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.manage'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[3] || (_cache[3] = $event => $options.handleQuickToolbarCommand('manage'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip || !$data.isQuickToolbarOpen,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: _cache[4] || (_cache[4] = $event => $options.handleQuickToolbarCommand('linkFormat'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"left\",\n \"hide-after\": 0,\n \"show-after\": 1000\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"quick-toolbar-button\",\n onClick: $options.openCompressDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"quick-toolbar-icon\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_button, {\n class: _normalizeClass([\"quick-toolbar-button quick-toolbar-more\", {\n 'is-active': $data.isQuickToolbarOpen\n }]),\n \"aria-expanded\": $data.isQuickToolbarOpen,\n onMouseenter: $options.handleQuickToolbarMoreEnter,\n onClick: $options.toggleQuickToolbar\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"quick-toolbar-icon quick-toolbar-toggle-icon\"\n })]),\n _: 1\n }, 8, [\"class\", \"aria-expanded\", \"onMouseenter\", \"onClick\"])], 34), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"span\", _hoisted_7, _toDisplayString($options.ownerName) + \" ImgHub\", 1), _createElementVNode(\"a\", _hoisted_8, _toDisplayString($options.ownerName), 1), _cache[24] || (_cache[24] = _createTextVNode(\" ImgHub \", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog settings-dialog-scope\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"span\", _hoisted_11, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[27] || (_cache[27] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"span\", _hoisted_18, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"span\", _hoisted_20, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_21, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[9] || (_cache[9] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[12] || (_cache[12] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[13] || (_cache[13] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[14] || (_cache[14] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[15] || (_cache[15] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[16] || (_cache[16] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[17] || (_cache[17] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[18] || (_cache[18] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[19] || (_cache[19] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[20] || (_cache[20] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[21] || (_cache[21] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_23, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.acknowledgeAnnouncement\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_22)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[23] || (_cache[23] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n isQuickToolbarOpen: false,\n isQuickToolbarPinned: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n displayedAnnouncementRefreshAt: null,\n // 当前弹窗所展示的公告版本\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', true, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n this.showAnnouncementIfNeeded();\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleQuickToolbarMoreEnter() {\n this.isQuickToolbarOpen = true;\n },\n handleQuickToolbarLeave() {\n if (!this.isQuickToolbarPinned) {\n this.isQuickToolbarOpen = false;\n }\n },\n toggleQuickToolbar() {\n this.isQuickToolbarPinned = !this.isQuickToolbarPinned;\n this.isQuickToolbarOpen = this.isQuickToolbarPinned;\n },\n closeQuickToolbar() {\n this.isQuickToolbarPinned = false;\n this.isQuickToolbarOpen = false;\n },\n handleQuickToolbarCommand(command) {\n this.closeQuickToolbar();\n if (command === 'linkFormat') {\n this.openUrlDialog();\n } else if (command === 'manage') {\n this.handleManage();\n } else if (command === 'logout') {\n this.handleLogout();\n }\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.openAnnouncement(announcement);\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n getAnnouncementRefreshAt() {\n const refreshAt = Number(this.userConfig?.announcementRefreshAt);\n return Number.isFinite(refreshAt) && refreshAt > 0 ? refreshAt : null;\n },\n openAnnouncement(announcement) {\n this.announcementContent = announcement;\n this.displayedAnnouncementRefreshAt = this.getAnnouncementRefreshAt();\n this.showAnnouncementDialog = true;\n },\n showAnnouncementIfNeeded() {\n const announcement = this.userConfig?.announcement;\n if (!announcement) return;\n const refreshAt = this.getAnnouncementRefreshAt();\n if (refreshAt) {\n const acknowledgedRefreshAt = Number(localStorage.getItem('announcementAcknowledgedRefreshAt'));\n if (!Number.isFinite(acknowledgedRefreshAt) || refreshAt > acknowledgedRefreshAt) {\n this.openAnnouncement(announcement);\n }\n return;\n }\n\n // 尚未产生刷新时间的旧公告在升级后再展示一次,确认后使用新版时间标记。\n if (!localStorage.getItem('announcementAcknowledgedAt')) {\n this.openAnnouncement(announcement);\n }\n },\n acknowledgeAnnouncement() {\n localStorage.setItem('announcementAcknowledgedAt', String(Date.now()));\n if (this.displayedAnnouncementRefreshAt) {\n localStorage.setItem('announcementAcknowledgedRefreshAt', String(this.displayedAnnouncementRefreshAt));\n }\n this.showAnnouncementDialog = false;\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=06705292&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=06705292&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-06705292\"]])\n\nexport default __exports__","/**\r\n * 路径验证器模块\r\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\r\n */\r\nimport i18n from '@/locales'\r\n\r\n/**\r\n * 验证文件夹路径的合法性\r\n * @param {string} path - 要验证的路径\r\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\r\n * @returns {{ valid: boolean, error?: string }} 验证结果\r\n */\r\nexport function validateFolderPath(path, { strict = true } = {}) {\r\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\r\n if (!path || path.trim() === '') {\r\n return { valid: true };\r\n }\r\n \r\n // 如果路径仅为 \"/\",返回有效(表示根目录)\r\n if (path === '/') {\r\n return { valid: true };\r\n }\r\n \r\n // 检查路径是否以 \"/\" 开头\r\n if (!path.startsWith('/')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.pathMustStartWithSlash') \r\n };\r\n }\r\n\r\n // 检查路径穿越:包含 .. 的路径段\r\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.pathTraversalNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径中单独的 . 段\r\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\r\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\r\n if (dotPattern.test(path)) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.singleDotNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径是否包含连续的斜杠\r\n if (path.includes('//')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \r\n };\r\n }\r\n \r\n // 检查路径是否包含非法字符\r\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","module.exports = require(\"./build/conversion.js\");\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: ['channel-icon-wrapper', `channel-brand-${$props.type}`]\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=ce6ff2ce&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=ce6ff2ce&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-ce6ff2ce\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","t","e","module","exports","n","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","prototype","hasOwnProperty","p","s","some","a","f","g","w","b","PNG","JPEG","GIF","Promise","u","next","throw","done","then","apply","toDataURL","toBlob","split","match","atob","length","Uint8Array","charCodeAt","Blob","Image","onload","onerror","Error","document","createElement","window","URL","createObjectURL","download","Date","now","toString","body","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","result","readAsDataURL","h","assign","getContext","Number","scale","width","height","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","y","quality","isNaN","accuracy","filter","sort","abs","pow","v","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","viewBox","fill","stroke","x","cx","cy","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_component_el_button","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","visible","popoverVisible","$event","placement","trigger","transition","reference","$slots","undefined","error","fetchDirectoryTree","$t","ref","treeData","treeProps","currentDirectory","onNodeClick","handleNodeClick","node","path","expanded","loading","openDrawer","modelValue","drawerVisible","direction","title","source","children","label","windowWidth","innerWidth","watch","newVal","setTimeout","$refs","treeRef","store","nodesMap","treeRefMobile","$nextTick","setCurrentKey","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","response","fetchWithAuth","method","ok","status","json","axios","withAuthCode","tree","err","console","startsWith","$emit","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_component_el_tooltip","show","count","totalCount","content","circle","toggleViewMode","viewMode","clearHistory","historyList","onScroll","handleScroll","groupedHistory","group","date","items","item","time","isImage","url","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","formatTime","hasMore","loadingMore","spin","allHistory","pageSize","currentPage","val","resetAndLoad","groups","forEach","dateStr","getFullYear","getMonth","padStart","getDate","push","keys","map","savedMode","localStorage","getItem","loadAllHistory","loadMore","history","JSON","parse","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","removeItem","$message","success","catch","stringify","fileName","imageExtensions","extension","pop","toLowerCase","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","open","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_ChannelIcon","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","dialogWidth","uploadChannel","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","components","ChannelIcon","Array","emits","set","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_el_upload","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","role","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","processBlock","block","H","W","s0","s1","S1","temp1","S0","maj","temp2","createSha256","buffer","bufferLength","totalLength","update","offset","needed","toCopy","subarray","digest","bitLength","view","DataView","setUint32","floor","hex","async","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","scrollContainer","setScrollTop","deep","immediate","location","protocol","host","handlePaste","storeAutoReUpload","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","encodeURIComponent","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","finally","delete","fileSize","fileType","totalChunks","ceil","precomputedSha256","initFormData","initResponse","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","trim","test","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","headers","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","etag","partNumber","progress","completeResponse","oid","img","canvas","ctx","originalName","newName","webpFile","revokeObjectURL","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","clientY","top","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","normalizedPath","normalizeDirectoryPath","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","parentPath","isArray","child","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isQuickToolbarOpen","handleQuickToolbarLeave","handleQuickToolbarCommand","openCompressDialog","onMouseenter","handleQuickToolbarMoreEnter","toggleQuickToolbar","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","acknowledgeAnnouncement","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","isQuickToolbarPinned","displayedAnnouncementRefreshAt","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","updateStoreUploadNameType","validateUploadFolder","strictResult","strict","valid","storeUploadFolder","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","showAnnouncementIfNeeded","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","handleManage","$router","defaultValue","num","parseFloat","openUrlDialog","handleLogout","authType","withCredentials","closeQuickToolbar","handleShowAnnouncement","openAnnouncement","info","getAnnouncementRefreshAt","refreshAt","announcementRefreshAt","isFinite","acknowledgedRefreshAt","validateFolderPath","i18n","global","dotPattern","invalidChars","isRedirecting","options","credentials","router","disableFooter","thisYear","footerLink","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","cfr2","s3","discord"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/647.6ed3341b.js.map.gz b/frontend-dist/js/647.6ed3341b.js.map.gz deleted file mode 100644 index 2c65aa4d..00000000 Binary files a/frontend-dist/js/647.6ed3341b.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/app.2b2b1f35.js b/frontend-dist/js/app.2b2b1f35.js deleted file mode 100644 index e486d6a0..00000000 --- a/frontend-dist/js/app.2b2b1f35.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(){"use strict";var e={457:function(e,a,t){var o=t(94373);const n=o.A.create({baseURL:"/",withCredentials:!0});a.A=n},16915:function(e,a,t){var o=t(48512),n=t(51219),l=t(25507),i=t(457),r=t(46638);const s=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(903),t.e(173),t.e(30),t.e(647)]).then(t.bind(t,51647)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(903),t.e(380),t.e(63)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(30),t.e(549)]).then(t.bind(t,11017)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(5)]).then(t.bind(t,27005)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(645)]).then(t.bind(t,37645)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(903),t.e(380),t.e(803)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>Promise.all([t.e(903),t.e(711)]).then(t.bind(t,5215))},{path:"/whiteliston",name:"whiteliston",component:()=>Promise.all([t.e(903),t.e(773)]).then(t.bind(t,86569))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(743).then(t.bind(t,92743))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Promise.all([t.e(903),t.e(787)]).then(t.bind(t,75875))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,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,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,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,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","refreshAnnouncement":"刷新公告已读状态","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","refreshAnnouncement":"Reset announcement read status","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),G=t(10798),_=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),Ge=t(97447),_e=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,G.A,_.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,Ge.Jm,_e.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.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)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{5:"046872c7",22:"b436b08e",63:"503c70e6",380:"62235203",549:"ffe205fb",645:"a0ee257d",647:"6ed3341b",711:"936a7109",743:"f28adaf7",773:"f0780366",787:"d0dbc2dd",803:"4f2ba956",903:"1e4b549d"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{5:"3a85dbb0",30:"c12a4e5b",63:"398231b7",173:"f8fd1fa2",322:"2b40f004",549:"0f00dee2",645:"a0ee33b3",647:"ba2aa3f5",711:"e6dbd5da",743:"4cb567b6",773:"b55efe26",787:"f6f7607a",803:"398231b7"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),c=0;c{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(903),t.e(173),t.e(30),t.e(36)]).then(t.bind(t,1036)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(903),t.e(380),t.e(63)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(30),t.e(549)]).then(t.bind(t,11017)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(5)]).then(t.bind(t,27005)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(645)]).then(t.bind(t,37645)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(903),t.e(380),t.e(803)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>Promise.all([t.e(903),t.e(711)]).then(t.bind(t,5215))},{path:"/whiteliston",name:"whiteliston",component:()=>Promise.all([t.e(903),t.e(773)]).then(t.bind(t,86569))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(743).then(t.bind(t,92743))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Promise.all([t.e(903),t.e(787)]).then(t.bind(t,75875))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,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,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,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,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","refreshAnnouncement":"刷新公告已读状态","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","refreshAnnouncement":"Reset announcement read status","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),G=t(10798),_=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),Ge=t(97447),_e=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,G.A,_.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,Ge.Jm,_e.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.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)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{5:"046872c7",22:"b436b08e",36:"1f3c2bdf",63:"503c70e6",380:"62235203",549:"ffe205fb",645:"a0ee257d",711:"936a7109",743:"f28adaf7",773:"f0780366",787:"d0dbc2dd",803:"4f2ba956",903:"1e4b549d"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{5:"3a85dbb0",30:"c12a4e5b",36:"5ae2c698",63:"398231b7",173:"f8fd1fa2",322:"2b40f004",549:"0f00dee2",645:"a0ee33b3",711:"e6dbd5da",743:"4cb567b6",773:"b55efe26",787:"f6f7607a",803:"398231b7"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),c=0;c {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\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","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 // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\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 adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\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 storeChannelName: state => state.storeChannelName,\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 setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\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 setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\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 paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, 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 const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = 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 setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { 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 { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\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(...fontAwesomeIcons);\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 || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/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).use(i18n).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(i18n).use(head).mount('#app');\r\n})\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 + \".\" + {\"5\":\"046872c7\",\"22\":\"b436b08e\",\"63\":\"503c70e6\",\"380\":\"62235203\",\"549\":\"ffe205fb\",\"645\":\"a0ee257d\",\"647\":\"6ed3341b\",\"711\":\"936a7109\",\"743\":\"f28adaf7\",\"773\":\"f0780366\",\"787\":\"d0dbc2dd\",\"803\":\"4f2ba956\",\"903\":\"1e4b549d\"}[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 + \".\" + {\"5\":\"3a85dbb0\",\"30\":\"c12a4e5b\",\"63\":\"398231b7\",\"173\":\"f8fd1fa2\",\"322\":\"2b40f004\",\"549\":\"0f00dee2\",\"645\":\"a0ee33b3\",\"647\":\"ba2aa3f5\",\"711\":\"e6dbd5da\",\"743\":\"4cb567b6\",\"773\":\"b55efe26\",\"787\":\"f6f7607a\",\"803\":\"398231b7\"}[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 = {\"5\":1,\"30\":1,\"63\":1,\"173\":1,\"322\":1,\"549\":1,\"645\":1,\"647\":1,\"711\":1,\"743\":1,\"773\":1,\"787\":1,\"803\":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(!/^(173|30|322)$/.test(chunkId)) {\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} else installedChunks[chunkId] = 0;\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__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","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","push","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","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","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.57c02bdc.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/utils/fontawesomeIcons.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.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\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\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","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 // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\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 adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\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 storeChannelName: state => state.storeChannelName,\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 setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\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 setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\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 paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, 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 const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = 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 setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { 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 { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\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(...fontAwesomeIcons);\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 || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/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).use(i18n).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(i18n).use(head).mount('#app');\r\n})\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 + \".\" + {\"5\":\"046872c7\",\"22\":\"b436b08e\",\"36\":\"1f3c2bdf\",\"63\":\"503c70e6\",\"380\":\"62235203\",\"549\":\"ffe205fb\",\"645\":\"a0ee257d\",\"711\":\"936a7109\",\"743\":\"f28adaf7\",\"773\":\"f0780366\",\"787\":\"d0dbc2dd\",\"803\":\"4f2ba956\",\"903\":\"1e4b549d\"}[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 + \".\" + {\"5\":\"3a85dbb0\",\"30\":\"c12a4e5b\",\"36\":\"5ae2c698\",\"63\":\"398231b7\",\"173\":\"f8fd1fa2\",\"322\":\"2b40f004\",\"549\":\"0f00dee2\",\"645\":\"a0ee33b3\",\"711\":\"e6dbd5da\",\"743\":\"4cb567b6\",\"773\":\"b55efe26\",\"787\":\"f6f7607a\",\"803\":\"398231b7\"}[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 = {\"5\":1,\"30\":1,\"36\":1,\"63\":1,\"173\":1,\"322\":1,\"549\":1,\"645\":1,\"711\":1,\"743\":1,\"773\":1,\"787\":1,\"803\":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(!/^(173|30|322)$/.test(chunkId)) {\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} else installedChunks[chunkId] = 0;\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__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","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","push","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","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","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/frontend-dist/js/app.57c02bdc.js.map.gz b/frontend-dist/js/app.57c02bdc.js.map.gz new file mode 100644 index 00000000..edb0ea3c Binary files /dev/null and b/frontend-dist/js/app.57c02bdc.js.map.gz differ diff --git a/readme/海报.png b/readme/海报.png index 94253e3f..bb3ce885 100644 Binary files a/readme/海报.png and b/readme/海报.png differ