diff --git a/frontend-dist/css/136.93acb05d.css.gz b/frontend-dist/css/136.93acb05d.css.gz deleted file mode 100644 index 62d65e56..00000000 Binary files a/frontend-dist/css/136.93acb05d.css.gz and /dev/null differ diff --git a/frontend-dist/css/173.5edc1a8c.css.gz b/frontend-dist/css/173.5edc1a8c.css.gz deleted file mode 100644 index 7203e617..00000000 Binary files a/frontend-dist/css/173.5edc1a8c.css.gz and /dev/null differ diff --git a/frontend-dist/css/173.5edc1a8c.css b/frontend-dist/css/173.de17907f.css similarity index 98% rename from frontend-dist/css/173.5edc1a8c.css rename to frontend-dist/css/173.de17907f.css index 1f9bfe99..dde45522 100644 --- a/frontend-dist/css/173.5edc1a8c.css +++ b/frontend-dist/css/173.de17907f.css @@ -1 +1 @@ -:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag,.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{border-radius:50%;cursor:pointer;display:flex;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{background-color:transparent;border:none;border-radius:50%;margin-left:6px;outline:none;overflow:hidden;padding:0}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white)}.el-tag--dark,.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-scrollbar{--el-scrollbar-opacity:0.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:0.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;word-break:normal;z-index:2000}.el-popper.is-dark{color:var(--el-bg-color)}.el-popper.is-dark,.el-popper.is-dark>.el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{right:0}.el-popper.is-light,.el-popper.is-light>.el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{right:0}.el-popper.is-pure{padding:0}.el-popper__arrow,.el-popper__arrow:before{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);font-size:12px;line-height:34px;overflow:hidden;padding:0 20px;text-overflow:ellipsis;white-space:nowrap}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transform:translateZ(0);transition:var(--el-transition-duration)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled,.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0deg);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%;z-index:-1}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper,.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute;z-index:-1}.el-select__input{appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;outline:none;padding:0;width:100%}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%) rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:50%;position:absolute;top:50%;transform:translate(-45%,-60%) rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0}.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important} \ No newline at end of file +:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag,.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{border-radius:50%;cursor:pointer;display:flex;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{background-color:transparent;border:none;border-radius:50%;margin-left:6px;outline:none;overflow:hidden;padding:0}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white)}.el-tag--dark,.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-scrollbar{--el-scrollbar-opacity:0.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:0.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;word-break:normal;z-index:2000}.el-popper.is-dark{color:var(--el-bg-color)}.el-popper.is-dark,.el-popper.is-dark>.el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{right:0}.el-popper.is-light,.el-popper.is-light>.el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{right:0}.el-popper.is-pure{padding:0}.el-popper__arrow,.el-popper__arrow:before{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class=%27icon%27 width=%27200%27 height=%27200%27 viewBox=%270 0 1024 1024%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill=%27currentColor%27 d=%27M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z%27%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);font-size:12px;line-height:34px;overflow:hidden;padding:0 20px;text-overflow:ellipsis;white-space:nowrap}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transform:translateZ(0);transition:var(--el-transition-duration)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled,.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0deg);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%;z-index:-1}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper,.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute;z-index:-1}.el-select__input{appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;outline:none;padding:0;width:100%}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%) rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:50%;position:absolute;top:50%;transform:translate(-45%,-60%) rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0}.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important} \ No newline at end of file diff --git a/frontend-dist/css/173.de17907f.css.gz b/frontend-dist/css/173.de17907f.css.gz new file mode 100644 index 00000000..40385d44 Binary files /dev/null and b/frontend-dist/css/173.de17907f.css.gz differ diff --git a/frontend-dist/css/231.fe297c4d.css b/frontend-dist/css/231.fe297c4d.css new file mode 100644 index 00000000..b1ec3c95 --- /dev/null +++ b/frontend-dist/css/231.fe297c4d.css @@ -0,0 +1 @@ +.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important}.whitelist-container[data-v-69dd74ea]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#6366f1);color:var(--text-color,#333)}.background-wrapper[data-v-69dd74ea]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.whitelist-content[data-v-69dd74ea]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:20px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.back-button-wrapper[data-v-69dd74ea]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-69dd74ea]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-69dd74ea]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.status-animation[data-v-69dd74ea]{margin-bottom:2rem;position:relative}.status-icon[data-v-69dd74ea]{position:relative;display:inline-block;margin-bottom:1rem}.shield-icon[data-v-69dd74ea]{font-size:4rem;color:var(--primary-color,#2563eb);animation:pulse-69dd74ea 2s ease-in-out infinite;filter:drop-shadow(0 0 20px rgba(37,99,235,.3))}.status-badge[data-v-69dd74ea]{position:absolute;bottom:-5px;right:-5px;background:#f56c6c;border-radius:50%;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:3px solid #fff;box-shadow:none}.clock-icon[data-v-69dd74ea]{color:#fff;font-size:.8rem;animation:tick-69dd74ea 1s ease-in-out infinite}.status-info[data-v-69dd74ea]{animation:fadeInUp-69dd74ea 1s ease-out .5s both}.status-title[data-v-69dd74ea]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.status-description[data-v-69dd74ea]{font-size:1.1rem;line-height:1.6;margin-bottom:1rem;opacity:.9;color:var(--text-color,#333)}.status-description-en[data-v-69dd74ea]{font-size:.95rem;line-height:1.5;margin-bottom:2rem;opacity:.7;color:var(--text-color-secondary,#666);font-style:italic}.status-actions[data-v-69dd74ea]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-69dd74ea]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-69dd74ea]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-69dd74ea]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-69dd74ea]:hover{box-shadow:none}.btn-icon[data-v-69dd74ea]{margin-right:8px}.help-info[data-v-69dd74ea]{animation:fadeInUp-69dd74ea 1s ease-out 1s both;margin-bottom:1.5rem}.help-text[data-v-69dd74ea]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-69dd74ea]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-69dd74ea]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-69dd74ea]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.powered-by[data-v-69dd74ea]{animation:fadeInUp-69dd74ea 1s ease-out 1.2s both;padding-top:1rem;border-top:1px solid hsla(0,0%,100%,.2);opacity:.8}.powered-by p[data-v-69dd74ea]{margin:0;font-size:.85rem;color:var(--text-color-secondary,#666)}.project-link[data-v-69dd74ea]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:600;transition:all .3s ease}.project-link[data-v-69dd74ea]:hover{color:#67c23a;text-shadow:0 0 10px rgba(103,194,58,.3)}.floating-elements[data-v-69dd74ea]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-69dd74ea]{position:absolute;background:rgba(37,99,235,.1);border-radius:50%;animation:floatShapes-69dd74ea 8s ease-in-out infinite}.shape-1[data-v-69dd74ea]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-69dd74ea]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(103,194,58,.1)}.shape-3[data-v-69dd74ea]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-69dd74ea]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,87%,69%,.1)}.shape-5[data-v-69dd74ea]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(230,162,60,.1)}@keyframes pulse-69dd74ea{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.8}}@keyframes tick-69dd74ea{0%,to{transform:rotate(0deg)}50%{transform:rotate(180deg)}}@keyframes floatShapes-69dd74ea{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-69dd74ea{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.whitelist-content[data-v-69dd74ea]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-69dd74ea]{top:-20px;right:-20px}.shield-icon[data-v-69dd74ea]{font-size:3rem}.status-title[data-v-69dd74ea]{font-size:1.5rem}.status-description[data-v-69dd74ea]{font-size:1rem}.status-description-en[data-v-69dd74ea]{font-size:.9rem}.status-actions[data-v-69dd74ea]{flex-direction:column;align-items:center}.action-btn[data-v-69dd74ea]{width:200px}.quick-links[data-v-69dd74ea]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-69dd74ea]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}}@media (max-width:480px){.whitelist-content[data-v-69dd74ea]{padding:1rem;margin:.5rem;max-width:calc(100% - 1rem)}.status-title[data-v-69dd74ea]{font-size:1.3rem}.status-description[data-v-69dd74ea]{font-size:.95rem}.status-description-en[data-v-69dd74ea]{font-size:.85rem}.shield-icon[data-v-69dd74ea]{font-size:2.5rem}}@media (prefers-color-scheme:dark){.whitelist-container[data-v-69dd74ea]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.status-description[data-v-69dd74ea],.status-title[data-v-69dd74ea]{color:var(--text-color,#e4e7ed)}.help-text[data-v-69dd74ea],.powered-by p[data-v-69dd74ea],.status-description-en[data-v-69dd74ea]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/231.fe297c4d.css.gz b/frontend-dist/css/231.fe297c4d.css.gz new file mode 100644 index 00000000..4f7c5124 Binary files /dev/null and b/frontend-dist/css/231.fe297c4d.css.gz differ diff --git a/frontend-dist/css/267.d120d397.css b/frontend-dist/css/267.3cab111c.css similarity index 100% rename from frontend-dist/css/267.d120d397.css rename to frontend-dist/css/267.3cab111c.css diff --git a/frontend-dist/css/267.d120d397.css.gz b/frontend-dist/css/267.3cab111c.css.gz similarity index 100% rename from frontend-dist/css/267.d120d397.css.gz rename to frontend-dist/css/267.3cab111c.css.gz diff --git a/frontend-dist/css/278.f8d0bad0.css b/frontend-dist/css/278.f8d0bad0.css deleted file mode 100644 index ad89a9a4..00000000 --- a/frontend-dist/css/278.f8d0bad0.css +++ /dev/null @@ -1 +0,0 @@ -.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important}.whitelist-container[data-v-0c389049]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#6366f1);color:var(--text-color,#333)}.background-wrapper[data-v-0c389049]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.whitelist-content[data-v-0c389049]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:hsla(0,0%,100%,.1);border-radius:20px;border:1px solid hsla(0,0%,100%,.2);box-shadow:none}.back-button-wrapper[data-v-0c389049]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-0c389049]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-0c389049]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.status-animation[data-v-0c389049]{margin-bottom:2rem;position:relative}.status-icon[data-v-0c389049]{position:relative;display:inline-block;margin-bottom:1rem}.shield-icon[data-v-0c389049]{font-size:4rem;color:var(--primary-color,#2563eb);animation:pulse-0c389049 2s ease-in-out infinite;filter:drop-shadow(0 0 20px rgba(37,99,235,.3))}.status-badge[data-v-0c389049]{position:absolute;bottom:-5px;right:-5px;background:#f56c6c;border-radius:50%;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:3px solid #fff;box-shadow:none}.clock-icon[data-v-0c389049]{color:#fff;font-size:.8rem;animation:tick-0c389049 1s ease-in-out infinite}.status-info[data-v-0c389049]{animation:fadeInUp-0c389049 1s ease-out .5s both}.status-title[data-v-0c389049]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.status-description[data-v-0c389049]{font-size:1.1rem;line-height:1.6;margin-bottom:1rem;opacity:.9;color:var(--text-color,#333)}.status-description-en[data-v-0c389049]{font-size:.95rem;line-height:1.5;margin-bottom:2rem;opacity:.7;color:var(--text-color-secondary,#666);font-style:italic}.status-actions[data-v-0c389049]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-0c389049]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-0c389049]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-0c389049]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-0c389049]:hover{box-shadow:none}.btn-icon[data-v-0c389049]{margin-right:8px}.help-info[data-v-0c389049]{animation:fadeInUp-0c389049 1s ease-out 1s both;margin-bottom:1.5rem}.help-text[data-v-0c389049]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-0c389049]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-0c389049]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-0c389049]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.powered-by[data-v-0c389049]{animation:fadeInUp-0c389049 1s ease-out 1.2s both;padding-top:1rem;border-top:1px solid hsla(0,0%,100%,.2);opacity:.8}.powered-by p[data-v-0c389049]{margin:0;font-size:.85rem;color:var(--text-color-secondary,#666)}.project-link[data-v-0c389049]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:600;transition:all .3s ease}.project-link[data-v-0c389049]:hover{color:#67c23a;text-shadow:0 0 10px rgba(103,194,58,.3)}.floating-elements[data-v-0c389049]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-0c389049]{position:absolute;background:rgba(37,99,235,.1);border-radius:50%;animation:floatShapes-0c389049 8s ease-in-out infinite}.shape-1[data-v-0c389049]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-0c389049]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(103,194,58,.1)}.shape-3[data-v-0c389049]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-0c389049]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,87%,69%,.1)}.shape-5[data-v-0c389049]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(230,162,60,.1)}@keyframes pulse-0c389049{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.8}}@keyframes tick-0c389049{0%,to{transform:rotate(0deg)}50%{transform:rotate(180deg)}}@keyframes floatShapes-0c389049{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-0c389049{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.whitelist-content[data-v-0c389049]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-0c389049]{top:-20px;right:-20px}.shield-icon[data-v-0c389049]{font-size:3rem}.status-title[data-v-0c389049]{font-size:1.5rem}.status-description[data-v-0c389049]{font-size:1rem}.status-description-en[data-v-0c389049]{font-size:.9rem}.status-actions[data-v-0c389049]{flex-direction:column;align-items:center}.action-btn[data-v-0c389049]{width:200px}.quick-links[data-v-0c389049]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-0c389049]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}}@media (max-width:480px){.whitelist-content[data-v-0c389049]{padding:1rem;margin:.5rem;max-width:calc(100% - 1rem)}.status-title[data-v-0c389049]{font-size:1.3rem}.status-description[data-v-0c389049]{font-size:.95rem}.status-description-en[data-v-0c389049]{font-size:.85rem}.shield-icon[data-v-0c389049]{font-size:2.5rem}}@media (prefers-color-scheme:dark){.whitelist-container[data-v-0c389049]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.whitelist-content[data-v-0c389049]{background:rgba(0,0,0,.2);border:1px solid hsla(0,0%,100%,.1)}.status-description[data-v-0c389049],.status-title[data-v-0c389049]{color:var(--text-color,#e4e7ed)}.help-text[data-v-0c389049],.powered-by p[data-v-0c389049],.status-description-en[data-v-0c389049]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/278.f8d0bad0.css.gz b/frontend-dist/css/278.f8d0bad0.css.gz deleted file mode 100644 index a4f0ea18..00000000 Binary files a/frontend-dist/css/278.f8d0bad0.css.gz and /dev/null differ diff --git a/frontend-dist/css/30.755fb9d7.css b/frontend-dist/css/30.6059b3ba.css similarity index 100% rename from frontend-dist/css/30.755fb9d7.css rename to frontend-dist/css/30.6059b3ba.css diff --git a/frontend-dist/css/30.755fb9d7.css.gz b/frontend-dist/css/30.6059b3ba.css.gz similarity index 100% rename from frontend-dist/css/30.755fb9d7.css.gz rename to frontend-dist/css/30.6059b3ba.css.gz diff --git a/frontend-dist/css/331.12334816.css b/frontend-dist/css/331.12334816.css deleted file mode 100644 index b221468b..00000000 --- a/frontend-dist/css/331.12334816.css +++ /dev/null @@ -1 +0,0 @@ -.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important}.blocked-container[data-v-98114f90]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#dc2626);color:var(--text-color,#333)}.background-wrapper[data-v-98114f90]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.blocked-content[data-v-98114f90]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:hsla(0,0%,100%,.1);border-radius:20px;border:1px solid hsla(0,0%,100%,.2);box-shadow:none}.back-button-wrapper[data-v-98114f90]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-98114f90]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-98114f90]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.status-animation[data-v-98114f90]{margin-bottom:2rem;position:relative}.status-icon[data-v-98114f90]{position:relative;display:inline-block;margin-bottom:1rem}.ban-icon[data-v-98114f90]{font-size:4rem;color:#f56c6c;animation:shake-98114f90 2s ease-in-out infinite;filter:drop-shadow(0 0 20px rgba(245,108,108,.3))}.status-badge[data-v-98114f90]{position:absolute;bottom:-5px;right:-5px;background:#e6a23c;border-radius:50%;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:3px solid #fff;box-shadow:none}.exclamation-icon[data-v-98114f90]{color:#fff;font-size:.9rem;animation:bounce-98114f90 1.5s ease-in-out infinite}.status-info[data-v-98114f90]{animation:fadeInUp-98114f90 1s ease-out .5s both}.status-title[data-v-98114f90]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.status-description[data-v-98114f90]{font-size:1.1rem;line-height:1.6;margin-bottom:1rem;opacity:.9;color:var(--text-color,#333)}.status-description-en[data-v-98114f90]{font-size:.95rem;line-height:1.5;margin-bottom:2rem;opacity:.7;color:var(--text-color-secondary,#666);font-style:italic}.status-actions[data-v-98114f90]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-98114f90]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-98114f90]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-98114f90]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-98114f90]:hover{box-shadow:none}.btn-icon[data-v-98114f90]{margin-right:8px}.help-info[data-v-98114f90]{animation:fadeInUp-98114f90 1s ease-out 1s both;margin-bottom:1.5rem}.help-text[data-v-98114f90]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-98114f90]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-98114f90]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-98114f90]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.powered-by[data-v-98114f90]{animation:fadeInUp-98114f90 1s ease-out 1.2s both;padding-top:1rem;border-top:1px solid hsla(0,0%,100%,.2);opacity:.8}.powered-by p[data-v-98114f90]{margin:0;font-size:.85rem;color:var(--text-color-secondary,#666)}.project-link[data-v-98114f90]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:600;transition:all .3s ease}.project-link[data-v-98114f90]:hover{color:#67c23a;text-shadow:0 0 10px rgba(103,194,58,.3)}.floating-elements[data-v-98114f90]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-98114f90]{position:absolute;background:hsla(0,87%,69%,.1);border-radius:50%;animation:floatShapes-98114f90 8s ease-in-out infinite}.shape-1[data-v-98114f90]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-98114f90]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(230,162,60,.1)}.shape-3[data-v-98114f90]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-98114f90]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,100%,71%,.1)}.shape-5[data-v-98114f90]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(238,90,36,.1)}@keyframes shake-98114f90{0%,to{transform:rotate(0deg)}10%{transform:rotate(-3deg)}20%{transform:rotate(3deg)}30%{transform:rotate(-3deg)}40%{transform:rotate(3deg)}50%{transform:rotate(0deg)}}@keyframes bounce-98114f90{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-5px)}60%{transform:translateY(-3px)}}@keyframes floatShapes-98114f90{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-98114f90{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.blocked-content[data-v-98114f90]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-98114f90]{top:-20px;right:-20px}.ban-icon[data-v-98114f90]{font-size:3rem}.status-title[data-v-98114f90]{font-size:1.5rem}.status-description[data-v-98114f90]{font-size:1rem}.status-description-en[data-v-98114f90]{font-size:.9rem}.status-actions[data-v-98114f90]{flex-direction:column;align-items:center}.action-btn[data-v-98114f90]{width:200px}.quick-links[data-v-98114f90]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-98114f90]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}}@media (max-width:480px){.blocked-content[data-v-98114f90]{padding:1rem;margin:.5rem;max-width:calc(100% - 1rem)}.status-title[data-v-98114f90]{font-size:1.3rem}.status-description[data-v-98114f90]{font-size:.95rem}.status-description-en[data-v-98114f90]{font-size:.85rem}.ban-icon[data-v-98114f90]{font-size:2.5rem}}@media (prefers-color-scheme:dark){.blocked-container[data-v-98114f90]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.blocked-content[data-v-98114f90]{background:rgba(0,0,0,.2);border:1px solid hsla(0,0%,100%,.1)}.status-description[data-v-98114f90],.status-title[data-v-98114f90]{color:var(--text-color,#e4e7ed)}.help-text[data-v-98114f90],.powered-by p[data-v-98114f90],.status-description-en[data-v-98114f90]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/331.12334816.css.gz b/frontend-dist/css/331.12334816.css.gz deleted file mode 100644 index cbb64d1c..00000000 Binary files a/frontend-dist/css/331.12334816.css.gz and /dev/null differ diff --git a/frontend-dist/css/390.9faa139f.css b/frontend-dist/css/390.c7e1825f.css similarity index 100% rename from frontend-dist/css/390.9faa139f.css rename to frontend-dist/css/390.c7e1825f.css diff --git a/frontend-dist/css/390.9faa139f.css.gz b/frontend-dist/css/390.c7e1825f.css.gz similarity index 100% rename from frontend-dist/css/390.9faa139f.css.gz rename to frontend-dist/css/390.c7e1825f.css.gz diff --git a/frontend-dist/css/488.64e37d88.css b/frontend-dist/css/488.64e37d88.css deleted file mode 100644 index 93dec440..00000000 --- a/frontend-dist/css/488.64e37d88.css +++ /dev/null @@ -1 +0,0 @@ -.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)}.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))}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important}.login[data-v-5b07fe04]{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:100vh;height:auto;background:var(--admin-container-bg-color,var(--bg-color));overflow-y:auto;padding:20px 0;box-sizing:border-box;transition:height .35s ease-out,min-height .35s ease-out}.login-title[data-v-5b07fe04]{font-size:2.3rem;margin-bottom:15px;color:var(--login-title-color);font-family:Pacifico,Noto Sans SC,sans-serif;cursor:pointer;transition:all .3s ease;letter-spacing:2px}@media (max-width:768px){.login-title[data-v-5b07fe04]{font-size:1.5rem}}.login-title[data-v-5b07fe04]:focus,.login-title[data-v-5b07fe04]:hover{text-shadow:0 0 10px var(--login-title-glow-color,rgba(52,152,219,.5))}.login-container[data-v-5b07fe04]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:auto;height:auto;width:600px;border-radius:12px;box-shadow:var(--login-container-box-shadow);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);transition:all .3s ease;padding:40px 0;gap:20px;position:relative;z-index:101}@media (max-width:768px){.login-container[data-v-5b07fe04]{width:85vw;padding:25px 0;gap:12px}}.login-container[data-v-5b07fe04]:hover{box-shadow:var(--login-container-hover-box-shadow)}.input-container[data-v-5b07fe04]{display:flex;flex-direction:column;align-items:flex-start;width:80%;margin-bottom:15px;position:relative;gap:8px}@media (max-width:768px){.input-container[data-v-5b07fe04]{width:85%;gap:4px;margin-bottom:8px}}.input-wrapper[data-v-5b07fe04]{position:relative;width:100%;display:flex;flex-direction:column;transition:all .3s cubic-bezier(.4,0,.2,1)}.input-icon[data-v-5b07fe04]{margin-right:6px;font-size:1rem}.input-name[data-v-5b07fe04]{font-size:.95rem;font-weight:600;color:var(--login-title-color);text-align:left;transition:all .3s ease;letter-spacing:.5px;position:relative;display:flex;align-items:center;justify-content:flex-start;padding-left:2px}.input-name[data-v-5b07fe04]:after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:2px;background:var(--login-input-underline-color,#5b9bd3);transition:width .3s linear;border-radius:1px}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04]:after,.input-container:hover .input-name[data-v-5b07fe04]:after{width:var(--underline-width,50px)}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04],.input-container:hover .input-name[data-v-5b07fe04]{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.input-name[data-v-5b07fe04]{font-size:.85rem}}.submit[data-v-5b07fe04]{margin-bottom:10px;width:50%;height:48px;font-size:1.1rem;font-weight:600;letter-spacing:2px;border-radius:12px;background-color:var(--login-submit-btn-bg-color);transition:all .4s cubic-bezier(.4,0,.2,1);border:none;overflow:hidden;position:relative;padding:0;display:flex;justify-content:center;align-items:center}.submit.is-loading[data-v-5b07fe04]{width:48px;border-radius:50%;background-color:transparent!important;box-shadow:none!important;pointer-events:none}.loading-ring[data-v-5b07fe04]{display:inline-block;width:34px;height:34px;border:4px solid transparent;border-radius:50%;border-top-color:var(--login-title-color,#fff);animation:spin-5b07fe04 1s ease-in-out infinite;box-sizing:border-box}@keyframes spin-5b07fe04{to{transform:rotate(1turn)}}@media (max-width:768px){.submit[data-v-5b07fe04]{width:50%}}.submit[data-v-5b07fe04]:not(.is-loading):focus,.submit[data-v-5b07fe04]:not(.is-loading):hover{transform:scale(1.05);box-shadow:none}.submit[data-v-5b07fe04]:disabled{cursor:default;transform:none}.password-input[data-v-5b07fe04]{width:100%;height:50px;position:relative}.password-input[data-v-5b07fe04] .el-input__prefix{color:var(--login-input-icon-color,#59636e);font-size:1rem;transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__prefix{color:var(--login-input-label-focus-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper{border-radius:12px;background-color:var(--password-input-bg-color);border:1px solid var(--glass-border);box-shadow:none;padding:12px 16px;transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}.password-input[data-v-5b07fe04] .el-input__wrapper:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s}.password-input[data-v-5b07fe04] .el-input__wrapper:hover:before{left:100%}.password-input[data-v-5b07fe04] .el-input__wrapper:hover{box-shadow:none;border-color:var(--login-input-underline-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within{border-color:var(--login-input-underline-color,#5b9bd3);box-shadow:none}.password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,var(--login-input-text-color,#333));font-size:1rem;font-weight:500;background:transparent;border:none;box-shadow:none}.dark .password-input[data-v-5b07fe04] .el-input__inner,[data-theme=dark] .password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,#fff)!important}.password-input[data-v-5b07fe04] .el-input__inner::-moz-placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;-moz-transition:opacity .3s ease;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__inner::placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::-moz-placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__suffix{color:var(--icon-color,#666)}.password-input[data-v-5b07fe04] .el-input__suffix-inner{transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:hover .el-input__suffix-inner{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.password-input[data-v-5b07fe04]{width:100%;height:40px}.password-input[data-v-5b07fe04] .el-input__wrapper{padding:8px 12px}}.footer[data-v-5b07fe04]{position:fixed;bottom:0;width:100vw}.toggle-dark[data-v-5b07fe04]{position:fixed;top:30px;right:30px;border:1px solid #d9dce2;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px}html.dark .toggle-dark[data-v-5b07fe04]{border:1px solid #34343a}.toggle-dark[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04]{position:fixed;top:30px;right:80px;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border:1px solid #d9dce2;border-radius:12px;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;z-index:100}html.dark .language-switcher[data-v-5b07fe04]{border:1px solid #34343a}@media (max-width:768px){.language-switcher[data-v-5b07fe04]{width:2rem;height:2rem}}.language-switcher[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .language-switcher[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04],.toggle-dark[data-v-5b07fe04]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)} \ No newline at end of file diff --git a/frontend-dist/css/488.64e37d88.css.gz b/frontend-dist/css/488.64e37d88.css.gz deleted file mode 100644 index 85f4ddec..00000000 Binary files a/frontend-dist/css/488.64e37d88.css.gz and /dev/null differ diff --git a/frontend-dist/css/488.be127f60.css b/frontend-dist/css/488.be127f60.css new file mode 100644 index 00000000..72f6b522 --- /dev/null +++ b/frontend-dist/css/488.be127f60.css @@ -0,0 +1 @@ +.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)}.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))}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important}.login[data-v-5b07fe04]{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:100vh;height:auto;background:var(--admin-container-bg-color,var(--bg-color));overflow-y:auto;padding:20px 0;box-sizing:border-box;transition:height .35s ease-out,min-height .35s ease-out}.login-title[data-v-5b07fe04]{font-size:2.3rem;margin-bottom:15px;color:var(--login-title-color);font-family:Pacifico,Noto Sans SC,sans-serif;cursor:pointer;transition:all .3s ease;letter-spacing:2px}@media (max-width:768px){.login-title[data-v-5b07fe04]{font-size:1.5rem}}.login-title[data-v-5b07fe04]:focus,.login-title[data-v-5b07fe04]:hover{text-shadow:0 0 10px var(--login-title-glow-color,rgba(52,152,219,.5))}.login-container[data-v-5b07fe04]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:auto;height:auto;width:600px;border-radius:12px;box-shadow:var(--login-container-box-shadow);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);transition:all .3s ease;padding:40px 0;gap:20px;position:relative;z-index:101}@media (max-width:768px){.login-container[data-v-5b07fe04]{width:85vw;padding:25px 0;gap:12px}}.login-container[data-v-5b07fe04]:hover{box-shadow:var(--login-container-hover-box-shadow)}.input-container[data-v-5b07fe04]{display:flex;flex-direction:column;align-items:flex-start;width:80%;margin-bottom:15px;position:relative;gap:8px}@media (max-width:768px){.input-container[data-v-5b07fe04]{width:85%;gap:4px;margin-bottom:8px}}.input-wrapper[data-v-5b07fe04]{position:relative;width:100%;display:flex;flex-direction:column;transition:all .3s cubic-bezier(.4,0,.2,1)}.input-icon[data-v-5b07fe04]{margin-right:6px;font-size:1rem}.input-name[data-v-5b07fe04]{font-size:.95rem;font-weight:600;color:var(--login-title-color);text-align:left;transition:all .3s ease;letter-spacing:.5px;position:relative;display:flex;align-items:center;justify-content:flex-start;padding-left:2px}.input-name[data-v-5b07fe04]:after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:2px;background:var(--login-input-underline-color,#5b9bd3);transition:width .3s linear;border-radius:1px}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04]:after,.input-container:hover .input-name[data-v-5b07fe04]:after{width:var(--underline-width,50px)}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04],.input-container:hover .input-name[data-v-5b07fe04]{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.input-name[data-v-5b07fe04]{font-size:.85rem}}.submit[data-v-5b07fe04]{margin-bottom:10px;width:50%;height:48px;font-size:1.1rem;font-weight:600;letter-spacing:2px;border-radius:12px;background-color:var(--login-submit-btn-bg-color);transition:all .4s cubic-bezier(.4,0,.2,1);border:none;overflow:hidden;position:relative;padding:0;display:flex;justify-content:center;align-items:center}.submit.is-loading[data-v-5b07fe04]{width:48px;border-radius:50%;background-color:transparent!important;box-shadow:none!important;pointer-events:none}.loading-ring[data-v-5b07fe04]{display:inline-block;width:34px;height:34px;border:4px solid transparent;border-radius:50%;border-top-color:var(--login-title-color,#fff);animation:spin-5b07fe04 1s ease-in-out infinite;box-sizing:border-box}@keyframes spin-5b07fe04{to{transform:rotate(1turn)}}@media (max-width:768px){.submit[data-v-5b07fe04]{width:50%}}.submit[data-v-5b07fe04]:not(.is-loading):focus,.submit[data-v-5b07fe04]:not(.is-loading):hover{transform:scale(1.05);box-shadow:none}.submit[data-v-5b07fe04]:disabled{cursor:default;transform:none}.password-input[data-v-5b07fe04]{width:100%;height:50px;position:relative}.password-input[data-v-5b07fe04] .el-input__prefix{color:var(--login-input-icon-color,#59636e);font-size:1rem;transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__prefix{color:var(--login-input-label-focus-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper{border-radius:12px;background-color:var(--password-input-bg-color);border:1px solid var(--glass-border);box-shadow:none;padding:12px 16px;transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}.password-input[data-v-5b07fe04] .el-input__wrapper:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s}.password-input[data-v-5b07fe04] .el-input__wrapper:hover:before{left:100%}.password-input[data-v-5b07fe04] .el-input__wrapper:hover{box-shadow:none;border-color:var(--login-input-underline-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within{border-color:var(--login-input-underline-color,#5b9bd3);box-shadow:none}.password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,var(--login-input-text-color,#333));font-size:1rem;font-weight:500;background:transparent;border:none;box-shadow:none}.dark .password-input[data-v-5b07fe04] .el-input__inner,[data-theme=dark] .password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,#fff)!important}.password-input[data-v-5b07fe04] .el-input__inner::-moz-placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;-moz-transition:opacity .3s ease;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__inner::placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::-moz-placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__suffix{color:var(--icon-color,#666)}.password-input[data-v-5b07fe04] .el-input__suffix-inner{transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:hover .el-input__suffix-inner{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.password-input[data-v-5b07fe04]{width:100%;height:40px}.password-input[data-v-5b07fe04] .el-input__wrapper{padding:8px 12px}}.footer[data-v-5b07fe04]{position:fixed;bottom:0;width:100vw}.toggle-dark[data-v-5b07fe04]{position:fixed;top:30px;right:30px;border:1px solid #d9dce2;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px}html.dark .toggle-dark[data-v-5b07fe04]{border:1px solid #34343a}.toggle-dark[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04]{position:fixed;top:30px;right:80px;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border:1px solid #d9dce2;border-radius:12px;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;z-index:100}html.dark .language-switcher[data-v-5b07fe04]{border:1px solid #34343a}@media (max-width:768px){.language-switcher[data-v-5b07fe04]{width:2rem;height:2rem}}.language-switcher[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .language-switcher[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04],.toggle-dark[data-v-5b07fe04]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)} \ No newline at end of file diff --git a/frontend-dist/css/488.be127f60.css.gz b/frontend-dist/css/488.be127f60.css.gz new file mode 100644 index 00000000..1d985a00 Binary files /dev/null and b/frontend-dist/css/488.be127f60.css.gz differ diff --git a/frontend-dist/css/647.4c84bc35.css.gz b/frontend-dist/css/647.4c84bc35.css.gz deleted file mode 100644 index a992a6db..00000000 Binary files a/frontend-dist/css/647.4c84bc35.css.gz and /dev/null differ diff --git a/frontend-dist/css/711.b4e5e6b5.css b/frontend-dist/css/711.b4e5e6b5.css new file mode 100644 index 00000000..8cea7e76 --- /dev/null +++ b/frontend-dist/css/711.b4e5e6b5.css @@ -0,0 +1 @@ +.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important}.blocked-container[data-v-690a9bec]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#dc2626);color:var(--text-color,#333)}.background-wrapper[data-v-690a9bec]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.blocked-content[data-v-690a9bec]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:20px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.back-button-wrapper[data-v-690a9bec]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-690a9bec]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-690a9bec]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.status-animation[data-v-690a9bec]{margin-bottom:2rem;position:relative}.status-icon[data-v-690a9bec]{position:relative;display:inline-block;margin-bottom:1rem}.ban-icon[data-v-690a9bec]{font-size:4rem;color:#f56c6c;animation:shake-690a9bec 2s ease-in-out infinite;filter:drop-shadow(0 0 20px rgba(245,108,108,.3))}.status-badge[data-v-690a9bec]{position:absolute;bottom:-5px;right:-5px;background:#e6a23c;border-radius:50%;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:3px solid #fff;box-shadow:none}.exclamation-icon[data-v-690a9bec]{color:#fff;font-size:.9rem;animation:bounce-690a9bec 1.5s ease-in-out infinite}.status-info[data-v-690a9bec]{animation:fadeInUp-690a9bec 1s ease-out .5s both}.status-title[data-v-690a9bec]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.status-description[data-v-690a9bec]{font-size:1.1rem;line-height:1.6;margin-bottom:1rem;opacity:.9;color:var(--text-color,#333)}.status-description-en[data-v-690a9bec]{font-size:.95rem;line-height:1.5;margin-bottom:2rem;opacity:.7;color:var(--text-color-secondary,#666);font-style:italic}.status-actions[data-v-690a9bec]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-690a9bec]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-690a9bec]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-690a9bec]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-690a9bec]:hover{box-shadow:none}.btn-icon[data-v-690a9bec]{margin-right:8px}.help-info[data-v-690a9bec]{animation:fadeInUp-690a9bec 1s ease-out 1s both;margin-bottom:1.5rem}.help-text[data-v-690a9bec]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-690a9bec]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-690a9bec]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-690a9bec]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.powered-by[data-v-690a9bec]{animation:fadeInUp-690a9bec 1s ease-out 1.2s both;padding-top:1rem;border-top:1px solid hsla(0,0%,100%,.2);opacity:.8}.powered-by p[data-v-690a9bec]{margin:0;font-size:.85rem;color:var(--text-color-secondary,#666)}.project-link[data-v-690a9bec]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:600;transition:all .3s ease}.project-link[data-v-690a9bec]:hover{color:#67c23a;text-shadow:0 0 10px rgba(103,194,58,.3)}.floating-elements[data-v-690a9bec]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-690a9bec]{position:absolute;background:hsla(0,87%,69%,.1);border-radius:50%;animation:floatShapes-690a9bec 8s ease-in-out infinite}.shape-1[data-v-690a9bec]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-690a9bec]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(230,162,60,.1)}.shape-3[data-v-690a9bec]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-690a9bec]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,100%,71%,.1)}.shape-5[data-v-690a9bec]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(238,90,36,.1)}@keyframes shake-690a9bec{0%,to{transform:rotate(0deg)}10%{transform:rotate(-3deg)}20%{transform:rotate(3deg)}30%{transform:rotate(-3deg)}40%{transform:rotate(3deg)}50%{transform:rotate(0deg)}}@keyframes bounce-690a9bec{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-5px)}60%{transform:translateY(-3px)}}@keyframes floatShapes-690a9bec{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-690a9bec{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.blocked-content[data-v-690a9bec]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-690a9bec]{top:-20px;right:-20px}.ban-icon[data-v-690a9bec]{font-size:3rem}.status-title[data-v-690a9bec]{font-size:1.5rem}.status-description[data-v-690a9bec]{font-size:1rem}.status-description-en[data-v-690a9bec]{font-size:.9rem}.status-actions[data-v-690a9bec]{flex-direction:column;align-items:center}.action-btn[data-v-690a9bec]{width:200px}.quick-links[data-v-690a9bec]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-690a9bec]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}}@media (max-width:480px){.blocked-content[data-v-690a9bec]{padding:1rem;margin:.5rem;max-width:calc(100% - 1rem)}.status-title[data-v-690a9bec]{font-size:1.3rem}.status-description[data-v-690a9bec]{font-size:.95rem}.status-description-en[data-v-690a9bec]{font-size:.85rem}.ban-icon[data-v-690a9bec]{font-size:2.5rem}}@media (prefers-color-scheme:dark){.blocked-container[data-v-690a9bec]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.status-description[data-v-690a9bec],.status-title[data-v-690a9bec]{color:var(--text-color,#e4e7ed)}.help-text[data-v-690a9bec],.powered-by p[data-v-690a9bec],.status-description-en[data-v-690a9bec]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/711.b4e5e6b5.css.gz b/frontend-dist/css/711.b4e5e6b5.css.gz new file mode 100644 index 00000000..9fb3c360 Binary files /dev/null and b/frontend-dist/css/711.b4e5e6b5.css.gz differ diff --git a/frontend-dist/css/713.0bba8175.css b/frontend-dist/css/713.0bba8175.css new file mode 100644 index 00000000..da45955d --- /dev/null +++ b/frontend-dist/css/713.0bba8175.css @@ -0,0 +1 @@ +.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important}.not-found-container[data-v-d1154f66]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#6366f1);color:var(--text-color,#333)}.background-wrapper[data-v-d1154f66]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.not-found-content[data-v-d1154f66]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:var(--glass-bg);backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:20px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.back-button-wrapper[data-v-d1154f66]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-d1154f66]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-d1154f66]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.error-animation[data-v-d1154f66]{margin-bottom:2rem;position:relative}.error-number[data-v-d1154f66]{font-size:6rem;font-weight:900;display:flex;justify-content:center;align-items:center;gap:.5rem;margin-bottom:1rem;text-shadow:0 0 20px rgba(0,0,0,.3);color:var(--primary-color,#2563eb)}.error-number span[data-v-d1154f66]{display:inline-block;animation:bounce-d1154f66 2s infinite;color:var(--not-found-title-text-color,#2563eb)}.error-number .four[data-v-d1154f66]:first-child{animation-delay:-.5s}.error-number .zero[data-v-d1154f66]{animation-delay:-.25s;color:#f56c6c;-webkit-text-fill-color:#f56c6c}.error-number .four[data-v-d1154f66]:last-child{animation-delay:0s}.error-image[data-v-d1154f66]{display:flex;justify-content:center;margin:1.5rem 0}.floating-image[data-v-d1154f66]{width:100px;height:100px;-o-object-fit:contain;object-fit:contain;animation:float-d1154f66 3s ease-in-out infinite;filter:drop-shadow(0 10px 20px rgba(0,0,0,.2));border-radius:20px;background:hsla(0,0%,100%,.1);padding:10px;border:1px solid hsla(0,0%,100%,.2)}.error-info[data-v-d1154f66]{animation:fadeInUp-d1154f66 1s ease-out .5s both}.error-title[data-v-d1154f66]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.error-description[data-v-d1154f66]{font-size:1.1rem;line-height:1.6;margin-bottom:2rem;opacity:.8;color:var(--text-color-secondary,#666)}.error-actions[data-v-d1154f66]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-d1154f66]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-d1154f66]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-d1154f66]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-d1154f66]:hover{box-shadow:none}.btn-icon[data-v-d1154f66]{margin-right:8px}.help-links[data-v-d1154f66]{animation:fadeInUp-d1154f66 1s ease-out 1s both}.help-text[data-v-d1154f66]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-d1154f66]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-d1154f66]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-d1154f66]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.floating-elements[data-v-d1154f66]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-d1154f66]{position:absolute;background:rgba(37,99,235,.1);border-radius:50%;animation:floatShapes-d1154f66 8s ease-in-out infinite}.shape-1[data-v-d1154f66]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-d1154f66]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(103,194,58,.1)}.shape-3[data-v-d1154f66]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-d1154f66]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,87%,69%,.1)}.shape-5[data-v-d1154f66]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(230,162,60,.1)}@keyframes bounce-d1154f66{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-15px)}60%{transform:translateY(-8px)}}@keyframes float-d1154f66{0%,to{transform:translateY(0) rotate(0deg)}50%{transform:translateY(-15px) rotate(5deg)}}@keyframes floatShapes-d1154f66{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-d1154f66{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.not-found-content[data-v-d1154f66]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-d1154f66]{top:-20px;right:-20px}.error-number[data-v-d1154f66]{font-size:4rem;gap:.3rem}.error-title[data-v-d1154f66]{font-size:1.5rem}.error-description[data-v-d1154f66]{font-size:1rem}.error-actions[data-v-d1154f66]{flex-direction:column;align-items:center}.action-btn[data-v-d1154f66]{width:200px}.quick-links[data-v-d1154f66]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-d1154f66]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}.floating-image[data-v-d1154f66]{width:80px;height:80px;border-radius:15px;padding:8px}}@media (prefers-color-scheme:dark){.not-found-container[data-v-d1154f66]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.error-title[data-v-d1154f66]{color:var(--text-color,#e4e7ed)}.error-description[data-v-d1154f66],.help-text[data-v-d1154f66]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/713.0bba8175.css.gz b/frontend-dist/css/713.0bba8175.css.gz new file mode 100644 index 00000000..48aacbad Binary files /dev/null and b/frontend-dist/css/713.0bba8175.css.gz differ diff --git a/frontend-dist/css/647.4c84bc35.css b/frontend-dist/css/784.e670981c.css similarity index 68% rename from frontend-dist/css/647.4c84bc35.css rename to frontend-dist/css/784.e670981c.css index 72f02978..aa7d0e9d 100644 --- a/frontend-dist/css/647.4c84bc35.css +++ b/frontend-dist/css/784.e670981c.css @@ -1 +1 @@ -.sidebar-container[data-v-ed65892c]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);border:1px solid #d9dce2;border-radius:16px;box-shadow:none;transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-ed65892c]{width:56px}html.dark .sidebar-container[data-v-ed65892c]{background:rgba(22,22,24,.75);border:1px solid #34343a;box-shadow:none}.sidebar-container[data-v-ed65892c]:hover,html.dark .sidebar-container[data-v-ed65892c]:hover{box-shadow:none}.menu-list[data-v-ed65892c]{padding:8px}.menu-item[data-v-ed65892c]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-ed65892c]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-ed65892c]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-ed65892c]{background:rgba(37,99,235,.2);color:#2563eb}html.dark .menu-item.is-active[data-v-ed65892c]{background:rgba(37,99,235,.3);color:var(--el-text-color-primary)}.menu-icon[data-v-ed65892c]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-ed65892c]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-ed65892c]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-ed65892c]{padding:12px;text-align:center;cursor:pointer;border-top:1px solid rgba(0,0,0,.08);transition:all .2s ease;color:var(--admin-container-color,#333)}html.dark .toggle-button[data-v-ed65892c]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-ed65892c]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-ed65892c]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-ed65892c]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-ed65892c]{width:50px}.menu-icon[data-v-ed65892c]{width:34px;min-width:34px}}.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%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.date-range-calendar[data-v-715da8c8]{width:min(336px,100%);max-width:100%;min-width:0;box-sizing:border-box;color:var(--admin-container-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.selected-range[data-v-715da8c8]{margin-bottom:16px}.selected-range-inputs[data-v-715da8c8]{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px}.date-input[data-v-715da8c8]{width:100%;min-width:0;height:34px;box-sizing:border-box;border:1px solid var(--glass-border);border-radius:8px;padding:0 8px;background:var(--glass-bg);color:var(--admin-container-color);font-size:13px;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.date-input[data-v-715da8c8]:focus,.date-input[data-v-715da8c8]:hover{border-color:var(--el-color-primary);box-shadow:none}.date-range-separator[data-v-715da8c8]{color:#59636e;font-size:12px;font-weight:700}.calendar-header[data-v-715da8c8]{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;margin-bottom:14px}.calendar-title[data-v-715da8c8]{text-align:center;font-size:16px;font-weight:700}.calendar-nav[data-v-715da8c8]{width:36px;height:36px;border:1px solid var(--glass-border);border-radius:50%;background:var(--glass-bg);color:var(--admin-container-color);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.calendar-nav[data-v-715da8c8]:focus,.calendar-nav[data-v-715da8c8]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:rgba(37,99,235,.08);box-shadow:none}.calendar-grid[data-v-715da8c8],.calendar-weekdays[data-v-715da8c8]{display:grid;grid-template-columns:repeat(7,1fr)}.calendar-weekdays[data-v-715da8c8]{margin-bottom:8px;color:#59636e;font-size:12px;font-weight:600;text-align:center}.calendar-weekdays span[data-v-715da8c8]{height:24px;line-height:24px}.calendar-grid[data-v-715da8c8]{gap:4px}.calendar-day[data-v-715da8c8]{position:relative;width:38px;height:38px;box-sizing:border-box;justify-self:center;padding:0;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--admin-container-color);font-size:14px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .18s ease,background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.calendar-day[data-v-715da8c8]:focus,.calendar-day[data-v-715da8c8]:hover{border-color:rgba(37,99,235,.45);background:rgba(37,99,235,.1);color:var(--el-color-primary)}.calendar-day.is-muted[data-v-715da8c8]{color:#86909c;opacity:.62}.calendar-day.is-today[data-v-715da8c8]{border-color:rgba(249,115,22,.7)}.calendar-day.is-in-range[data-v-715da8c8]{border-radius:12px;background:rgba(37,99,235,.12);color:var(--el-color-primary)}.calendar-day.is-range-end[data-v-715da8c8],.calendar-day.is-range-start[data-v-715da8c8]{background:var(--el-color-primary);border-color:var(--el-color-primary);color:#fff;box-shadow:none}html.dark .calendar-weekdays[data-v-715da8c8]{color:#a1a1aa}html.dark .calendar-day.is-muted[data-v-715da8c8]{color:#737b88}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.status-panel[data-v-6b0a5e1a]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.card-icon[data-v-6b0a5e1a]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:#2563eb;color:#fff}.card-content[data-v-6b0a5e1a]{flex:1}.card-title[data-v-6b0a5e1a]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-6b0a5e1a]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-6b0a5e1a]{font-size:11px;color:#59636e;margin-top:4px;opacity:.8}.charts-section[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-bottom:30px;overflow:visible}@media (max-width:768px){.charts-section[data-v-6b0a5e1a]{grid-template-columns:1fr}}.chart-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.chart-card[data-v-6b0a5e1a],.chart-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.chart-card[data-v-6b0a5e1a],.chart-content[data-v-6b0a5e1a],.pie-chart-container[data-v-6b0a5e1a],.pie-chart-wrapper[data-v-6b0a5e1a]{overflow:visible}.chart-header[data-v-6b0a5e1a]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.chart-header .fa-icon[data-v-6b0a5e1a]{margin-right:10px;color:var(--admin-purple)}.trend-chart-card[data-v-6b0a5e1a]{grid-column:1/-1}.trend-chart-header[data-v-6b0a5e1a]{justify-content:space-between;gap:14px;flex-wrap:wrap}.chart-title[data-v-6b0a5e1a]{display:flex;align-items:center;gap:8px}.trend-controls[data-v-6b0a5e1a]{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}.trend-calendar-btn[data-v-6b0a5e1a]{width:32px;min-width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;color:var(--admin-container-color);background:var(--glass-bg);border:1px solid var(--glass-border)}.trend-calendar-btn[data-v-6b0a5e1a]:hover{color:var(--el-color-primary);border-color:var(--glass-border);background:var(--glass-bg);box-shadow:none}.trend-date-dialog[data-v-6b0a5e1a]{overflow:visible;max-width:calc(100vw - 32px);box-sizing:border-box}.trend-date-dialog[data-v-6b0a5e1a] .el-dialog__body{overflow:visible;padding:16px 24px 24px}.trend-date-panel[data-v-6b0a5e1a]{width:100%;max-width:100%;min-width:0;box-sizing:border-box;display:flex;justify-content:center;overflow:hidden}.trend-group-switch[data-v-6b0a5e1a]{flex-shrink:0;height:32px;display:flex}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button__inner{height:32px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0 14px}.chart-content.trend-chart-content[data-v-6b0a5e1a]{min-height:320px;padding:0;margin:0;min-width:0;max-width:100%;overflow:hidden}.line-chart-wrapper[data-v-6b0a5e1a]{position:relative;width:100%;max-width:100%;min-width:0;height:320px;overflow:hidden}.line-chart-wrapper[data-v-6b0a5e1a] canvas{display:block;width:100%!important;max-width:100%!important}.trend-empty-state[data-v-6b0a5e1a]{height:320px}.chart-content[data-v-6b0a5e1a]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-6b0a5e1a]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#59636e;font-size:14px}.empty-state .fa-icon[data-v-6b0a5e1a]{font-size:32px;margin-bottom:10px}.stats-list[data-v-6b0a5e1a]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-6b0a5e1a]{display:flex;align-items:center;gap:12px}.stats-label[data-v-6b0a5e1a]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-6b0a5e1a]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-6b0a5e1a]{height:100%;background:#6366f1;border-radius:4px;transition:width .6s ease}.type-fill[data-v-6b0a5e1a]{background:#16a34a}.stats-value[data-v-6b0a5e1a]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-6b0a5e1a]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-6b0a5e1a]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-6b0a5e1a]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-6b0a5e1a]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-6b0a5e1a]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-6b0a5e1a]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-6b0a5e1a]{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(0,0,0,.03);border:1px solid var(--glass-border);border-radius:8px}.legend-item[data-v-6b0a5e1a]:hover{background:rgba(0,0,0,.03)}html.dark .legend-item[data-v-6b0a5e1a],html.dark .legend-item[data-v-6b0a5e1a]:hover{background:hsla(0,0%,100%,.05)}.legend-color[data-v-6b0a5e1a]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-6b0a5e1a]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-6b0a5e1a]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-6b0a5e1a]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-6b0a5e1a]{margin-bottom:30px}.action-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.action-card[data-v-6b0a5e1a],.action-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.action-card[data-v-6b0a5e1a],.chart-card[data-v-6b0a5e1a],.overview-card[data-v-6b0a5e1a]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.action-header[data-v-6b0a5e1a]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-header .fa-icon[data-v-6b0a5e1a]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-6b0a5e1a]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-6b0a5e1a]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-6b0a5e1a]{border-radius:10px;padding:12px 24px;margin-left:0;font-weight:500;font-size:14px;transition:background-color .2s ease,border-color .2s ease,color .2s ease;min-width:150px;width:150px;height:48px;box-shadow:none}@media (max-width:768px){.action-btn[data-v-6b0a5e1a]{flex:1;width:auto;min-width:0;height:auto}}.action-btn .fa-icon[data-v-6b0a5e1a]{margin-right:8px;font-size:14px}.rebuild-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#2563eb}.rebuild-btn[data-v-6b0a5e1a]:hover{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}.backup-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#16a34a}.backup-btn[data-v-6b0a5e1a]:hover{background:#f0fdf4;border-color:#86efac;color:#15803d}.restore-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#d97706}.restore-btn[data-v-6b0a5e1a]:hover{background:#fffbeb;border-color:#fcd34d;color:#b45309}.dark .rebuild-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#60a5fa}.dark .rebuild-btn[data-v-6b0a5e1a]:hover{background:rgba(59,130,246,.12);border-color:rgba(96,165,250,.4);color:#93c5fd}.dark .backup-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#4ade80}.dark .backup-btn[data-v-6b0a5e1a]:hover{background:rgba(34,197,94,.12);border-color:rgba(74,222,128,.4);color:#86efac}.dark .restore-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#fbbf24}.dark .restore-btn[data-v-6b0a5e1a]:hover{background:rgba(251,191,36,.12);border-color:rgba(251,191,36,.4);color:#fcd34d}.restore-section[data-v-6b0a5e1a]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-6b0a5e1a],.action-buttons>.restore-section[data-v-6b0a5e1a],.restore-section[data-v-6b0a5e1a]{flex:1;width:100%}.action-btn[data-v-6b0a5e1a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-6b0a5e1a]{position:relative;background:var(--glass-bg);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-6b0a5e1a]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-6b0a5e1a],.card-bg-media[data-v-6b0a5e1a] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-6b0a5e1a] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-6b0a5e1a]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-6b0a5e1a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-6b0a5e1a]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.5) 0,rgba(0,0,0,.2) 55%,transparent);z-index:2}.file-card-header .fa-icon[data-v-6b0a5e1a]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-6b0a5e1a]{color:#f59e0b}.info-card-footer[data-v-6b0a5e1a]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.55) 0,rgba(0,0,0,.25) 50%,transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-6b0a5e1a]{font-size:14px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.info-card-footer .file-meta[data-v-6b0a5e1a]{font-size:12px;color:#fafafa;text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-6b0a5e1a]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-6b0a5e1a]{height:450px}}.file-info-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.file-info-card:hover .card-bg-media[data-v-6b0a5e1a]{transform:scale(1)}@media (max-width:768px){.status-panel[data-v-6b0a5e1a]{padding:15px}.charts-section[data-v-6b0a5e1a],.overview-cards[data-v-6b0a5e1a]{grid-template-columns:1fr;gap:15px}.trend-chart-header[data-v-6b0a5e1a]{align-items:stretch}.chart-title[data-v-6b0a5e1a]{width:100%}.trend-controls[data-v-6b0a5e1a]{width:100%;justify-content:stretch}.trend-date-dialog[data-v-6b0a5e1a] .el-dialog__body{padding:12px 14px 18px}.trend-group-switch[data-v-6b0a5e1a]{width:100%}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button{flex:1}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button__inner{width:100%;padding:0 10px}.line-chart-wrapper[data-v-6b0a5e1a],.trend-empty-state[data-v-6b0a5e1a]{height:280px}.file-info-section[data-v-6b0a5e1a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-6b0a5e1a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-6b0a5e1a]{font-size:24px}.action-buttons[data-v-6b0a5e1a]{flex-direction:column;gap:12px}.action-btn[data-v-6b0a5e1a]{width:100%;min-width:unset}}.stats-fill[data-v-6b0a5e1a]{animation:fillAnimation-6b0a5e1a 1s ease-out}@keyframes fillAnimation-6b0a5e1a{0%{width:0}}.progress-container[data-v-6b0a5e1a]{width:100%;padding:20px;text-align:center}.progress-header[data-v-6b0a5e1a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-6b0a5e1a]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-6b0a5e1a]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-6b0a5e1a]{margin-bottom:16px}.progress-bar[data-v-6b0a5e1a] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-6b0a5e1a] .el-progress-bar__inner{background:#6366f1;border-radius:6px;transition:width .3s ease}.progress-details[data-v-6b0a5e1a]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-6b0a5e1a],.progress-time[data-v-6b0a5e1a]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-6b0a5e1a],.progress-time .fa-icon[data-v-6b0a5e1a]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-6b0a5e1a]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-6b0a5e1a]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-6b0a5e1a]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);box-shadow:none}.cancel-btn .fa-icon[data-v-6b0a5e1a]{margin-right:8px}.error-container[data-v-6b0a5e1a]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-6b0a5e1a]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-6b0a5e1a]{text-align:center}.error-message[data-v-6b0a5e1a]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-6b0a5e1a]{font-size:13px;color:#666}.error-actions[data-v-6b0a5e1a]{display:flex;gap:12px}.error-actions .el-button[data-v-6b0a5e1a]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-6b0a5e1a]{background:#6366f1;border:none;color:#fff}.error-actions .el-button--primary[data-v-6b0a5e1a]:hover{background:#4f46e5;box-shadow:none}.error-actions .el-button--default[data-v-6b0a5e1a]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-6b0a5e1a]:hover{background:hsla(0,0%,100%,.15);border-color:#4a4a52;box-shadow:none}.error-actions .fa-icon[data-v-6b0a5e1a]{margin-right:8px}html.dark .progress-count[data-v-6b0a5e1a],html.dark .progress-time[data-v-6b0a5e1a]{color:#aaa}html.dark .progress-message[data-v-6b0a5e1a]{color:#999}html.dark .error-container[data-v-6b0a5e1a]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-6b0a5e1a]{color:#aaa}@media (max-width:768px){.error-container[data-v-6b0a5e1a],.progress-container[data-v-6b0a5e1a]{padding:16px}.progress-header[data-v-6b0a5e1a]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-6b0a5e1a]{flex-direction:column;gap:8px}.error-actions[data-v-6b0a5e1a]{flex-direction:column;width:100%}.error-actions .el-button[data-v-6b0a5e1a]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-input-number{display:inline-flex}.el-input-number{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}.channel-icon-wrapper[data-v-33933ada]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-33933ada] svg,.channel-svg-icon[data-v-33933ada]{width:1em;height:1em;fill:currentColor}.custom-select[data-v-3554ed88]{position:relative}.custom-select-trigger[data-v-3554ed88]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:hsla(0,0%,100%,.72);border:1px solid #d9dce2;border-radius:8px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease;box-sizing:border-box}html.dark .custom-select-trigger[data-v-3554ed88]{background:rgba(22,22,24,.75);border:1px solid #34343a}.custom-select-trigger[data-v-3554ed88]:hover{background:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .custom-select-trigger[data-v-3554ed88]:hover{background:rgba(22,22,24,.88);border-color:#4a4a52}.custom-select.is-open .custom-select-trigger[data-v-3554ed88]{border-color:var(--el-color-primary)}.custom-select-value[data-v-3554ed88]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-3554ed88],.custom-select-value.is-placeholder[data-v-3554ed88]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-3554ed88]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-3554ed88]{transform:rotate(180deg)}.custom-select-dropdown[data-v-3554ed88]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:hsla(0,0%,100%,.88);border:1px solid #d9dce2;border-radius:8px;box-shadow:none;z-index:2000;overflow:hidden}html.dark .custom-select-dropdown[data-v-3554ed88]{background:rgba(22,22,24,.9);border:1px solid #34343a}.custom-select-option[data-v-3554ed88]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-3554ed88]:hover{background:rgba(0,0,0,.04)}html.dark .custom-select-option[data-v-3554ed88]:hover{background:hsla(0,0%,100%,.08);color:var(--el-text-color-primary)}.custom-select-option.is-selected[data-v-3554ed88]{color:var(--el-color-primary);font-weight:500}html.dark .custom-select-option.is-selected[data-v-3554ed88]{background:rgba(74,93,155,.38);color:#fff;font-weight:600}html.dark .custom-select-option.is-selected[data-v-3554ed88]:hover{background:rgba(94,115,181,.48);color:#fff}.option-icon[data-v-3554ed88]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-3554ed88],.dropdown-fade-leave-active[data-v-3554ed88]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-3554ed88],.dropdown-fade-leave-to[data-v-3554ed88]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-68503f89]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-68503f89]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-68503f89]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.inline-warning-icon[data-v-68503f89]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-warning-icon[data-v-68503f89]:hover{color:var(--el-color-primary)}.inline-help-icon[data-v-68503f89]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-help-icon[data-v-68503f89]:hover{color:var(--el-color-primary)}.add-btn[data-v-68503f89]{border-radius:8px;background-color:rgba(37,99,235,.9)!important;border-color:rgba(37,99,235,.9)!important;color:#fff!important;transition:background-color .2s ease,border-color .2s ease}html.dark .add-btn[data-v-68503f89]{background-color:rgba(59,130,246,.9)!important;border-color:rgba(59,130,246,.9)!important}.add-btn[data-v-68503f89]:hover{background-color:rgba(37,99,235,.78)!important;border-color:rgba(37,99,235,.78)!important}html.dark .add-btn[data-v-68503f89]:hover{background-color:rgba(59,130,246,.78)!important;border-color:rgba(59,130,246,.78)!important}.header-actions[data-v-68503f89]{display:flex;gap:12px}.header-actions[data-v-68503f89] .el-button{border-radius:8px}.channel-group[data-v-68503f89]{margin-bottom:32px;background:var(--glass-bg);border-radius:16px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow)}.group-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-68503f89]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-68503f89]{font-size:20px;color:var(--el-color-primary)}.channel-count[data-v-68503f89]{font-size:12px}.load-balance-switch[data-v-68503f89]{display:flex;align-items:center;gap:8px}.switch-label[data-v-68503f89]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-68503f89]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-68503f89]{background:var(--glass-bg);border-radius:10px;border:1px solid var(--glass-border);overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:var(--glass-shadow)}.channel-card[data-v-68503f89],.channel-group[data-v-68503f89]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.card-glow[data-v-68503f89]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-68503f89]:hover{border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.channel-card.disabled[data-v-68503f89]{opacity:.6;background:var(--el-fill-color-lighter)}.card-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-68503f89]{display:flex;align-items:center;gap:8px}.channel-name[data-v-68503f89]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-68503f89]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-68503f89]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-68503f89]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-68503f89]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-68503f89]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-68503f89]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-68503f89] .el-progress{margin-bottom:4px}.quota-text[data-v-68503f89]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-68503f89]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-68503f89]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-68503f89]{font-size:32px}.channel-warning[data-v-68503f89]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.channel-type-option[data-v-68503f89]{display:inline-flex;align-items:center;gap:8px;line-height:1}.select-option-icon[data-v-68503f89]{width:16px;height:16px;font-size:16px;text-align:center}.form-warning[data-v-68503f89]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-68503f89]{width:100%}.quota-status[data-v-68503f89] .el-progress{margin-bottom:8px}.quota-info[data-v-68503f89]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border:1px solid var(--glass-border);border-radius:6px}.quota-info.quota-warning[data-v-68503f89]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-68503f89]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-68503f89]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-68503f89]{animation:fa-spin-68503f89 1s linear infinite}@keyframes fa-spin-68503f89{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-68503f89]{padding:12px}.page-header[data-v-68503f89]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-68503f89]{grid-template-columns:1fr;padding:12px}.group-header[data-v-68503f89]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-68503f89] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-68503f89] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-a230355c]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-a230355c]:hover{box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-a230355c]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-a230355c]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-a230355c]:hover{transform:none}.floating-save-btn svg[data-v-a230355c]{font-size:14px}.fade-up-enter-active[data-v-a230355c]{transition:all .3s ease-out}.fade-up-leave-active[data-v-a230355c]{transition:all .2s ease-in}.fade-up-enter-from[data-v-a230355c]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-a230355c]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-a230355c]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-a230355c]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-a230355c]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-a230355c]{display:none}.floating-save-btn svg[data-v-a230355c]{font-size:16px}}.security-settings[data-v-f87cbcb2]{padding:20px;min-height:500px}.first-settings[data-v-f87cbcb2]{margin-bottom:40px}.first-title[data-v-f87cbcb2]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-f87cbcb2]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-f87cbcb2] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-f87cbcb2] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-f87cbcb2] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-f87cbcb2] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-f87cbcb2] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-f87cbcb2] .el-input,.first-settings[data-v-f87cbcb2] .el-select{width:100%}.first-settings[data-v-f87cbcb2] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-f87cbcb2]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.query-param-list[data-v-f87cbcb2]{display:flex;flex-direction:column;gap:10px;width:100%}.query-param-row[data-v-f87cbcb2]{display:grid;grid-template-columns:minmax(120px,1fr) minmax(160px,1.4fr) auto;gap:8px;align-items:center;width:100%}.response-field-row[data-v-f87cbcb2]{display:grid;grid-template-columns:minmax(180px,1fr) auto auto auto;gap:4px;align-items:center;width:100%}.response-field-row[data-v-f87cbcb2] .el-button+.el-button{margin-left:0}.token-title[data-v-f87cbcb2]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-f87cbcb2]{margin-left:5px}.token-table-container[data-v-f87cbcb2]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-f87cbcb2]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);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)}.token-table[data-v-f87cbcb2] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-f87cbcb2] .el-table__body-wrapper{border-radius:0 0 12px 12px;background:transparent}.token-table[data-v-f87cbcb2] .el-table{border-radius:12px;background:transparent}.token-table[data-v-f87cbcb2] .el-table__header{background-color:rgba(0,0,0,.04)}.token-table[data-v-f87cbcb2] .el-table th{background-color:rgba(0,0,0,.04)!important;border-bottom:1px solid #d9dce2;text-align:center}.token-table[data-v-f87cbcb2] .el-table td{background-color:transparent!important;border-bottom:1px solid #d9dce2}html.dark .token-table[data-v-f87cbcb2] .el-table th{background-color:hsla(0,0%,100%,.05)!important;border-bottom:1px solid #34343a}html.dark .token-table[data-v-f87cbcb2] .el-table td{border-bottom:1px solid #34343a}.token-table[data-v-f87cbcb2] .el-table__row:hover td{background-color:rgba(0,0,0,.03)!important}html.dark .token-table[data-v-f87cbcb2] .el-table__row:hover td{background-color:hsla(0,0%,100%,.05)!important}.token-table[data-v-f87cbcb2] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-f87cbcb2]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-f87cbcb2]{gap:8px}.action-button[data-v-f87cbcb2]{margin-left:0}.permission-tag[data-v-f87cbcb2]{margin:2px!important}.token-display[data-v-f87cbcb2]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-f87cbcb2]{padding:15px;padding-bottom:80px}.first-settings[data-v-f87cbcb2] .el-form{padding:12px 15px}.first-settings[data-v-f87cbcb2] .el-form-item__content{max-width:100%}.query-param-row[data-v-f87cbcb2]{grid-template-columns:1fr}.response-field-row[data-v-f87cbcb2]{grid-template-columns:1fr auto auto auto}.token-table-container[data-v-f87cbcb2]{padding:0 10px}.table-cell-content[data-v-f87cbcb2]{padding:6px 2px;min-height:36px}.token-display[data-v-f87cbcb2]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-f87cbcb2]{padding:0 5px}.table-cell-content[data-v-f87cbcb2]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-f87cbcb2]{padding:4px 8px;font-size:12px}.permission-tag[data-v-f87cbcb2]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-f87cbcb2]{padding:10px 0}.token-result .el-form-item[data-v-f87cbcb2]{margin-bottom:20px}.dialog-footer[data-v-f87cbcb2]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-f87cbcb2],.fade-slide-leave-active[data-v-f87cbcb2]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-f87cbcb2],.fade-slide-leave-to[data-v-f87cbcb2]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-f87cbcb2],.fade-slide-leave-from[data-v-f87cbcb2]{opacity:1;transform:translateY(0)}[data-v-f87cbcb2] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);border:1px solid var(--glass-border);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-5fc03908]{padding:20px;min-height:500px}.first-settings[data-v-5fc03908]{margin-bottom:40px}.first-title[data-v-5fc03908]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-5fc03908]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-5fc03908] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.first-settings[data-v-5fc03908] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-5fc03908] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-5fc03908] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-5fc03908] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-5fc03908] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-5fc03908] .el-input,.first-settings[data-v-5fc03908] .el-select{width:100%}.first-settings[data-v-5fc03908] .el-switch{--el-switch-on-color:var(--el-color-primary)}.announcement-refresh-option[data-v-5fc03908]{width:100%;margin-top:10px;display:flex;justify-content:flex-start}.first-settings[data-v-5fc03908] .el-form-item:has(.announcement-refresh-option) .el-form-item__content{flex-direction:column;align-items:flex-start}@media (max-width:768px){.page-settings[data-v-5fc03908]{padding:15px;padding-bottom:80px}.first-settings[data-v-5fc03908] .el-form{padding:12px 15px}.first-settings[data-v-5fc03908] .el-form-item__content{max-width:100%}}.others-settings[data-v-69ae97d8]{padding:20px;min-height:500px}.first-settings[data-v-69ae97d8]{margin-bottom:40px}.first-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-69ae97d8] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-69ae97d8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-69ae97d8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-69ae97d8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-69ae97d8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-69ae97d8] .el-input{width:100%}.first-settings[data-v-69ae97d8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-69ae97d8]{padding:15px;padding-bottom:80px}.first-settings[data-v-69ae97d8] .el-form{padding:12px 15px}.first-settings[data-v-69ae97d8] .el-form-item__content{max-width:100%}}.container[data-v-036a2d40]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-036a2d40]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);border:1px solid #d9dce2;box-shadow:none;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease;border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-036a2d40]{background:rgba(22,22,24,.75);border:1px solid #34343a;box-shadow:none}@media (max-width:768px){.header-content[data-v-036a2d40]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-036a2d40]{font-size:.95em}}.header-content[data-v-036a2d40]:hover{background:hsla(0,0%,100%,.72);box-shadow:none;transform:translateX(-50%)}html.dark .header-content[data-v-036a2d40]:hover{background:rgba(22,22,24,.75);box-shadow:none}.header-icon[data-v-036a2d40]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-036a2d40]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-036a2d40]{display:flex;gap:10px}.main-container[data-v-036a2d40]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-036a2d40]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-036a2d40],.main-container[data-v-036a2d40]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file +.sidebar-container[data-v-ed65892c]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);border:1px solid #d9dce2;border-radius:16px;box-shadow:none;transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-ed65892c]{width:56px}html.dark .sidebar-container[data-v-ed65892c]{background:rgba(22,22,24,.75);border:1px solid #34343a;box-shadow:none}.sidebar-container[data-v-ed65892c]:hover,html.dark .sidebar-container[data-v-ed65892c]:hover{box-shadow:none}.menu-list[data-v-ed65892c]{padding:8px}.menu-item[data-v-ed65892c]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-ed65892c]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-ed65892c]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-ed65892c]{background:rgba(37,99,235,.2);color:#2563eb}html.dark .menu-item.is-active[data-v-ed65892c]{background:rgba(37,99,235,.3);color:var(--el-text-color-primary)}.menu-icon[data-v-ed65892c]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-ed65892c]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-ed65892c]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-ed65892c]{padding:12px;text-align:center;cursor:pointer;border-top:1px solid rgba(0,0,0,.08);transition:all .2s ease;color:var(--admin-container-color,#333)}html.dark .toggle-button[data-v-ed65892c]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-ed65892c]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-ed65892c]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-ed65892c]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-ed65892c]{width:50px}.menu-icon[data-v-ed65892c]{width:34px;min-width:34px}}.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%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.date-range-calendar[data-v-715da8c8]{width:min(336px,100%);max-width:100%;min-width:0;box-sizing:border-box;color:var(--admin-container-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.selected-range[data-v-715da8c8]{margin-bottom:16px}.selected-range-inputs[data-v-715da8c8]{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px}.date-input[data-v-715da8c8]{width:100%;min-width:0;height:34px;box-sizing:border-box;border:1px solid var(--glass-border);border-radius:8px;padding:0 8px;background:var(--glass-bg);color:var(--admin-container-color);font-size:13px;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.date-input[data-v-715da8c8]:focus,.date-input[data-v-715da8c8]:hover{border-color:var(--el-color-primary);box-shadow:none}.date-range-separator[data-v-715da8c8]{color:#59636e;font-size:12px;font-weight:700}.calendar-header[data-v-715da8c8]{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;margin-bottom:14px}.calendar-title[data-v-715da8c8]{text-align:center;font-size:16px;font-weight:700}.calendar-nav[data-v-715da8c8]{width:36px;height:36px;border:1px solid var(--glass-border);border-radius:50%;background:var(--glass-bg);color:var(--admin-container-color);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.calendar-nav[data-v-715da8c8]:focus,.calendar-nav[data-v-715da8c8]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:rgba(37,99,235,.08);box-shadow:none}.calendar-grid[data-v-715da8c8],.calendar-weekdays[data-v-715da8c8]{display:grid;grid-template-columns:repeat(7,1fr)}.calendar-weekdays[data-v-715da8c8]{margin-bottom:8px;color:#59636e;font-size:12px;font-weight:600;text-align:center}.calendar-weekdays span[data-v-715da8c8]{height:24px;line-height:24px}.calendar-grid[data-v-715da8c8]{gap:4px}.calendar-day[data-v-715da8c8]{position:relative;width:38px;height:38px;box-sizing:border-box;justify-self:center;padding:0;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--admin-container-color);font-size:14px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .18s ease,background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.calendar-day[data-v-715da8c8]:focus,.calendar-day[data-v-715da8c8]:hover{border-color:rgba(37,99,235,.45);background:rgba(37,99,235,.1);color:var(--el-color-primary)}.calendar-day.is-muted[data-v-715da8c8]{color:#86909c;opacity:.62}.calendar-day.is-today[data-v-715da8c8]{border-color:rgba(249,115,22,.7)}.calendar-day.is-in-range[data-v-715da8c8]{border-radius:12px;background:rgba(37,99,235,.12);color:var(--el-color-primary)}.calendar-day.is-range-end[data-v-715da8c8],.calendar-day.is-range-start[data-v-715da8c8]{background:var(--el-color-primary);border-color:var(--el-color-primary);color:#fff;box-shadow:none}html.dark .calendar-weekdays[data-v-715da8c8]{color:#a1a1aa}html.dark .calendar-day.is-muted[data-v-715da8c8]{color:#737b88}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.status-panel[data-v-6b0a5e1a]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.card-icon[data-v-6b0a5e1a]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:#2563eb;color:#fff}.card-content[data-v-6b0a5e1a]{flex:1}.card-title[data-v-6b0a5e1a]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-6b0a5e1a]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-6b0a5e1a]{font-size:11px;color:#59636e;margin-top:4px;opacity:.8}.charts-section[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-bottom:30px;overflow:visible}@media (max-width:768px){.charts-section[data-v-6b0a5e1a]{grid-template-columns:1fr}}.chart-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.chart-card[data-v-6b0a5e1a],.chart-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.chart-card[data-v-6b0a5e1a],.chart-content[data-v-6b0a5e1a],.pie-chart-container[data-v-6b0a5e1a],.pie-chart-wrapper[data-v-6b0a5e1a]{overflow:visible}.chart-header[data-v-6b0a5e1a]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.chart-header .fa-icon[data-v-6b0a5e1a]{margin-right:10px;color:var(--admin-purple)}.trend-chart-card[data-v-6b0a5e1a]{grid-column:1/-1}.trend-chart-header[data-v-6b0a5e1a]{justify-content:space-between;gap:14px;flex-wrap:wrap}.chart-title[data-v-6b0a5e1a]{display:flex;align-items:center;gap:8px}.trend-controls[data-v-6b0a5e1a]{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}.trend-calendar-btn[data-v-6b0a5e1a]{width:32px;min-width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;color:var(--admin-container-color);background:var(--glass-bg);border:1px solid var(--glass-border)}.trend-calendar-btn[data-v-6b0a5e1a]:hover{color:var(--el-color-primary);border-color:var(--glass-border);background:var(--glass-bg);box-shadow:none}.trend-date-dialog[data-v-6b0a5e1a]{overflow:visible;max-width:calc(100vw - 32px);box-sizing:border-box}.trend-date-dialog[data-v-6b0a5e1a] .el-dialog__body{overflow:visible;padding:16px 24px 24px}.trend-date-panel[data-v-6b0a5e1a]{width:100%;max-width:100%;min-width:0;box-sizing:border-box;display:flex;justify-content:center;overflow:hidden}.trend-group-switch[data-v-6b0a5e1a]{flex-shrink:0;height:32px;display:flex}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button__inner{height:32px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0 14px}.chart-content.trend-chart-content[data-v-6b0a5e1a]{min-height:320px;padding:0;margin:0;min-width:0;max-width:100%;overflow:hidden}.line-chart-wrapper[data-v-6b0a5e1a]{position:relative;width:100%;max-width:100%;min-width:0;height:320px;overflow:hidden}.line-chart-wrapper[data-v-6b0a5e1a] canvas{display:block;width:100%!important;max-width:100%!important}.trend-empty-state[data-v-6b0a5e1a]{height:320px}.chart-content[data-v-6b0a5e1a]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-6b0a5e1a]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#59636e;font-size:14px}.empty-state .fa-icon[data-v-6b0a5e1a]{font-size:32px;margin-bottom:10px}.stats-list[data-v-6b0a5e1a]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-6b0a5e1a]{display:flex;align-items:center;gap:12px}.stats-label[data-v-6b0a5e1a]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-6b0a5e1a]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-6b0a5e1a]{height:100%;background:#6366f1;border-radius:4px;transition:width .6s ease}.type-fill[data-v-6b0a5e1a]{background:#16a34a}.stats-value[data-v-6b0a5e1a]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-6b0a5e1a]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-6b0a5e1a]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-6b0a5e1a]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-6b0a5e1a]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-6b0a5e1a]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-6b0a5e1a]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-6b0a5e1a]{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(0,0,0,.03);border:1px solid var(--glass-border);border-radius:8px}.legend-item[data-v-6b0a5e1a]:hover{background:rgba(0,0,0,.03)}html.dark .legend-item[data-v-6b0a5e1a],html.dark .legend-item[data-v-6b0a5e1a]:hover{background:hsla(0,0%,100%,.05)}.legend-color[data-v-6b0a5e1a]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-6b0a5e1a]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-6b0a5e1a]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-6b0a5e1a]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-6b0a5e1a]{margin-bottom:30px}.action-card[data-v-6b0a5e1a]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.action-card[data-v-6b0a5e1a],.action-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.action-card[data-v-6b0a5e1a],.chart-card[data-v-6b0a5e1a],.overview-card[data-v-6b0a5e1a]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.action-header[data-v-6b0a5e1a]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-header .fa-icon[data-v-6b0a5e1a]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-6b0a5e1a]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-6b0a5e1a]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-6b0a5e1a]{border-radius:10px;padding:12px 24px;margin-left:0;font-weight:500;font-size:14px;transition:background-color .2s ease,border-color .2s ease,color .2s ease;min-width:150px;width:150px;height:48px;box-shadow:none}@media (max-width:768px){.action-btn[data-v-6b0a5e1a]{flex:1;width:auto;min-width:0;height:auto}}.action-btn .fa-icon[data-v-6b0a5e1a]{margin-right:8px;font-size:14px}.rebuild-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#2563eb}.rebuild-btn[data-v-6b0a5e1a]:hover{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}.backup-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#16a34a}.backup-btn[data-v-6b0a5e1a]:hover{background:#f0fdf4;border-color:#86efac;color:#15803d}.restore-btn[data-v-6b0a5e1a]{background:#fff;border-color:#e5e6eb;color:#d97706}.restore-btn[data-v-6b0a5e1a]:hover{background:#fffbeb;border-color:#fcd34d;color:#b45309}.dark .rebuild-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#60a5fa}.dark .rebuild-btn[data-v-6b0a5e1a]:hover{background:rgba(59,130,246,.12);border-color:rgba(96,165,250,.4);color:#93c5fd}.dark .backup-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#4ade80}.dark .backup-btn[data-v-6b0a5e1a]:hover{background:rgba(34,197,94,.12);border-color:rgba(74,222,128,.4);color:#86efac}.dark .restore-btn[data-v-6b0a5e1a]{background:#1f1f22;border-color:#2a2a2e;color:#fbbf24}.dark .restore-btn[data-v-6b0a5e1a]:hover{background:rgba(251,191,36,.12);border-color:rgba(251,191,36,.4);color:#fcd34d}.restore-section[data-v-6b0a5e1a]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-6b0a5e1a],.action-buttons>.restore-section[data-v-6b0a5e1a],.restore-section[data-v-6b0a5e1a]{flex:1;width:100%}.action-btn[data-v-6b0a5e1a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-6b0a5e1a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-6b0a5e1a]{position:relative;background:var(--glass-bg);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-6b0a5e1a]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-6b0a5e1a],.card-bg-media[data-v-6b0a5e1a] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-6b0a5e1a] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-6b0a5e1a]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-6b0a5e1a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-6b0a5e1a]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.5) 0,rgba(0,0,0,.2) 55%,transparent);z-index:2}.file-card-header .fa-icon[data-v-6b0a5e1a]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-6b0a5e1a]{color:#f59e0b}.info-card-footer[data-v-6b0a5e1a]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.55) 0,rgba(0,0,0,.25) 50%,transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-6b0a5e1a]{font-size:14px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.info-card-footer .file-meta[data-v-6b0a5e1a]{font-size:12px;color:#fafafa;text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-6b0a5e1a]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-6b0a5e1a]{height:450px}}.file-info-card[data-v-6b0a5e1a]:hover{box-shadow:var(--glass-shadow)}.file-info-card:hover .card-bg-media[data-v-6b0a5e1a]{transform:scale(1)}@media (max-width:768px){.status-panel[data-v-6b0a5e1a]{padding:15px}.charts-section[data-v-6b0a5e1a],.overview-cards[data-v-6b0a5e1a]{grid-template-columns:1fr;gap:15px}.trend-chart-header[data-v-6b0a5e1a]{align-items:stretch}.chart-title[data-v-6b0a5e1a]{width:100%}.trend-controls[data-v-6b0a5e1a]{width:100%;justify-content:stretch}.trend-date-dialog[data-v-6b0a5e1a] .el-dialog__body{padding:12px 14px 18px}.trend-group-switch[data-v-6b0a5e1a]{width:100%}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button{flex:1}.trend-group-switch[data-v-6b0a5e1a] .el-radio-button__inner{width:100%;padding:0 10px}.line-chart-wrapper[data-v-6b0a5e1a],.trend-empty-state[data-v-6b0a5e1a]{height:280px}.file-info-section[data-v-6b0a5e1a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-6b0a5e1a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-6b0a5e1a]{font-size:24px}.action-buttons[data-v-6b0a5e1a]{flex-direction:column;gap:12px}.action-btn[data-v-6b0a5e1a]{width:100%;min-width:unset}}.stats-fill[data-v-6b0a5e1a]{animation:fillAnimation-6b0a5e1a 1s ease-out}@keyframes fillAnimation-6b0a5e1a{0%{width:0}}.progress-container[data-v-6b0a5e1a]{width:100%;padding:20px;text-align:center}.progress-header[data-v-6b0a5e1a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-6b0a5e1a]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-6b0a5e1a]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-6b0a5e1a]{margin-bottom:16px}.progress-bar[data-v-6b0a5e1a] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-6b0a5e1a] .el-progress-bar__inner{background:#6366f1;border-radius:6px;transition:width .3s ease}.progress-details[data-v-6b0a5e1a]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-6b0a5e1a],.progress-time[data-v-6b0a5e1a]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-6b0a5e1a],.progress-time .fa-icon[data-v-6b0a5e1a]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-6b0a5e1a]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-6b0a5e1a]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-6b0a5e1a]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);box-shadow:none}.cancel-btn .fa-icon[data-v-6b0a5e1a]{margin-right:8px}.error-container[data-v-6b0a5e1a]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-6b0a5e1a]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-6b0a5e1a]{text-align:center}.error-message[data-v-6b0a5e1a]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-6b0a5e1a]{font-size:13px;color:#666}.error-actions[data-v-6b0a5e1a]{display:flex;gap:12px}.error-actions .el-button[data-v-6b0a5e1a]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-6b0a5e1a]{background:#6366f1;border:none;color:#fff}.error-actions .el-button--primary[data-v-6b0a5e1a]:hover{background:#4f46e5;box-shadow:none}.error-actions .el-button--default[data-v-6b0a5e1a]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-6b0a5e1a]:hover{background:hsla(0,0%,100%,.15);border-color:#4a4a52;box-shadow:none}.error-actions .fa-icon[data-v-6b0a5e1a]{margin-right:8px}html.dark .progress-count[data-v-6b0a5e1a],html.dark .progress-time[data-v-6b0a5e1a]{color:#aaa}html.dark .progress-message[data-v-6b0a5e1a]{color:#999}html.dark .error-container[data-v-6b0a5e1a]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-6b0a5e1a]{color:#aaa}@media (max-width:768px){.error-container[data-v-6b0a5e1a],.progress-container[data-v-6b0a5e1a]{padding:16px}.progress-header[data-v-6b0a5e1a]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-6b0a5e1a]{flex-direction:column;gap:8px}.error-actions[data-v-6b0a5e1a]{flex-direction:column;width:100%}.error-actions .el-button[data-v-6b0a5e1a]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-input-number{display:inline-flex}.el-input-number{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}.channel-icon-wrapper[data-v-33933ada]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-33933ada] svg,.channel-svg-icon[data-v-33933ada]{width:1em;height:1em;fill:currentColor}.custom-select[data-v-de989c36]{position:relative}.custom-select-trigger[data-v-de989c36]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:hsla(0,0%,100%,.72);border:1px solid #d9dce2;border-radius:8px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease;box-sizing:border-box}html.dark .custom-select-trigger[data-v-de989c36]{background:rgba(22,22,24,.75);border:1px solid #34343a}.custom-select-trigger[data-v-de989c36]:hover{background:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .custom-select-trigger[data-v-de989c36]:hover{background:rgba(22,22,24,.88);border-color:#4a4a52}.custom-select.is-open .custom-select-trigger[data-v-de989c36]{border-color:var(--el-color-primary)}.custom-select-value[data-v-de989c36]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-de989c36],.custom-select-value.is-placeholder[data-v-de989c36]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-de989c36]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-de989c36]{transform:rotate(180deg)}.custom-select-dropdown[data-v-de989c36]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:hsla(0,0%,100%,.88);border:1px solid #d9dce2;border-radius:8px;box-shadow:none;z-index:2000;max-height:280px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}html.dark .custom-select-dropdown[data-v-de989c36]{background:rgba(22,22,24,.9);border:1px solid #34343a}.custom-select-option[data-v-de989c36]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-de989c36]:hover{background:rgba(0,0,0,.04)}html.dark .custom-select-option[data-v-de989c36]:hover{background:hsla(0,0%,100%,.08);color:var(--el-text-color-primary)}.custom-select-option.is-selected[data-v-de989c36]{color:var(--el-color-primary);font-weight:500}html.dark .custom-select-option.is-selected[data-v-de989c36]{background:rgba(74,93,155,.38);color:#fff;font-weight:600}html.dark .custom-select-option.is-selected[data-v-de989c36]:hover{background:rgba(94,115,181,.48);color:#fff}.option-icon[data-v-de989c36]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-de989c36],.dropdown-fade-leave-active[data-v-de989c36]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-de989c36],.dropdown-fade-leave-to[data-v-de989c36]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-68503f89]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-68503f89]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-68503f89]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.inline-warning-icon[data-v-68503f89]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-warning-icon[data-v-68503f89]:hover{color:var(--el-color-primary)}.inline-help-icon[data-v-68503f89]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-help-icon[data-v-68503f89]:hover{color:var(--el-color-primary)}.add-btn[data-v-68503f89]{border-radius:8px;background-color:rgba(37,99,235,.9)!important;border-color:rgba(37,99,235,.9)!important;color:#fff!important;transition:background-color .2s ease,border-color .2s ease}html.dark .add-btn[data-v-68503f89]{background-color:rgba(59,130,246,.9)!important;border-color:rgba(59,130,246,.9)!important}.add-btn[data-v-68503f89]:hover{background-color:rgba(37,99,235,.78)!important;border-color:rgba(37,99,235,.78)!important}html.dark .add-btn[data-v-68503f89]:hover{background-color:rgba(59,130,246,.78)!important;border-color:rgba(59,130,246,.78)!important}.header-actions[data-v-68503f89]{display:flex;gap:12px}.header-actions[data-v-68503f89] .el-button{border-radius:8px}.channel-group[data-v-68503f89]{margin-bottom:32px;background:var(--glass-bg);border-radius:16px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow)}.group-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-68503f89]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-68503f89]{font-size:20px;color:var(--el-color-primary)}.channel-count[data-v-68503f89]{font-size:12px}.load-balance-switch[data-v-68503f89]{display:flex;align-items:center;gap:8px}.switch-label[data-v-68503f89]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-68503f89]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-68503f89]{background:var(--glass-bg);border-radius:10px;border:1px solid var(--glass-border);overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:var(--glass-shadow)}.channel-card[data-v-68503f89],.channel-group[data-v-68503f89]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.card-glow[data-v-68503f89]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-68503f89]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-68503f89]:hover{border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.channel-card.disabled[data-v-68503f89]{opacity:.6;background:var(--el-fill-color-lighter)}.card-header[data-v-68503f89]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-68503f89]{display:flex;align-items:center;gap:8px}.channel-name[data-v-68503f89]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-68503f89]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-68503f89]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-68503f89]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-68503f89]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-68503f89]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-68503f89]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-68503f89] .el-progress{margin-bottom:4px}.quota-text[data-v-68503f89]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-68503f89]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-68503f89]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-68503f89]{font-size:32px}.channel-warning[data-v-68503f89]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.channel-type-option[data-v-68503f89]{display:inline-flex;align-items:center;gap:8px;line-height:1}.select-option-icon[data-v-68503f89]{width:16px;height:16px;font-size:16px;text-align:center}.form-warning[data-v-68503f89]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-68503f89]{width:100%}.quota-status[data-v-68503f89] .el-progress{margin-bottom:8px}.quota-info[data-v-68503f89]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border:1px solid var(--glass-border);border-radius:6px}.quota-info.quota-warning[data-v-68503f89]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-68503f89]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-68503f89]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-68503f89]{animation:fa-spin-68503f89 1s linear infinite}@keyframes fa-spin-68503f89{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-68503f89]{padding:12px}.page-header[data-v-68503f89]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-68503f89]{grid-template-columns:1fr;padding:12px}.group-header[data-v-68503f89]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-68503f89] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-68503f89] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-a230355c]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-a230355c]:hover{box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-a230355c]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-a230355c]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-a230355c]:hover{transform:none}.floating-save-btn svg[data-v-a230355c]{font-size:14px}.fade-up-enter-active[data-v-a230355c]{transition:all .3s ease-out}.fade-up-leave-active[data-v-a230355c]{transition:all .2s ease-in}.fade-up-enter-from[data-v-a230355c]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-a230355c]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-a230355c]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-a230355c]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-a230355c]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-a230355c]{display:none}.floating-save-btn svg[data-v-a230355c]{font-size:16px}}.security-settings[data-v-f87cbcb2]{padding:20px;min-height:500px}.first-settings[data-v-f87cbcb2]{margin-bottom:40px}.first-title[data-v-f87cbcb2]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-f87cbcb2]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-f87cbcb2] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-f87cbcb2] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-f87cbcb2] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-f87cbcb2] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-f87cbcb2] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-f87cbcb2] .el-input,.first-settings[data-v-f87cbcb2] .el-select{width:100%}.first-settings[data-v-f87cbcb2] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-f87cbcb2]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.query-param-list[data-v-f87cbcb2]{display:flex;flex-direction:column;gap:10px;width:100%}.query-param-row[data-v-f87cbcb2]{display:grid;grid-template-columns:minmax(120px,1fr) minmax(160px,1.4fr) auto;gap:8px;align-items:center;width:100%}.response-field-row[data-v-f87cbcb2]{display:grid;grid-template-columns:minmax(180px,1fr) auto auto auto;gap:4px;align-items:center;width:100%}.response-field-row[data-v-f87cbcb2] .el-button+.el-button{margin-left:0}.token-title[data-v-f87cbcb2]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-f87cbcb2]{margin-left:5px}.token-table-container[data-v-f87cbcb2]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-f87cbcb2]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);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)}.token-table[data-v-f87cbcb2] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-f87cbcb2] .el-table__body-wrapper{border-radius:0 0 12px 12px;background:transparent}.token-table[data-v-f87cbcb2] .el-table{border-radius:12px;background:transparent}.token-table[data-v-f87cbcb2] .el-table__header{background-color:rgba(0,0,0,.04)}.token-table[data-v-f87cbcb2] .el-table th{background-color:rgba(0,0,0,.04)!important;border-bottom:1px solid #d9dce2;text-align:center}.token-table[data-v-f87cbcb2] .el-table td{background-color:transparent!important;border-bottom:1px solid #d9dce2}html.dark .token-table[data-v-f87cbcb2] .el-table th{background-color:hsla(0,0%,100%,.05)!important;border-bottom:1px solid #34343a}html.dark .token-table[data-v-f87cbcb2] .el-table td{border-bottom:1px solid #34343a}.token-table[data-v-f87cbcb2] .el-table__row:hover td{background-color:rgba(0,0,0,.03)!important}html.dark .token-table[data-v-f87cbcb2] .el-table__row:hover td{background-color:hsla(0,0%,100%,.05)!important}.token-table[data-v-f87cbcb2] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-f87cbcb2]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-f87cbcb2]{gap:8px}.action-button[data-v-f87cbcb2]{margin-left:0}.permission-tag[data-v-f87cbcb2]{margin:2px!important}.token-display[data-v-f87cbcb2]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-f87cbcb2]{padding:15px;padding-bottom:80px}.first-settings[data-v-f87cbcb2] .el-form{padding:12px 15px}.first-settings[data-v-f87cbcb2] .el-form-item__content{max-width:100%}.query-param-row[data-v-f87cbcb2]{grid-template-columns:1fr}.response-field-row[data-v-f87cbcb2]{grid-template-columns:1fr auto auto auto}.token-table-container[data-v-f87cbcb2]{padding:0 10px}.table-cell-content[data-v-f87cbcb2]{padding:6px 2px;min-height:36px}.token-display[data-v-f87cbcb2]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-f87cbcb2]{padding:0 5px}.table-cell-content[data-v-f87cbcb2]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-f87cbcb2]{padding:4px 8px;font-size:12px}.permission-tag[data-v-f87cbcb2]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-f87cbcb2]{padding:10px 0}.token-result .el-form-item[data-v-f87cbcb2]{margin-bottom:20px}.dialog-footer[data-v-f87cbcb2]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-f87cbcb2],.fade-slide-leave-active[data-v-f87cbcb2]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-f87cbcb2],.fade-slide-leave-to[data-v-f87cbcb2]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-f87cbcb2],.fade-slide-leave-from[data-v-f87cbcb2]{opacity:1;transform:translateY(0)}[data-v-f87cbcb2] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);border:1px solid var(--glass-border);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-5fc03908]{padding:20px;min-height:500px}.first-settings[data-v-5fc03908]{margin-bottom:40px}.first-title[data-v-5fc03908]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-5fc03908]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-5fc03908] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.first-settings[data-v-5fc03908] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-5fc03908] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-5fc03908] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-5fc03908] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-5fc03908] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-5fc03908] .el-input,.first-settings[data-v-5fc03908] .el-select{width:100%}.first-settings[data-v-5fc03908] .el-switch{--el-switch-on-color:var(--el-color-primary)}.announcement-refresh-option[data-v-5fc03908]{width:100%;margin-top:10px;display:flex;justify-content:flex-start}.first-settings[data-v-5fc03908] .el-form-item:has(.announcement-refresh-option) .el-form-item__content{flex-direction:column;align-items:flex-start}@media (max-width:768px){.page-settings[data-v-5fc03908]{padding:15px;padding-bottom:80px}.first-settings[data-v-5fc03908] .el-form{padding:12px 15px}.first-settings[data-v-5fc03908] .el-form-item__content{max-width:100%}}.others-settings[data-v-69ae97d8]{padding:20px;min-height:500px}.first-settings[data-v-69ae97d8]{margin-bottom:40px}.first-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-69ae97d8] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-69ae97d8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-69ae97d8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-69ae97d8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-69ae97d8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-69ae97d8] .el-input{width:100%}.first-settings[data-v-69ae97d8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-69ae97d8]{padding:15px;padding-bottom:80px}.first-settings[data-v-69ae97d8] .el-form{padding:12px 15px}.first-settings[data-v-69ae97d8] .el-form-item__content{max-width:100%}}.container[data-v-036a2d40]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-036a2d40]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);border:1px solid #d9dce2;box-shadow:none;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease;border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-036a2d40]{background:rgba(22,22,24,.75);border:1px solid #34343a;box-shadow:none}@media (max-width:768px){.header-content[data-v-036a2d40]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-036a2d40]{font-size:.95em}}.header-content[data-v-036a2d40]:hover{background:hsla(0,0%,100%,.72);box-shadow:none;transform:translateX(-50%)}html.dark .header-content[data-v-036a2d40]:hover{background:rgba(22,22,24,.75);box-shadow:none}.header-icon[data-v-036a2d40]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-036a2d40]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-036a2d40]{display:flex;gap:10px}.main-container[data-v-036a2d40]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-036a2d40]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-036a2d40],.main-container[data-v-036a2d40]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/frontend-dist/css/784.e670981c.css.gz b/frontend-dist/css/784.e670981c.css.gz new file mode 100644 index 00000000..84a971ad Binary files /dev/null and b/frontend-dist/css/784.e670981c.css.gz differ diff --git a/frontend-dist/css/136.93acb05d.css b/frontend-dist/css/800.c2738ec8.css similarity index 91% rename from frontend-dist/css/136.93acb05d.css rename to frontend-dist/css/800.c2738ec8.css index 0d4b82a2..63f0aef3 100644 --- a/frontend-dist/css/136.93acb05d.css +++ b/frontend-dist/css/800.c2738ec8.css @@ -1 +1 @@ -.history-container[data-v-f70e7770]{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-f70e7770]: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-f70e7770]{clip-path:circle(150% at calc(100% - 200px) 50px);opacity:1}.history-header[data-v-f70e7770]{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-f70e7770]{display:flex;align-items:baseline;gap:15px}.header-left h2[data-v-f70e7770]{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-f70e7770]{color:var(--upload-text-color);font-size:14px;opacity:.8}.header-right[data-v-f70e7770]{display:flex;gap:10px}.header-right .el-button[data-v-f70e7770]{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-f70e7770]:hover{transform:scale(1.05);box-shadow:var(--toolbar-button-shadow-hover)}.header-right .el-button.el-button--danger[data-v-f70e7770]{background:#dc2626;color:#fff}.history-content[data-v-f70e7770]{flex:1;overflow-y:auto;padding:20px 40px}.grid-view[data-v-f70e7770]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:20px}.grid-item[data-v-f70e7770]{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-f70e7770]:hover{box-shadow:var(--toolbar-button-shadow-hover)}.grid-preview[data-v-f70e7770]{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-f70e7770],.grid-preview video[data-v-f70e7770]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper[data-v-f70e7770]{font-size:48px;color:var(--theme-toggle-color);opacity:.5}.grid-overlay[data-v-f70e7770]{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-f70e7770]{opacity:1}.grid-actions[data-v-f70e7770]{display:flex;gap:15px}.grid-info[data-v-f70e7770]{padding:12px}.file-name[data-v-f70e7770]{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-f70e7770]{font-size:12px;color:var(--upload-text-color);opacity:.6}.list-view[data-v-f70e7770]{display:flex;flex-direction:column;gap:10px}.list-item[data-v-f70e7770]{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-f70e7770]:hover{transform:translateX(5px);box-shadow:var(--toolbar-button-shadow-hover)}.list-preview[data-v-f70e7770]{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-f70e7770],.list-preview video[data-v-f70e7770]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper-small[data-v-f70e7770]{font-size:24px;color:var(--theme-toggle-color);opacity:.5}.list-info[data-v-f70e7770]{flex:1;min-width:0;margin-right:20px}.file-url[data-v-f70e7770]{font-size:12px;color:var(--upload-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.6}.list-meta[data-v-f70e7770]{margin-right:20px;text-align:right;min-width:140px}.list-actions[data-v-f70e7770]{display:flex;gap:8px}.empty-state[data-v-f70e7770]{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-f70e7770]{font-size:64px;margin-bottom:20px;color:var(--theme-toggle-color)}.history-content[data-v-f70e7770]::-webkit-scrollbar{width:8px}.history-content[data-v-f70e7770]::-webkit-scrollbar-track{background:transparent}.history-content[data-v-f70e7770]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:4px}.history-content[data-v-f70e7770]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker)}.action-btn-view[data-v-f70e7770]{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-f70e7770]:hover{box-shadow:var(--toolbar-button-shadow-hover);color:var(--el-color-primary)}.history-group[data-v-f70e7770]{position:relative;padding-left:30px;border-left:2px solid var(--el-border-color-lighter);margin-left:10px;padding-bottom:30px}.history-group[data-v-f70e7770]:last-child{border-left:2px solid transparent}.timeline-header[data-v-f70e7770]{display:flex;align-items:center;margin-bottom:20px;position:relative}.timeline-dot[data-v-f70e7770]{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-f70e7770]{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-f70e7770]{display:flex;justify-content:center;padding:20px}.loading-indicator[data-v-f70e7770]{display:flex;align-items:center;gap:8px;color:var(--el-upload-dragger-uniform-color)}.load-more-hint[data-v-f70e7770],.no-more-hint[data-v-f70e7770]{color:var(--upload-text-color);opacity:.5;font-size:14px}.no-more-hint[data-v-f70e7770]{text-align:center;padding:20px}@media (max-width:768px){.history-header[data-v-f70e7770]{padding:15px 20px}.header-left h2[data-v-f70e7770]{font-size:20px}.history-content[data-v-f70e7770]{padding:15px 20px}.grid-view[data-v-f70e7770]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:15px}.grid-preview[data-v-f70e7770]{height:120px}.list-meta[data-v-f70e7770]{display:none}.list-info[data-v-f70e7770]{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-33933ada]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-33933ada] svg,.channel-svg-icon[data-v-33933ada]{width:1em;height:1em;fill:currentColor}.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)}.upload-settings-dialog .channel-brand-telegram{color:#229ed9!important}.upload-settings-dialog .channel-brand-cfr2{color:#f38020!important}.upload-settings-dialog .channel-brand-s3{color:#f90!important}.upload-settings-dialog .channel-brand-discord{color:#5865f2!important}.upload-settings-dialog .channel-brand-huggingface{color:#ff9d00!important}.upload-settings-dialog .channel-brand-webdav{color:#14b8a6!important}@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-698179d6]{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-698179d6]:hover{border-color:var(--upload-list-item-hover-border,rgba(37,99,235,.25));box-shadow:none}.upload-list-item-content[data-v-698179d6]{display:flex;flex-direction:column;margin-left:10px}.upload-list-item-action[data-v-698179d6]{display:flex;flex-direction:column;align-items:center;gap:6px}.upload-list-item-url-row[data-v-698179d6]{display:flex;flex-direction:row;align-items:center;width:38vw;gap:8px;margin-bottom:6px}.upload-list-item-url-row[data-v-698179d6]:last-child{margin-bottom:0}.upload-list-item-url[data-v-698179d6]{display:flex;flex-direction:column}.file-icon[data-v-698179d6]{font-size:30px;color:var(--upload-list-file-icon-color)}.upload-list-item-name-wrapper[data-v-698179d6]{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-698179d6]: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-698179d6]{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-698179d6]{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-698179d6] .el-progress{--el-color-primary:#2563eb}.upload-list-item-progress[data-v-698179d6] .el-progress-bar{padding-right:0;margin-right:0}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .el-progress-bar__inner{border-radius:8px;background:#2563eb!important;box-shadow:none;position:relative;overflow:hidden;transition:width .3s ease}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .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-698179d6 1s linear infinite}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .el-progress--success .el-progress-bar__inner:after,.upload-list-item-progress[data-v-698179d6] .el-progress--success .el-progress-bar__inner:before{animation:none;background:none}.upload-list-item-progress[data-v-698179d6] .el-progress--exception .el-progress-bar__inner{background:#dc2626!important;background-size:200% 100%;box-shadow:none;animation:progressPulse-698179d6 1s ease-in-out infinite}.upload-list-item-progress[data-v-698179d6] .el-progress--exception .el-progress-bar__inner:before{animation:none;background:none}@keyframes progressStripes-698179d6{0%{transform:translateX(0)}to{transform:translateX(22.627px)}}@keyframes progressPulse-698179d6{0%,to{opacity:1}50%{opacity:.7}}.upload-list-item-url[data-v-698179d6] .el-input{transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item-url[data-v-698179d6] .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-698179d6] .el-input-group>.el-input__wrapper{border-radius:0 9px 9px 0!important}.upload-list-item-url[data-v-698179d6] .el-input__wrapper:hover{box-shadow:none;border-color:var(--el-color-primary-light-5)}.upload-list-item-url[data-v-698179d6] .el-input__wrapper.is-focus{box-shadow:none;border-color:var(--el-color-primary)}.upload-list-item-url[data-v-698179d6] .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-698179d6 2s infinite;z-index:0}@keyframes shimmer-698179d6{0%{left:-100%}to{left:100%}}.upload-list-item-url[data-v-698179d6] .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-698179d6] .el-input__inner::-moz-selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-698179d6] .el-input__inner::selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-698179d6] .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-698179d6] .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-698179d6] .el-input:hover .el-input-group__prepend{background:var(--el-color-primary-light-8)}.upload-list-item-url[data-v-698179d6] .el-input:hover .el-input-group__prepend:after{opacity:.5}.upload-list-item-url[data-v-698179d6] .el-input.is-focus .el-input-group__prepend{background:var(--el-color-primary);color:#fff;animation:prependPulse-698179d6 2s ease-in-out infinite}.upload-list-item-url[data-v-698179d6] .el-input.is-focus .el-input-group__prepend:after{background:hsla(0,0%,100%,.3);opacity:1}@keyframes prependPulse-698179d6{0%,to{opacity:1}50%{opacity:.95}}.modern-file-action-btn[data-v-698179d6]{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-698179d6]:before{content:"";position:absolute;inset:2px;border-radius:8px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-file-action-btn[data-v-698179d6]:hover{background:var(--upload-action-btn-hover-bg)}.modern-file-action-btn[data-v-698179d6]:hover:before{opacity:.08}.modern-file-action-btn[data-v-698179d6]:active{transform:scale(.96)}.modern-file-action-btn-primary[data-v-698179d6]{color:var(--upload-action-copy-color)}.modern-file-action-btn-danger[data-v-698179d6]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-file-action-btn-danger[data-v-698179d6]:hover{background:var(--upload-action-danger-hover-bg)}@media (max-width:768px){.upload-list-item[data-v-698179d6]{margin:5px 6px;padding:7px 8px;border-radius:12px}.upload-list-item-content[data-v-698179d6]{margin-left:2px}.upload-list-item-action[data-v-698179d6]{gap:3px}.upload-list-item-url-row[data-v-698179d6]{width:42vw;flex-direction:column;gap:4px;margin-bottom:4px}.upload-list-item-progress[data-v-698179d6]{width:32vw;margin-top:5px;padding:2px 5px;border-radius:9px}.upload-list-item-progress[data-v-698179d6] .el-progress-bar__outer{height:6px!important}.upload-list-item-url[data-v-698179d6] .el-input__wrapper{border-radius:7px}.upload-list-item-url[data-v-698179d6] .el-input__inner{font-size:10px;padding-left:8px}.upload-list-item-url[data-v-698179d6] .el-input-group__prepend{font-size:9px;padding:0 6px;border-radius:7px 0 0 7px}.modern-file-action-btn[data-v-698179d6]{width:26px;height:26px;margin:2px 0;border-radius:8px;font-size:12px}.upload-list-item-name-wrapper[data-v-698179d6]{padding:3px 8px;margin-bottom:5px;border-radius:7px}.upload-list-item-name[data-v-698179d6]{font-size:11px;width:32vw}}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.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-fca24b68{0%{--border-angle:0deg}to{--border-angle:360deg}}.upload-form[data-v-fca24b68],.upload-list-card[data-v-fca24b68]{display:flex;flex-direction:column;justify-content:center;align-items:center}.upload-list-card[data-v-fca24b68]{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-fca24b68] .el-card__body{padding:0;width:100%;overflow:hidden}.upload-list-container[data-v-fca24b68]{width:55vw;height:7vh;transition:height .3s ease;overflow:hidden}@media (max-width:768px){.upload-list-card[data-v-fca24b68],.upload-list-container[data-v-fca24b68]{width:70vw}}.upload-list-card.upload-list-busy[data-v-fca24b68],.upload-list-container.upload-list-busy[data-v-fca24b68]{height:40vh}.upload-list-card.is-uploading[data-v-fca24b68]{border:1px solid var(--el-upload-dragger-uniform-color,#2563eb)!important;box-shadow:none!important}.upload-card-wrapper[data-v-fca24b68]{position:relative;overflow:visible}.upload-card-glow[data-v-fca24b68]{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-fca24b68]{width:55vw;padding:20px;background:none}@media (max-width:768px){.upload-card[data-v-fca24b68]{width:70vw}}.upload-card-busy[data-v-fca24b68] .el-upload-dragger{height:17vh}[data-v-fca24b68] .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-fca24b68] .el-upload:focus .el-upload-dragger{border-color:var(--glass-border-hover)}[data-v-fca24b68] .el-upload-dragger.is-dragover,[data-v-fca24b68] .el-upload-dragger:hover{opacity:.7;box-shadow:var(--glass-shadow)}.is-uploading[data-v-fca24b68] .el-upload-dragger{border-color:transparent!important}.upload-card.is-uploading[data-v-fca24b68]{position:relative;background:none}.upload-card.is-uploading[data-v-fca24b68]: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-fca24b68 2s linear infinite;pointer-events:none;z-index:1}.el-upload__text[data-v-fca24b68]{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-fca24b68]{font-size:small}}.el-upload__text.upload-list-busy[data-v-fca24b68]{font-size:small}.el-icon--upload[data-v-fca24b68]{font-size:100px;transition:font-size .3s ease;color:var(--el-icon--upload-color)}.el-icon--upload.upload-list-busy[data-v-fca24b68]{font-size:60px}@media (max-width:768px){.el-icon--upload[data-v-fca24b68]{font-size:50px}.el-icon--upload.upload-list-busy[data-v-fca24b68]{font-size:30px}}.paste-card[data-v-fca24b68]{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-fca24b68]:hover{opacity:.8;box-shadow:var(--el-upload-dragger-hover-box-shadow)}.paste-card.is-uploading[data-v-fca24b68]{position:relative;border-color:transparent!important;overflow:visible}.paste-card.is-uploading[data-v-fca24b68]: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-fca24b68 2s linear infinite;pointer-events:none;z-index:1}.paste-card[data-v-fca24b68] .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-fca24b68]{height:17vh}.upload-card-textarea[data-v-fca24b68]{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-fca24b68]{height:50%}.upload-card-textarea[data-v-fca24b68]: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-fca24b68]:hover:before{opacity:1}.upload-card-textarea[data-v-fca24b68]:focus-within:before{opacity:1;background:rgba(37,99,235,.4)}[data-v-fca24b68] .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-fca24b68] .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-fca24b68] .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-fca24b68] .el-textarea__inner:hover{background:var(--textarea-inner-hover-bg,rgba(37,99,235,.03))}[data-v-fca24b68] .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-fca24b68] ::-webkit-scrollbar{width:6px;height:6px}.upload-card-textarea[data-v-fca24b68] ::-webkit-scrollbar-track{background:transparent;border-radius:6px;margin:8px}.upload-card-textarea[data-v-fca24b68] ::-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-fca24b68] ::-webkit-scrollbar-thumb:hover{background:rgba(37,99,235,.7)}.paste-card-actions[data-v-fca24b68]{display:flex;justify-content:space-between;align-items:center;width:50vw;gap:12px;margin-top:16px}.paste-card-upload-button[data-v-fca24b68]{min-width:92px;height:38px;border-radius:10px!important;font-weight:600;font-size:14px;letter-spacing:.04em;color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 10%,var(--toolbar-button-bg-color))!important;border:1px solid color-mix(in srgb,var(--el-upload-dragger-uniform-color) 30%,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-fca24b68]:hover{color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 15%,var(--toolbar-button-bg-color))!important;border-color:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 48%,var(--glass-border))!important;transform:translateY(-1px);box-shadow:none}.paste-card-upload-button[data-v-fca24b68]:focus-visible{color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 15%,var(--toolbar-button-bg-color))!important;border-color:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 48%,var(--glass-border))!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--el-upload-dragger-uniform-color) 14%,transparent)!important}.paste-card-upload-button[data-v-fca24b68]:active{transform:translateY(0);background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 18%,var(--toolbar-button-bg-color))!important}.upload-card-busy .paste-card-upload-button[data-v-fca24b68]{min-width:72px;height:32px;border-radius:8px!important;font-size:13px;letter-spacing:.02em}.upload-card-busy .paste-card-actions[data-v-fca24b68]{margin-top:10px}.paste-card-method-group[data-v-fca24b68]{display:inline-flex;align-items:center;height:38px;box-sizing:border-box;gap:2px;padding:3px;background:var(--modern-action-group-bg);border:1px solid var(--modern-action-group-border);border-radius:10px}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner{display:inline-flex;align-items:center;justify-content:center;min-width:64px;height:30px;box-sizing:border-box;padding:0 14px;border-radius:7px!important;border:none!important;background:transparent;font-weight:500;font-size:13px;line-height:1;color:var(--toolbar-button-color);box-shadow:none!important;transition:color .2s ease,background-color .2s ease,box-shadow .2s ease}.paste-card-method-group[data-v-fca24b68] .el-radio-button:first-child .el-radio-button__inner,.paste-card-method-group[data-v-fca24b68] .el-radio-button:last-child .el-radio-button__inner{border-radius:7px!important}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner:hover{background:var(--modern-action-group-hover-bg);color:var(--el-text-color-primary)}.paste-card-method-group[data-v-fca24b68] .el-radio-button__original-radio:checked+.el-radio-button__inner{background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 16%,var(--toolbar-button-bg-color))!important;color:var(--el-upload-dragger-uniform-color)!important;font-weight:600;box-shadow:0 0 0 1px color-mix(in srgb,var(--el-upload-dragger-uniform-color) 52%,var(--glass-border)) inset!important}@media (max-width:768px){.paste-card[data-v-fca24b68]{height:auto;min-height:30vh;padding:6px;border-radius:12px}.upload-card-busy.paste-card[data-v-fca24b68]{height:auto;min-height:18vh;padding:5px}.upload-card-textarea[data-v-fca24b68]{margin-top:4px;width:calc(100% - 4px)!important}.upload-card-textarea[data-v-fca24b68]:before{border-radius:11px}[data-v-fca24b68] .el-textarea__inner{border-radius:10px;padding:8px 10px;font-size:12px}.paste-card-actions[data-v-fca24b68]{width:100%!important;margin-top:8px;gap:8px}.paste-card-upload-button[data-v-fca24b68]{height:32px;min-width:64px;border-radius:8px!important;font-size:12px;letter-spacing:.02em;padding:0 12px}.paste-card-method-group[data-v-fca24b68]{height:32px;padding:3px;border-radius:9px}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner{min-width:52px;height:26px;padding:0 10px;font-size:11px;border-radius:6px!important}}.upload-list-dashboard[data-v-fca24b68]{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-fca24b68] .el-upload-dragger{position:relative;overflow:hidden}[data-v-fca24b68] .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-fca24b68] .el-upload-dragger:after,[data-v-fca24b68] .el-upload-dragger:before{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;z-index:0;transition:opacity .6s ease}[data-v-fca24b68] .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-fca24b68]:hover .el-upload-dragger:before{opacity:.3;animation:starScroll-fca24b68 60s linear infinite}.upload-card[data-v-fca24b68]:hover .el-upload-dragger:after{opacity:.6;animation:starScroll-fca24b68 40s linear infinite,starPulse-fca24b68 4s ease-in-out infinite}@keyframes starScroll-fca24b68{0%{background-position:0 0}to{background-position:100px 100px}}@keyframes starPulse-fca24b68{0%,to{opacity:.6}50%{opacity:.3}}.modern-action-group[data-v-fca24b68]{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-fca24b68]:hover{background:var(--glass-bg);border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-btn[data-v-fca24b68]{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-fca24b68]:focus,.modern-action-btn[data-v-fca24b68]:focus-visible{outline:none!important}.modern-action-btn[data-v-fca24b68]:before{content:"";position:absolute;inset:2px;border-radius:11px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-action-btn[data-v-fca24b68]:hover{background:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.modern-action-btn[data-v-fca24b68]:hover:before{opacity:.08}.modern-action-btn[data-v-fca24b68]:active{transform:translateY(0) scale(.97);box-shadow:var(--upload-action-btn-active-shadow)}.modern-action-btn-copy[data-v-fca24b68]{color:var(--upload-action-copy-color)}.modern-action-btn-retry[data-v-fca24b68]{color:var(--upload-action-retry-color)}.modern-action-btn-danger[data-v-fca24b68]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-action-btn-danger[data-v-fca24b68]:hover{background:var(--upload-action-danger-hover-bg);box-shadow:var(--upload-action-danger-hover-shadow)}.modern-dropdown-item-content[data-v-fca24b68]{display:flex;align-items:center;justify-content:space-between;width:100%;gap:12px;padding:4px 0}.modern-dropdown-item-content span[data-v-fca24b68]{font-weight:500;color:var(--el-text-color-primary)}.upload-list-dashboard-title[data-v-fca24b68]{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-fca24b68]{font-size:16px;margin-right:4px;opacity:.85}@media (max-width:768px){.modern-action-group[data-v-fca24b68]{height:34px;gap:2px;padding:2px;border-radius:9px}.modern-action-btn[data-v-fca24b68]{width:28px;height:28px;border-radius:7px;font-size:11px}.upload-list-dashboard-title[data-v-fca24b68]{height:34px;font-size:11px;padding:0 7px;border-radius:9px}.upload-list-dashboard-title .el-icon[data-v-fca24b68]{font-size:13px;margin-right:1px}.upload-list-dashboard[data-v-fca24b68]{padding:0 6px;gap:4px}.upload-list-dashboard-title[data-v-fca24b68]{gap:3px;min-width:0;flex-shrink:1;overflow:hidden}.upload-list-dashboard-action[data-v-fca24b68]{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-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.container[data-v-c4d6ef3e]{background:var(--bg-color);min-height:100vh}.rotate[data-v-c4d6ef3e]{animation:spin-c4d6ef3e 2s ease-in-out}.scale[data-v-c4d6ef3e]{animation:scale-c4d6ef3e .5s ease-in-out}@keyframes spin-c4d6ef3e{0%{transform:rotate(0deg)}25%{transform:rotate(5deg)}50%{transform:rotate(0deg)}75%{transform:rotate(-3deg)}to{transform:rotate(0deg)}}@keyframes streamer-c4d6ef3e{0%{background-position:200%}to{background-position:-200%}}@keyframes rotate-shake-c4d6ef3e{0%{transform:rotate(0deg)}50%{transform:rotate(10deg)}to{transform:rotate(0deg)}}@keyframes shake-c4d6ef3e{0%{transform:translateX(0)}50%{transform:translateX(-1px)}to{transform:translateX(0)}}@keyframes scale-c4d6ef3e{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.desktop-only[data-v-c4d6ef3e]{display:inline-block}.mobile-only[data-v-c4d6ef3e]{display:none}@media (max-width:768px){.desktop-only[data-v-c4d6ef3e]{display:none!important}.mobile-only[data-v-c4d6ef3e]{display:flex!important}}.toggle-dark-button[data-v-c4d6ef3e]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .toggle-dark-button[data-v-c4d6ef3e]{border:1px solid #34343a}.more-dropdown[data-v-c4d6ef3e]{position:fixed;top:30px;right:30px;z-index:100}.more-dropdown .more-button[data-v-c4d6ef3e]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .more-dropdown .more-button[data-v-c4d6ef3e]{border:1px solid #34343a}.more-dropdown .more-button[data-v-c4d6ef3e]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .more-dropdown .more-button[data-v-c4d6ef3e]:hover{border-color:#4a4a52}.upload-method-button[data-v-c4d6ef3e]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .upload-method-button[data-v-c4d6ef3e]{border:1px solid #34343a}@media (max-width:768px){.upload-method-button[data-v-c4d6ef3e]{width:2rem;height:2rem}}.upload-method-icon[data-v-c4d6ef3e]{outline:none}.more-button .svg-inline--fa[data-v-c4d6ef3e],.upload-method-button .svg-inline--fa[data-v-c4d6ef3e]{font-size:1.5em}.directory-tree-trigger .svg-inline--fa[data-v-c4d6ef3e]{font-size:1.2em}.mobile-more-dropdown[data-v-c4d6ef3e]{position:fixed;top:30px;right:18px;z-index:100}.mobile-more-button[data-v-c4d6ef3e]{width:2rem;height:2rem;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .mobile-more-button[data-v-c4d6ef3e]{border:1px solid #34343a}.mobile-more-button[data-v-c4d6ef3e]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .mobile-more-button[data-v-c4d6ef3e]:hover{border-color:#4a4a52}.upload-folder-container[data-v-c4d6ef3e]{display:flex;align-items:center;position:fixed;top:30px;right:180px;z-index:100}.upload-folder-container.no-announcement[data-v-c4d6ef3e]{right:180px}@media (max-width:768px){.upload-folder-container.no-announcement[data-v-c4d6ef3e],.upload-folder-container[data-v-c4d6ef3e]{right:58px}}.upload-folder[data-v-c4d6ef3e]{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-c4d6ef3e]{width:200px}@media (max-width:768px){.upload-folder[data-v-c4d6ef3e]{width:80px;height:2rem}.upload-folder.active[data-v-c4d6ef3e]{width:120px}}.directory-tree-trigger[data-v-c4d6ef3e]{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-c4d6ef3e]:hover{border-color:#bfc4cc;transform:scale(1.05)}html.dark .directory-tree-trigger[data-v-c4d6ef3e]:hover{border-color:#4a4a52}@media (max-width:768px){.directory-tree-trigger[data-v-c4d6ef3e]{width:2rem;height:2rem}.directory-tree-trigger .svg-inline--fa[data-v-c4d6ef3e]{font-size:1.1em}}.upload-folder[data-v-c4d6ef3e] .inner-folder-input{width:100%;height:100%}.upload-folder[data-v-c4d6ef3e] .el-input{height:100%;box-sizing:border-box}.upload-folder[data-v-c4d6ef3e] .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-c4d6ef3e] .el-input__wrapper:hover{background-color:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .upload-folder[data-v-c4d6ef3e] .el-input__wrapper:hover{background-color:rgba(22,22,24,.88);border-color:#4a4a52}.upload-folder[data-v-c4d6ef3e] .el-input__wrapper.is-focus,.upload-folder[data-v-c4d6ef3e] .el-input__wrapper:focus-within{border-color:var(--glass-border);box-shadow:var(--glass-shadow)!important}.quick-toolbar[data-v-c4d6ef3e]{--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 #d9dce2;background-color:var(--glass-bg);box-shadow:none;transition:background-color .24s ease,border-color .24s ease}html.dark .quick-toolbar[data-v-c4d6ef3e]{border:1px solid #34343a}.directory-tree-trigger[data-v-c4d6ef3e],.mobile-more-button[data-v-c4d6ef3e],.more-dropdown .more-button[data-v-c4d6ef3e],.quick-toolbar[data-v-c4d6ef3e],.toggle-dark-button[data-v-c4d6ef3e],.upload-method-button[data-v-c4d6ef3e]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.quick-toolbar-button[data-v-c4d6ef3e]{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-c4d6ef3e]{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-c4d6ef3e]{grid-template-rows:1fr;margin-bottom:4px;opacity:1;pointer-events:auto;transform:translateY(0)}.quick-toolbar-actions-inner[data-v-c4d6ef3e]{display:flex;flex-direction:column;align-items:center;gap:3px;min-height:0;overflow:hidden}.quick-toolbar-more.is-active[data-v-c4d6ef3e]{background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-shadow)}.quick-toolbar-more[data-v-c4d6ef3e]{margin-top:4px}.quick-toolbar-icon[data-v-c4d6ef3e]{font-size:16px}.quick-toolbar-toggle-icon[data-v-c4d6ef3e]{transform:rotate(180deg);transition:transform .32s ease}.quick-toolbar-more.is-active .quick-toolbar-toggle-icon[data-v-c4d6ef3e]{transform:rotate(0deg)}.info-container[data-v-c4d6ef3e]:hover,.quick-toolbar-button[data-v-c4d6ef3e]: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-c4d6ef3e]:hover{border-color:#bfc4cc}html.dark .quick-toolbar[data-v-c4d6ef3e]:hover{border-color:#4a4a52}.quick-toolbar-button[data-v-c4d6ef3e]:hover{transform:none}.toggle-dark-button[data-v-c4d6ef3e]:hover,.upload-method-button[data-v-c4d6ef3e]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark-button[data-v-c4d6ef3e]:hover,html.dark .upload-method-button[data-v-c4d6ef3e]:hover{border-color:#4a4a52}.upload-folder[data-v-c4d6ef3e]:hover .el-input__wrapper{background-color:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .upload-folder[data-v-c4d6ef3e]:hover .el-input__wrapper{background-color:rgba(22,22,24,.88);border-color:#4a4a52}@media (max-width:768px){.quick-toolbar[data-v-c4d6ef3e]{--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-c4d6ef3e]{margin-bottom:0}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-c4d6ef3e]{margin-bottom:3px}.quick-toolbar-actions-inner[data-v-c4d6ef3e]{gap:2px}.quick-toolbar-more[data-v-c4d6ef3e]{margin-top:3px}.quick-toolbar-icon[data-v-c4d6ef3e]{font-size:14px}}[data-v-c4d6ef3e] .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-c4d6ef3e]{display:flex;justify-content:center;margin-top:20px}.header[data-v-c4d6ef3e]{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-c4d6ef3e]{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-c4d6ef3e 4s ease-in-out infinite;letter-spacing:3px}.title[data-v-c4d6ef3e]:hover{transform:scale(1.08);filter:drop-shadow(0 0 20px var(--upload-title-hover-glow))}.title[data-v-c4d6ef3e]: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-c4d6ef3e]:hover:after{width:80%}.main-title[data-v-c4d6ef3e]{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-c4d6ef3e]{opacity:0}.title[data-v-c4d6ef3e]:hover{color:transparent;text-shadow:none}.title-crayon-text[data-v-c4d6ef3e]{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-c4d6ef3e]{animation:crayonWrite-c4d6ef3e .82s steps(18) forwards,crayonScratch-c4d6ef3e .16s steps(2) .82s 3}@keyframes float-c4d6ef3e{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}@keyframes crayonWrite-c4d6ef3e{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-c4d6ef3e{0%,to{transform:translateX(-50%) rotate(-.8deg)}50%{transform:translateX(calc(-50% + 1px)) rotate(-.45deg)}}@media (max-width:768px){.title[data-v-c4d6ef3e]{font-size:1.55rem;letter-spacing:1px}.title[data-v-c4d6ef3e]:hover{transform:scale(1.05)}}.upload-home[data-v-c4d6ef3e]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:94vh;background-color:var(--admin-container-bg-color)}.upload[data-v-c4d6ef3e]{margin-bottom:5px;position:relative;top:-3vh}@media (max-width:768px){.header[data-v-c4d6ef3e]{padding:8px 15px 4px;top:-2.5vh}.title[data-v-c4d6ef3e]{padding-bottom:5px}.upload[data-v-c4d6ef3e]{top:-3.8vh}}.footer[data-v-c4d6ef3e]{height:6vh} \ No newline at end of file +.history-container[data-v-f70e7770]{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-f70e7770]: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-f70e7770]{clip-path:circle(150% at calc(100% - 200px) 50px);opacity:1}.history-header[data-v-f70e7770]{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-f70e7770]{display:flex;align-items:baseline;gap:15px}.header-left h2[data-v-f70e7770]{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-f70e7770]{color:var(--upload-text-color);font-size:14px;opacity:.8}.header-right[data-v-f70e7770]{display:flex;gap:10px}.header-right .el-button[data-v-f70e7770]{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-f70e7770]:hover{transform:scale(1.05);box-shadow:var(--toolbar-button-shadow-hover)}.header-right .el-button.el-button--danger[data-v-f70e7770]{background:#dc2626;color:#fff}.history-content[data-v-f70e7770]{flex:1;overflow-y:auto;padding:20px 40px}.grid-view[data-v-f70e7770]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:20px}.grid-item[data-v-f70e7770]{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-f70e7770]:hover{box-shadow:var(--toolbar-button-shadow-hover)}.grid-preview[data-v-f70e7770]{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-f70e7770],.grid-preview video[data-v-f70e7770]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper[data-v-f70e7770]{font-size:48px;color:var(--theme-toggle-color);opacity:.5}.grid-overlay[data-v-f70e7770]{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-f70e7770]{opacity:1}.grid-actions[data-v-f70e7770]{display:flex;gap:15px}.grid-info[data-v-f70e7770]{padding:12px}.file-name[data-v-f70e7770]{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-f70e7770]{font-size:12px;color:var(--upload-text-color);opacity:.6}.list-view[data-v-f70e7770]{display:flex;flex-direction:column;gap:10px}.list-item[data-v-f70e7770]{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-f70e7770]:hover{transform:translateX(5px);box-shadow:var(--toolbar-button-shadow-hover)}.list-preview[data-v-f70e7770]{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-f70e7770],.list-preview video[data-v-f70e7770]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.file-icon-wrapper-small[data-v-f70e7770]{font-size:24px;color:var(--theme-toggle-color);opacity:.5}.list-info[data-v-f70e7770]{flex:1;min-width:0;margin-right:20px}.file-url[data-v-f70e7770]{font-size:12px;color:var(--upload-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.6}.list-meta[data-v-f70e7770]{margin-right:20px;text-align:right;min-width:140px}.list-actions[data-v-f70e7770]{display:flex;gap:8px}.empty-state[data-v-f70e7770]{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-f70e7770]{font-size:64px;margin-bottom:20px;color:var(--theme-toggle-color)}.history-content[data-v-f70e7770]::-webkit-scrollbar{width:8px}.history-content[data-v-f70e7770]::-webkit-scrollbar-track{background:transparent}.history-content[data-v-f70e7770]::-webkit-scrollbar-thumb{background:var(--el-border-color);border-radius:4px}.history-content[data-v-f70e7770]::-webkit-scrollbar-thumb:hover{background:var(--el-border-color-darker)}.action-btn-view[data-v-f70e7770]{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-f70e7770]:hover{box-shadow:var(--toolbar-button-shadow-hover);color:var(--el-color-primary)}.history-group[data-v-f70e7770]{position:relative;padding-left:30px;border-left:2px solid var(--el-border-color-lighter);margin-left:10px;padding-bottom:30px}.history-group[data-v-f70e7770]:last-child{border-left:2px solid transparent}.timeline-header[data-v-f70e7770]{display:flex;align-items:center;margin-bottom:20px;position:relative}.timeline-dot[data-v-f70e7770]{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-f70e7770]{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-f70e7770]{display:flex;justify-content:center;padding:20px}.loading-indicator[data-v-f70e7770]{display:flex;align-items:center;gap:8px;color:var(--el-upload-dragger-uniform-color)}.load-more-hint[data-v-f70e7770],.no-more-hint[data-v-f70e7770]{color:var(--upload-text-color);opacity:.5;font-size:14px}.no-more-hint[data-v-f70e7770]{text-align:center;padding:20px}@media (max-width:768px){.history-header[data-v-f70e7770]{padding:15px 20px}.header-left h2[data-v-f70e7770]{font-size:20px}.history-content[data-v-f70e7770]{padding:15px 20px}.grid-view[data-v-f70e7770]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:15px}.grid-preview[data-v-f70e7770]{height:120px}.list-meta[data-v-f70e7770]{display:none}.list-info[data-v-f70e7770]{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-33933ada]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-33933ada] svg,.channel-svg-icon[data-v-33933ada]{width:1em;height:1em;fill:currentColor}.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)}.upload-settings-dialog .channel-brand-telegram{color:#229ed9!important}.upload-settings-dialog .channel-brand-cfr2{color:#f38020!important}.upload-settings-dialog .channel-brand-s3{color:#f90!important}.upload-settings-dialog .channel-brand-discord{color:#5865f2!important}.upload-settings-dialog .channel-brand-huggingface{color:#ff9d00!important}.upload-settings-dialog .channel-brand-webdav{color:#14b8a6!important}@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-698179d6]{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-698179d6]:hover{border-color:var(--upload-list-item-hover-border,rgba(37,99,235,.25));box-shadow:none}.upload-list-item-content[data-v-698179d6]{display:flex;flex-direction:column;margin-left:10px}.upload-list-item-action[data-v-698179d6]{display:flex;flex-direction:column;align-items:center;gap:6px}.upload-list-item-url-row[data-v-698179d6]{display:flex;flex-direction:row;align-items:center;width:38vw;gap:8px;margin-bottom:6px}.upload-list-item-url-row[data-v-698179d6]:last-child{margin-bottom:0}.upload-list-item-url[data-v-698179d6]{display:flex;flex-direction:column}.file-icon[data-v-698179d6]{font-size:30px;color:var(--upload-list-file-icon-color)}.upload-list-item-name-wrapper[data-v-698179d6]{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-698179d6]: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-698179d6]{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-698179d6]{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-698179d6] .el-progress{--el-color-primary:#2563eb}.upload-list-item-progress[data-v-698179d6] .el-progress-bar{padding-right:0;margin-right:0}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .el-progress-bar__inner{border-radius:8px;background:#2563eb!important;box-shadow:none;position:relative;overflow:hidden;transition:width .3s ease}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .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-698179d6 1s linear infinite}.upload-list-item-progress[data-v-698179d6] .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-698179d6] .el-progress--success .el-progress-bar__inner:after,.upload-list-item-progress[data-v-698179d6] .el-progress--success .el-progress-bar__inner:before{animation:none;background:none}.upload-list-item-progress[data-v-698179d6] .el-progress--exception .el-progress-bar__inner{background:#dc2626!important;background-size:200% 100%;box-shadow:none;animation:progressPulse-698179d6 1s ease-in-out infinite}.upload-list-item-progress[data-v-698179d6] .el-progress--exception .el-progress-bar__inner:before{animation:none;background:none}@keyframes progressStripes-698179d6{0%{transform:translateX(0)}to{transform:translateX(22.627px)}}@keyframes progressPulse-698179d6{0%,to{opacity:1}50%{opacity:.7}}.upload-list-item-url[data-v-698179d6] .el-input{transition:all .3s cubic-bezier(.4,0,.2,1)}.upload-list-item-url[data-v-698179d6] .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-698179d6] .el-input-group>.el-input__wrapper{border-radius:0 9px 9px 0!important}.upload-list-item-url[data-v-698179d6] .el-input__wrapper:hover{box-shadow:none;border-color:var(--el-color-primary-light-5)}.upload-list-item-url[data-v-698179d6] .el-input__wrapper.is-focus{box-shadow:none;border-color:var(--el-color-primary)}.upload-list-item-url[data-v-698179d6] .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-698179d6 2s infinite;z-index:0}@keyframes shimmer-698179d6{0%{left:-100%}to{left:100%}}.upload-list-item-url[data-v-698179d6] .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-698179d6] .el-input__inner::-moz-selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-698179d6] .el-input__inner::selection{background-color:var(--el-color-primary-light-7)}.upload-list-item-url[data-v-698179d6] .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-698179d6] .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-698179d6] .el-input:hover .el-input-group__prepend{background:var(--el-color-primary-light-8)}.upload-list-item-url[data-v-698179d6] .el-input:hover .el-input-group__prepend:after{opacity:.5}.upload-list-item-url[data-v-698179d6] .el-input.is-focus .el-input-group__prepend{background:var(--el-color-primary);color:#fff;animation:prependPulse-698179d6 2s ease-in-out infinite}.upload-list-item-url[data-v-698179d6] .el-input.is-focus .el-input-group__prepend:after{background:hsla(0,0%,100%,.3);opacity:1}@keyframes prependPulse-698179d6{0%,to{opacity:1}50%{opacity:.95}}.modern-file-action-btn[data-v-698179d6]{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-698179d6]:before{content:"";position:absolute;inset:2px;border-radius:8px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-file-action-btn[data-v-698179d6]:hover{background:var(--upload-action-btn-hover-bg)}.modern-file-action-btn[data-v-698179d6]:hover:before{opacity:.08}.modern-file-action-btn[data-v-698179d6]:active{transform:scale(.96)}.modern-file-action-btn-primary[data-v-698179d6]{color:var(--upload-action-copy-color)}.modern-file-action-btn-danger[data-v-698179d6]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-file-action-btn-danger[data-v-698179d6]:hover{background:var(--upload-action-danger-hover-bg)}@media (max-width:768px){.upload-list-item[data-v-698179d6]{margin:5px 6px;padding:7px 8px;border-radius:12px}.upload-list-item-content[data-v-698179d6]{margin-left:2px}.upload-list-item-action[data-v-698179d6]{gap:3px}.upload-list-item-url-row[data-v-698179d6]{width:42vw;flex-direction:column;gap:4px;margin-bottom:4px}.upload-list-item-progress[data-v-698179d6]{width:32vw;margin-top:5px;padding:2px 5px;border-radius:9px}.upload-list-item-progress[data-v-698179d6] .el-progress-bar__outer{height:6px!important}.upload-list-item-url[data-v-698179d6] .el-input__wrapper{border-radius:7px}.upload-list-item-url[data-v-698179d6] .el-input__inner{font-size:10px;padding-left:8px}.upload-list-item-url[data-v-698179d6] .el-input-group__prepend{font-size:9px;padding:0 6px;border-radius:7px 0 0 7px}.modern-file-action-btn[data-v-698179d6]{width:26px;height:26px;margin:2px 0;border-radius:8px;font-size:12px}.upload-list-item-name-wrapper[data-v-698179d6]{padding:3px 8px;margin-bottom:5px;border-radius:7px}.upload-list-item-name[data-v-698179d6]{font-size:11px;width:32vw}}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.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-fca24b68{0%{--border-angle:0deg}to{--border-angle:360deg}}.upload-form[data-v-fca24b68],.upload-list-card[data-v-fca24b68]{display:flex;flex-direction:column;justify-content:center;align-items:center}.upload-list-card[data-v-fca24b68]{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-fca24b68] .el-card__body{padding:0;width:100%;overflow:hidden}.upload-list-container[data-v-fca24b68]{width:55vw;height:7vh;transition:height .3s ease;overflow:hidden}@media (max-width:768px){.upload-list-card[data-v-fca24b68],.upload-list-container[data-v-fca24b68]{width:70vw}}.upload-list-card.upload-list-busy[data-v-fca24b68],.upload-list-container.upload-list-busy[data-v-fca24b68]{height:40vh}.upload-list-card.is-uploading[data-v-fca24b68]{border:1px solid var(--el-upload-dragger-uniform-color,#2563eb)!important;box-shadow:none!important}.upload-card-wrapper[data-v-fca24b68]{position:relative;overflow:visible}.upload-card-glow[data-v-fca24b68]{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-fca24b68]{width:55vw;padding:20px;background:none}@media (max-width:768px){.upload-card[data-v-fca24b68]{width:70vw}}.upload-card-busy[data-v-fca24b68] .el-upload-dragger{height:17vh}[data-v-fca24b68] .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-fca24b68] .el-upload:focus .el-upload-dragger{border-color:var(--glass-border-hover)}[data-v-fca24b68] .el-upload-dragger.is-dragover,[data-v-fca24b68] .el-upload-dragger:hover{opacity:.7;box-shadow:var(--glass-shadow)}.is-uploading[data-v-fca24b68] .el-upload-dragger{border-color:transparent!important}.upload-card.is-uploading[data-v-fca24b68]{position:relative;background:none}.upload-card.is-uploading[data-v-fca24b68]: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-fca24b68 2s linear infinite;pointer-events:none;z-index:1}.el-upload__text[data-v-fca24b68]{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-fca24b68]{font-size:small}}.el-upload__text.upload-list-busy[data-v-fca24b68]{font-size:small}.el-icon--upload[data-v-fca24b68]{font-size:100px;transition:font-size .3s ease;color:var(--el-icon--upload-color)}.el-icon--upload.upload-list-busy[data-v-fca24b68]{font-size:60px}@media (max-width:768px){.el-icon--upload[data-v-fca24b68]{font-size:50px}.el-icon--upload.upload-list-busy[data-v-fca24b68]{font-size:30px}}.paste-card[data-v-fca24b68]{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-fca24b68]:hover{opacity:.8;box-shadow:var(--el-upload-dragger-hover-box-shadow)}.paste-card.is-uploading[data-v-fca24b68]{position:relative;border-color:transparent!important;overflow:visible}.paste-card.is-uploading[data-v-fca24b68]: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-fca24b68 2s linear infinite;pointer-events:none;z-index:1}.paste-card[data-v-fca24b68] .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-fca24b68]{height:17vh}.upload-card-textarea[data-v-fca24b68]{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-fca24b68]{height:50%}.upload-card-textarea[data-v-fca24b68]: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-fca24b68]:hover:before{opacity:1}.upload-card-textarea[data-v-fca24b68]:focus-within:before{opacity:1;background:rgba(37,99,235,.4)}[data-v-fca24b68] .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-fca24b68] .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-fca24b68] .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder);font-weight:400;opacity:.7}[data-v-fca24b68] .el-textarea__inner:hover{background:var(--textarea-inner-hover-bg,rgba(37,99,235,.03))}[data-v-fca24b68] .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-fca24b68] ::-webkit-scrollbar{width:6px;height:6px}.upload-card-textarea[data-v-fca24b68] ::-webkit-scrollbar-track{background:transparent;border-radius:6px;margin:8px}.upload-card-textarea[data-v-fca24b68] ::-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-fca24b68] ::-webkit-scrollbar-thumb:hover{background:rgba(37,99,235,.7)}.paste-card-actions[data-v-fca24b68]{display:flex;justify-content:space-between;align-items:center;width:50vw;gap:12px;margin-top:16px}.paste-card-upload-button[data-v-fca24b68]{min-width:92px;height:38px;border-radius:10px!important;font-weight:600;font-size:14px;letter-spacing:.04em;color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 10%,var(--toolbar-button-bg-color))!important;border:1px solid color-mix(in srgb,var(--el-upload-dragger-uniform-color) 30%,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-fca24b68]:hover{color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 15%,var(--toolbar-button-bg-color))!important;border-color:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 48%,var(--glass-border))!important;transform:translateY(-1px);box-shadow:none}.paste-card-upload-button[data-v-fca24b68]:focus-visible{color:var(--el-upload-dragger-uniform-color)!important;background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 15%,var(--toolbar-button-bg-color))!important;border-color:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 48%,var(--glass-border))!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--el-upload-dragger-uniform-color) 14%,transparent)!important}.paste-card-upload-button[data-v-fca24b68]:active{transform:translateY(0);background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 18%,var(--toolbar-button-bg-color))!important}.upload-card-busy .paste-card-upload-button[data-v-fca24b68]{min-width:72px;height:32px;border-radius:8px!important;font-size:13px;letter-spacing:.02em}.upload-card-busy .paste-card-actions[data-v-fca24b68]{margin-top:10px}.paste-card-method-group[data-v-fca24b68]{display:inline-flex;align-items:center;height:38px;box-sizing:border-box;gap:2px;padding:3px;background:var(--modern-action-group-bg);border:1px solid var(--modern-action-group-border);border-radius:10px}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner{display:inline-flex;align-items:center;justify-content:center;min-width:64px;height:30px;box-sizing:border-box;padding:0 14px;border-radius:7px!important;border:none!important;background:transparent;font-weight:500;font-size:13px;line-height:1;color:var(--toolbar-button-color);box-shadow:none!important;transition:color .2s ease,background-color .2s ease,box-shadow .2s ease}.paste-card-method-group[data-v-fca24b68] .el-radio-button:first-child .el-radio-button__inner,.paste-card-method-group[data-v-fca24b68] .el-radio-button:last-child .el-radio-button__inner{border-radius:7px!important}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner:hover{background:var(--modern-action-group-hover-bg);color:var(--el-text-color-primary)}.paste-card-method-group[data-v-fca24b68] .el-radio-button__original-radio:checked+.el-radio-button__inner{background:color-mix(in srgb,var(--el-upload-dragger-uniform-color) 16%,var(--toolbar-button-bg-color))!important;color:var(--el-upload-dragger-uniform-color)!important;font-weight:600;box-shadow:0 0 0 1px color-mix(in srgb,var(--el-upload-dragger-uniform-color) 52%,var(--glass-border)) inset!important}@media (max-width:768px){.paste-card[data-v-fca24b68]{height:auto;min-height:30vh;padding:6px;border-radius:12px}.upload-card-busy.paste-card[data-v-fca24b68]{height:auto;min-height:18vh;padding:5px}.upload-card-textarea[data-v-fca24b68]{margin-top:4px;width:calc(100% - 4px)!important}.upload-card-textarea[data-v-fca24b68]:before{border-radius:11px}[data-v-fca24b68] .el-textarea__inner{border-radius:10px;padding:8px 10px;font-size:12px}.paste-card-actions[data-v-fca24b68]{width:100%!important;margin-top:8px;gap:8px}.paste-card-upload-button[data-v-fca24b68]{height:32px;min-width:64px;border-radius:8px!important;font-size:12px;letter-spacing:.02em;padding:0 12px}.paste-card-method-group[data-v-fca24b68]{height:32px;padding:3px;border-radius:9px}.paste-card-method-group[data-v-fca24b68] .el-radio-button__inner{min-width:52px;height:26px;padding:0 10px;font-size:11px;border-radius:6px!important}}.upload-list-dashboard[data-v-fca24b68]{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-fca24b68] .el-upload-dragger{position:relative;overflow:hidden}[data-v-fca24b68] .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-fca24b68] .el-upload-dragger:after,[data-v-fca24b68] .el-upload-dragger:before{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;z-index:0;transition:opacity .6s ease}[data-v-fca24b68] .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-fca24b68]:hover .el-upload-dragger:before{opacity:.3;animation:starScroll-fca24b68 60s linear infinite}.upload-card[data-v-fca24b68]:hover .el-upload-dragger:after{opacity:.6;animation:starScroll-fca24b68 40s linear infinite,starPulse-fca24b68 4s ease-in-out infinite}@keyframes starScroll-fca24b68{0%{background-position:0 0}to{background-position:100px 100px}}@keyframes starPulse-fca24b68{0%,to{opacity:.6}50%{opacity:.3}}.modern-action-group[data-v-fca24b68]{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-fca24b68]:hover{background:var(--glass-bg);border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.modern-action-btn[data-v-fca24b68]{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-fca24b68]:focus,.modern-action-btn[data-v-fca24b68]:focus-visible{outline:none!important}.modern-action-btn[data-v-fca24b68]:before{content:"";position:absolute;inset:2px;border-radius:11px;background:currentColor;opacity:0;transition:opacity .22s ease}.modern-action-btn[data-v-fca24b68]:hover{background:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-hover-shadow)}.modern-action-btn[data-v-fca24b68]:hover:before{opacity:.08}.modern-action-btn[data-v-fca24b68]:active{transform:translateY(0) scale(.97);box-shadow:var(--upload-action-btn-active-shadow)}.modern-action-btn-copy[data-v-fca24b68]{color:var(--upload-action-copy-color)}.modern-action-btn-retry[data-v-fca24b68]{color:var(--upload-action-retry-color)}.modern-action-btn-danger[data-v-fca24b68]{color:var(--upload-action-danger-color);background:var(--upload-action-danger-bg)}.modern-action-btn-danger[data-v-fca24b68]:hover{background:var(--upload-action-danger-hover-bg);box-shadow:var(--upload-action-danger-hover-shadow)}.modern-dropdown-item-content[data-v-fca24b68]{display:flex;align-items:center;justify-content:space-between;width:100%;gap:12px;padding:4px 0}.modern-dropdown-item-content span[data-v-fca24b68]{font-weight:500;color:var(--el-text-color-primary)}.upload-list-dashboard-title[data-v-fca24b68]{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-fca24b68]{font-size:16px;margin-right:4px;opacity:.85}@media (max-width:768px){.modern-action-group[data-v-fca24b68]{height:34px;gap:2px;padding:2px;border-radius:9px}.modern-action-btn[data-v-fca24b68]{width:28px;height:28px;border-radius:7px;font-size:11px}.upload-list-dashboard-title[data-v-fca24b68]{height:34px;font-size:11px;padding:0 7px;border-radius:9px}.upload-list-dashboard-title .el-icon[data-v-fca24b68]{font-size:13px;margin-right:1px}.upload-list-dashboard[data-v-fca24b68]{padding:0 6px;gap:4px}.upload-list-dashboard-title[data-v-fca24b68]{gap:3px;min-width:0;flex-shrink:1;overflow:hidden}.upload-list-dashboard-action[data-v-fca24b68]{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-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.container[data-v-51cecbb0]{background:var(--bg-color);min-height:100vh}.rotate[data-v-51cecbb0]{animation:spin-51cecbb0 2s ease-in-out}.scale[data-v-51cecbb0]{animation:scale-51cecbb0 .5s ease-in-out}@keyframes spin-51cecbb0{0%{transform:rotate(0deg)}25%{transform:rotate(5deg)}50%{transform:rotate(0deg)}75%{transform:rotate(-3deg)}to{transform:rotate(0deg)}}@keyframes streamer-51cecbb0{0%{background-position:200%}to{background-position:-200%}}@keyframes rotate-shake-51cecbb0{0%{transform:rotate(0deg)}50%{transform:rotate(10deg)}to{transform:rotate(0deg)}}@keyframes shake-51cecbb0{0%{transform:translateX(0)}50%{transform:translateX(-1px)}to{transform:translateX(0)}}@keyframes scale-51cecbb0{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.desktop-only[data-v-51cecbb0]{display:inline-block}.mobile-only[data-v-51cecbb0]{display:none}@media (max-width:768px){.desktop-only[data-v-51cecbb0]{display:none!important}.mobile-only[data-v-51cecbb0]{display:flex!important}}.toggle-dark-button[data-v-51cecbb0]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .toggle-dark-button[data-v-51cecbb0]{border:1px solid #34343a}.more-dropdown[data-v-51cecbb0]{position:fixed;top:30px;right:30px;z-index:100}.more-dropdown .more-button[data-v-51cecbb0]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .more-dropdown .more-button[data-v-51cecbb0]{border:1px solid #34343a}.more-dropdown .more-button[data-v-51cecbb0]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .more-dropdown .more-button[data-v-51cecbb0]:hover{border-color:#4a4a52}.upload-method-button[data-v-51cecbb0]{width:2.5rem;height:2.5rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .upload-method-button[data-v-51cecbb0]{border:1px solid #34343a}@media (max-width:768px){.upload-method-button[data-v-51cecbb0]{width:2rem;height:2rem}}.upload-method-icon[data-v-51cecbb0]{outline:none}.more-button .svg-inline--fa[data-v-51cecbb0],.upload-method-button .svg-inline--fa[data-v-51cecbb0]{font-size:1.5em}.directory-tree-trigger .svg-inline--fa[data-v-51cecbb0]{font-size:1.2em}.mobile-more-dropdown[data-v-51cecbb0]{position:fixed;top:30px;right:18px;z-index:100}.mobile-more-button[data-v-51cecbb0]{width:2rem;height:2rem;display:flex;justify-content:center;align-items:center;border:1px solid #d9dce2;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}html.dark .mobile-more-button[data-v-51cecbb0]{border:1px solid #34343a}.mobile-more-button[data-v-51cecbb0]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .mobile-more-button[data-v-51cecbb0]:hover{border-color:#4a4a52}.upload-folder-container[data-v-51cecbb0]{display:flex;align-items:center;position:fixed;top:30px;right:180px;z-index:100}.upload-folder-container.no-announcement[data-v-51cecbb0]{right:180px}@media (max-width:768px){.upload-folder-container.no-announcement[data-v-51cecbb0],.upload-folder-container[data-v-51cecbb0]{right:58px}}.upload-folder[data-v-51cecbb0]{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-51cecbb0]{width:200px}@media (max-width:768px){.upload-folder[data-v-51cecbb0]{width:80px;height:2rem}.upload-folder.active[data-v-51cecbb0]{width:120px}}.directory-tree-trigger[data-v-51cecbb0]{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-51cecbb0]:hover{border-color:#bfc4cc;transform:scale(1.05)}html.dark .directory-tree-trigger[data-v-51cecbb0]:hover{border-color:#4a4a52}@media (max-width:768px){.directory-tree-trigger[data-v-51cecbb0]{width:2rem;height:2rem}.directory-tree-trigger .svg-inline--fa[data-v-51cecbb0]{font-size:1.1em}}.upload-folder[data-v-51cecbb0] .inner-folder-input{width:100%;height:100%}.upload-folder[data-v-51cecbb0] .el-input{height:100%;box-sizing:border-box}.upload-folder[data-v-51cecbb0] .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-51cecbb0] .el-input__wrapper:hover{background-color:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .upload-folder[data-v-51cecbb0] .el-input__wrapper:hover{background-color:rgba(22,22,24,.88);border-color:#4a4a52}.upload-folder[data-v-51cecbb0] .el-input__wrapper.is-focus,.upload-folder[data-v-51cecbb0] .el-input__wrapper:focus-within{border-color:var(--glass-border);box-shadow:var(--glass-shadow)!important}.quick-toolbar[data-v-51cecbb0]{--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 #d9dce2;background-color:var(--glass-bg);box-shadow:none;transition:background-color .24s ease,border-color .24s ease}html.dark .quick-toolbar[data-v-51cecbb0]{border:1px solid #34343a}.directory-tree-trigger[data-v-51cecbb0],.mobile-more-button[data-v-51cecbb0],.more-dropdown .more-button[data-v-51cecbb0],.quick-toolbar[data-v-51cecbb0],.toggle-dark-button[data-v-51cecbb0],.upload-method-button[data-v-51cecbb0]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.quick-toolbar-button[data-v-51cecbb0]{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-51cecbb0]{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-51cecbb0]{grid-template-rows:1fr;margin-bottom:4px;opacity:1;pointer-events:auto;transform:translateY(0)}.quick-toolbar-actions-inner[data-v-51cecbb0]{display:flex;flex-direction:column;align-items:center;gap:3px;min-height:0;overflow:hidden}.quick-toolbar-more.is-active[data-v-51cecbb0]{background-color:var(--upload-action-btn-hover-bg);box-shadow:var(--upload-action-btn-shadow)}.quick-toolbar-more[data-v-51cecbb0]{margin-top:4px}.quick-toolbar-icon[data-v-51cecbb0]{font-size:16px}.quick-toolbar-toggle-icon[data-v-51cecbb0]{transform:rotate(180deg);transition:transform .32s ease}.quick-toolbar-more.is-active .quick-toolbar-toggle-icon[data-v-51cecbb0]{transform:rotate(0deg)}.info-container[data-v-51cecbb0]:hover,.quick-toolbar-button[data-v-51cecbb0]: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-51cecbb0]:hover{border-color:#bfc4cc}html.dark .quick-toolbar[data-v-51cecbb0]:hover{border-color:#4a4a52}.quick-toolbar-button[data-v-51cecbb0]:hover{transform:none}.toggle-dark-button[data-v-51cecbb0]:hover,.upload-method-button[data-v-51cecbb0]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark-button[data-v-51cecbb0]:hover,html.dark .upload-method-button[data-v-51cecbb0]:hover{border-color:#4a4a52}.upload-folder[data-v-51cecbb0]:hover .el-input__wrapper{background-color:hsla(0,0%,100%,.85);border-color:#bfc4cc}html.dark .upload-folder[data-v-51cecbb0]:hover .el-input__wrapper{background-color:rgba(22,22,24,.88);border-color:#4a4a52}@media (max-width:768px){.quick-toolbar[data-v-51cecbb0]{--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-51cecbb0]{margin-bottom:0}.quick-toolbar.is-expanded .quick-toolbar-actions[data-v-51cecbb0]{margin-bottom:3px}.quick-toolbar-actions-inner[data-v-51cecbb0]{gap:2px}.quick-toolbar-more[data-v-51cecbb0]{margin-top:3px}.quick-toolbar-icon[data-v-51cecbb0]{font-size:14px}}[data-v-51cecbb0] .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-51cecbb0]{display:flex;justify-content:center;margin-top:20px}.header[data-v-51cecbb0]{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-51cecbb0]{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-51cecbb0 4s ease-in-out infinite;letter-spacing:3px}.title[data-v-51cecbb0]:hover{transform:scale(1.08);filter:drop-shadow(0 0 20px var(--upload-title-hover-glow))}.title[data-v-51cecbb0]: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-51cecbb0]:hover:after{width:80%}.main-title[data-v-51cecbb0]{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-51cecbb0]{opacity:0}.title[data-v-51cecbb0]:hover{color:transparent;text-shadow:none}.title-crayon-text[data-v-51cecbb0]{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-51cecbb0]{animation:crayonWrite-51cecbb0 .82s steps(18) forwards,crayonScratch-51cecbb0 .16s steps(2) .82s 3}@keyframes float-51cecbb0{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}@keyframes crayonWrite-51cecbb0{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-51cecbb0{0%,to{transform:translateX(-50%) rotate(-.8deg)}50%{transform:translateX(calc(-50% + 1px)) rotate(-.45deg)}}@media (max-width:768px){.title[data-v-51cecbb0]{font-size:1.55rem;letter-spacing:1px}.title[data-v-51cecbb0]:hover{transform:scale(1.05)}}.upload-home[data-v-51cecbb0]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:94vh;background-color:transparent}.upload[data-v-51cecbb0]{margin-bottom:5px;position:relative;top:-3vh}@media (max-width:768px){.header[data-v-51cecbb0]{padding:8px 15px 4px;top:-2.5vh}.title[data-v-51cecbb0]{padding-bottom:5px}.upload[data-v-51cecbb0]{top:-3.8vh}}.footer[data-v-51cecbb0]{height:6vh} \ No newline at end of file diff --git a/frontend-dist/css/800.c2738ec8.css.gz b/frontend-dist/css/800.c2738ec8.css.gz new file mode 100644 index 00000000..7e73e23c Binary files /dev/null and b/frontend-dist/css/800.c2738ec8.css.gz differ diff --git a/frontend-dist/css/804.64e37d88.css b/frontend-dist/css/804.64e37d88.css deleted file mode 100644 index 93dec440..00000000 --- a/frontend-dist/css/804.64e37d88.css +++ /dev/null @@ -1 +0,0 @@ -.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)}.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))}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important}.login[data-v-5b07fe04]{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:100vh;height:auto;background:var(--admin-container-bg-color,var(--bg-color));overflow-y:auto;padding:20px 0;box-sizing:border-box;transition:height .35s ease-out,min-height .35s ease-out}.login-title[data-v-5b07fe04]{font-size:2.3rem;margin-bottom:15px;color:var(--login-title-color);font-family:Pacifico,Noto Sans SC,sans-serif;cursor:pointer;transition:all .3s ease;letter-spacing:2px}@media (max-width:768px){.login-title[data-v-5b07fe04]{font-size:1.5rem}}.login-title[data-v-5b07fe04]:focus,.login-title[data-v-5b07fe04]:hover{text-shadow:0 0 10px var(--login-title-glow-color,rgba(52,152,219,.5))}.login-container[data-v-5b07fe04]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:auto;height:auto;width:600px;border-radius:12px;box-shadow:var(--login-container-box-shadow);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);transition:all .3s ease;padding:40px 0;gap:20px;position:relative;z-index:101}@media (max-width:768px){.login-container[data-v-5b07fe04]{width:85vw;padding:25px 0;gap:12px}}.login-container[data-v-5b07fe04]:hover{box-shadow:var(--login-container-hover-box-shadow)}.input-container[data-v-5b07fe04]{display:flex;flex-direction:column;align-items:flex-start;width:80%;margin-bottom:15px;position:relative;gap:8px}@media (max-width:768px){.input-container[data-v-5b07fe04]{width:85%;gap:4px;margin-bottom:8px}}.input-wrapper[data-v-5b07fe04]{position:relative;width:100%;display:flex;flex-direction:column;transition:all .3s cubic-bezier(.4,0,.2,1)}.input-icon[data-v-5b07fe04]{margin-right:6px;font-size:1rem}.input-name[data-v-5b07fe04]{font-size:.95rem;font-weight:600;color:var(--login-title-color);text-align:left;transition:all .3s ease;letter-spacing:.5px;position:relative;display:flex;align-items:center;justify-content:flex-start;padding-left:2px}.input-name[data-v-5b07fe04]:after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:2px;background:var(--login-input-underline-color,#5b9bd3);transition:width .3s linear;border-radius:1px}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04]:after,.input-container:hover .input-name[data-v-5b07fe04]:after{width:var(--underline-width,50px)}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04],.input-container:hover .input-name[data-v-5b07fe04]{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.input-name[data-v-5b07fe04]{font-size:.85rem}}.submit[data-v-5b07fe04]{margin-bottom:10px;width:50%;height:48px;font-size:1.1rem;font-weight:600;letter-spacing:2px;border-radius:12px;background-color:var(--login-submit-btn-bg-color);transition:all .4s cubic-bezier(.4,0,.2,1);border:none;overflow:hidden;position:relative;padding:0;display:flex;justify-content:center;align-items:center}.submit.is-loading[data-v-5b07fe04]{width:48px;border-radius:50%;background-color:transparent!important;box-shadow:none!important;pointer-events:none}.loading-ring[data-v-5b07fe04]{display:inline-block;width:34px;height:34px;border:4px solid transparent;border-radius:50%;border-top-color:var(--login-title-color,#fff);animation:spin-5b07fe04 1s ease-in-out infinite;box-sizing:border-box}@keyframes spin-5b07fe04{to{transform:rotate(1turn)}}@media (max-width:768px){.submit[data-v-5b07fe04]{width:50%}}.submit[data-v-5b07fe04]:not(.is-loading):focus,.submit[data-v-5b07fe04]:not(.is-loading):hover{transform:scale(1.05);box-shadow:none}.submit[data-v-5b07fe04]:disabled{cursor:default;transform:none}.password-input[data-v-5b07fe04]{width:100%;height:50px;position:relative}.password-input[data-v-5b07fe04] .el-input__prefix{color:var(--login-input-icon-color,#59636e);font-size:1rem;transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__prefix{color:var(--login-input-label-focus-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper{border-radius:12px;background-color:var(--password-input-bg-color);border:1px solid var(--glass-border);box-shadow:none;padding:12px 16px;transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}.password-input[data-v-5b07fe04] .el-input__wrapper:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s}.password-input[data-v-5b07fe04] .el-input__wrapper:hover:before{left:100%}.password-input[data-v-5b07fe04] .el-input__wrapper:hover{box-shadow:none;border-color:var(--login-input-underline-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within{border-color:var(--login-input-underline-color,#5b9bd3);box-shadow:none}.password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,var(--login-input-text-color,#333));font-size:1rem;font-weight:500;background:transparent;border:none;box-shadow:none}.dark .password-input[data-v-5b07fe04] .el-input__inner,[data-theme=dark] .password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,#fff)!important}.password-input[data-v-5b07fe04] .el-input__inner::-moz-placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;-moz-transition:opacity .3s ease;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__inner::placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::-moz-placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__suffix{color:var(--icon-color,#666)}.password-input[data-v-5b07fe04] .el-input__suffix-inner{transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:hover .el-input__suffix-inner{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.password-input[data-v-5b07fe04]{width:100%;height:40px}.password-input[data-v-5b07fe04] .el-input__wrapper{padding:8px 12px}}.footer[data-v-5b07fe04]{position:fixed;bottom:0;width:100vw}.toggle-dark[data-v-5b07fe04]{position:fixed;top:30px;right:30px;border:1px solid #d9dce2;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px}html.dark .toggle-dark[data-v-5b07fe04]{border:1px solid #34343a}.toggle-dark[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04]{position:fixed;top:30px;right:80px;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border:1px solid #d9dce2;border-radius:12px;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;z-index:100}html.dark .language-switcher[data-v-5b07fe04]{border:1px solid #34343a}@media (max-width:768px){.language-switcher[data-v-5b07fe04]{width:2rem;height:2rem}}.language-switcher[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .language-switcher[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04],.toggle-dark[data-v-5b07fe04]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)} \ No newline at end of file diff --git a/frontend-dist/css/804.64e37d88.css.gz b/frontend-dist/css/804.64e37d88.css.gz deleted file mode 100644 index 85f4ddec..00000000 Binary files a/frontend-dist/css/804.64e37d88.css.gz and /dev/null differ diff --git a/frontend-dist/css/804.be127f60.css b/frontend-dist/css/804.be127f60.css new file mode 100644 index 00000000..72f6b522 --- /dev/null +++ b/frontend-dist/css/804.be127f60.css @@ -0,0 +1 @@ +.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)}.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))}}.language-switcher[data-v-08567d0a]{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:all .3s ease}.lang-icon[data-v-08567d0a]{font-size:var(--lang-icon-size,1.5em);color:var(--lang-icon-color,var(--theme-toggle-color))}#themeToggle[data-v-c93807da]{border:1px solid #d9dce2;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}html.dark #themeToggle[data-v-c93807da]{border:1px solid #34343a}#themeToggle[data-v-c93807da]:hover{border-color:#bfc4cc}html.dark #themeToggle[data-v-c93807da]:hover{border-color:#4a4a52}#themeToggle[data-v-c93807da]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}@media (max-width:768px){#themeToggle[data-v-c93807da]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-c93807da]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-c93807da]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-c93807da]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-c93807da]{transform:rotate(40deg)}.theme_toggle_g[data-v-c93807da]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-c93807da],.icon-fade-leave-active[data-v-c93807da]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-c93807da]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-c93807da],.icon-fade-leave-from[data-v-c93807da]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-c93807da]{display:inline-block}.background-image1:not([src]),.background-image2:not([src]){display:none}body.wallpaper-active{background-color:transparent!important}body.wallpaper-active .wallpaper-background-active{background:transparent!important;background-color:transparent!important}.login[data-v-5b07fe04]{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:100vh;height:auto;background:var(--admin-container-bg-color,var(--bg-color));overflow-y:auto;padding:20px 0;box-sizing:border-box;transition:height .35s ease-out,min-height .35s ease-out}.login-title[data-v-5b07fe04]{font-size:2.3rem;margin-bottom:15px;color:var(--login-title-color);font-family:Pacifico,Noto Sans SC,sans-serif;cursor:pointer;transition:all .3s ease;letter-spacing:2px}@media (max-width:768px){.login-title[data-v-5b07fe04]{font-size:1.5rem}}.login-title[data-v-5b07fe04]:focus,.login-title[data-v-5b07fe04]:hover{text-shadow:0 0 10px var(--login-title-glow-color,rgba(52,152,219,.5))}.login-container[data-v-5b07fe04]{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:auto;height:auto;width:600px;border-radius:12px;box-shadow:var(--login-container-box-shadow);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);transition:all .3s ease;padding:40px 0;gap:20px;position:relative;z-index:101}@media (max-width:768px){.login-container[data-v-5b07fe04]{width:85vw;padding:25px 0;gap:12px}}.login-container[data-v-5b07fe04]:hover{box-shadow:var(--login-container-hover-box-shadow)}.input-container[data-v-5b07fe04]{display:flex;flex-direction:column;align-items:flex-start;width:80%;margin-bottom:15px;position:relative;gap:8px}@media (max-width:768px){.input-container[data-v-5b07fe04]{width:85%;gap:4px;margin-bottom:8px}}.input-wrapper[data-v-5b07fe04]{position:relative;width:100%;display:flex;flex-direction:column;transition:all .3s cubic-bezier(.4,0,.2,1)}.input-icon[data-v-5b07fe04]{margin-right:6px;font-size:1rem}.input-name[data-v-5b07fe04]{font-size:.95rem;font-weight:600;color:var(--login-title-color);text-align:left;transition:all .3s ease;letter-spacing:.5px;position:relative;display:flex;align-items:center;justify-content:flex-start;padding-left:2px}.input-name[data-v-5b07fe04]:after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:2px;background:var(--login-input-underline-color,#5b9bd3);transition:width .3s linear;border-radius:1px}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04]:after,.input-container:hover .input-name[data-v-5b07fe04]:after{width:var(--underline-width,50px)}.input-container:has(.input-wrapper.focused) .input-name[data-v-5b07fe04],.input-container:hover .input-name[data-v-5b07fe04]{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.input-name[data-v-5b07fe04]{font-size:.85rem}}.submit[data-v-5b07fe04]{margin-bottom:10px;width:50%;height:48px;font-size:1.1rem;font-weight:600;letter-spacing:2px;border-radius:12px;background-color:var(--login-submit-btn-bg-color);transition:all .4s cubic-bezier(.4,0,.2,1);border:none;overflow:hidden;position:relative;padding:0;display:flex;justify-content:center;align-items:center}.submit.is-loading[data-v-5b07fe04]{width:48px;border-radius:50%;background-color:transparent!important;box-shadow:none!important;pointer-events:none}.loading-ring[data-v-5b07fe04]{display:inline-block;width:34px;height:34px;border:4px solid transparent;border-radius:50%;border-top-color:var(--login-title-color,#fff);animation:spin-5b07fe04 1s ease-in-out infinite;box-sizing:border-box}@keyframes spin-5b07fe04{to{transform:rotate(1turn)}}@media (max-width:768px){.submit[data-v-5b07fe04]{width:50%}}.submit[data-v-5b07fe04]:not(.is-loading):focus,.submit[data-v-5b07fe04]:not(.is-loading):hover{transform:scale(1.05);box-shadow:none}.submit[data-v-5b07fe04]:disabled{cursor:default;transform:none}.password-input[data-v-5b07fe04]{width:100%;height:50px;position:relative}.password-input[data-v-5b07fe04] .el-input__prefix{color:var(--login-input-icon-color,#59636e);font-size:1rem;transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__prefix{color:var(--login-input-label-focus-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper{border-radius:12px;background-color:var(--password-input-bg-color);border:1px solid var(--glass-border);box-shadow:none;padding:12px 16px;transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}.password-input[data-v-5b07fe04] .el-input__wrapper:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s}.password-input[data-v-5b07fe04] .el-input__wrapper:hover:before{left:100%}.password-input[data-v-5b07fe04] .el-input__wrapper:hover{box-shadow:none;border-color:var(--login-input-underline-color,#5b9bd3)}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within{border-color:var(--login-input-underline-color,#5b9bd3);box-shadow:none}.password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,var(--login-input-text-color,#333));font-size:1rem;font-weight:500;background:transparent;border:none;box-shadow:none}.dark .password-input[data-v-5b07fe04] .el-input__inner,[data-theme=dark] .password-input[data-v-5b07fe04] .el-input__inner{color:var(--text-color,#fff)!important}.password-input[data-v-5b07fe04] .el-input__inner::-moz-placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;-moz-transition:opacity .3s ease;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__inner::placeholder{color:var(--placeholder-color,var(--text-color-secondary,hsla(0,0%,59%,.8)));font-weight:400;transition:opacity .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::-moz-placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__wrapper:focus-within .el-input__inner::placeholder{opacity:.7}.password-input[data-v-5b07fe04] .el-input__suffix{color:var(--icon-color,#666)}.password-input[data-v-5b07fe04] .el-input__suffix-inner{transition:color .3s ease}.password-input[data-v-5b07fe04] .el-input__wrapper:hover .el-input__suffix-inner{color:var(--login-input-label-focus-color,#5b9bd3)}@media (max-width:768px){.password-input[data-v-5b07fe04]{width:100%;height:40px}.password-input[data-v-5b07fe04] .el-input__wrapper{padding:8px 12px}}.footer[data-v-5b07fe04]{position:fixed;bottom:0;width:100vw}.toggle-dark[data-v-5b07fe04]{position:fixed;top:30px;right:30px;border:1px solid #d9dce2;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border-radius:12px}html.dark .toggle-dark[data-v-5b07fe04]{border:1px solid #34343a}.toggle-dark[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .toggle-dark[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04]{position:fixed;top:30px;right:80px;transition:background-color .25s ease,border-color .25s ease,transform .25s ease;background-color:var(--glass-bg);box-shadow:none;border:1px solid #d9dce2;border-radius:12px;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;z-index:100}html.dark .language-switcher[data-v-5b07fe04]{border:1px solid #34343a}@media (max-width:768px){.language-switcher[data-v-5b07fe04]{width:2rem;height:2rem}}.language-switcher[data-v-5b07fe04]:hover{transform:scale(1.05);border-color:#bfc4cc}html.dark .language-switcher[data-v-5b07fe04]:hover{border-color:#4a4a52}.language-switcher[data-v-5b07fe04],.toggle-dark[data-v-5b07fe04]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)} \ No newline at end of file diff --git a/frontend-dist/css/804.be127f60.css.gz b/frontend-dist/css/804.be127f60.css.gz new file mode 100644 index 00000000..1d985a00 Binary files /dev/null and b/frontend-dist/css/804.be127f60.css.gz differ diff --git a/frontend-dist/css/967.b80746a3.css b/frontend-dist/css/967.b80746a3.css deleted file mode 100644 index d20aa47c..00000000 --- a/frontend-dist/css/967.b80746a3.css +++ /dev/null @@ -1 +0,0 @@ -.background-image1:not([src]),.background-image2:not([src]){display:none}body:has(#bg1[src]){background-color:transparent!important}body:has(#bg1[src]) .blocked-container,body:has(#bg1[src]) .container,body:has(#bg1[src]) .login,body:has(#bg1[src]) .not-found-container,body:has(#bg1[src]) .upload-home,body:has(#bg1[src]) .whitelist-container{background:transparent!important;background-color:transparent!important}.not-found-container[data-v-59d53856]{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:var(--bg-color,#6366f1);color:var(--text-color,#333)}.background-wrapper[data-v-59d53856]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1}.not-found-content[data-v-59d53856]{text-align:center;z-index:10;max-width:600px;padding:2rem;position:relative;background:hsla(0,0%,100%,.1);border-radius:20px;border:1px solid hsla(0,0%,100%,.2);box-shadow:none}.back-button-wrapper[data-v-59d53856]{position:absolute;top:-25px;right:-25px;z-index:15}.back-button[data-v-59d53856]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));border:none;color:var(--toolbar-button-text-color,#333);box-shadow:none;transition:all .3s cubic-bezier(.4,0,.2,1)}.back-button[data-v-59d53856]:hover{transform:scale(1.1);box-shadow:none;background:var(--primary-color,#2563eb);color:#fff}.error-animation[data-v-59d53856]{margin-bottom:2rem;position:relative}.error-number[data-v-59d53856]{font-size:6rem;font-weight:900;display:flex;justify-content:center;align-items:center;gap:.5rem;margin-bottom:1rem;text-shadow:0 0 20px rgba(0,0,0,.3);color:var(--primary-color,#2563eb)}.error-number span[data-v-59d53856]{display:inline-block;animation:bounce-59d53856 2s infinite;color:var(--not-found-title-text-color,#2563eb)}.error-number .four[data-v-59d53856]:first-child{animation-delay:-.5s}.error-number .zero[data-v-59d53856]{animation-delay:-.25s;color:#f56c6c;-webkit-text-fill-color:#f56c6c}.error-number .four[data-v-59d53856]:last-child{animation-delay:0s}.error-image[data-v-59d53856]{display:flex;justify-content:center;margin:1.5rem 0}.floating-image[data-v-59d53856]{width:100px;height:100px;-o-object-fit:contain;object-fit:contain;animation:float-59d53856 3s ease-in-out infinite;filter:drop-shadow(0 10px 20px rgba(0,0,0,.2));border-radius:20px;background:hsla(0,0%,100%,.1);padding:10px;border:1px solid hsla(0,0%,100%,.2)}.error-info[data-v-59d53856]{animation:fadeInUp-59d53856 1s ease-out .5s both}.error-title[data-v-59d53856]{font-size:2rem;font-weight:700;margin-bottom:1rem;color:var(--text-color,#333);color:var(--not-found-title-text-color,#2563eb)}.error-description[data-v-59d53856]{font-size:1.1rem;line-height:1.6;margin-bottom:2rem;opacity:.8;color:var(--text-color-secondary,#666)}.error-actions[data-v-59d53856]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:2rem}.action-btn[data-v-59d53856]{border-radius:25px;padding:12px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:none;border:none;min-width:140px}.primary-btn[data-v-59d53856]{background:var(--primary-color,#2563eb);color:#fff}.secondary-btn[data-v-59d53856]{background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.9));color:var(--text-color,#333)}.action-btn[data-v-59d53856]:hover{box-shadow:none}.btn-icon[data-v-59d53856]{margin-right:8px}.help-links[data-v-59d53856]{animation:fadeInUp-59d53856 1s ease-out 1s both}.help-text[data-v-59d53856]{margin-bottom:1rem;opacity:.7;font-size:.9rem;color:var(--text-color-secondary,#666)}.quick-links[data-v-59d53856]{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.quick-link[data-v-59d53856]{color:var(--primary-color,#2563eb);text-decoration:none;font-weight:500;padding:.5rem 1rem;border-radius:15px;background:var(--toolbar-button-bg-color,hsla(0,0%,100%,.8));transition:all .3s cubic-bezier(.4,0,.2,1);border:1px solid rgba(37,99,235,.2);font-size:.85rem;display:flex;align-items:center;gap:.5rem}.quick-link[data-v-59d53856]:hover{background:var(--primary-color,#2563eb);color:#fff;box-shadow:none}.floating-elements[data-v-59d53856]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.floating-shape[data-v-59d53856]{position:absolute;background:rgba(37,99,235,.1);border-radius:50%;animation:floatShapes-59d53856 8s ease-in-out infinite}.shape-1[data-v-59d53856]{width:60px;height:60px;top:15%;left:10%;animation-delay:0s}.shape-2[data-v-59d53856]{width:80px;height:80px;top:60%;right:15%;animation-delay:-2s;background:rgba(103,194,58,.1)}.shape-3[data-v-59d53856]{width:40px;height:40px;bottom:25%;left:20%;animation-delay:-4s}.shape-4[data-v-59d53856]{width:70px;height:70px;top:25%;right:25%;animation-delay:-1s;background:hsla(0,87%,69%,.1)}.shape-5[data-v-59d53856]{width:50px;height:50px;bottom:15%;right:10%;animation-delay:-3s;background:rgba(230,162,60,.1)}@keyframes bounce-59d53856{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-15px)}60%{transform:translateY(-8px)}}@keyframes float-59d53856{0%,to{transform:translateY(0) rotate(0deg)}50%{transform:translateY(-15px) rotate(5deg)}}@keyframes floatShapes-59d53856{0%,to{transform:translateY(0) rotate(0deg);opacity:.6}50%{transform:translateY(-25px) rotate(180deg);opacity:.3}}@keyframes fadeInUp-59d53856{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.not-found-content[data-v-59d53856]{padding:1.5rem;margin:1rem;max-width:calc(100% - 2rem)}.back-button-wrapper[data-v-59d53856]{top:-20px;right:-20px}.error-number[data-v-59d53856]{font-size:4rem;gap:.3rem}.error-title[data-v-59d53856]{font-size:1.5rem}.error-description[data-v-59d53856]{font-size:1rem}.error-actions[data-v-59d53856]{flex-direction:column;align-items:center}.action-btn[data-v-59d53856]{width:200px}.quick-links[data-v-59d53856]{flex-direction:column;gap:.5rem;align-items:center}.quick-link[data-v-59d53856]{width:-moz-fit-content;width:fit-content;min-width:120px;justify-content:center}.floating-image[data-v-59d53856]{width:80px;height:80px;border-radius:15px;padding:8px}}@media (prefers-color-scheme:dark){.not-found-container[data-v-59d53856]{background:var(--bg-color,#1f1f22);color:var(--text-color,#e4e7ed)}.not-found-content[data-v-59d53856]{background:rgba(0,0,0,.2);border:1px solid hsla(0,0%,100%,.1)}.error-title[data-v-59d53856]{color:var(--text-color,#e4e7ed)}.error-description[data-v-59d53856],.help-text[data-v-59d53856]{color:var(--text-color-secondary,#a1a1aa)}} \ No newline at end of file diff --git a/frontend-dist/css/967.b80746a3.css.gz b/frontend-dist/css/967.b80746a3.css.gz deleted file mode 100644 index a0d0e2f3..00000000 Binary files a/frontend-dist/css/967.b80746a3.css.gz and /dev/null differ diff --git a/frontend-dist/css/app.f639726f.css b/frontend-dist/css/app.d178a0d5.css similarity index 89% rename from frontend-dist/css/app.f639726f.css rename to frontend-dist/css/app.d178a0d5.css index 9dba586b..7d8e8e91 100644 --- a/frontend-dist/css/app.f639726f.css +++ b/frontend-dist/css/app.d178a0d5.css @@ -1 +1 @@ -@font-face{font-family:Pacifico;src:url(/fonts/Pacifico-Regular.dc63ac94.woff2) format("woff2");font-display:swap}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#1d2129}body{margin:0;padding:0;background-color:#f7f7f8}:focus-visible{outline:none}*{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}:root{--bg-color:#f7f7f8;--popper-bg-color:#fff;--popper-shadow:none;--image-preview-filter:none;--text-bg-color:#f2f3f5;--background-image-filter:none;--upload-list-card-bg-color:#fff;--upload-list-card-border:1px solid #e5e6eb;--upload-list-card-box-shadow:none;--upload-list-item-border:1px solid #e5e6eb;--upload-list-dashboard-bg-color:#fff;--upload-list-dashboard-shadow:none;--upload-list-file-icon-color:#2563eb;--el-upload-dragger-bg-color:#fafafb;--el-upload-dragger-border:2px dashed #c9cdd4;--el-upload-dragger-border-color:#c9cdd4;--el-upload-dragger-hover-box-shadow:none;--el-upload-dragger-uniform-color:#2563eb;--paste-card-textarea-border-color:#c9cdd4;--paste-card-textarea-box-shadow:none;--el-icon--upload-color:#2563eb;--upload-text-color:#4e5969;--upload-header-color:#1d2129;--upload-main-title-color:#1d2129;--upload-title-text-color:#4e5969;--upload-title-text-shadow:none;--upload-title-hover-glow:transparent;--upload-title-underline-bg:#2563eb;--upload-title-underline-shadow:none;--upload-title-crayon-deep:#1d2129;--upload-title-crayon-base:#1d2129;--upload-title-crayon-light:#4e5969;--upload-title-crayon-edge:#c9cdd4;--upload-title-crayon-fleck:transparent;--upload-title-crayon-burr:transparent;--upload-title-crayon-dust:transparent;--modern-action-group-bg:#f7f8fa;--modern-action-group-border:#e5e6eb;--logo-glow-color:transparent;--modern-action-group-shadow:none;--modern-action-group-hover-bg:#f2f3f5;--modern-action-group-hover-shadow:none;--upload-action-toolbar-bg:#fff;--upload-action-toolbar-border:#e5e6eb;--upload-action-toolbar-shadow:none;--upload-action-toolbar-hover-bg:#f7f8fa;--upload-action-toolbar-hover-border:#c9cdd4;--upload-action-toolbar-hover-shadow:none;--upload-action-btn-bg:transparent;--upload-action-btn-color:#4e5969;--upload-action-btn-shadow:none;--upload-action-btn-hover-bg:#f2f3f5;--upload-action-btn-hover-shadow:none;--upload-action-btn-active-shadow:none;--upload-action-copy-color:#2563eb;--upload-action-retry-color:#16a34a;--upload-action-danger-color:#dc2626;--upload-action-danger-bg:transparent;--upload-action-danger-hover-bg:#fef2f2;--upload-action-danger-hover-shadow:none;--file-name-bg:#f7f8fa;--file-name-border:#e5e6eb;--file-name-hover-bg:#f2f3f5;--file-name-hover-border:#c9cdd4;--upload-list-item-bg:#fff;--upload-list-item-border-color:#e5e6eb;--upload-list-item-shadow:none;--upload-list-item-hover-border:#c9cdd4;--upload-list-item-hover-shadow:none;--dashboard-title-bg:transparent;--toolbar-button-bg-color:#fff;--toolbar-button-shadow:none;--toolbar-button-shadow-hover:none;--toolbar-button-color:#4e5969;--page-footer-text-color:#59636e;--page-footer-name-color:#1d2129;--login-container-bg-color:#fff;--password-input-bg-color:#fff;--password-input-border:1px solid #e5e6eb;--login-title-color:#1d2129;--login-container-box-shadow:none;--login-container-hover-box-shadow:none;--login-submit-btn-bg-color:#2563eb;--login-title-glow-color:transparent;--login-input-underline-color:#2563eb;--login-input-underline-secondary-color:#3b82f6;--login-input-label-focus-color:#2563eb;--dialog-bg-color:#fff;--dialog-box-shadow:none;--dialog-section-bg-color:#f2f3f5;--dialog-control-bg-color:#f7f8fa;--tabs-dropdown-popper-bg-color:#fff;--tabs-dropdown-popper-shadow:none;--tabs-switcher-hover-bg:#f2f3f5;--tabs-switcher-border-color:#e5e6eb;--tabs-switcher-hover-border-color:#c9cdd4;--tabs-switcher-accent-color:#2563eb;--tabs-switcher-current-color:#2563eb;--tabs-switcher-current-bg:#eff6ff;--tabs-switcher-current-border-color:#2563eb;--tabs-switcher-current-shadow:none;--admin-header-content-bg-color:#fff;--admin-header-content-hover-bg-color:#f7f8fa;--admin-header-content-border-bottom:1px solid #e5e6eb;--admin-header-content-box-shadow:none;--admin-header-content-hover-box-shadow:none;--admin-container-bg-color:#f7f7f8;--admin-container-color:#1d2129;--admin-dashborad-stats-bg-color:#fff;--admin-dashborad-stats-hover-bg-color:#f7f8fa;--admin-dashboard-search-card-bg-color:#fff;--admin-dashboard-stats-shadow:none;--admin-dashboard-stats-hover-shadow:none;--admin-dashboard-search-card-box-shadow:none;--admin-dashboard-btn-color:#4e5969;--admin-dashboard-btn-bg-color:#fff;--admin-dashboard-btn-shadow:none;--admin-dashboard-btn-hover-shadow:none;--admin-dashboard-imgcard-bg-color:#fff;--admin-dashboard-imgcard-shadow:none;--admin-dashboard-tag-suggestion-bg-color:#fff;--admin-dashboard-tag-suggestion-border-color:#e5e6eb;--admin-dashboard-tag-suggestion-box-shadow:none;--admin-dashboard-tag-suggestion-item-hover-bg-color:#f7f8fa;--skeleton-bg-color:#e5e6eb;--skeleton-shimmer-color:#f7f8fa;--admin-cuscfg-table-shadow:none;--admin-cuscfg-table-bg-color:#fff;--admin-syscfg-tabs-border-color:#e5e6eb;--admin-purple:#6366f1;--admin-batch-toolbar-bg:#fff;--admin-batch-toolbar-border:#e5e6eb;--admin-batch-toolbar-shadow:none;--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:#f2f3f5;--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#dc2626;--admin-batch-tag-color:#d97706;--admin-batch-clear-color:#4e5969;--theme-toggle-color:#1d2129;--theme-toggle-bg-color:#1d2129;--admin-theme-toggle-color:#1d2129;--admin-theme-toggle-bg-color:#1d2129;--not-found-title-text-color:#1d2129;--floating-btn-bg:#2563eb;--floating-btn-color:#fff;--floating-btn-shadow:none;--floating-btn-shadow-hover:none;--floating-btn-right:32px;--floating-btn-bottom:32px;--glass-bg:hsla(0,0%,100%,.45);--glass-bg-hover:hsla(0,0%,100%,.55);--glass-border:#d9dce2;--glass-border-hover:#bfc4cc;--glass-shadow:none;--glass-shadow-hover:none;--glass-header-bg:rgba(247,248,250,.45);--glass-header-border:#d9dce2;--el-text-color-primary:#1d2129;--el-text-color-regular:#4e5969;--el-text-color-secondary:#59636e;--el-text-color-placeholder:#86909c;--el-text-color-disabled:#c0c4cc;--el-border-color:#c9cdd4;--el-border-color-light:#d9dce2;--el-border-color-lighter:#e5e6eb;--el-border-color-extra-light:#eceef1;--el-border-radius-base:8px;--el-border-radius-small:6px;--el-fill-color:#f2f3f5;--el-fill-color-light:#f7f8fa;--el-fill-color-lighter:#fafafb;--el-fill-color-blank:#fff;--text-color:#1d2129;--text-color-secondary:#59636e;--login-input-icon-color:#86909c;--icon-color:#59636e;--placeholder-color:#86909c}.dark{--bg-color:#0a0a0b;--popper-bg-color:#161618;--popper-shadow:none;--image-preview-filter:brightness(0.7);--text-bg-color:#1f1f22;--background-image-filter:brightness(0.7);--upload-list-card-bg-color:#161618;--upload-list-card-border:1px solid #2a2a2e;--upload-list-card-box-shadow:none;--upload-list-item-border:1px solid #2a2a2e;--upload-list-dashboard-bg-color:#161618;--upload-list-dashboard-shadow:none;--upload-list-file-icon-color:#60a5fa;--el-upload-dragger-bg-color:#131316;--el-upload-dragger-border:2px dashed #3a3a3f;--el-upload-dragger-border-color:#3a3a3f;--el-upload-dragger-hover-box-shadow:none;--el-upload-dragger-uniform-color:#60a5fa;--paste-card-textarea-border-color:#3a3a3f;--paste-card-textarea-box-shadow:none;--el-icon--upload-color:#60a5fa;--upload-text-color:#a1a1aa;--upload-header-color:#fafafa;--upload-main-title-color:#fafafa;--upload-title-text-color:#a1a1aa;--upload-title-text-shadow:none;--upload-title-hover-glow:transparent;--upload-title-underline-bg:#60a5fa;--upload-title-underline-shadow:none;--upload-title-crayon-deep:#fafafa;--upload-title-crayon-base:#fafafa;--upload-title-crayon-light:#a1a1aa;--upload-title-crayon-edge:#3a3a3f;--upload-title-crayon-fleck:transparent;--upload-title-crayon-burr:transparent;--upload-title-crayon-dust:transparent;--toolbar-button-bg-color:#161618;--toolbar-button-shadow:none;--toolbar-button-shadow-hover:none;--toolbar-button-color:#a1a1aa;--modern-action-group-bg:#131316;--modern-action-group-border:#2a2a2e;--logo-glow-color:transparent;--modern-action-group-shadow:none;--modern-action-group-hover-bg:#1f1f22;--modern-action-group-hover-shadow:none;--upload-action-toolbar-bg:#161618;--upload-action-toolbar-border:#2a2a2e;--upload-action-toolbar-shadow:none;--upload-action-toolbar-hover-bg:#1f1f22;--upload-action-toolbar-hover-border:#3a3a3f;--upload-action-toolbar-hover-shadow:none;--upload-action-btn-bg:transparent;--upload-action-btn-color:#a1a1aa;--upload-action-btn-shadow:none;--upload-action-btn-hover-bg:#1f1f22;--upload-action-btn-hover-shadow:none;--upload-action-btn-active-shadow:none;--upload-action-copy-color:#60a5fa;--upload-action-retry-color:#4ade80;--upload-action-danger-color:#f87171;--upload-action-danger-bg:transparent;--upload-action-danger-hover-bg:hsla(0,91%,71%,.12);--upload-action-danger-hover-shadow:none;--file-name-bg:#1f1f22;--file-name-border:#2a2a2e;--file-name-hover-bg:#26262a;--file-name-hover-border:#3a3a3f;--upload-list-item-bg:#161618;--upload-list-item-border-color:#2a2a2e;--upload-list-item-shadow:none;--upload-list-item-hover-border:#3a3a3f;--upload-list-item-hover-shadow:none;--dashboard-title-bg:transparent;--page-footer-text-color:#71717a;--page-footer-name-color:#a1a1aa;--login-container-bg-color:#161618;--password-input-bg-color:#131316;--password-input-border:1px solid #2a2a2e;--login-title-color:#fafafa;--login-container-box-shadow:none;--login-container-hover-box-shadow:none;--login-submit-btn-bg-color:#4a5d9b;--login-title-glow-color:transparent;--login-input-underline-color:#60a5fa;--login-input-underline-secondary-color:#3b82f6;--login-input-label-focus-color:#60a5fa;--dialog-bg-color:#161618;--dialog-box-shadow:none;--dialog-section-bg-color:#1f1f22;--dialog-control-bg-color:#161618;--tabs-dropdown-popper-bg-color:#161618;--tabs-dropdown-popper-shadow:none;--tabs-switcher-hover-bg:#1f1f22;--tabs-switcher-border-color:#2a2a2e;--tabs-switcher-hover-border-color:#3a3a3f;--tabs-switcher-accent-color:#60a5fa;--tabs-switcher-current-color:#60a5fa;--tabs-switcher-current-bg:rgba(59,130,246,.14);--tabs-switcher-current-border-color:#3b82f6;--tabs-switcher-current-shadow:none;--admin-header-content-bg-color:#161618;--admin-header-content-hover-bg-color:#1f1f22;--admin-header-content-border-bottom:1px solid #2a2a2e;--admin-header-content-box-shadow:none;--admin-header-content-hover-box-shadow:none;--admin-container-bg-color:#0a0a0b;--admin-container-color:#fafafa;--admin-dashborad-stats-bg-color:#161618;--admin-dashborad-stats-hover-bg-color:#1f1f22;--admin-dashboard-stats-shadow:none;--admin-dashboard-stats-hover-shadow:none;--admin-dashboard-search-card-bg-color:#161618;--admin-dashboard-search-card-box-shadow:none;--admin-dashboard-btn-color:#a1a1aa;--admin-dashboard-btn-bg-color:#161618;--admin-dashboard-btn-shadow:none;--admin-dashboard-btn-hover-shadow:none;--admin-dashboard-imgcard-bg-color:#161618;--admin-dashboard-imgcard-shadow:none;--admin-dashboard-tag-suggestion-bg-color:#161618;--admin-dashboard-tag-suggestion-border-color:#2a2a2e;--admin-dashboard-tag-suggestion-box-shadow:none;--admin-dashboard-tag-suggestion-item-hover-bg-color:#1f1f22;--skeleton-bg-color:#1f1f22;--skeleton-shimmer-color:#26262a;--admin-cuscfg-table-shadow:none;--admin-cuscfg-table-bg-color:#161618;--admin-syscfg-tabs-border-color:#2a2a2e;--theme-toggle-color:#d4d4d8;--theme-toggle-bg-color:#e4e4e7;--admin-theme-toggle-color:#d4d4d8;--admin-theme-toggle-bg-color:#e4e4e7;--admin-batch-toolbar-bg:#161618;--admin-batch-toolbar-border:#2a2a2e;--admin-batch-toolbar-shadow:none;--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:#1f1f22;--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#f87171;--admin-batch-tag-color:#fbbf24;--admin-batch-clear-color:#a1a1aa;--not-found-title-text-color:#fafafa;--floating-btn-bg:#3b82f6;--floating-btn-color:#fff;--floating-btn-shadow:none;--floating-btn-shadow-hover:none;--glass-bg:rgba(22,22,24,.5);--glass-bg-hover:rgba(35,35,35,.6);--glass-border:#34343a;--glass-border-hover:#4a4a52;--glass-shadow:none;--glass-shadow-hover:none;--glass-header-bg:rgba(31,31,34,.5);--glass-header-border:#34343a;--el-text-color-primary:#fafafa;--el-text-color-regular:#c8c9cc;--el-text-color-secondary:#a1a1aa;--el-text-color-placeholder:#6b6b73;--el-text-color-disabled:#4a4a52;--el-border-color:#34343a;--el-border-color-light:#2a2a2e;--el-border-color-lighter:#26262a;--el-border-color-extra-light:#1f1f22;--el-fill-color:#1f1f22;--el-fill-color-light:#1a1a1d;--el-fill-color-lighter:#161618;--el-fill-color-blank:#161618;--el-bg-color:#161618;--el-bg-color-page:#0a0a0b;--el-bg-color-overlay:#1f1f22;--el-color-primary:#4a5d9b;--el-color-primary-light-3:#5e73b5;--el-color-primary-light-5:#768cc6;--el-color-primary-light-7:#98a9d5;--el-color-primary-light-8:#b0bde0;--el-color-primary-light-9:#ccd4ec;--el-color-primary-dark-2:#3a4b80;--text-color:#fafafa;--text-color-secondary:#a1a1aa;--login-input-icon-color:#71717a;--icon-color:#a1a1aa;--placeholder-color:#6b6b73}.el-message{border-radius:10px!important;border:1px solid var(--glass-border)!important;padding:10px 20px!important;box-shadow:var(--glass-shadow)!important;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);min-width:unset!important;top:30px!important}.el-message .el-message__icon{font-size:18px!important;color:var(--el-text-color-primary)!important}.el-message .el-message__content{font-size:16px!important;font-weight:500!important;color:var(--el-text-color-primary)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.5px}.el-message--success .el-message__icon{color:#67c23a!important}.el-message--warning .el-message__icon{color:#e6a23c!important}.el-message--error .el-message__icon{color:#f56c6c!important}.dark .el-message{background-color:var(--glass-bg)!important;border:1px solid var(--glass-border)!important;box-shadow:var(--glass-shadow)!important}@media (max-width:768px){.el-message{padding:8px 18px!important;border-radius:30px!important}.el-message .el-message__icon{font-size:14px!important}.el-message .el-message__content{font-size:13px!important}}.el-dialog,.el-message-box{border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow)!important;border:1px solid var(--glass-border);background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.el-dialog__header,.el-message-box__header{border-bottom:none;padding:16px 20px!important;margin-right:0!important;position:relative}.el-dialog__header:after,.el-message-box__header:after{content:"";position:absolute;bottom:0;left:20px;right:20px;height:1px;background:#e5e6eb}.el-dialog__body,.el-message-box__content{padding:20px!important}.el-dialog__footer,.el-message-box__btns{border-top:none;padding:12px 20px!important;background-color:transparent}.dark .el-dialog,.dark .el-message-box{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)!important;box-shadow:var(--glass-shadow)!important}.dark .el-dialog__header,.dark .el-message-box__header{border-bottom:none}.dark .el-dialog__header:after,.dark .el-message-box__header:after{background:#2a2a2e}.dark .el-dialog__footer,.dark .el-message-box__btns{border-top:none;background-color:transparent}.dark .el-dialog__title,.dark .el-message-box__title{color:#e5eaf3}.dark .el-message-box__content{color:#cfd3dc}.dark .el-button--primary{--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2)}html.dark .el-button--primary.is-plain{--el-button-text-color:var(--el-text-color-primary);--el-button-bg-color:hsla(0,0%,100%,.04);--el-button-border-color:rgba(118,140,198,.65);--el-button-hover-text-color:#fff;--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);color:var(--el-text-color-primary)!important;background-color:hsla(0,0%,100%,.04)!important;border-color:rgba(118,140,198,.65)!important}html.dark .el-button--primary.is-plain:focus,html.dark .el-button--primary.is-plain:hover{color:#fff!important;background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary-light-3)!important}.dark .el-pager li.is-active{background-color:var(--el-color-primary);color:#fff}.dark .el-pager li{color:#a1a1aa}.dark .el-pagination .btn-next,.dark .el-pagination .btn-prev,.dark .el-pagination button{background-color:transparent;color:#a1a1aa}.dark .el-input__wrapper.is-focus,.dark .el-select__wrapper.is-focused,.dark .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-color-primary-light-5) inset!important}html.dark .el-cascader__dropdown__item.hover,html.dark .el-select-dropdown__item.is-hovering{background-color:hsla(0,0%,100%,.08)!important;color:var(--el-text-color-primary)!important}html.dark .el-cascader__dropdown__item.is-active,html.dark .el-select-dropdown__item.is-selected{background-color:rgba(74,93,155,.38)!important;color:#fff!important}.dark .el-switch.is-checked .el-switch__core{background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary)!important}.dark .el-tabs__active-bar,.dark .el-tabs__item.is-active{color:var(--el-color-primary-light-7)}.dark .el-tabs__item.is-active:after{background-color:var(--el-color-primary)}.dark .el-checkbox__input.is-checked .el-checkbox__inner,.dark .el-radio__input.is-checked .el-radio__inner{background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary)!important}.dark .el-checkbox__input.is-checked+.el-checkbox__label,.dark .el-radio__input.is-checked+.el-radio__label{color:var(--el-text-color-primary)!important}.el-loading-mask{border-radius:12px}.el-dropdown__popper.el-popper{border-radius:8px;border:1px solid #d9dce2;background-color:var(--popper-bg-color);box-shadow:var(--popper-shadow)}html.dark .el-dropdown__popper.el-popper{border-color:#34343a}.el-dropdown__popper.el-popper .el-dropdown-menu{padding:4px;border-radius:7px;background:transparent;border:none;overflow:hidden}.el-dropdown__popper.el-popper .el-dropdown-menu__item{min-height:34px;padding:0 12px;border-radius:6px;border:none;background:transparent;color:var(--el-text-color-regular);transition:background-color .2s ease,color .2s ease}.el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):focus,.el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):hover{background-color:rgba(0,0,0,.04);color:var(--el-text-color-primary)}html.dark .el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):focus,html.dark .el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):hover{background-color:hsla(0,0%,100%,.08);color:var(--el-text-color-primary)}.el-popper.is-light>.el-popper__arrow:before{background:none!important;border:none!important}*,body,html{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar,body::-webkit-scrollbar,html::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;background:transparent!important}.os-theme-dark{--os-handle-bg:hsla(0,0%,50%,.5);--os-handle-bg-hover:hsla(0,0%,50%,.7);--os-handle-bg-active:hsla(0,0%,50%,.85)}.dark .os-theme-dark,html.dark .os-theme-dark{--os-handle-bg:hsla(0,0%,71%,.6);--os-handle-bg-hover:hsla(0,0%,71%,.75);--os-handle-bg-active:hsla(0,0%,71%,.9)}.os-theme-dark .os-scrollbar,.os-theme-dark .os-scrollbar-horizontal,.os-theme-dark .os-scrollbar-vertical{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-track-bg-hover:transparent;--os-track-bg-active:transparent}.os-theme-dark .os-scrollbar .os-scrollbar-handle{border-radius:10px!important;transition:background-color .2s ease,opacity .2s ease!important}.el-card,.el-dialog,.el-dropdown__popper.el-popper,.el-message-box{background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}html.dark .el-card,html.dark .el-dialog,html.dark .el-dropdown__popper.el-popper,html.dark .el-message-box{background-color:var(--glass-bg)!important} \ No newline at end of file +@font-face{font-family:Pacifico;src:url(/fonts/Pacifico-Regular.dc63ac94.woff2) format("woff2");font-display:swap}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#1d2129}body{margin:0;padding:0;background-color:#f7f7f8}:focus-visible{outline:none}*{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}:root{--bg-color:#f7f7f8;--popper-bg-color:#fff;--popper-shadow:none;--image-preview-filter:none;--text-bg-color:#f2f3f5;--background-image-filter:none;--upload-list-card-bg-color:#fff;--upload-list-card-border:1px solid #e5e6eb;--upload-list-card-box-shadow:none;--upload-list-item-border:1px solid #e5e6eb;--upload-list-dashboard-bg-color:#fff;--upload-list-dashboard-shadow:none;--upload-list-file-icon-color:#2563eb;--el-upload-dragger-bg-color:#fafafb;--el-upload-dragger-border:2px dashed #c9cdd4;--el-upload-dragger-border-color:#c9cdd4;--el-upload-dragger-hover-box-shadow:none;--el-upload-dragger-uniform-color:#2563eb;--paste-card-textarea-border-color:#c9cdd4;--paste-card-textarea-box-shadow:none;--el-icon--upload-color:#2563eb;--upload-text-color:#4e5969;--upload-header-color:#1d2129;--upload-main-title-color:#1d2129;--upload-title-text-color:#4e5969;--upload-title-text-shadow:none;--upload-title-hover-glow:transparent;--upload-title-underline-bg:#2563eb;--upload-title-underline-shadow:none;--upload-title-crayon-deep:#1d2129;--upload-title-crayon-base:#1d2129;--upload-title-crayon-light:#4e5969;--upload-title-crayon-edge:#c9cdd4;--upload-title-crayon-fleck:transparent;--upload-title-crayon-burr:transparent;--upload-title-crayon-dust:transparent;--modern-action-group-bg:#f7f8fa;--modern-action-group-border:#e5e6eb;--logo-glow-color:transparent;--modern-action-group-shadow:none;--modern-action-group-hover-bg:#f2f3f5;--modern-action-group-hover-shadow:none;--upload-action-toolbar-bg:#fff;--upload-action-toolbar-border:#e5e6eb;--upload-action-toolbar-shadow:none;--upload-action-toolbar-hover-bg:#f7f8fa;--upload-action-toolbar-hover-border:#c9cdd4;--upload-action-toolbar-hover-shadow:none;--upload-action-btn-bg:transparent;--upload-action-btn-color:#4e5969;--upload-action-btn-shadow:none;--upload-action-btn-hover-bg:#f2f3f5;--upload-action-btn-hover-shadow:none;--upload-action-btn-active-shadow:none;--upload-action-copy-color:#2563eb;--upload-action-retry-color:#16a34a;--upload-action-danger-color:#dc2626;--upload-action-danger-bg:transparent;--upload-action-danger-hover-bg:#fef2f2;--upload-action-danger-hover-shadow:none;--file-name-bg:#f7f8fa;--file-name-border:#e5e6eb;--file-name-hover-bg:#f2f3f5;--file-name-hover-border:#c9cdd4;--upload-list-item-bg:#fff;--upload-list-item-border-color:#e5e6eb;--upload-list-item-shadow:none;--upload-list-item-hover-border:#c9cdd4;--upload-list-item-hover-shadow:none;--dashboard-title-bg:transparent;--toolbar-button-bg-color:#fff;--toolbar-button-shadow:none;--toolbar-button-shadow-hover:none;--toolbar-button-color:#4e5969;--page-footer-text-color:#59636e;--page-footer-name-color:#1d2129;--login-container-bg-color:#fff;--password-input-bg-color:#fff;--password-input-border:1px solid #e5e6eb;--login-title-color:#1d2129;--login-container-box-shadow:none;--login-container-hover-box-shadow:none;--login-submit-btn-bg-color:#2563eb;--login-title-glow-color:transparent;--login-input-underline-color:#2563eb;--login-input-underline-secondary-color:#3b82f6;--login-input-label-focus-color:#2563eb;--dialog-bg-color:#fff;--dialog-box-shadow:none;--dialog-section-bg-color:#f2f3f5;--dialog-control-bg-color:#f7f8fa;--tabs-dropdown-popper-bg-color:#fff;--tabs-dropdown-popper-shadow:none;--tabs-switcher-hover-bg:#f2f3f5;--tabs-switcher-border-color:#e5e6eb;--tabs-switcher-hover-border-color:#c9cdd4;--tabs-switcher-accent-color:#2563eb;--tabs-switcher-current-color:#2563eb;--tabs-switcher-current-bg:#eff6ff;--tabs-switcher-current-border-color:#2563eb;--tabs-switcher-current-shadow:none;--admin-header-content-bg-color:#fff;--admin-header-content-hover-bg-color:#f7f8fa;--admin-header-content-border-bottom:1px solid #e5e6eb;--admin-header-content-box-shadow:none;--admin-header-content-hover-box-shadow:none;--admin-container-bg-color:#f7f7f8;--admin-container-color:#1d2129;--admin-dashborad-stats-bg-color:#fff;--admin-dashborad-stats-hover-bg-color:#f7f8fa;--admin-dashboard-search-card-bg-color:#fff;--admin-dashboard-stats-shadow:none;--admin-dashboard-stats-hover-shadow:none;--admin-dashboard-search-card-box-shadow:none;--admin-dashboard-btn-color:#4e5969;--admin-dashboard-btn-bg-color:#fff;--admin-dashboard-btn-shadow:none;--admin-dashboard-btn-hover-shadow:none;--admin-dashboard-imgcard-bg-color:#fff;--admin-dashboard-imgcard-shadow:none;--admin-dashboard-tag-suggestion-bg-color:#fff;--admin-dashboard-tag-suggestion-border-color:#e5e6eb;--admin-dashboard-tag-suggestion-box-shadow:none;--admin-dashboard-tag-suggestion-item-hover-bg-color:#f7f8fa;--skeleton-bg-color:#e5e6eb;--skeleton-shimmer-color:#f7f8fa;--admin-cuscfg-table-shadow:none;--admin-cuscfg-table-bg-color:#fff;--admin-syscfg-tabs-border-color:#e5e6eb;--admin-purple:#6366f1;--admin-batch-toolbar-bg:#fff;--admin-batch-toolbar-border:#e5e6eb;--admin-batch-toolbar-shadow:none;--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:#f2f3f5;--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#dc2626;--admin-batch-tag-color:#d97706;--admin-batch-clear-color:#4e5969;--theme-toggle-color:#1d2129;--theme-toggle-bg-color:#1d2129;--admin-theme-toggle-color:#1d2129;--admin-theme-toggle-bg-color:#1d2129;--not-found-title-text-color:#1d2129;--floating-btn-bg:#2563eb;--floating-btn-color:#fff;--floating-btn-shadow:none;--floating-btn-shadow-hover:none;--floating-btn-right:32px;--floating-btn-bottom:32px;--glass-bg:hsla(0,0%,100%,.45);--glass-bg-hover:hsla(0,0%,100%,.55);--glass-border:#d9dce2;--glass-border-hover:#bfc4cc;--glass-shadow:none;--glass-shadow-hover:none;--glass-header-bg:rgba(247,248,250,.45);--glass-header-border:#d9dce2;--el-text-color-primary:#1d2129;--el-text-color-regular:#4e5969;--el-text-color-secondary:#59636e;--el-text-color-placeholder:#86909c;--el-text-color-disabled:#c0c4cc;--el-border-color:#c9cdd4;--el-border-color-light:#d9dce2;--el-border-color-lighter:#e5e6eb;--el-border-color-extra-light:#eceef1;--el-border-radius-base:8px;--el-border-radius-small:6px;--el-fill-color:#f2f3f5;--el-fill-color-light:#f7f8fa;--el-fill-color-lighter:#fafafb;--el-fill-color-blank:#fff;--text-color:#1d2129;--text-color-secondary:#59636e;--login-input-icon-color:#86909c;--icon-color:#59636e;--placeholder-color:#86909c}.dark{--bg-color:#0a0a0b;--popper-bg-color:#161618;--popper-shadow:none;--image-preview-filter:brightness(0.7);--text-bg-color:#1f1f22;--background-image-filter:brightness(0.7);--upload-list-card-bg-color:#161618;--upload-list-card-border:1px solid #2a2a2e;--upload-list-card-box-shadow:none;--upload-list-item-border:1px solid #2a2a2e;--upload-list-dashboard-bg-color:#161618;--upload-list-dashboard-shadow:none;--upload-list-file-icon-color:#60a5fa;--el-upload-dragger-bg-color:#131316;--el-upload-dragger-border:2px dashed #3a3a3f;--el-upload-dragger-border-color:#3a3a3f;--el-upload-dragger-hover-box-shadow:none;--el-upload-dragger-uniform-color:#60a5fa;--paste-card-textarea-border-color:#3a3a3f;--paste-card-textarea-box-shadow:none;--el-icon--upload-color:#60a5fa;--upload-text-color:#a1a1aa;--upload-header-color:#fafafa;--upload-main-title-color:#fafafa;--upload-title-text-color:#a1a1aa;--upload-title-text-shadow:none;--upload-title-hover-glow:transparent;--upload-title-underline-bg:#60a5fa;--upload-title-underline-shadow:none;--upload-title-crayon-deep:#fafafa;--upload-title-crayon-base:#fafafa;--upload-title-crayon-light:#a1a1aa;--upload-title-crayon-edge:#3a3a3f;--upload-title-crayon-fleck:transparent;--upload-title-crayon-burr:transparent;--upload-title-crayon-dust:transparent;--toolbar-button-bg-color:#161618;--toolbar-button-shadow:none;--toolbar-button-shadow-hover:none;--toolbar-button-color:#a1a1aa;--modern-action-group-bg:#131316;--modern-action-group-border:#2a2a2e;--logo-glow-color:transparent;--modern-action-group-shadow:none;--modern-action-group-hover-bg:#1f1f22;--modern-action-group-hover-shadow:none;--upload-action-toolbar-bg:#161618;--upload-action-toolbar-border:#2a2a2e;--upload-action-toolbar-shadow:none;--upload-action-toolbar-hover-bg:#1f1f22;--upload-action-toolbar-hover-border:#3a3a3f;--upload-action-toolbar-hover-shadow:none;--upload-action-btn-bg:transparent;--upload-action-btn-color:#a1a1aa;--upload-action-btn-shadow:none;--upload-action-btn-hover-bg:#1f1f22;--upload-action-btn-hover-shadow:none;--upload-action-btn-active-shadow:none;--upload-action-copy-color:#60a5fa;--upload-action-retry-color:#4ade80;--upload-action-danger-color:#f87171;--upload-action-danger-bg:transparent;--upload-action-danger-hover-bg:hsla(0,91%,71%,.12);--upload-action-danger-hover-shadow:none;--file-name-bg:#1f1f22;--file-name-border:#2a2a2e;--file-name-hover-bg:#26262a;--file-name-hover-border:#3a3a3f;--upload-list-item-bg:#161618;--upload-list-item-border-color:#2a2a2e;--upload-list-item-shadow:none;--upload-list-item-hover-border:#3a3a3f;--upload-list-item-hover-shadow:none;--dashboard-title-bg:transparent;--page-footer-text-color:#71717a;--page-footer-name-color:#a1a1aa;--login-container-bg-color:#161618;--password-input-bg-color:#131316;--password-input-border:1px solid #2a2a2e;--login-title-color:#fafafa;--login-container-box-shadow:none;--login-container-hover-box-shadow:none;--login-submit-btn-bg-color:#4a5d9b;--login-title-glow-color:transparent;--login-input-underline-color:#60a5fa;--login-input-underline-secondary-color:#3b82f6;--login-input-label-focus-color:#60a5fa;--dialog-bg-color:#161618;--dialog-box-shadow:none;--dialog-section-bg-color:#1f1f22;--dialog-control-bg-color:#161618;--tabs-dropdown-popper-bg-color:#161618;--tabs-dropdown-popper-shadow:none;--tabs-switcher-hover-bg:#1f1f22;--tabs-switcher-border-color:#2a2a2e;--tabs-switcher-hover-border-color:#3a3a3f;--tabs-switcher-accent-color:#60a5fa;--tabs-switcher-current-color:#60a5fa;--tabs-switcher-current-bg:rgba(59,130,246,.14);--tabs-switcher-current-border-color:#3b82f6;--tabs-switcher-current-shadow:none;--admin-header-content-bg-color:#161618;--admin-header-content-hover-bg-color:#1f1f22;--admin-header-content-border-bottom:1px solid #2a2a2e;--admin-header-content-box-shadow:none;--admin-header-content-hover-box-shadow:none;--admin-container-bg-color:#0a0a0b;--admin-container-color:#fafafa;--admin-dashborad-stats-bg-color:#161618;--admin-dashborad-stats-hover-bg-color:#1f1f22;--admin-dashboard-stats-shadow:none;--admin-dashboard-stats-hover-shadow:none;--admin-dashboard-search-card-bg-color:#161618;--admin-dashboard-search-card-box-shadow:none;--admin-dashboard-btn-color:#a1a1aa;--admin-dashboard-btn-bg-color:#161618;--admin-dashboard-btn-shadow:none;--admin-dashboard-btn-hover-shadow:none;--admin-dashboard-imgcard-bg-color:#161618;--admin-dashboard-imgcard-shadow:none;--admin-dashboard-tag-suggestion-bg-color:#161618;--admin-dashboard-tag-suggestion-border-color:#2a2a2e;--admin-dashboard-tag-suggestion-box-shadow:none;--admin-dashboard-tag-suggestion-item-hover-bg-color:#1f1f22;--skeleton-bg-color:#1f1f22;--skeleton-shimmer-color:#26262a;--admin-cuscfg-table-shadow:none;--admin-cuscfg-table-bg-color:#161618;--admin-syscfg-tabs-border-color:#2a2a2e;--theme-toggle-color:#d4d4d8;--theme-toggle-bg-color:#e4e4e7;--admin-theme-toggle-color:#d4d4d8;--admin-theme-toggle-bg-color:#e4e4e7;--admin-batch-toolbar-bg:#161618;--admin-batch-toolbar-border:#2a2a2e;--admin-batch-toolbar-shadow:none;--admin-batch-action-bg:transparent;--admin-batch-action-shadow:none;--admin-batch-action-hover-bg:#1f1f22;--admin-batch-action-hover-shadow:none;--admin-batch-delete-color:#f87171;--admin-batch-tag-color:#fbbf24;--admin-batch-clear-color:#a1a1aa;--not-found-title-text-color:#fafafa;--floating-btn-bg:#3b82f6;--floating-btn-color:#fff;--floating-btn-shadow:none;--floating-btn-shadow-hover:none;--glass-bg:rgba(22,22,24,.5);--glass-bg-hover:rgba(35,35,35,.6);--glass-border:#34343a;--glass-border-hover:#4a4a52;--glass-shadow:none;--glass-shadow-hover:none;--glass-header-bg:rgba(31,31,34,.5);--glass-header-border:#34343a;--el-text-color-primary:#fafafa;--el-text-color-regular:#c8c9cc;--el-text-color-secondary:#a1a1aa;--el-text-color-placeholder:#6b6b73;--el-text-color-disabled:#4a4a52;--el-border-color:#34343a;--el-border-color-light:#2a2a2e;--el-border-color-lighter:#26262a;--el-border-color-extra-light:#1f1f22;--el-fill-color:#1f1f22;--el-fill-color-light:#1a1a1d;--el-fill-color-lighter:#161618;--el-fill-color-blank:#161618;--el-bg-color:#161618;--el-bg-color-page:#0a0a0b;--el-bg-color-overlay:#1f1f22;--el-color-primary:#4a5d9b;--el-color-primary-light-3:#5e73b5;--el-color-primary-light-5:#768cc6;--el-color-primary-light-7:#98a9d5;--el-color-primary-light-8:#b0bde0;--el-color-primary-light-9:#ccd4ec;--el-color-primary-dark-2:#3a4b80;--text-color:#fafafa;--text-color-secondary:#a1a1aa;--login-input-icon-color:#71717a;--icon-color:#a1a1aa;--placeholder-color:#6b6b73}.el-message{border-radius:10px!important;border:1px solid var(--glass-border)!important;padding:10px 20px!important;box-shadow:var(--glass-shadow)!important;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);min-width:unset!important;top:30px!important}.el-message .el-message__icon{font-size:18px!important;color:var(--el-text-color-primary)!important}.el-message .el-message__content{font-size:16px!important;font-weight:500!important;color:var(--el-text-color-primary)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.5px}.el-message--success .el-message__icon{color:#67c23a!important}.el-message--warning .el-message__icon{color:#e6a23c!important}.el-message--error .el-message__icon{color:#f56c6c!important}.dark .el-message{background-color:var(--glass-bg)!important;border:1px solid var(--glass-border)!important;box-shadow:var(--glass-shadow)!important}@media (max-width:768px){.el-message{padding:8px 18px!important;border-radius:30px!important}.el-message .el-message__icon{font-size:14px!important}.el-message .el-message__content{font-size:13px!important}}.el-dialog,.el-message-box{border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow)!important;border:1px solid var(--glass-border);background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.el-dialog__header,.el-message-box__header{border-bottom:none;padding:16px 20px!important;margin-right:0!important;position:relative}.el-dialog__header:after,.el-message-box__header:after{content:"";position:absolute;bottom:0;left:20px;right:20px;height:1px;background:#e5e6eb}.el-dialog__body,.el-message-box__content{padding:20px!important}.el-dialog__footer,.el-message-box__btns{border-top:none;padding:12px 20px!important;background-color:transparent}.dark .el-dialog,.dark .el-message-box{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)!important;box-shadow:var(--glass-shadow)!important}.dark .el-dialog__header,.dark .el-message-box__header{border-bottom:none}.dark .el-dialog__header:after,.dark .el-message-box__header:after{background:#2a2a2e}.dark .el-dialog__footer,.dark .el-message-box__btns{border-top:none;background-color:transparent}.dark .el-dialog__title,.dark .el-message-box__title{color:#e5eaf3}.dark .el-message-box__content{color:#cfd3dc}.dark .el-button--primary{--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2)}html.dark .el-button--primary.is-plain{--el-button-text-color:var(--el-text-color-primary);--el-button-bg-color:hsla(0,0%,100%,.04);--el-button-border-color:rgba(118,140,198,.65);--el-button-hover-text-color:#fff;--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);color:var(--el-text-color-primary)!important;background-color:hsla(0,0%,100%,.04)!important;border-color:rgba(118,140,198,.65)!important}html.dark .el-button--primary.is-plain:focus,html.dark .el-button--primary.is-plain:hover{color:#fff!important;background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary-light-3)!important}.dark .el-pager li.is-active{background-color:var(--el-color-primary);color:#fff}.dark .el-pager li{color:#a1a1aa}.dark .el-pagination .btn-next,.dark .el-pagination .btn-prev,.dark .el-pagination button{background-color:transparent;color:#a1a1aa}.dark .el-input__wrapper.is-focus,.dark .el-select__wrapper.is-focused,.dark .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-color-primary-light-5) inset!important}html.dark .el-cascader__dropdown__item.hover,html.dark .el-select-dropdown__item.is-hovering{background-color:hsla(0,0%,100%,.08)!important;color:var(--el-text-color-primary)!important}html.dark .el-cascader__dropdown__item.is-active,html.dark .el-select-dropdown__item.is-selected{background-color:rgba(74,93,155,.38)!important;color:#fff!important}.dark .el-switch.is-checked .el-switch__core{background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary)!important}.dark .el-tabs__active-bar,.dark .el-tabs__item.is-active{color:var(--el-color-primary-light-7)}.dark .el-tabs__item.is-active:after{background-color:var(--el-color-primary)}.dark .el-checkbox__input.is-checked .el-checkbox__inner,.dark .el-radio__input.is-checked .el-radio__inner{background-color:var(--el-color-primary)!important;border-color:var(--el-color-primary)!important}.dark .el-checkbox__input.is-checked+.el-checkbox__label,.dark .el-radio__input.is-checked+.el-radio__label{color:var(--el-text-color-primary)!important}.el-loading-mask{border-radius:12px}.el-dropdown__popper.el-popper{border-radius:8px;border:1px solid #d9dce2;background-color:var(--popper-bg-color);box-shadow:var(--popper-shadow)}html.dark .el-dropdown__popper.el-popper{border-color:#34343a}.el-dropdown__popper.el-popper .el-dropdown-menu{padding:4px;border-radius:7px;background:transparent;border:none}.el-dropdown__popper.el-popper .el-dropdown-menu__item{min-height:34px;padding:0 12px;border-radius:6px;border:none;background:transparent;color:var(--el-text-color-regular);transition:background-color .2s ease,color .2s ease}.el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):focus,.el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):hover{background-color:rgba(0,0,0,.04);color:var(--el-text-color-primary)}html.dark .el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):focus,html.dark .el-dropdown__popper.el-popper .el-dropdown-menu__item:not(.is-disabled):hover{background-color:hsla(0,0%,100%,.08);color:var(--el-text-color-primary)}.el-popper.is-light>.el-popper__arrow:before{background:none!important;border:none!important}*,body,html{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar,body::-webkit-scrollbar,html::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;background:transparent!important}.os-theme-dark{--os-handle-bg:hsla(0,0%,50%,.5);--os-handle-bg-hover:hsla(0,0%,50%,.7);--os-handle-bg-active:hsla(0,0%,50%,.85)}.dark .os-theme-dark,html.dark .os-theme-dark{--os-handle-bg:hsla(0,0%,71%,.6);--os-handle-bg-hover:hsla(0,0%,71%,.75);--os-handle-bg-active:hsla(0,0%,71%,.9)}.os-theme-dark .os-scrollbar,.os-theme-dark .os-scrollbar-horizontal,.os-theme-dark .os-scrollbar-vertical{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-track-bg-hover:transparent;--os-track-bg-active:transparent}.os-theme-dark .os-scrollbar .os-scrollbar-handle{border-radius:10px!important;transition:background-color .2s ease,opacity .2s ease!important}.el-card,.el-dialog,.el-dropdown__popper.el-popper,.el-message-box{background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}html.dark .el-card,html.dark .el-dialog,html.dark .el-dropdown__popper.el-popper,html.dark .el-message-box{background-color:var(--glass-bg)!important} \ No newline at end of file diff --git a/frontend-dist/css/app.f639726f.css.gz b/frontend-dist/css/app.d178a0d5.css.gz similarity index 88% rename from frontend-dist/css/app.f639726f.css.gz rename to frontend-dist/css/app.d178a0d5.css.gz index 87cd5480..2cfc7310 100644 Binary files a/frontend-dist/css/app.f639726f.css.gz and b/frontend-dist/css/app.d178a0d5.css.gz differ diff --git a/frontend-dist/index.html b/frontend-dist/index.html index 457c3418..7e4a4601 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 7549496f..23b7d7f9 100644 Binary files a/frontend-dist/index.html.gz and b/frontend-dist/index.html.gz differ diff --git a/frontend-dist/js/136.e7c2a2d2.js b/frontend-dist/js/136.e7c2a2d2.js deleted file mode 100644 index 62ecc5c8..00000000 --- a/frontend-dist/js/136.e7c2a2d2.js +++ /dev/null @@ -1,2 +0,0 @@ -(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[136],{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 a=o(56768),s=o(24232);const i=["href","target"],l=["alt","src"];function n(e,t,o,n,r,d){return(0,a.uX)(),(0,a.CE)("a",{href:d.logoHref,target:o.target,class:(0,s.C4)(e.logo-e.link)},[(0,a.Lk)("img",{class:(0,s.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},808:function(e,t,o){"use strict";o.d(t,{A:function(){return m}});var a=o(56768),s=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,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>p.handleToggleClick&&p.handleToggleClick(...e))},[(0,a.bF)(s.eB,{name:"icon-fade",mode:"out-in"},{default:(0,a.k6)(()=>[u.isAuto?((0,a.uX)(),(0,a.Wv)(h,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,a.uX)(),(0,a.CE)("svg",{key:"sun-moon",class:(0,i.C4)(["theme_toggle_svg",{dark: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,a.Lk)("mask",l,[t[1]||(t[1]=(0,a.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,a.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:u.isDark?"50%":"100%",cy:u.isDark?"23%":"0%",r:u.isDark?"9":"5"},null,8,n)]),(0,a.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:u.isDark?"9":"5",mask:"url(#themeMask)"},null,8,r),(0,a.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:u.isDark?0:1},[...t[2]||(t[2]=[(0,a.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,a.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,a.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,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-c93807da"]]);var m=h},2893:function(e,t,o){"use strict";o(85331)},3261:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},7835:function(e,t,o){"use strict";e.exports=o.p+"img/background-light.f17603bc.jpg"},10456:function(e,t,o){"use strict";o(85331)},10732:function(e,t,o){"use strict";e.exports=o.p+"img/background.de27f549.jpg"},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(a){if(t[a])return t[a].exports;var s=t[a]={i:a,l:!1,exports:{}};return e[a].call(s.exports,s,s.exports,o),s.l=!0,s.exports}return o.m=e,o.c=t,o.d=function(e,t,a){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},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 a=Object.create(null);if(o.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)o.d(a,s,function(t){return e[t]}.bind(null,s));return a},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 a;function s(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 a}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(a||(a={}));var i=function(e,t,o,a){return new(o||(o=Promise))(function(s,i){function l(e){try{r(a.next(e))}catch(e){i(e)}}function n(e){try{r(a.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((a=a.apply(e,t||[])).next())})};function l(e,t=.92,o=a.JPEG){return i(this,void 0,void 0,function*(){return s(o)||(o=a.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=a.JPEG){return new Promise(a=>e.toBlob(e=>a(e),o,t))}var r=function(e,t,o,a){return new(o||(o=Promise))(function(s,i){function l(e){try{r(a.next(e))}catch(e){i(e)}}function n(e){try{r(a.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((a=a.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let a=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 s(t)&&(a=t),new Blob([n],{type:a})})}function c(e){return new Promise((t,o)=>{const a=new Image;a.onload=()=>t(a),a.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),a.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 a=document.createEvent("MouseEvents");a.initEvent("click",!1,!1),o.dispatchEvent(a),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,a){return new(o||(o=Promise))(function(s,i){function l(e){try{r(a.next(e))}catch(e){i(e)}}function n(e){try{r(a.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((a=a.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),a=document.createElement("canvas"),s=a.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)?(a.height=l,a.width=i):(a.height=i,a.width=l),o.orientation){case 3:s.rotate(180*Math.PI/180),s.drawImage(e,-a.width,-a.height,a.width,a.height);break;case 6:s.rotate(90*Math.PI/180),s.drawImage(e,0,-a.width,a.height,a.width);break;case 8:s.rotate(270*Math.PI/180),s.drawImage(e,-a.height,0,a.height,a.width);break;case 2:s.translate(a.width,0),s.scale(-1,1),s.drawImage(e,0,0,a.width,a.height);break;case 4:s.translate(a.width,0),s.scale(-1,1),s.rotate(180*Math.PI/180),s.drawImage(e,-a.width,-a.height,a.width,a.height);break;case 5:s.translate(a.width,0),s.scale(-1,1),s.rotate(90*Math.PI/180),s.drawImage(e,0,-a.width,a.height,a.width);break;case 7:s.translate(a.width,0),s.scale(-1,1),s.rotate(270*Math.PI/180),s.drawImage(e,-a.height,0,a.height,a.width);break;default:s.drawImage(e,0,0,a.width,a.height)}return a})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const a=new Image;a.onload=()=>t(a),a.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),a.src=e})}var y=function(e,t,o,a){return new(o||(o=Promise))(function(s,i){function l(e){try{r(a.next(e))}catch(e){i(e)}}function n(e){try{r(a.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(l,n)}r((a=a.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=a.JPEG;s(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=a.JPEG;s(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)},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},21136:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return To}});var a=o(78507),s=(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"},x=["title"],_=["title"],I={class:"list-meta"},A={class:"upload-time"},M={class:"list-actions"},E={key:0,class:"load-more-container"},D={key:0,class:"loading-indicator"},R={key:1,class:"load-more-hint"},B={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function W(e,t,o,W,N,z){const V=(0,i.g2)("font-awesome-icon"),H=s.S2,Q=a.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:N.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(Q,{content:e.$t("uploadHistory.switchView"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:z.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"grid"===N.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(Q,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:z.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(V,{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)(V,{icon:"times"})]),_:1})])]),N.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>z.handleScroll&&z.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(z.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,l.v_)(e.date),1)]),"grid"===N.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,g)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(V,{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=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{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_)(z.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,U)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(V,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,l.v_)(e.name),9,x),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,l.v_)(e.url),9,_)]),(0,i.Lk)("div",I,[(0,i.Lk)("div",A,(0,l.v_)(z.formatTime(e.time)),1)]),(0,i.Lk)("div",M,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(V,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),z.hasMore?((0,i.uX)(),(0,i.CE)("div",E,[N.loadingMore?((0,i.uX)(),(0,i.CE)("div",D,[(0,i.bF)(V,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",R,(0,l.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):N.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",B,(0,l.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(V,{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 N={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),a=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[a]||(e[a]=[]),e[a].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,a=t.scrollHeight,s=t.clientHeight;a-o-s<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(),a=String(t.getMonth()+1).padStart(2,"0"),s=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}-${a}-${s} ${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)}}},z=o(71241);const V=(0,z.A)(N,[["render",W],["__scopeId","data-v-f70e7770"]]);var H=V,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(53676));const Z={class:"dialog-section"},ee={class:"section-header"},te={class:"section-title"},oe={class:"section-content"},ae={class:"setting-item"},se={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"},xe={class:"slider-wrapper"},_e={class:"slider-input-wrapper"},Ie={key:0,class:"dialog-section"},Ae={class:"section-header"},Me={class:"section-title"},Ee={class:"section-content"},De={class:"setting-item"},Re={class:"setting-label"},Be={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=a.R7,g=K.P9,f=K.AV,y=G.WK,b=j.qi,k=O.B8,v=q.lq,C=s.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",ae,[(0,i.Lk)("span",se,(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 channel-brand-telegram"}),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 channel-brand-cfr2"}),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 channel-brand-s3"}),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 channel-brand-discord"}),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 channel-brand-huggingface"}),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 channel-brand-webdav"}),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",xe,[(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",_e,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[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",Ie,[(0,i.Lk)("div",Ae,[(0,i.Lk)("span",Me,(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",Ee,[(0,i.Lk)("div",De,[(0,i.Lk)("span",Re,(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",Be,[(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 We={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 Ne=(0,z.A)(We,[["render",Pe]]);var ze=Ne,Ve=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"},at={key:1,class:"upload-list-item-progress"},st={class:"upload-list-item-action"};function it(e,t,o,a,s,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",at,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",st,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var 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 a,s;o>0?(a=e.substring(0,o),s=e.substring(o)):(a=e,s="");const i=s.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":a.substring(0,l)+"..."+a.slice(-4)+s},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,z.A)(dt,[["render",it],["__scopeId","data-v-698179d6"]]);var ut=ct,pt=o(62086),ht=(o(40670),o(88830),o(23597),o(70683)),mt=(o(95385),o(3261),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={class:"upload-list-dashboard-action"},Ct={class:"modern-action-group"},wt={class:"modern-dropdown-item-content"},Ft={class:"modern-action-btn modern-action-btn-danger"};function Lt(e,t,n,r,d,c){const u=(0,i.g2)("CameraFilled"),p=He.tk,h=mt.j5,m=G.WK,g=s.S2,f=J.Zh,y=J.MQ,b=ht.Ik,k=(0,i.g2)("List"),v=(0,i.g2)("Checked"),C=(0,i.g2)("Failed"),w=Xe.$g,F=(0,i.g2)("font-awesome-icon"),L=a.R7,U=j.qi,$=pt.c6,S=pt.Iy,T=pt.dW,x=ut,_=Ve.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)(h,{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)(p,{class:(0,l.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(u)]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,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)(b,{class:(0,l.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",kt,[(0,i.bF)(g,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.bF)(y,{modelValue:d.pasteUploadMethod,"onUpdate:modelValue":t[3]||(t[3]=e=>d.pasteUploadMethod=e),class:"paste-card-method-group",size:c.pasteCardMethodButtonSize},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"save"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.pasteSave")),1)]),_:1}),(0,i.bF)(f,{label:"external"},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.pasteExternal")),1)]),_:1})]),_:1},8,["modelValue","size"])])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(b,{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)(_,{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)(w,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(k)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(v)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(C)]),_:1}),(0,i.eW)((0,l.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",vt,[(0,i.Lk)("div",Ct,[(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-copy",onClick:t[4]||(t[4]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(F,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",wt,[(0,i.Lk)("span",null,(0,l.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(U,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[6]||(t[6]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn modern-action-btn-retry",onClick:t[5]||(t[5]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(F,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,l.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)($,{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",Ft,[(0,i.bF)(F,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)(x,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[7]||(t[7]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979);var Ut=o(457),$t=o(76334),St=o(60782);function Tt(e,t,o){const a=o+e;return{finalURL:a,mdURL:`![${t}](${a})`,htmlURL:`${t}`,ubbURL:`[img]${a}[/img]`}}function xt(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function _t(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=Tt(e.srcID,e.name,t);Object.assign(e,o)})}const It=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]),At=(e,t)=>e>>>t|e<<32-t;function Mt(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=At(o[u-15],7)^At(o[u-15],18)^o[u-15]>>>3,t=At(o[u-2],17)^At(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[a,s,i,l,n,r,d,c]=t;for(let u=0;u<64;u++){const e=At(n,6)^At(n,11)^At(n,25),t=n&r^~n&d,p=c+e+t+It[u]+o[u]>>>0,h=At(a,2)^At(a,13)^At(a,22),m=a&s^a&i^s&i,g=h+m>>>0;c=d,d=r,r=n,n=l+p>>>0,l=i,i=s,s=a,a=p+g>>>0}t[0]=t[0]+a>>>0,t[1]=t[1]+s>>>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 Et(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,a=0;return{update(s){a+=s.length;let i=0;if(o>0){const a=64-o,l=Math.min(a,s.length);t.set(s.subarray(0,l),o),o+=l,i=l,64===o&&(Mt(t,e),o=0)}while(i+64<=s.length)Mt(s.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),Mt(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(s/4294967296),!1),i.setUint32(60,s>>>0,!1),Mt(t,e);let l="";for(let t=0;t<8;t++)l+=e[t].toString(16).padStart(8,"0");return l}}}async function Dt(e){const t=Et(),o=4194304;let a=0;while(athis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){_t(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&_t(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,St.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 a,s;o>0?(a=e.substring(0,o),s=e.substring(o)):(a=e,s="");const i=s.length+4,l=t-i-3;return l<=0?e.substring(0,t-3)+"...":a.substring(0,l)+"..."+a.slice(-4)+s},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),a=o?.uploadChannel||this.uploadChannel;if("external"===a)return void this.uploadSingleFile(e);if("huggingface"===a){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===a){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const s=20971520;e.file.size>s?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,a=t.uploadChannel||this.uploadChannel,s=this.autoRetry&&"external"!==a,i="external"===a?"default":this.uploadNameType,l=new AbortController;this.abortControllers.set(e.file.uid,l);const n=new FormData;if(n.append("file",e.file),"external"===a&&n.append("url",e.file.url),"huggingface"===a)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Dt(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Ut.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+a+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+s+"&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,a=new AbortController;this.abortControllers.set(e.file.uid,a);const s="discord"===o?9437184:16777216,i=e.file.size,l=e.file.type||"application/octet-stream",n=Math.ceil(i/s),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 Dt(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,Ut.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*s,h=Math.min(u+s,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 a=Math.round(o.loaded/o.total*100);y[t]=a;const s=Math.round(y.reduce((e,t)=>e+t,0)/n);e.onProgress({percent:s,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,Ut.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 a=o.uploadChannel||this.uploadChannel;if("external"!==a){const a=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+a;const s=Tt(a,t.name,this.rootUrl);Object.assign(o,s),o.srcID=a}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(a){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(xt(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 a=e;const s=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(s)try{const t=await this.convertImageToWebp(e);t&&(a=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=a.type.includes("image")&&this.customerCompress&&a.size/1024/1024>this.compressBar,l=a.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const a=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:a,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)$t.compressAccurately(a,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:a.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const s=new File([t],a.name,{type:t.type});s.uid=e.uid;const i=this.uploadCount++,l=this.serverCompress&&s.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(s,l):setTimeout(()=>{n(s,l),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:a.name})),o(e)});else if(l){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!a.type.includes("image")||a.size/1024/1024<10);0===e?n(a,t):setTimeout(()=>{n(a,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:a.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=>xt(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:s,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 a="";o.test(e)&&Ut.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]){a=o[1].replace(/['"]/g,"");try{a=decodeURIComponent(a)}catch(s){a=""}}""===a&&(o=t.exec(i),null!=o&&o[1]&&(a=decodeURIComponent(o[1])))}if(""===a){const t=new URL(e);a=t.pathname.split("/").pop()}if(""===a){const o=new URL(e);let s=o.pathname.split(".").pop();(!s||""===s||s.length>10)&&(s="bin"),a="PastedFile"+Date.now()+t+"."+s}const l=o.data,n=new File([l],a,{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 Dt(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const a=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),s=btoa(String.fromCharCode(...a));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,Ut.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:s,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:a}=l.uploadAction;if(a?.chunk_size)await this.uploadToHuggingFaceMultipart(e,l,o);else{console.log("Uploading to S3 (basic)...");const s=await fetch(t,{method:"PUT",headers:a||{},body:e.file,signal:o.signal});if(!s.ok){const e=await s.text();throw new Error(`S3 upload failed: ${s.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,Ut.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(a){if("CanceledError"===a.name||"ERR_CANCELED"===a.code||"AbortError"===a.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",a),this.exceptionList.push(e),e.onError(a,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:a}=t,{href:s,header:i}=a,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,a=t*l,s=Math.min(a+l,e.file.size),n=e.file.slice(a,s);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(s,{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 a=new Image,s=document.createElement("canvas"),i=s.getContext("2d");a.onload=()=>{s.width=a.width,s.height=a.height,i.drawImage(a,0,0),s.toBlob(s=>{if(s){const o=e.name,a=o.lastIndexOf("."),i=a>0?o.substring(0,a)+".webp":o+".webp",l=new File([s],i,{type:"image/webp"});l.uid=e.uid,t(l)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(a.src)},"image/webp",.92)},a.onerror=()=>{URL.revokeObjectURL(a.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},a.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),a=e.clientX-o.left,s=e.clientY-o.top;t.style.opacity="1",t.style.left=a+"px",t.style.top=s+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const Bt=(0,z.A)(Rt,[["render",Lt],["__scopeId","data-v-fca24b68"]]);var Pt=Bt,Wt=o(732),Nt=o(33892),zt=o(45130);const Vt={class:"directory-suggestion-input",ref:"wrapperRef"},Ht={class:"suggestion-dropdown"},Qt={class:"suggestion-list"},Xt=["title","onMousedown"];function qt(e,t,o,a,s,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",Vt,[(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",Ht,[(0,i.Lk)("ul",Qt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,zt.D$)(t=>n.selectItem(e),["prevent"])},(0,l.v_)(e.value),41,Xt))),128))])],512),[[zt.aG,s.dropdownVisible&&s.suggestions.length>0]])],512)}var Ot={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),a=this.directoryChildrenMap[o];a&&a.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 a=this.normalizeDirectoryPath(e.path),s=Array.isArray(e.children)?e.children:[];t[a]=s.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),s.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await Ut.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),a=o.split("/"),s=a[a.length-1]||"",i=a.slice(0,-1).filter(Boolean),l=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:s,parentPath:l}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),a=this.directoryChildrenMap[o]||[];if(!t)return a.slice(0,10).map(e=>({value:e.path}));const s=t.toLowerCase();return a.filter(e=>e.name.toLowerCase().startsWith(s)).slice(0,10).map(e=>({value:e.path}))}}};const jt=(0,z.A)(Ot,[["render",qt],["__scopeId","data-v-28b8eda7"]]);var Gt=jt,Kt=o(808);const Jt={class:"container"},Yt={class:"upload-home"},Zt={class:"quick-toolbar-actions"},eo={class:"quick-toolbar-actions-inner"},to={class:"header"},oo={class:"title"},ao={class:"title-crayon-text","aria-hidden":"true"},so={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},io={class:"dialog-section"},lo={class:"section-header"},no={class:"section-title"},ro={class:"section-content"},co={class:"dialog-section"},uo={class:"section-header"},po={class:"section-title"},ho={class:"section-content"},mo={class:"setting-item"},go={class:"setting-label"},fo={key:0,class:"setting-item"},yo={class:"setting-label"},bo={class:"dialog-action"},ko=["innerHTML"],vo={class:"dialog-footer"};function Co(e,t,o,n,r,d){const c=Kt.A,u=(0,i.g2)("font-awesome-icon"),p=s.S2,h=pt.c6,m=pt.Iy,g=pt.dW,f=Gt,y=G.WK,b=Nt.A,k=a.R7,v=Wt.A,C=Pt,w=J.ll,F=J.MQ,L=j.qi,U=X.kZ,$=ze,S=Q.A,T=H;return(0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Yt,[(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},{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",Zt,[(0,i.Lk)("div",eo,[(0,i.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.logout"),placement:"left","hide-after":0},{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},{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},{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},{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",to,[(0,i.Lk)("h1",oo,[(0,i.Lk)("span",ao,(0,l.v_)(d.ownerName)+" ImgHub",1),(0,i.Lk)("a",so,(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",io,[(0,i.Lk)("div",lo,[(0,i.Lk)("span",no,(0,l.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",ro,[(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",co,[(0,i.Lk)("div",uo,[(0,i.Lk)("span",po,(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",ho,[(0,i.Lk)("div",mo,[(0,i.Lk)("span",go,(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",fo,[(0,i.Lk)("span",yo,(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",bo,[(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",vo,[(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,ko)]),_: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 wo=o(46638),Fo=o(48903),Lo=o(90144),Uo=o(62388),$o={name:"UploadHome",mixins:[Fo.A],data(){return{selectedUrlForm:(0,Lo.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,Uo.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,St.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:Pt,Footer:Q.A,ToggleDark:Kt.A,Logo:Wt.A,UploadHistory:H,UploadSettingsDialog:ze,DirectoryTreePicker:Nt.A,DirectorySuggestionInput:Gt},methods:{async fetchAvailableChannels(){try{const e=await Ut.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,a=this.availableChannels[this.uploadChannel]||[];t&&a.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&a.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,Uo.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(){Ut.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,wo.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,wo.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 So=(0,z.A)($o,[["render",Co],["__scopeId","data-v-c4d6ef3e"]]);var To=So},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 a=o(99114),s=(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=s.pw,T=a.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)},48903:function(e,t,o){"use strict";var a=o(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const o=document.createElement("img");o.id="bg2",o.className="background-image2",o.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(o,e.firstChild)},initializeBackground(e,t=".login",o=!1,a=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:o,autoCreateElements:a};const s=document.querySelector(t);this.prepareBackgroundContainer(s),a&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),l=document.getElementById("bg2");if(!i||!l)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const n=this.userConfig?.[e];"bing"===n?this.setupBingWallpaper(i,l,t):Array.isArray(n)&&n.length>1?this.setupCustomWallpaperCarousel(i,l,n,t):Array.isArray(n)&&1===n.length?this.setupSingleCustomWallpaper(i,n[0],t):o&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,o){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,o,!0),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,o,a){this.loadBackgroundImage(e,o[this.customWallPaperIndex],a,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,o)},this.bkInterval)},setupSingleCustomWallpaper(e,t,o){this.loadBackgroundImage(e,t,o)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,s=o(a?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,o,a=!1){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,a);const s=document.querySelector(o);this.prepareBackgroundContainer(s);const i=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity,a&&(e.style.transform="scale(1.045)")})})},l=new Image;l.onload=()=>{e.src=t,i()},l.onerror=()=>{e.src=t,i()},l.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const o=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${o}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const o=0!=e.style.opacity,a=o?e:t,s=o?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0);const l=new Image;l.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",setTimeout(()=>{a.style.opacity=0,this.prepareBackgroundMotion(a,!0)},1200)},50)},l.src=i},switchCustomWallpaper(e,t,o){const a=0!=e.style.opacity,s=a?e:t,i=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%o.length;const l=o[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1,this.prepareBackgroundMotion(i,!0);const n=new Image;n.onload=()=>{i.src=l,setTimeout(()=>{i.style.opacity=this.bkOpacity,i.style.transform="scale(1.045)",setTimeout(()=>{s.style.opacity=0,this.prepareBackgroundMotion(s,!0)},1200)},50)},n.src=l},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),o=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),o&&(o.style.transition="none",o.style.opacity=0,o.removeAttribute("src"),setTimeout(()=>{o&&(o.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&t.removeAttribute("src")},1200)),o&&(o.style.opacity=0,setTimeout(()=>{o&&o.removeAttribute("src")},1200)))},smoothThemeTransition(e,t=".login",a=!1,s=!1){const i=this.userConfig?.[e];if(!a||void 0!==i)return void this.reinitializeBackground(e,t,a,s);const l=document.getElementById("bg1"),n=document.getElementById("bg2");if(!l||!n)return void this.reinitializeBackground(e,t,a,s);const r=0!=l.style.opacity?l:n,d=0!=l.style.opacity?n:l,c=this.useDarkMode,u=o(c?10732:7835),p=new Image;p.onload=()=>{d.src=u,d.onload=()=>{r.style.opacity=0,setTimeout(()=>{d.style.opacity=this.bkOpacity},50)}},p.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,s)},p.src=u},reinitializeBackground(e,t=".login",o=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,o,a)},100)}}}},50333:function(e,t,o){"use strict";o(85331),o(29092)},53676:function(e,t,o){"use strict";o.d(t,{A:function(){return u}});var a=o(56768);const s={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,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("span",(0,a.v6)(e.$attrs,{class:"channel-icon-wrapper"}),["telegram"===o.type?((0,a.uX)(),(0,a.CE)("svg",s,[...t[0]||(t[0]=[(0,a.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,a.uX)(),(0,a.CE)("svg",i,[...t[1]||(t[1]=[(0,a.Fv)('',9)])])):"webdav"===o.type?((0,a.uX)(),(0,a.CE)("svg",l,[...t[2]||(t[2]=[(0,a.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,a.uX)(),(0,a.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-33933ada"]]);var u=c},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return s}});var a=o(46638);function s(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:a.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:a.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:a.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:a.Ay.global.t("validation.consecutiveSlashNotAllowed")};const s=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return s.test(e)?{valid:!1,error:a.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 a=o(25507),s=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,a.A.commit("setAdminLoggedIn",!1),s.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 a=o(56768),s=o(24232);const i={key:0,class:"page-footer"},l=["href"];function n(e,t,o,n,r,d){const c=(0,a.g2)("font-awesome-icon");return d.disableFooter?(0,a.Q3)("",!0):((0,a.uX)(),(0,a.CE)("div",i,[(0,a.Lk)("p",null,[(0,a.eW)("© 2024-"+(0,s.v_)(d.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,a.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,a.eW)(" for You! ",-1)),(0,a.Lk)("a",{href:d.footerLink,target:"_blank"},[(0,a.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)}}]); -//# sourceMappingURL=136.e7c2a2d2.js.map \ No newline at end of file diff --git a/frontend-dist/js/136.e7c2a2d2.js.gz b/frontend-dist/js/136.e7c2a2d2.js.gz deleted file mode 100644 index d147304a..00000000 Binary files a/frontend-dist/js/136.e7c2a2d2.js.gz and /dev/null differ diff --git a/frontend-dist/js/136.e7c2a2d2.js.map b/frontend-dist/js/136.e7c2a2d2.js.map deleted file mode 100644 index 87fd7758..00000000 --- a/frontend-dist/js/136.e7c2a2d2.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/136.e7c2a2d2.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?5a8c","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?0f8d","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?2681","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?5e70","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?79b9","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?5714","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00","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/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?4482","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","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"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=c93807da&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=c93807da&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-c93807da\"]])\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 { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\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=f70e7770&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=f70e7770&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-f70e7770\"]])\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 channel-brand-telegram\"\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 channel-brand-cfr2\"\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 channel-brand-s3\"\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 channel-brand-discord\"\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 channel-brand-huggingface\"\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 channel-brand-webdav\"\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=bb927c90\"\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=698179d6&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=698179d6&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-698179d6\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-copy\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-retry\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.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=fca24b68&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=fca24b68&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-fca24b68\"]])\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 }, {\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 }, {\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 }, {\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 }, {\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 }, {\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=c4d6ef3e&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=c4d6ef3e&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-c4d6ef3e\"]])\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 * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\r\n }\r\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n if (enableZoom) {\r\n imgElement.style.transform = 'scale(1.045)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.removeAttribute('src')\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.removeAttribute('src')\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { createElementVNode as _createElementVNode, 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\"\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=33933ada&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=33933ada&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-33933ada\"]])\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__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","t","e","module","exports","n","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","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","quality","isNaN","accuracy","filter","sort","abs","pow","v","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_component_el_button","_component_el_tooltip","show","$t","count","totalCount","content","placement","circle","toggleViewMode","viewMode","clearHistory","$event","$emit","historyList","ref","onScroll","handleScroll","groupedHistory","group","date","items","item","time","isImage","url","loading","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","title","formatTime","hasMore","loadingMore","spin","allHistory","pageSize","currentPage","watch","val","resetAndLoad","groups","forEach","dateStr","getFullYear","getMonth","padStart","getDate","push","keys","map","mounted","savedMode","localStorage","getItem","loadAllHistory","loadMore","history","JSON","parse","console","error","setTimeout","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","modelValue","visible","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","emits","set","innerWidth","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_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","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","$nextTick","$refs","scrollContainer","setScrollTop","deep","immediate","location","protocol","host","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","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","ok","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","undefined","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","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","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","_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","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","oldVal","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","getElementById","textContent","head","existingStyle","remove","createBackgroundElements","bg1","className","bg2","insertBefore","firstChild","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","dispatch","bingWallPapers","loadBackgroundImage","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","preload","zoomDuration","transformOrigin","computedStyle","getComputedStyle","isolation","isBg1Current","curBg","nextBg","nextUrl","clearBackgroundInterval","removeAttribute","reinitializeBackground","currentBg","newThemeImage","preloadImg","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","cfr2","s3","discord","validateFolderPath","i18n","global","dotPattern","invalidChars","isRedirecting","options","credentials","router","disableFooter","thisYear","footerLink"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/136.e7c2a2d2.js.map.gz b/frontend-dist/js/136.e7c2a2d2.js.map.gz deleted file mode 100644 index 246e85a4..00000000 Binary files a/frontend-dist/js/136.e7c2a2d2.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/21.618c6fee.js b/frontend-dist/js/21.618c6fee.js deleted file mode 100644 index e2be7a5c..00000000 --- a/frontend-dist/js/21.618c6fee.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[21],{7835:function(e,t,n){e.exports=n.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,n){e.exports=n.p+"img/background.de27f549.jpg"},48903:function(e,t,n){var a=n(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const s=document.querySelector(t);this.prepareBackgroundContainer(s),a&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const r=document.getElementById("bg1"),o=document.getElementById("bg2");if(!r||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const i=this.userConfig?.[e];"bing"===i?this.setupBingWallpaper(r,o,t):Array.isArray(i)&&i.length>1?this.setupCustomWallpaperCarousel(r,o,i,t):Array.isArray(i)&&1===i.length?this.setupSingleCustomWallpaper(r,i[0],t):n&&this.setupDefaultWallpaper(r,t)},setupBingWallpaper(e,t,n){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n,!0),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,s=n(a?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,n,a=!1){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,a);const s=document.querySelector(n);this.prepareBackgroundContainer(s);const r=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity,a&&(e.style.transform="scale(1.045)")})})},o=new Image;o.onload=()=>{e.src=t,r()},o.onerror=()=>{e.src=t,r()},o.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const n=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${n}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const n=0!=e.style.opacity,a=n?e:t,s=n?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const r=this.bingWallPapers[this.bingWallPaperIndex]?.url;a.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0);const o=new Image;o.onload=()=>{s.src=r,setTimeout(()=>{s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",setTimeout(()=>{a.style.opacity=0,this.prepareBackgroundMotion(a,!0)},1200)},50)},o.src=r},switchCustomWallpaper(e,t,n){const a=0!=e.style.opacity,s=a?e:t,r=a?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const o=n[this.customWallPaperIndex];s.style.zIndex=-2,r.style.zIndex=-1,this.prepareBackgroundMotion(r,!0);const i=new Image;i.onload=()=>{r.src=o,setTimeout(()=>{r.style.opacity=this.bkOpacity,r.style.transform="scale(1.045)",setTimeout(()=>{s.style.opacity=0,this.prepareBackgroundMotion(s,!0)},1200)},50)},i.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.removeAttribute("src"),setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&t.removeAttribute("src")},1200)),n&&(n.style.opacity=0,setTimeout(()=>{n&&n.removeAttribute("src")},1200)))},smoothThemeTransition(e,t=".login",a=!1,s=!1){const r=this.userConfig?.[e];if(!a||void 0!==r)return void this.reinitializeBackground(e,t,a,s);const o=document.getElementById("bg1"),i=document.getElementById("bg2");if(!o||!i)return void this.reinitializeBackground(e,t,a,s);const l=0!=o.style.opacity?o:i,c=0!=o.style.opacity?i:o,u=this.useDarkMode,g=n(u?10732:7835),d=new Image;d.onload=()=>{c.src=g,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},d.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,a,s)},d.src=g},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}},54047:function(e,t,n){n.d(t,{A:function(){return u}});var a=n(56768);const s=["title"];function r(e,t,n,r,o,i){const l=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>i.toggleLocale&&i.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,a.bF)(l,{icon:"globe",class:"lang-icon"})],8,s)}var o=n(46638),i={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,o.xS)(e)}}},l=n(71241);const c=(0,l.A)(i,[["render",r],["__scopeId","data-v-08567d0a"]]);var u=c}}]); -//# sourceMappingURL=21.618c6fee.js.map \ No newline at end of file diff --git a/frontend-dist/js/21.618c6fee.js.gz b/frontend-dist/js/21.618c6fee.js.gz deleted file mode 100644 index 298f0ac5..00000000 Binary files a/frontend-dist/js/21.618c6fee.js.gz and /dev/null differ diff --git a/frontend-dist/js/21.618c6fee.js.map b/frontend-dist/js/21.618c6fee.js.map deleted file mode 100644 index d273ae2d..00000000 --- a/frontend-dist/js/21.618c6fee.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/21.618c6fee.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\r\n }\r\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n if (enableZoom) {\r\n imgElement.style.transform = 'scale(1.045)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.removeAttribute('src')\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.removeAttribute('src')\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","opacity","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","preload","Image","onload","src","onerror","zoomDuration","Math","max","transition","transformOrigin","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","removeAttribute","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","class","onClick","args","toggleLocale","role","title","$t","icon","name","isZh","$i18n","locale","next","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/21.618c6fee.js.map.gz b/frontend-dist/js/21.618c6fee.js.map.gz deleted file mode 100644 index 4f82d523..00000000 Binary files a/frontend-dist/js/21.618c6fee.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/22.b436b08e.js b/frontend-dist/js/22.b436b08e.js new file mode 100644 index 00000000..d40eec5d --- /dev/null +++ b/frontend-dist/js/22.b436b08e.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[22],{213:function(e,n,t){t(85331),t(19104)},4318:function(){},10456:function(e,n,t){t(85331)},18785:function(e,n,t){t(85331)},19104:function(e,n,t){t(85331)},30694:function(e,n,t){t(85331)},38736:function(e,n,t){t(85331)},54047:function(e,n,t){t.d(n,{A:function(){return u}});var i=t(56768);const o=["title"];function a(e,n,t,a,s,c){const l=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("span",{class:"language-switcher",onClick:n[0]||(n[0]=(...e)=>c.toggleLocale&&c.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,i.bF)(l,{icon:"globe",class:"lang-icon"})],8,o)}var s=t(46638),c={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,s.xS)(e)}}},l=t(71241);const r=(0,l.A)(c,[["render",a],["__scopeId","data-v-08567d0a"]]);var u=r},67819:function(e,n,t){t(85331)},70797:function(e,n,t){t.d(n,{A:function(){return s}});t(44114);var i=t(25507),o=t(16915);let a=!1;async function s(e,n={}){n.credentials="include",n.headers={...n.headers};const t=await fetch(e,n);return 401!==t.status||a||(a=!0,i.A.commit("setAdminLoggedIn",!1),o.A.push("/adminLogin").finally(()=>{a=!1})),t}},77128:function(e,n,t){t(85331),t(4318)},78450:function(e,n,t){t(85331)},85970:function(e,n,t){t(85331)},91570:function(e,n,t){t.d(n,{A:function(){return M}});var i=t(54047),o=t(56768),a=t(45130),s=t(24232);const c={id:"themeMaskAdmin"},l=["cx","cy","r"],r=["r"],u=["opacity"];function h(e,n,t,i,h,g){const d=(0,o.g2)("font-awesome-icon");return(0,o.uX)(),(0,o.CE)("div",{id:"themeToggle",onClick:n[0]||(n[0]=(...e)=>g.handleToggleClick&&g.handleToggleClick(...e))},[(0,o.bF)(a.eB,{name:"icon-fade",mode:"out-in"},{default:(0,o.k6)(()=>[h.isAuto?((0,o.uX)(),(0,o.Wv)(d,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.3em",color:"var(--admin-theme-toggle-color)"}})):((0,o.uX)(),(0,o.CE)("svg",{key:"sun-moon",class:(0,s.C4)(["theme_toggle_svg",{dark:h.isDark}]),width:"1.3em",height:"1.3em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,o.Lk)("mask",c,[n[1]||(n[1]=(0,o.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,o.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:h.isDark?"50%":"100%",cy:h.isDark?"23%":"0%",r:h.isDark?"9":"5"},null,8,l)]),(0,o.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:h.isDark?"9":"5",mask:"url(#themeMaskAdmin)"},null,8,r),(0,o.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:h.isDark?0:1},[...n[2]||(n[2]=[(0,o.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,o.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,o.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var g={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},d=t(71241);const p=(0,d.A)(g,[["render",h],["__scopeId","data-v-5c149ed5"]]);var m=p;const k={class:"tabs"},v=["aria-expanded"],b={class:"page-switcher-title"},f=["onMouseenter","onClick"],P={class:"page-switcher-title"};function C(e,n,t,c,l,r){const u=(0,o.g2)("font-awesome-icon"),h=m,g=i.A;return(0,o.uX)(),(0,o.CE)("div",k,[(0,o.Lk)("div",{class:(0,s.C4)(["page-switcher",{"is-open":l.isPageMenuOpen}]),role:"navigation",onClick:n[3]||(n[3]=(0,a.D$)(()=>{},["stop"])),onPointerdown:n[4]||(n[4]=(0,a.D$)(()=>{},["stop"])),onMouseenter:n[5]||(n[5]=(...e)=>r.handlePageSwitcherEnter&&r.handlePageSwitcherEnter(...e)),onMouseleave:n[6]||(n[6]=(...e)=>r.handlePageSwitcherLeave&&r.handlePageSwitcherLeave(...e))},[(0,o.Lk)("div",{class:"page-switcher-sheet",role:"menu",onClick:n[2]||(n[2]=(0,a.D$)(()=>{},["stop"]))},[(0,o.Lk)("button",{class:"page-option is-current",type:"button",role:"menuitem","aria-current":"page","aria-expanded":l.isPageMenuOpen,onClick:n[0]||(n[0]=(0,a.D$)(e=>r.handlePageOptionClick(r.activePageOption.name),["stop"]))},[(0,o.bF)(u,{icon:r.activePageOption.icon,class:"page-option-icon"},null,8,["icon"]),(0,o.Lk)("span",b,(0,s.v_)(e.$t(r.activePageOption.label)),1),(0,o.bF)(u,{icon:"chevron-down",class:"page-switcher-arrow"})],8,v),(0,o.Lk)("div",{class:"page-option-list",onMouseleave:n[1]||(n[1]=(...e)=>r.clearHoveredPageOption&&r.clearHoveredPageOption(...e))},[(0,o.Lk)("span",{class:(0,s.C4)(["page-option-highlight",{"is-visible":null!==l.hoveredPageOptionIndex}]),style:(0,s.Tr)({"--hovered-option-index":null===l.hoveredPageOptionIndex?0:l.hoveredPageOptionIndex}),"aria-hidden":"true"},null,6),((0,o.uX)(!0),(0,o.CE)(o.FK,null,(0,o.pI)(r.inactivePageOptions,(n,t)=>((0,o.uX)(),(0,o.CE)("button",{key:n.name,class:"page-option",type:"button",role:"menuitem",onMouseenter:e=>r.setHoveredPageOption(t),onClick:(0,a.D$)(e=>r.handlePageOptionClick(n.name),["stop"])},[(0,o.bF)(u,{icon:n.icon,class:"page-option-icon"},null,8,["icon"]),(0,o.Lk)("span",P,(0,s.v_)(e.$t(n.label)),1)],40,f))),128))],32)])],34),(0,o.bF)(h),(0,o.bF)(g,{class:"tabs-language-switcher"})])}t(44114),t(18111),t(22489),t(20116);var w={name:"DashboardTabs",props:{activeTab:{type:String,default:"dashboard"}},components:{AdminToggleDark:m,LanguageSwitcher:i.A},data(){return{isPageMenuOpen:!1,hoveredPageOptionIndex:null}},computed:{pageOptions(){return[{name:"dashboard",icon:"images",label:"dashboardTabs.fileManagement"},{name:"customerConfig",icon:"user-cog",label:"dashboardTabs.userManagement"},{name:"systemConfig",icon:"cogs",label:"dashboardTabs.systemSettings"},{name:"",icon:"upload",label:"dashboardTabs.fileUpload"}]},activePageOption(){return this.pageOptions.find(e=>e.name===this.activeTab)||this.pageOptions[0]},inactivePageOptions(){return this.pageOptions.filter(e=>e.name!==this.activePageOption.name)}},methods:{handleDocumentClick(e){this.$el?.contains(e.target)||this.closePageMenu()},refreshDashboard(){location.reload()},handleTabClick(e){this.closePageMenu(),e!==this.activeTab?this.$router.push(`/${e}`):this.refreshDashboard()},isTouchViewport(){return window.matchMedia("(hover: none), (pointer: coarse)").matches},handlePageOptionClick(e){!this.isTouchViewport()||this.isPageMenuOpen||e===this.activeTab?e!==this.activeTab?this.handleTabClick(e):this.isTouchViewport()?this.togglePageMenu():this.openPageMenu():this.openPageMenu()},handlePageSwitcherEnter(){this.isTouchViewport()||this.openPageMenu()},handlePageSwitcherLeave(){this.isTouchViewport()||this.closePageMenu()},setHoveredPageOption(e){this.hoveredPageOptionIndex=e},clearHoveredPageOption(){this.hoveredPageOptionIndex=null},openPageMenu(){this.isPageMenuOpen=!0},togglePageMenu(){this.isPageMenuOpen=!this.isPageMenuOpen},closePageMenu(){this.isPageMenuOpen=!1,this.clearHoveredPageOption()}},mounted(){document.addEventListener("click",this.handleDocumentClick)},beforeUnmount(){document.removeEventListener("click",this.handleDocumentClick)}};const y=(0,d.A)(w,[["render",C],["__scopeId","data-v-07e603fa"]]);var M=y},96808:function(e,n,t){t(85331),t(18785),t(67819),t(85970),t(19104)}}]); +//# sourceMappingURL=22.b436b08e.js.map \ No newline at end of file diff --git a/frontend-dist/js/22.b436b08e.js.gz b/frontend-dist/js/22.b436b08e.js.gz new file mode 100644 index 00000000..5f23d5db Binary files /dev/null and b/frontend-dist/js/22.b436b08e.js.gz differ diff --git a/frontend-dist/js/22.b436b08e.js.map b/frontend-dist/js/22.b436b08e.js.map new file mode 100644 index 00000000..f66dd117 --- /dev/null +++ b/frontend-dist/js/22.b436b08e.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/22.b436b08e.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?96f9","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = [\"aria-expanded\"];\nconst _hoisted_3 = {\n class: \"page-switcher-title\"\n};\nconst _hoisted_4 = [\"onMouseenter\", \"onClick\"];\nconst _hoisted_5 = {\n class: \"page-switcher-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"page-switcher\", {\n 'is-open': $data.isPageMenuOpen\n }]),\n role: \"navigation\",\n onClick: _cache[3] || (_cache[3] = _withModifiers(() => {}, [\"stop\"])),\n onPointerdown: _cache[4] || (_cache[4] = _withModifiers(() => {}, [\"stop\"])),\n onMouseenter: _cache[5] || (_cache[5] = (...args) => $options.handlePageSwitcherEnter && $options.handlePageSwitcherEnter(...args)),\n onMouseleave: _cache[6] || (_cache[6] = (...args) => $options.handlePageSwitcherLeave && $options.handlePageSwitcherLeave(...args))\n }, [_createElementVNode(\"div\", {\n class: \"page-switcher-sheet\",\n role: \"menu\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"button\", {\n class: \"page-option is-current\",\n type: \"button\",\n role: \"menuitem\",\n \"aria-current\": \"page\",\n \"aria-expanded\": $data.isPageMenuOpen,\n onClick: _cache[0] || (_cache[0] = _withModifiers($event => $options.handlePageOptionClick($options.activePageOption.name), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.activePageOption.icon,\n class: \"page-option-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t($options.activePageOption.label)), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"page-switcher-arrow\"\n })], 8, _hoisted_2), _createElementVNode(\"div\", {\n class: \"page-option-list\",\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.clearHoveredPageOption && $options.clearHoveredPageOption(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"page-option-highlight\", {\n 'is-visible': $data.hoveredPageOptionIndex !== null\n }]),\n style: _normalizeStyle({\n '--hovered-option-index': $data.hoveredPageOptionIndex === null ? 0 : $data.hoveredPageOptionIndex\n }),\n \"aria-hidden\": \"true\"\n }, null, 6), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.inactivePageOptions, (option, index) => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: option.name,\n class: \"page-option\",\n type: \"button\",\n role: \"menuitem\",\n onMouseenter: $event => $options.setHoveredPageOption(index),\n onClick: _withModifiers($event => $options.handlePageOptionClick(option.name), [\"stop\"])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: option.icon,\n class: \"page-option-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(_ctx.$t(option.label)), 1)], 40, _hoisted_4);\n }), 128))], 32)])], 34), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\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 AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n data() {\n return {\n isPageMenuOpen: false,\n hoveredPageOptionIndex: null\n };\n },\n computed: {\n pageOptions() {\n return [{\n name: 'dashboard',\n icon: 'images',\n label: 'dashboardTabs.fileManagement'\n }, {\n name: 'customerConfig',\n icon: 'user-cog',\n label: 'dashboardTabs.userManagement'\n }, {\n name: 'systemConfig',\n icon: 'cogs',\n label: 'dashboardTabs.systemSettings'\n }, {\n name: '',\n icon: 'upload',\n label: 'dashboardTabs.fileUpload'\n }];\n },\n activePageOption() {\n return this.pageOptions.find(option => option.name === this.activeTab) || this.pageOptions[0];\n },\n inactivePageOptions() {\n return this.pageOptions.filter(option => option.name !== this.activePageOption.name);\n }\n },\n methods: {\n handleDocumentClick(event) {\n if (this.$el?.contains(event.target)) {\n return;\n }\n this.closePageMenu();\n },\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.closePageMenu();\n if (tab === this.activeTab) {\n this.refreshDashboard();\n return;\n }\n this.$router.push(`/${tab}`);\n },\n isTouchViewport() {\n return window.matchMedia('(hover: none), (pointer: coarse)').matches;\n },\n handlePageOptionClick(tab) {\n if (this.isTouchViewport() && !this.isPageMenuOpen && tab !== this.activeTab) {\n this.openPageMenu();\n return;\n }\n if (tab === this.activeTab) {\n if (this.isTouchViewport()) {\n this.togglePageMenu();\n } else {\n this.openPageMenu();\n }\n return;\n }\n this.handleTabClick(tab);\n },\n handlePageSwitcherEnter() {\n if (!this.isTouchViewport()) {\n this.openPageMenu();\n }\n },\n handlePageSwitcherLeave() {\n if (!this.isTouchViewport()) {\n this.closePageMenu();\n }\n },\n setHoveredPageOption(index) {\n this.hoveredPageOptionIndex = index;\n },\n clearHoveredPageOption() {\n this.hoveredPageOptionIndex = null;\n },\n openPageMenu() {\n this.isPageMenuOpen = true;\n },\n togglePageMenu() {\n this.isPageMenuOpen = !this.isPageMenuOpen;\n },\n closePageMenu() {\n this.isPageMenuOpen = false;\n this.clearHoveredPageOption();\n }\n },\n mounted() {\n document.addEventListener('click', this.handleDocumentClick);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=07e603fa&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=07e603fa&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-07e603fa\"]])\n\nexport default __exports__"],"names":["_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","class","onClick","args","toggleLocale","role","title","$t","icon","name","computed","isZh","this","$i18n","locale","methods","next","__exports__","isRedirecting","async","fetchWithAuth","url","options","credentials","headers","response","fetch","status","store","commit","router","push","finally","id","_hoisted_2","_hoisted_3","_hoisted_4","handleToggleClick","mode","default","isAuto","key","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","_hoisted_5","_component_AdminToggleDark","_component_LanguageSwitcher","isPageMenuOpen","onPointerdown","onMouseenter","handlePageSwitcherEnter","onMouseleave","handlePageSwitcherLeave","type","$event","handlePageOptionClick","activePageOption","label","clearHoveredPageOption","hoveredPageOptionIndex","inactivePageOptions","option","index","setHoveredPageOption","props","activeTab","String","components","AdminToggleDark","LanguageSwitcher","pageOptions","find","filter","handleDocumentClick","event","$el","contains","target","closePageMenu","refreshDashboard","location","reload","handleTabClick","tab","$router","isTouchViewport","window","matchMedia","matches","togglePageMenu","openPageMenu","mounted","document","addEventListener","beforeUnmount","removeEventListener"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/22.b436b08e.js.map.gz b/frontend-dist/js/22.b436b08e.js.map.gz new file mode 100644 index 00000000..2767820e Binary files /dev/null and b/frontend-dist/js/22.b436b08e.js.map.gz differ diff --git a/frontend-dist/js/22.f752503c.js b/frontend-dist/js/22.f752503c.js deleted file mode 100644 index 14d5bdc4..00000000 --- a/frontend-dist/js/22.f752503c.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[22],{213:function(e,n,t){t(85331),t(19104)},4318:function(){},10456:function(e,n,t){t(85331)},18785:function(e,n,t){t(85331)},19104:function(e,n,t){t(85331)},30694:function(e,n,t){t(85331)},38736:function(e,n,t){t(85331)},67819:function(e,n,t){t(85331)},70797:function(e,n,t){t.d(n,{A:function(){return s}});t(44114);var i=t(25507),a=t(16915);let o=!1;async function s(e,n={}){n.credentials="include",n.headers={...n.headers};const t=await fetch(e,n);return 401!==t.status||o||(o=!0,i.A.commit("setAdminLoggedIn",!1),a.A.push("/adminLogin").finally(()=>{o=!1})),t}},77128:function(e,n,t){t(85331),t(4318)},78450:function(e,n,t){t(85331)},85970:function(e,n,t){t(85331)},91570:function(e,n,t){t.d(n,{A:function(){return O}});var i=t(54047),a=t(56768),o=t(45130),s=t(24232);const l={id:"themeMaskAdmin"},r=["cx","cy","r"],c=["r"],u=["opacity"];function h(e,n,t,i,h,d){const g=(0,a.g2)("font-awesome-icon");return(0,a.uX)(),(0,a.CE)("div",{id:"themeToggle",onClick:n[0]||(n[0]=(...e)=>d.handleToggleClick&&d.handleToggleClick(...e))},[(0,a.bF)(o.eB,{name:"icon-fade",mode:"out-in"},{default:(0,a.k6)(()=>[h.isAuto?((0,a.uX)(),(0,a.Wv)(g,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.3em",color:"var(--admin-theme-toggle-color)"}})):((0,a.uX)(),(0,a.CE)("svg",{key:"sun-moon",class:(0,s.C4)(["theme_toggle_svg",{dark:h.isDark}]),width:"1.3em",height:"1.3em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,a.Lk)("mask",l,[n[1]||(n[1]=(0,a.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,a.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:h.isDark?"50%":"100%",cy:h.isDark?"23%":"0%",r:h.isDark?"9":"5"},null,8,r)]),(0,a.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:h.isDark?"9":"5",mask:"url(#themeMaskAdmin)"},null,8,c),(0,a.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:h.isDark?0:1},[...n[2]||(n[2]=[(0,a.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,a.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,a.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,a.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,a.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},g=t(71241);const p=(0,g.A)(d,[["render",h],["__scopeId","data-v-5c149ed5"]]);var k=p;const m={class:"tabs"},v=["aria-expanded"],P={class:"page-switcher-title"},b=["onMouseenter","onClick"],f={class:"page-switcher-title"};function y(e,n,t,l,r,c){const u=(0,a.g2)("font-awesome-icon"),h=k,d=i.A;return(0,a.uX)(),(0,a.CE)("div",m,[(0,a.Lk)("div",{class:(0,s.C4)(["page-switcher",{"is-open":r.isPageMenuOpen}]),role:"navigation",onClick:n[3]||(n[3]=(0,o.D$)(()=>{},["stop"])),onPointerdown:n[4]||(n[4]=(0,o.D$)(()=>{},["stop"])),onMouseenter:n[5]||(n[5]=(...e)=>c.handlePageSwitcherEnter&&c.handlePageSwitcherEnter(...e)),onMouseleave:n[6]||(n[6]=(...e)=>c.handlePageSwitcherLeave&&c.handlePageSwitcherLeave(...e))},[(0,a.Lk)("div",{class:"page-switcher-sheet",role:"menu",onClick:n[2]||(n[2]=(0,o.D$)(()=>{},["stop"]))},[(0,a.Lk)("button",{class:"page-option is-current",type:"button",role:"menuitem","aria-current":"page","aria-expanded":r.isPageMenuOpen,onClick:n[0]||(n[0]=(0,o.D$)(e=>c.handlePageOptionClick(c.activePageOption.name),["stop"]))},[(0,a.bF)(u,{icon:c.activePageOption.icon,class:"page-option-icon"},null,8,["icon"]),(0,a.Lk)("span",P,(0,s.v_)(e.$t(c.activePageOption.label)),1),(0,a.bF)(u,{icon:"chevron-down",class:"page-switcher-arrow"})],8,v),(0,a.Lk)("div",{class:"page-option-list",onMouseleave:n[1]||(n[1]=(...e)=>c.clearHoveredPageOption&&c.clearHoveredPageOption(...e))},[(0,a.Lk)("span",{class:(0,s.C4)(["page-option-highlight",{"is-visible":null!==r.hoveredPageOptionIndex}]),style:(0,s.Tr)({"--hovered-option-index":null===r.hoveredPageOptionIndex?0:r.hoveredPageOptionIndex}),"aria-hidden":"true"},null,6),((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(c.inactivePageOptions,(n,t)=>((0,a.uX)(),(0,a.CE)("button",{key:n.name,class:"page-option",type:"button",role:"menuitem",onMouseenter:e=>c.setHoveredPageOption(t),onClick:(0,o.D$)(e=>c.handlePageOptionClick(n.name),["stop"])},[(0,a.bF)(u,{icon:n.icon,class:"page-option-icon"},null,8,["icon"]),(0,a.Lk)("span",f,(0,s.v_)(e.$t(n.label)),1)],40,b))),128))],32)])],34),(0,a.bF)(h),(0,a.bF)(d,{class:"tabs-language-switcher"})])}t(44114),t(18111),t(22489),t(20116);var M={name:"DashboardTabs",props:{activeTab:{type:String,default:"dashboard"}},components:{AdminToggleDark:k,LanguageSwitcher:i.A},data(){return{isPageMenuOpen:!1,hoveredPageOptionIndex:null}},computed:{pageOptions(){return[{name:"dashboard",icon:"images",label:"dashboardTabs.fileManagement"},{name:"customerConfig",icon:"user-cog",label:"dashboardTabs.userManagement"},{name:"systemConfig",icon:"cogs",label:"dashboardTabs.systemSettings"},{name:"",icon:"upload",label:"dashboardTabs.fileUpload"}]},activePageOption(){return this.pageOptions.find(e=>e.name===this.activeTab)||this.pageOptions[0]},inactivePageOptions(){return this.pageOptions.filter(e=>e.name!==this.activePageOption.name)}},methods:{handleDocumentClick(e){this.$el?.contains(e.target)||this.closePageMenu()},refreshDashboard(){location.reload()},handleTabClick(e){this.closePageMenu(),e!==this.activeTab?this.$router.push(`/${e}`):this.refreshDashboard()},isTouchViewport(){return window.matchMedia("(hover: none), (pointer: coarse)").matches},handlePageOptionClick(e){!this.isTouchViewport()||this.isPageMenuOpen||e===this.activeTab?e!==this.activeTab?this.handleTabClick(e):this.isTouchViewport()?this.togglePageMenu():this.openPageMenu():this.openPageMenu()},handlePageSwitcherEnter(){this.isTouchViewport()||this.openPageMenu()},handlePageSwitcherLeave(){this.isTouchViewport()||this.closePageMenu()},setHoveredPageOption(e){this.hoveredPageOptionIndex=e},clearHoveredPageOption(){this.hoveredPageOptionIndex=null},openPageMenu(){this.isPageMenuOpen=!0},togglePageMenu(){this.isPageMenuOpen=!this.isPageMenuOpen},closePageMenu(){this.isPageMenuOpen=!1,this.clearHoveredPageOption()}},mounted(){document.addEventListener("click",this.handleDocumentClick)},beforeUnmount(){document.removeEventListener("click",this.handleDocumentClick)}};const C=(0,g.A)(M,[["render",y],["__scopeId","data-v-07e603fa"]]);var O=C},96808:function(e,n,t){t(85331),t(18785),t(67819),t(85970),t(19104)}}]); -//# sourceMappingURL=22.f752503c.js.map \ No newline at end of file diff --git a/frontend-dist/js/22.f752503c.js.gz b/frontend-dist/js/22.f752503c.js.gz deleted file mode 100644 index 05425535..00000000 Binary files a/frontend-dist/js/22.f752503c.js.gz and /dev/null differ diff --git a/frontend-dist/js/22.f752503c.js.map b/frontend-dist/js/22.f752503c.js.map deleted file mode 100644 index b8aac67b..00000000 --- a/frontend-dist/js/22.f752503c.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/22.f752503c.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?bba2","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue","webpack://sanyue_imghub/./src/components/dashboard/AdminToggleDark.vue?7379","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?96f9","webpack://sanyue_imghub/./src/components/DashboardTabs.vue","webpack://sanyue_imghub/./src/components/DashboardTabs.vue?1414"],"sourcesContent":["import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMaskAdmin\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.3em\",\n height: \"1.3em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMaskAdmin)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.3em\",\n \"color\": \"var(--admin-theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./AdminToggleDark.vue?vue&type=template&id=5c149ed5&scoped=true\"\nimport script from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./AdminToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./AdminToggleDark.vue?vue&type=style&index=0&id=5c149ed5&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c149ed5\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"tabs\"\n};\nconst _hoisted_2 = [\"aria-expanded\"];\nconst _hoisted_3 = {\n class: \"page-switcher-title\"\n};\nconst _hoisted_4 = [\"onMouseenter\", \"onClick\"];\nconst _hoisted_5 = {\n class: \"page-switcher-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_AdminToggleDark = _resolveComponent(\"AdminToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"page-switcher\", {\n 'is-open': $data.isPageMenuOpen\n }]),\n role: \"navigation\",\n onClick: _cache[3] || (_cache[3] = _withModifiers(() => {}, [\"stop\"])),\n onPointerdown: _cache[4] || (_cache[4] = _withModifiers(() => {}, [\"stop\"])),\n onMouseenter: _cache[5] || (_cache[5] = (...args) => $options.handlePageSwitcherEnter && $options.handlePageSwitcherEnter(...args)),\n onMouseleave: _cache[6] || (_cache[6] = (...args) => $options.handlePageSwitcherLeave && $options.handlePageSwitcherLeave(...args))\n }, [_createElementVNode(\"div\", {\n class: \"page-switcher-sheet\",\n role: \"menu\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"button\", {\n class: \"page-option is-current\",\n type: \"button\",\n role: \"menuitem\",\n \"aria-current\": \"page\",\n \"aria-expanded\": $data.isPageMenuOpen,\n onClick: _cache[0] || (_cache[0] = _withModifiers($event => $options.handlePageOptionClick($options.activePageOption.name), [\"stop\"]))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $options.activePageOption.icon,\n class: \"page-option-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t($options.activePageOption.label)), 1), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"page-switcher-arrow\"\n })], 8, _hoisted_2), _createElementVNode(\"div\", {\n class: \"page-option-list\",\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.clearHoveredPageOption && $options.clearHoveredPageOption(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"page-option-highlight\", {\n 'is-visible': $data.hoveredPageOptionIndex !== null\n }]),\n style: _normalizeStyle({\n '--hovered-option-index': $data.hoveredPageOptionIndex === null ? 0 : $data.hoveredPageOptionIndex\n }),\n \"aria-hidden\": \"true\"\n }, null, 6), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.inactivePageOptions, (option, index) => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: option.name,\n class: \"page-option\",\n type: \"button\",\n role: \"menuitem\",\n onMouseenter: $event => $options.setHoveredPageOption(index),\n onClick: _withModifiers($event => $options.handlePageOptionClick(option.name), [\"stop\"])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: option.icon,\n class: \"page-option-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(_ctx.$t(option.label)), 1)], 40, _hoisted_4);\n }), 128))], 32)])], 34), _createVNode(_component_AdminToggleDark), _createVNode(_component_LanguageSwitcher, {\n class: \"tabs-language-switcher\"\n })]);\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 AdminToggleDark from './dashboard/AdminToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nexport default {\n name: 'DashboardTabs',\n props: {\n activeTab: {\n type: String,\n default: 'dashboard'\n }\n },\n components: {\n AdminToggleDark,\n LanguageSwitcher\n },\n data() {\n return {\n isPageMenuOpen: false,\n hoveredPageOptionIndex: null\n };\n },\n computed: {\n pageOptions() {\n return [{\n name: 'dashboard',\n icon: 'images',\n label: 'dashboardTabs.fileManagement'\n }, {\n name: 'customerConfig',\n icon: 'user-cog',\n label: 'dashboardTabs.userManagement'\n }, {\n name: 'systemConfig',\n icon: 'cogs',\n label: 'dashboardTabs.systemSettings'\n }, {\n name: '',\n icon: 'upload',\n label: 'dashboardTabs.fileUpload'\n }];\n },\n activePageOption() {\n return this.pageOptions.find(option => option.name === this.activeTab) || this.pageOptions[0];\n },\n inactivePageOptions() {\n return this.pageOptions.filter(option => option.name !== this.activePageOption.name);\n }\n },\n methods: {\n handleDocumentClick(event) {\n if (this.$el?.contains(event.target)) {\n return;\n }\n this.closePageMenu();\n },\n refreshDashboard() {\n location.reload();\n },\n handleTabClick(tab) {\n this.closePageMenu();\n if (tab === this.activeTab) {\n this.refreshDashboard();\n return;\n }\n this.$router.push(`/${tab}`);\n },\n isTouchViewport() {\n return window.matchMedia('(hover: none), (pointer: coarse)').matches;\n },\n handlePageOptionClick(tab) {\n if (this.isTouchViewport() && !this.isPageMenuOpen && tab !== this.activeTab) {\n this.openPageMenu();\n return;\n }\n if (tab === this.activeTab) {\n if (this.isTouchViewport()) {\n this.togglePageMenu();\n } else {\n this.openPageMenu();\n }\n return;\n }\n this.handleTabClick(tab);\n },\n handlePageSwitcherEnter() {\n if (!this.isTouchViewport()) {\n this.openPageMenu();\n }\n },\n handlePageSwitcherLeave() {\n if (!this.isTouchViewport()) {\n this.closePageMenu();\n }\n },\n setHoveredPageOption(index) {\n this.hoveredPageOptionIndex = index;\n },\n clearHoveredPageOption() {\n this.hoveredPageOptionIndex = null;\n },\n openPageMenu() {\n this.isPageMenuOpen = true;\n },\n togglePageMenu() {\n this.isPageMenuOpen = !this.isPageMenuOpen;\n },\n closePageMenu() {\n this.isPageMenuOpen = false;\n this.clearHoveredPageOption();\n }\n },\n mounted() {\n document.addEventListener('click', this.handleDocumentClick);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DashboardTabs.vue?vue&type=template&id=07e603fa&scoped=true\"\nimport script from \"./DashboardTabs.vue?vue&type=script&lang=js\"\nexport * from \"./DashboardTabs.vue?vue&type=script&lang=js\"\n\nimport \"./DashboardTabs.vue?vue&type=style&index=0&id=07e603fa&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-07e603fa\"]])\n\nexport default __exports__"],"names":["isRedirecting","async","fetchWithAuth","url","options","credentials","headers","response","fetch","status","store","commit","router","push","finally","_hoisted_1","id","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","onClick","args","handleToggleClick","name","mode","default","isAuto","key","icon","class","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","this","$store","getters","useDarkMode","cusDarkMode","methods","__exports__","_hoisted_5","_component_AdminToggleDark","_component_LanguageSwitcher","isPageMenuOpen","role","onPointerdown","onMouseenter","handlePageSwitcherEnter","onMouseleave","handlePageSwitcherLeave","type","$event","handlePageOptionClick","activePageOption","$t","label","clearHoveredPageOption","hoveredPageOptionIndex","inactivePageOptions","option","index","setHoveredPageOption","props","activeTab","String","components","AdminToggleDark","LanguageSwitcher","computed","pageOptions","find","filter","handleDocumentClick","event","$el","contains","target","closePageMenu","refreshDashboard","location","reload","handleTabClick","tab","$router","isTouchViewport","window","matchMedia","matches","togglePageMenu","openPageMenu","mounted","document","addEventListener","beforeUnmount","removeEventListener"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/22.f752503c.js.map.gz b/frontend-dist/js/22.f752503c.js.map.gz deleted file mode 100644 index 60a314d3..00000000 Binary files a/frontend-dist/js/22.f752503c.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/231.f4621e12.js b/frontend-dist/js/231.f4621e12.js new file mode 100644 index 00000000..63312e7e --- /dev/null +++ b/frontend-dist/js/231.f4621e12.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[231],{36967:function(e,a,s){s.r(a),s.d(a,{default:function(){return B}});var t=s(80047),i=(s(85331),s(99648),s(56768)),o=s(24232);const n={class:"whitelist-container"},l=["innerHTML"],c={class:"whitelist-content"},d={class:"back-button-wrapper"},r={class:"status-animation"},h={class:"status-icon"},u={class:"status-badge"},k={class:"status-info"},v={class:"status-title"},p={class:"status-description"},g={class:"status-actions"},b={class:"help-info"},m={class:"help-text"},f={class:"quick-links"};function w(e,a,s,w,L,C){const F=(0,i.g2)("font-awesome-icon"),_=t.S2;return(0,i.uX)(),(0,i.CE)("div",n,[(0,i.Lk)("div",{class:"background-wrapper",innerHTML:e.backgroundImagesTemplate},null,8,l),(0,i.Lk)("div",c,[(0,i.Lk)("div",d,[(0,i.bF)(_,{class:"back-button",onClick:C.goHome,circle:"",size:"large"},{default:(0,i.k6)(()=>[(0,i.bF)(F,{icon:"home"})]),_:1},8,["onClick"])]),(0,i.Lk)("div",r,[(0,i.Lk)("div",h,[(0,i.bF)(F,{icon:"shield-alt",class:"shield-icon"}),(0,i.Lk)("div",u,[(0,i.bF)(F,{icon:"clock",class:"clock-icon"})])])]),(0,i.Lk)("div",k,[(0,i.Lk)("h1",v,(0,o.v_)(e.$t("whitelist.title")),1),(0,i.Lk)("p",p,(0,o.v_)(e.$t("whitelist.description")),1),(0,i.Lk)("div",g,[(0,i.bF)(_,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:C.goHome},{default:(0,i.k6)(()=>[(0,i.bF)(F,{icon:"home",class:"btn-icon"}),(0,i.eW)(" "+(0,o.v_)(e.$t("whitelist.goHome")),1)]),_:1},8,["onClick"]),(0,i.bF)(_,{size:"large",class:"action-btn secondary-btn",onClick:C.goBack},{default:(0,i.k6)(()=>[(0,i.bF)(F,{icon:"arrow-left",class:"btn-icon"}),(0,i.eW)(" "+(0,o.v_)(e.$t("whitelist.goBack")),1)]),_:1},8,["onClick"])]),(0,i.Lk)("div",b,[(0,i.Lk)("p",m,(0,o.v_)(e.$t("whitelist.helpText")),1),(0,i.Lk)("div",f,[(0,i.Lk)("a",{href:"javascript:void(0)",onClick:a[0]||(a[0]=(...e)=>C.goHome&&C.goHome(...e)),class:"quick-link"},[(0,i.bF)(F,{icon:"cloud-upload-alt"}),(0,i.eW)(" "+(0,o.v_)(e.$t("whitelist.uploadImage")),1)]),(0,i.Lk)("a",{href:"javascript:void(0)",onClick:a[1]||(a[1]=(...e)=>C.refreshPage&&C.refreshPage(...e)),class:"quick-link"},[(0,i.bF)(F,{icon:"redo"}),(0,i.eW)(" "+(0,o.v_)(e.$t("whitelist.refreshPage")),1)])])]),a[2]||(a[2]=(0,i.Lk)("div",{class:"powered-by"},[(0,i.Lk)("p",null,[(0,i.eW)("Powered By: "),(0,i.Lk)("a",{href:"https://github.com/MarSeventh/CloudFlare-ImgBed",class:"project-link"}," CloudFlare-ImgBed ")])],-1))])]),a[3]||(a[3]=(0,i.Fv)('
',1))])}s(44114);var L=s(74354),C=s(60782),F=s(48903),_={name:"WhiteListOn",mixins:[F.A],computed:{...(0,C.L8)(["useDarkMode","userConfig"])},setup(){(0,L.u)({title:"White List On",meta:[{name:"robots",content:"noindex, nofollow"},{name:"viewport",content:"width=device-width, initial-scale=1"},{charset:"UTF-8"}]})},mounted(){this.initializeBackground("uploadBkImg",".whitelist-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},refreshPage(){window.location.reload()}}},$=s(71241);const y=(0,$.A)(_,[["render",w],["__scopeId","data-v-69dd74ea"]]);var B=y}}]); +//# sourceMappingURL=231.f4621e12.js.map \ No newline at end of file diff --git a/frontend-dist/js/231.f4621e12.js.gz b/frontend-dist/js/231.f4621e12.js.gz new file mode 100644 index 00000000..9d9976ea Binary files /dev/null and b/frontend-dist/js/231.f4621e12.js.gz differ diff --git a/frontend-dist/js/231.f4621e12.js.map b/frontend-dist/js/231.f4621e12.js.map new file mode 100644 index 00000000..5c3976e1 --- /dev/null +++ b/frontend-dist/js/231.f4621e12.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/231.f4621e12.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/WhiteListOn.vue?9be1","webpack://sanyue_imghub/./src/views/WhiteListOn.vue","webpack://sanyue_imghub/./src/views/WhiteListOn.vue?05e5"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"whitelist-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"whitelist-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-title\"\n};\nconst _hoisted_10 = {\n class: \"status-description\"\n};\nconst _hoisted_11 = {\n class: \"status-actions\"\n};\nconst _hoisted_12 = {\n class: \"help-info\"\n};\nconst _hoisted_13 = {\n class: \"help-text\"\n};\nconst _hoisted_14 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n class: \"shield-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\",\n class: \"clock-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h1\", _hoisted_9, _toDisplayString(_ctx.$t('whitelist.title')), 1), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('whitelist.description')), 1), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goHome')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goBack')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"p\", _hoisted_13, _toDisplayString(_ctx.$t('whitelist.helpText')), 1), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.uploadImage')), 1)]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.refreshPage')), 1)])])]), _cache[2] || (_cache[2] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[3] || (_cache[3] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'WhiteListOn',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'White List On',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.whitelist-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./WhiteListOn.vue?vue&type=template&id=69dd74ea&scoped=true\"\nimport script from \"./WhiteListOn.vue?vue&type=script&lang=js\"\nexport * from \"./WhiteListOn.vue?vue&type=script&lang=js\"\n\nimport \"./WhiteListOn.vue?vue&type=style&index=0&id=69dd74ea&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-69dd74ea\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","$t","type","goBack","href","args","refreshPage","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/231.f4621e12.js.map.gz b/frontend-dist/js/231.f4621e12.js.map.gz new file mode 100644 index 00000000..919eef4e Binary files /dev/null and b/frontend-dist/js/231.f4621e12.js.map.gz differ diff --git a/frontend-dist/js/278.740dc6f4.js b/frontend-dist/js/278.740dc6f4.js deleted file mode 100644 index a1e2e1a3..00000000 --- a/frontend-dist/js/278.740dc6f4.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[278],{7835:function(e,t,a){e.exports=a.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,a){e.exports=a.p+"img/background.de27f549.jpg"},18278:function(e,t,a){a.r(t),a.d(t,{default:function(){return P}});var n=a(80047),s=(a(85331),a(99648),a(56768)),i=a(24232);const o={class:"whitelist-container"},r=["innerHTML"],l={class:"whitelist-content"},c={class:"back-button-wrapper"},u={class:"status-animation"},d={class:"status-icon"},g={class:"status-badge"},m={class:"status-info"},h={class:"status-title"},p={class:"status-description"},k={class:"status-actions"},b={class:"help-info"},y={class:"help-text"},f={class:"quick-links"};function v(e,t,a,v,I,B){const w=(0,s.g2)("font-awesome-icon"),C=n.S2;return(0,s.uX)(),(0,s.CE)("div",o,[(0,s.Lk)("div",{class:"background-wrapper",innerHTML:e.backgroundImagesTemplate},null,8,r),(0,s.Lk)("div",l,[(0,s.Lk)("div",c,[(0,s.bF)(C,{class:"back-button",onClick:B.goHome,circle:"",size:"large"},{default:(0,s.k6)(()=>[(0,s.bF)(w,{icon:"home"})]),_:1},8,["onClick"])]),(0,s.Lk)("div",u,[(0,s.Lk)("div",d,[(0,s.bF)(w,{icon:"shield-alt",class:"shield-icon"}),(0,s.Lk)("div",g,[(0,s.bF)(w,{icon:"clock",class:"clock-icon"})])])]),(0,s.Lk)("div",m,[(0,s.Lk)("h1",h,(0,i.v_)(e.$t("whitelist.title")),1),(0,s.Lk)("p",p,(0,i.v_)(e.$t("whitelist.description")),1),(0,s.Lk)("div",k,[(0,s.bF)(C,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:B.goHome},{default:(0,s.k6)(()=>[(0,s.bF)(w,{icon:"home",class:"btn-icon"}),(0,s.eW)(" "+(0,i.v_)(e.$t("whitelist.goHome")),1)]),_:1},8,["onClick"]),(0,s.bF)(C,{size:"large",class:"action-btn secondary-btn",onClick:B.goBack},{default:(0,s.k6)(()=>[(0,s.bF)(w,{icon:"arrow-left",class:"btn-icon"}),(0,s.eW)(" "+(0,i.v_)(e.$t("whitelist.goBack")),1)]),_:1},8,["onClick"])]),(0,s.Lk)("div",b,[(0,s.Lk)("p",y,(0,i.v_)(e.$t("whitelist.helpText")),1),(0,s.Lk)("div",f,[(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[0]||(t[0]=(...e)=>B.goHome&&B.goHome(...e)),class:"quick-link"},[(0,s.bF)(w,{icon:"cloud-upload-alt"}),(0,s.eW)(" "+(0,i.v_)(e.$t("whitelist.uploadImage")),1)]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[1]||(t[1]=(...e)=>B.refreshPage&&B.refreshPage(...e)),class:"quick-link"},[(0,s.bF)(w,{icon:"redo"}),(0,s.eW)(" "+(0,i.v_)(e.$t("whitelist.refreshPage")),1)])])]),t[2]||(t[2]=(0,s.Lk)("div",{class:"powered-by"},[(0,s.Lk)("p",null,[(0,s.eW)("Powered By: "),(0,s.Lk)("a",{href:"https://github.com/MarSeventh/CloudFlare-ImgBed",class:"project-link"}," CloudFlare-ImgBed ")])],-1))])]),t[3]||(t[3]=(0,s.Fv)('
',1))])}a(44114);var I=a(74354),B=a(60782),w=a(48903),C={name:"WhiteListOn",mixins:[w.A],computed:{...(0,B.L8)(["useDarkMode","userConfig"])},setup(){(0,I.u)({title:"White List On",meta:[{name:"robots",content:"noindex, nofollow"},{name:"viewport",content:"width=device-width, initial-scale=1"},{charset:"UTF-8"}]})},mounted(){this.initializeBackground("uploadBkImg",".whitelist-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},refreshPage(){window.location.reload()}}},W=a(71241);const x=(0,W.A)(C,[["render",v],["__scopeId","data-v-0c389049"]]);var P=x},48903:function(e,t,a){var n=a(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,n.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const a=document.createElement("img");a.id="bg2",a.className="background-image2",a.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(a,e.firstChild)},initializeBackground(e,t=".login",a=!1,n=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:a,autoCreateElements:n};const s=document.querySelector(t);this.prepareBackgroundContainer(s),n&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),o=document.getElementById("bg2");if(!i||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):a&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,a){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,a,!0),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,a,n){this.loadBackgroundImage(e,a[this.customWallPaperIndex],n,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,a){this.loadBackgroundImage(e,t,a)},setupDefaultWallpaper(e,t){const n=this.useDarkMode,s=a(n?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,a,n=!1){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,n);const s=document.querySelector(a);this.prepareBackgroundContainer(s);const i=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity,n&&(e.style.transform="scale(1.045)")})})},o=new Image;o.onload=()=>{e.src=t,i()},o.onerror=()=>{e.src=t,i()},o.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const a=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${a}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,n=a?e:t,s=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;n.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0);const o=new Image;o.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",setTimeout(()=>{n.style.opacity=0,this.prepareBackgroundMotion(n,!0)},1200)},50)},o.src=i},switchCustomWallpaper(e,t,a){const n=0!=e.style.opacity,s=n?e:t,i=n?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%a.length;const o=a[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1,this.prepareBackgroundMotion(i,!0);const r=new Image;r.onload=()=>{i.src=o,setTimeout(()=>{i.style.opacity=this.bkOpacity,i.style.transform="scale(1.045)",setTimeout(()=>{s.style.opacity=0,this.prepareBackgroundMotion(s,!0)},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),a=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),a&&(a.style.transition="none",a.style.opacity=0,a.removeAttribute("src"),setTimeout(()=>{a&&(a.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&t.removeAttribute("src")},1200)),a&&(a.style.opacity=0,setTimeout(()=>{a&&a.removeAttribute("src")},1200)))},smoothThemeTransition(e,t=".login",n=!1,s=!1){const i=this.userConfig?.[e];if(!n||void 0!==i)return void this.reinitializeBackground(e,t,n,s);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,n,s);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,u=this.useDarkMode,d=a(u?10732:7835),g=new Image;g.onload=()=>{c.src=d,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,n,s)},g.src=d},reinitializeBackground(e,t=".login",a=!1,n=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,a,n)},100)}}}}}]); -//# sourceMappingURL=278.740dc6f4.js.map \ No newline at end of file diff --git a/frontend-dist/js/278.740dc6f4.js.gz b/frontend-dist/js/278.740dc6f4.js.gz deleted file mode 100644 index 5e113ea6..00000000 Binary files a/frontend-dist/js/278.740dc6f4.js.gz and /dev/null differ diff --git a/frontend-dist/js/278.740dc6f4.js.map b/frontend-dist/js/278.740dc6f4.js.map deleted file mode 100644 index 9c3a1532..00000000 --- a/frontend-dist/js/278.740dc6f4.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/278.740dc6f4.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/WhiteListOn.vue?4bb2","webpack://sanyue_imghub/./src/views/WhiteListOn.vue","webpack://sanyue_imghub/./src/views/WhiteListOn.vue?05e5","webpack://sanyue_imghub/./src/mixins/backgroundManager.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"whitelist-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"whitelist-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-title\"\n};\nconst _hoisted_10 = {\n class: \"status-description\"\n};\nconst _hoisted_11 = {\n class: \"status-actions\"\n};\nconst _hoisted_12 = {\n class: \"help-info\"\n};\nconst _hoisted_13 = {\n class: \"help-text\"\n};\nconst _hoisted_14 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"shield-alt\",\n class: \"shield-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\",\n class: \"clock-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"h1\", _hoisted_9, _toDisplayString(_ctx.$t('whitelist.title')), 1), _createElementVNode(\"p\", _hoisted_10, _toDisplayString(_ctx.$t('whitelist.description')), 1), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goHome')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.goBack')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"p\", _hoisted_13, _toDisplayString(_ctx.$t('whitelist.helpText')), 1), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.uploadImage')), 1)]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('whitelist.refreshPage')), 1)])])]), _cache[2] || (_cache[2] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[3] || (_cache[3] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'WhiteListOn',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'White List On',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.whitelist-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./WhiteListOn.vue?vue&type=template&id=0c389049&scoped=true\"\nimport script from \"./WhiteListOn.vue?vue&type=script&lang=js\"\nexport * from \"./WhiteListOn.vue?vue&type=script&lang=js\"\n\nimport \"./WhiteListOn.vue?vue&type=style&index=0&id=0c389049&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-0c389049\"]])\n\nexport default __exports__","/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\r\n }\r\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n if (enableZoom) {\r\n imgElement.style.transform = 'scale(1.045)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.removeAttribute('src')\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.removeAttribute('src')\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","$t","type","goBack","href","args","refreshPage","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","__exports__","data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","userConfig","bkOpacity","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","opacity","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","preload","Image","onload","src","onerror","zoomDuration","Math","max","transition","transformOrigin","computedStyle","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","immediate","removeAttribute","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/278.740dc6f4.js.map.gz b/frontend-dist/js/278.740dc6f4.js.map.gz deleted file mode 100644 index b672bbab..00000000 Binary files a/frontend-dist/js/278.740dc6f4.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/293.4c283028.js b/frontend-dist/js/293.24979b69.js similarity index 67% rename from frontend-dist/js/293.4c283028.js rename to frontend-dist/js/293.24979b69.js index ee324fd7..d8a8782b 100644 --- a/frontend-dist/js/293.4c283028.js +++ b/frontend-dist/js/293.24979b69.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[293],{732:function(e,t,i){i.d(t,{A:function(){return h}});var o=i(56768),s=i(24232);const n=["href","target"],l=["alt","src"];function r(e,t,i,r,a,u){return(0,o.uX)(),(0,o.CE)("a",{href:u.logoHref,target:i.target,class:(0,s.C4)(e.logo-e.link)},[(0,o.Lk)("img",{class:(0,s.C4)(u.logoClasses),alt:i.alt,src:u.logoUrl},null,10,l)],10,n)}var a=i(60782),u={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,a.L8)(["userConfig"]),logoUrl(){return this.customSrc||this.userConfig?.logoUrl||i(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=i(71241);const d=(0,c.A)(u,[["render",r],["__scopeId","data-v-17f54292"]]);var h=d},808:function(e,t,i){i.d(t,{A:function(){return p}});var o=i(56768),s=i(45130),n=i(24232);const l={id:"themeMask"},r=["cx","cy","r"],a=["r"],u=["opacity"];function c(e,t,i,c,d,h){const g=(0,o.g2)("font-awesome-icon");return(0,o.uX)(),(0,o.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>h.handleToggleClick&&h.handleToggleClick(...e))},[(0,o.bF)(s.eB,{name:"icon-fade",mode:"out-in"},{default:(0,o.k6)(()=>[d.isAuto?((0,o.uX)(),(0,o.Wv)(g,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,o.uX)(),(0,o.CE)("svg",{key:"sun-moon",class:(0,n.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,o.Lk)("mask",l,[t[1]||(t[1]=(0,o.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,o.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,r)]),(0,o.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMask)"},null,8,a),(0,o.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,o.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,o.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,o.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},h=i(71241);const g=(0,h.A)(d,[["render",c],["__scopeId","data-v-c93807da"]]);var p=g},25293:function(e,t,i){i.d(t,{A:function(){return C}});var o=i(86975),s=i(80047),n=(i(85331),i(99648),i(39623)),l=(i(29092),i(813)),r=(i(34896),i(732)),a=i(54047),u=i(808),c=i(56768),d=i(24232),h=i(45130);const g={class:"login-container"},p={class:"login-title",tabindex:"0"},f={class:"input-wrapper"},k={key:0,class:"loading-ring"},m={key:1};function y(e,t,i,y,v,w){const b=u.A,L=a.A,_=r.A,C=l.tk,x=n.WK,D=s.S2,S=o.A;return(0,c.uX)(),(0,c.CE)("div",{class:"login",style:(0,d.Tr)(w.viewportStyle)},[(0,c.bF)(b,{class:"toggle-dark"}),(0,c.bF)(L,{class:"language-switcher"}),(0,c.bF)(_),(0,c.Lk)("div",g,[(0,c.Lk)("h1",p,(0,d.v_)(i.title),1),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(i.fields,(e,t)=>((0,c.uX)(),(0,c.CE)("div",{key:e.key,class:"input-container"},[(0,c.Lk)("label",{class:"input-name",ref_for:!0,ref:`inputLabel${t}`,style:(0,d.Tr)({"--underline-width":v.labelUnderlineWidths[t]+"px"})},(0,d.v_)(e.label),5),(0,c.Lk)("div",f,[(0,c.bF)(x,{modelValue:v.formData[e.key],"onUpdate:modelValue":t=>v.formData[e.key]=t,placeholder:e.placeholder,type:e.type||"text","show-password":e.showPassword,class:"password-input",onKeyup:(0,h.jR)(w.handleSubmit,["enter","native"]),onFocus:w.handleInputFocus,onBlur:w.handleInputBlur},(0,c.eX)({_:2},[e.icon?{name:"prefix",fn:(0,c.k6)(()=>[(0,c.bF)(C,{class:"el-input__icon"},{default:(0,c.k6)(()=>[((0,c.uX)(),(0,c.Wv)((0,c.$y)(e.icon)))]),_:2},1024)]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","placeholder","type","show-password","onKeyup","onFocus","onBlur"])])]))),128)),(0,c.bF)(D,{class:(0,d.C4)(["submit",{"is-loading":i.loading}]),type:"primary",onClick:w.handleSubmit,disabled:i.loading},{default:(0,c.k6)(()=>[i.loading?((0,c.uX)(),(0,c.CE)("div",k)):((0,c.uX)(),(0,c.CE)("span",m,(0,d.v_)(w.computedSubmitText),1))]),_:1},8,["class","onClick","disabled"])]),(0,c.bF)(S,{class:"footer"})],4)}i(18111),i(7588);var v=i(60782),w=i(48903),b={name:"BaseLogin",mixins:[w.A],props:{title:{type:String,required:!0},fields:{type:Array,required:!0},submitText:{type:String,default:""},backgroundKey:{type:String,required:!0},isAdmin:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},data(){return{formData:{},labelUnderlineWidths:[],isFocused:!1,viewportHeight:0}},computed:{...(0,v.L8)(["userConfig"]),computedSubmitText(){return this.submitText||this.$t("login.submit")},viewportStyle(){return this.viewportHeight>0?{height:`${this.viewportHeight}px`,minHeight:`${this.viewportHeight}px`}:{}}},watch:{fields:{handler(){this.$nextTick(()=>{this.calculateLabelWidths()})},deep:!0}},components:{Footer:o.A,ToggleDark:u.A,LanguageSwitcher:a.A,Logo:r.A},mounted(){this.initFormData(),this.initializeBackground(this.backgroundKey,".login",!this.isAdmin,!0),this.$nextTick(()=>{this.calculateLabelWidths()}),this._handleViewportResize=this.handleViewportResize.bind(this),window.visualViewport&&(this._initialHeight=window.visualViewport.height,window.visualViewport.addEventListener("resize",this._handleViewportResize))},beforeDestroy(){window.visualViewport&&this._handleViewportResize&&window.visualViewport.removeEventListener("resize",this._handleViewportResize)},methods:{initFormData(){const e={};this.fields.forEach(t=>{e[t.key]=""}),this.formData=e,this.labelUnderlineWidths=new Array(this.fields.length).fill(0)},calculateLabelWidths(){this.$nextTick(()=>{this.fields.forEach((e,t)=>{const i=this.$refs[`inputLabel${t}`];if(i&&i[0]){const o=document.createElement("canvas"),s=o.getContext("2d"),n=i[0],l=window.getComputedStyle(n);s.font=`${l.fontWeight} ${l.fontSize} ${l.fontFamily}`;const r=s.measureText(e.label).width;this.labelUnderlineWidths[t]=Math.ceil(r)+3}})})},handleSubmit(){this.loading||this.$emit("submit",{...this.formData})},handleViewportResize(){if(!window.visualViewport)return;const e=window.visualViewport.height,t=this._initialHeight-e,i=150;this.viewportHeight=t>i?e:0},handleInputFocus(e){this.isFocused=!0;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.add("focused")}},handleInputBlur(e){this.isFocused=!1;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.remove("focused")}}}},L=i(71241);const _=(0,L.A)(b,[["render",y],["__scopeId","data-v-5b07fe04"]]);var C=_},33153:function(e,t,i){e.exports=i.p+"img/logo.e8dbfa27.png"},34896:function(e,t,i){i(85331)},86975:function(e,t,i){i.d(t,{A:function(){return h}});var o=i(56768),s=i(24232);const n={key:0,class:"page-footer"},l=["href"];function r(e,t,i,r,a,u){const c=(0,o.g2)("font-awesome-icon");return u.disableFooter?(0,o.Q3)("",!0):((0,o.uX)(),(0,o.CE)("div",n,[(0,o.Lk)("p",null,[(0,o.eW)("© 2024-"+(0,s.v_)(u.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,o.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,o.eW)(" for You! ",-1)),(0,o.Lk)("a",{href:u.footerLink,target:"_blank"},[(0,o.bF)(c,{icon:"paper-plane",class:"footer-link-icon"})],8,l)])]))}var a=i(60782),u={name:"Footer",computed:{...(0,a.L8)(["userConfig"]),footerLink(){return this.userConfig?.footerLink||"https://github.com/MarSeventh"},thisYear(){return(new Date).getFullYear()},disableFooter(){return this.userConfig?.disableFooter||!1}}},c=i(71241);const d=(0,c.A)(u,[["render",r],["__scopeId","data-v-08acbaa9"]]);var h=d}}]); -//# sourceMappingURL=293.4c283028.js.map \ No newline at end of file +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[293],{732:function(e,t,i){i.d(t,{A:function(){return h}});var o=i(56768),s=i(24232);const n=["href","target"],a=["alt","src"];function l(e,t,i,l,r,u){return(0,o.uX)(),(0,o.CE)("a",{href:u.logoHref,target:i.target,class:(0,s.C4)(e.logo-e.link)},[(0,o.Lk)("img",{class:(0,s.C4)(u.logoClasses),alt:i.alt,src:u.logoUrl},null,10,a)],10,n)}var r=i(60782),u={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||i(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=i(71241);const d=(0,c.A)(u,[["render",l],["__scopeId","data-v-17f54292"]]);var h=d},808:function(e,t,i){i.d(t,{A:function(){return p}});var o=i(56768),s=i(45130),n=i(24232);const a={id:"themeMask"},l=["cx","cy","r"],r=["r"],u=["opacity"];function c(e,t,i,c,d,h){const g=(0,o.g2)("font-awesome-icon");return(0,o.uX)(),(0,o.CE)("div",{id:"themeToggle",onClick:t[0]||(t[0]=(...e)=>h.handleToggleClick&&h.handleToggleClick(...e))},[(0,o.bF)(s.eB,{name:"icon-fade",mode:"out-in"},{default:(0,o.k6)(()=>[d.isAuto?((0,o.uX)(),(0,o.Wv)(g,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,o.uX)(),(0,o.CE)("svg",{key:"sun-moon",class:(0,n.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,o.Lk)("mask",a,[t[1]||(t[1]=(0,o.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,o.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,l)]),(0,o.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMask)"},null,8,r),(0,o.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,o.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,o.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,o.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,o.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,o.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,u)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},h=i(71241);const g=(0,h.A)(d,[["render",c],["__scopeId","data-v-c93807da"]]);var p=g},25293:function(e,t,i){i.d(t,{A:function(){return _}});var o=i(86975),s=i(80047),n=(i(85331),i(99648),i(39623)),a=(i(29092),i(813)),l=(i(34896),i(732)),r=i(54047),u=i(808),c=i(56768),d=i(24232),h=i(45130);const g={class:"login-container"},p={class:"login-title",tabindex:"0"},f={class:"input-wrapper"},k={key:0,class:"loading-ring"},m={key:1};function y(e,t,i,y,v,w){const b=u.A,L=r.A,C=l.A,_=a.tk,x=n.WK,S=s.S2,D=o.A;return(0,c.uX)(),(0,c.CE)("div",{class:"login",style:(0,d.Tr)(w.viewportStyle)},[(0,c.bF)(b,{class:"toggle-dark"}),(0,c.bF)(L,{class:"language-switcher"}),(0,c.bF)(C),(0,c.Lk)("div",g,[(0,c.Lk)("h1",p,(0,d.v_)(i.title),1),((0,c.uX)(!0),(0,c.CE)(c.FK,null,(0,c.pI)(i.fields,(e,t)=>((0,c.uX)(),(0,c.CE)("div",{key:e.key,class:"input-container"},[(0,c.Lk)("label",{class:"input-name",ref_for:!0,ref:`inputLabel${t}`,style:(0,d.Tr)({"--underline-width":v.labelUnderlineWidths[t]+"px"})},(0,d.v_)(e.label),5),(0,c.Lk)("div",f,[(0,c.bF)(x,{modelValue:v.formData[e.key],"onUpdate:modelValue":t=>v.formData[e.key]=t,placeholder:e.placeholder,type:e.type||"text","show-password":e.showPassword,class:"password-input",onKeyup:(0,h.jR)(w.handleSubmit,["enter","native"]),onFocus:w.handleInputFocus,onBlur:w.handleInputBlur},(0,c.eX)({_:2},[e.icon?{name:"prefix",fn:(0,c.k6)(()=>[(0,c.bF)(_,{class:"el-input__icon"},{default:(0,c.k6)(()=>[((0,c.uX)(),(0,c.Wv)((0,c.$y)(e.icon)))]),_:2},1024)]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","placeholder","type","show-password","onKeyup","onFocus","onBlur"])])]))),128)),(0,c.bF)(S,{class:(0,d.C4)(["submit",{"is-loading":i.loading}]),type:"primary",onClick:w.handleSubmit,disabled:i.loading},{default:(0,c.k6)(()=>[i.loading?((0,c.uX)(),(0,c.CE)("div",k)):((0,c.uX)(),(0,c.CE)("span",m,(0,d.v_)(w.computedSubmitText),1))]),_:1},8,["class","onClick","disabled"])]),(0,c.bF)(D,{class:"footer"})],4)}i(18111),i(7588);var v=i(60782),w=i(48903),b={name:"BaseLogin",mixins:[w.A],props:{title:{type:String,required:!0},fields:{type:Array,required:!0},submitText:{type:String,default:""},backgroundKey:{type:String,required:!0},isAdmin:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},data(){return{formData:{},labelUnderlineWidths:[],isFocused:!1,viewportHeight:0}},computed:{...(0,v.L8)(["userConfig"]),computedSubmitText(){return this.submitText||this.$t("login.submit")},viewportStyle(){return this.viewportHeight>0?{height:`${this.viewportHeight}px`,minHeight:`${this.viewportHeight}px`}:{}}},watch:{fields:{handler(){this.$nextTick(()=>{this.calculateLabelWidths()})},deep:!0}},components:{Footer:o.A,ToggleDark:u.A,LanguageSwitcher:r.A,Logo:l.A},mounted(){this.initFormData(),this.initializeBackground(this.backgroundKey,".login",!this.isAdmin,!0),this.$nextTick(()=>{this.calculateLabelWidths()}),this._handleViewportResize=this.handleViewportResize.bind(this),window.visualViewport&&(this._initialHeight=window.visualViewport.height,window.visualViewport.addEventListener("resize",this._handleViewportResize))},beforeDestroy(){window.visualViewport&&this._handleViewportResize&&window.visualViewport.removeEventListener("resize",this._handleViewportResize)},methods:{initFormData(){const e={};this.fields.forEach(t=>{e[t.key]=""}),this.formData=e,this.labelUnderlineWidths=new Array(this.fields.length).fill(0)},calculateLabelWidths(){this.$nextTick(()=>{this.fields.forEach((e,t)=>{const i=this.$refs[`inputLabel${t}`];if(i&&i[0]){const o=document.createElement("canvas"),s=o.getContext("2d"),n=i[0],a=window.getComputedStyle(n);s.font=`${a.fontWeight} ${a.fontSize} ${a.fontFamily}`;const l=s.measureText(e.label).width;this.labelUnderlineWidths[t]=Math.ceil(l)+3}})})},handleSubmit(){this.loading||this.$emit("submit",{...this.formData})},handleViewportResize(){if(!window.visualViewport)return;const e=window.visualViewport.height,t=this._initialHeight-e,i=150;this.viewportHeight=t>i?e:0},handleInputFocus(e){this.isFocused=!0;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.add("focused")}},handleInputBlur(e){this.isFocused=!1;const t=e.target.closest(".input-container");if(t){const e=t.querySelector(".input-wrapper");e&&e.classList.remove("focused")}}}},L=i(71241);const C=(0,L.A)(b,[["render",y],["__scopeId","data-v-5b07fe04"]]);var _=C},33153:function(e,t,i){e.exports=i.p+"img/logo.e8dbfa27.png"},34896:function(e,t,i){i(85331)},54047:function(e,t,i){i.d(t,{A:function(){return c}});var o=i(56768);const s=["title"];function n(e,t,i,n,a,l){const r=(0,o.g2)("font-awesome-icon");return(0,o.uX)(),(0,o.CE)("span",{class:"language-switcher",onClick:t[0]||(t[0]=(...e)=>l.toggleLocale&&l.toggleLocale(...e)),role:"button",title:e.$t("language.switchTo")},[(0,o.bF)(r,{icon:"globe",class:"lang-icon"})],8,s)}var a=i(46638),l={name:"LanguageSwitcher",computed:{isZh(){return"zh-CN"===this.$i18n.locale}},methods:{toggleLocale(){const e=this.isZh?"en":"zh-CN";(0,a.xS)(e)}}},r=i(71241);const u=(0,r.A)(l,[["render",n],["__scopeId","data-v-08567d0a"]]);var c=u},86975:function(e,t,i){i.d(t,{A:function(){return h}});var o=i(56768),s=i(24232);const n={key:0,class:"page-footer"},a=["href"];function l(e,t,i,l,r,u){const c=(0,o.g2)("font-awesome-icon");return u.disableFooter?(0,o.Q3)("",!0):((0,o.uX)(),(0,o.CE)("div",n,[(0,o.Lk)("p",null,[(0,o.eW)("© 2024-"+(0,s.v_)(u.thisYear)+" Designed by ",1),t[0]||(t[0]=(0,o.Lk)("a",{class:"footer-name",href:"https://github.com/MarSeventh",target:"_blank"},"SanyueQi",-1)),t[1]||(t[1]=(0,o.eW)(" for You! ",-1)),(0,o.Lk)("a",{href:u.footerLink,target:"_blank"},[(0,o.bF)(c,{icon:"paper-plane",class:"footer-link-icon"})],8,a)])]))}var r=i(60782),u={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=i(71241);const d=(0,c.A)(u,[["render",l],["__scopeId","data-v-08acbaa9"]]);var h=d}}]); +//# sourceMappingURL=293.24979b69.js.map \ No newline at end of file diff --git a/frontend-dist/js/293.24979b69.js.gz b/frontend-dist/js/293.24979b69.js.gz new file mode 100644 index 00000000..a0ee09b1 Binary files /dev/null and b/frontend-dist/js/293.24979b69.js.gz differ diff --git a/frontend-dist/js/293.24979b69.js.map b/frontend-dist/js/293.24979b69.js.map new file mode 100644 index 00000000..006f8fe7 --- /dev/null +++ b/frontend-dist/js/293.24979b69.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/293.24979b69.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?5a8c","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/components/BaseLogin.vue?5d56","webpack://sanyue_imghub/./src/components/BaseLogin.vue","webpack://sanyue_imghub/./src/components/BaseLogin.vue?0ac4","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?0caa","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue","webpack://sanyue_imghub/./src/components/LanguageSwitcher.vue?90ec","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=c93807da&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=c93807da&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-c93807da\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, withCtx as _withCtx, withKeys as _withKeys, createSlots as _createSlots, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"login-container\"\n};\nconst _hoisted_2 = {\n class: \"login-title\",\n tabindex: \"0\"\n};\nconst _hoisted_3 = {\n class: \"input-wrapper\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"loading-ring\"\n};\nconst _hoisted_5 = {\n key: 1\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_Footer = _resolveComponent(\"Footer\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"login\",\n style: _normalizeStyle($options.viewportStyle)\n }, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark\"\n }), _createVNode(_component_LanguageSwitcher, {\n class: \"language-switcher\"\n }), _createVNode(_component_Logo), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"h1\", _hoisted_2, _toDisplayString($props.title), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.fields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: field.key,\n class: \"input-container\"\n }, [_createElementVNode(\"label\", {\n class: \"input-name\",\n ref_for: true,\n ref: `inputLabel${index}`,\n style: _normalizeStyle({\n '--underline-width': $data.labelUnderlineWidths[index] + 'px'\n })\n }, _toDisplayString(field.label), 5), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.formData[field.key],\n \"onUpdate:modelValue\": $event => $data.formData[field.key] = $event,\n placeholder: field.placeholder,\n type: field.type || 'text',\n \"show-password\": field.showPassword,\n class: \"password-input\",\n onKeyup: _withKeys($options.handleSubmit, [\"enter\", \"native\"]),\n onFocus: $options.handleInputFocus,\n onBlur: $options.handleInputBlur\n }, _createSlots({\n _: 2\n }, [field.icon ? {\n name: \"prefix\",\n fn: _withCtx(() => [_createVNode(_component_el_icon, {\n class: \"el-input__icon\"\n }, {\n default: _withCtx(() => [(_openBlock(), _createBlock(_resolveDynamicComponent(field.icon)))]),\n _: 2\n }, 1024)]),\n key: \"0\"\n } : undefined]), 1032, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\", \"type\", \"show-password\", \"onKeyup\", \"onFocus\", \"onBlur\"])])]);\n }), 128)), _createVNode(_component_el_button, {\n class: _normalizeClass([\"submit\", {\n 'is-loading': $props.loading\n }]),\n type: \"primary\",\n onClick: $options.handleSubmit,\n disabled: $props.loading\n }, {\n default: _withCtx(() => [$props.loading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString($options.computedSubmitText), 1))]),\n _: 1\n }, 8, [\"class\", \"onClick\", \"disabled\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n })], 4);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport Logo from '@/components/Logo.vue';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BaseLogin',\n mixins: [backgroundManager],\n props: {\n // 页面标题\n title: {\n type: String,\n required: true\n },\n // 输入字段配置\n fields: {\n type: Array,\n required: true\n // fields 格式: [{ key: 'username', label: '用户名', placeholder: '请输入用户名', type: 'text', showPassword: false }]\n },\n // 提交按钮文本\n submitText: {\n type: String,\n default: ''\n },\n // 背景图配置键名\n backgroundKey: {\n type: String,\n required: true\n },\n // 是否为管理端登录(影响背景样式)\n isAdmin: {\n type: Boolean,\n default: false\n },\n // 是否正在加载\n loading: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n formData: {},\n labelUnderlineWidths: [],\n isFocused: false,\n viewportHeight: 0\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n computedSubmitText() {\n return this.submitText || this.$t('login.submit');\n },\n viewportStyle() {\n // 当检测到虚拟键盘弹出时,将容器高度收缩到可见视口高度\n // 容器本身 flex 居中,高度缩小后登录卡片自然在可见区域内居中\n if (this.viewportHeight > 0) {\n return {\n height: `${this.viewportHeight}px`,\n minHeight: `${this.viewportHeight}px`\n };\n }\n return {};\n }\n },\n watch: {\n fields: {\n handler() {\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n deep: true\n }\n },\n components: {\n Footer,\n ToggleDark,\n LanguageSwitcher,\n Logo\n },\n mounted() {\n // 初始化表单数据\n this.initFormData();\n // 初始化背景图\n this.initializeBackground(this.backgroundKey, '.login', !this.isAdmin, true);\n // 在下一个tick计算标签宽度,确保DOM已经渲染\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n // 监听 visualViewport 变化,检测虚拟键盘弹出\n this._handleViewportResize = this.handleViewportResize.bind(this);\n if (window.visualViewport) {\n this._initialHeight = window.visualViewport.height;\n window.visualViewport.addEventListener('resize', this._handleViewportResize);\n }\n },\n beforeDestroy() {\n if (window.visualViewport && this._handleViewportResize) {\n window.visualViewport.removeEventListener('resize', this._handleViewportResize);\n }\n },\n methods: {\n initFormData() {\n // 根据字段配置初始化表单数据\n const newFormData = {};\n this.fields.forEach(field => {\n newFormData[field.key] = '';\n });\n this.formData = newFormData;\n // 初始化下划线宽度数组\n this.labelUnderlineWidths = new Array(this.fields.length).fill(0);\n },\n calculateLabelWidths() {\n // 计算每个标签的文字宽度\n this.$nextTick(() => {\n this.fields.forEach((field, index) => {\n const labelRef = this.$refs[`inputLabel${index}`];\n if (labelRef && labelRef[0]) {\n // 创建一个临时的canvas来测量文字宽度\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // 获取标签的计算样式\n const labelElement = labelRef[0];\n const computedStyle = window.getComputedStyle(labelElement);\n\n // 设置font样式以匹配标签\n context.font = `${computedStyle.fontWeight} ${computedStyle.fontSize} ${computedStyle.fontFamily}`;\n\n // 测量文字宽度\n const textWidth = context.measureText(field.label).width;\n\n // 添加一些额外的边距,确保下划线覆盖整个文字\n this.labelUnderlineWidths[index] = Math.ceil(textWidth) + 3;\n }\n });\n });\n },\n handleSubmit() {\n if (this.loading) return;\n // 触发父组件的提交事件,传递表单数据\n this.$emit('submit', {\n ...this.formData\n });\n },\n handleViewportResize() {\n if (!window.visualViewport) return;\n const currentHeight = window.visualViewport.height;\n // 键盘高度 = 初始视口高度 - 当前视口高度\n const keyboardHeight = this._initialHeight - currentHeight;\n // 设定阈值:视口缩小超过 150px 才认为是虚拟键盘弹出\n // 避免地址栏收缩等小幅变化误触发\n const KEYBOARD_THRESHOLD = 150;\n if (keyboardHeight > KEYBOARD_THRESHOLD) {\n // 将容器高度设为当前可见视口高度\n // flex 居中会让登录卡片自然在可见区域内居中,不会顶部溢出或底部留白\n this.viewportHeight = currentHeight;\n } else {\n this.viewportHeight = 0;\n }\n },\n handleInputFocus(event) {\n this.isFocused = true;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.add('focused');\n }\n }\n },\n handleInputBlur(event) {\n this.isFocused = false;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.remove('focused');\n }\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BaseLogin.vue?vue&type=template&id=5b07fe04&scoped=true\"\nimport script from \"./BaseLogin.vue?vue&type=script&lang=js\"\nexport * from \"./BaseLogin.vue?vue&type=script&lang=js\"\n\nimport \"./BaseLogin.vue?vue&type=style&index=0&id=5b07fe04&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-5b07fe04\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"title\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", {\n class: \"language-switcher\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleLocale && $options.toggleLocale(...args)),\n role: \"button\",\n title: _ctx.$t('language.switchTo')\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n class: \"lang-icon\"\n })], 8, _hoisted_1);\n}","import { setLocale } from '@/locales';\nexport default {\n name: 'LanguageSwitcher',\n computed: {\n isZh() {\n return this.$i18n.locale === 'zh-CN';\n }\n },\n methods: {\n toggleLocale() {\n const next = this.isZh ? 'en' : 'zh-CN';\n setLocale(next);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./LanguageSwitcher.vue?vue&type=template&id=08567d0a&scoped=true\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js\"\n\nimport \"./LanguageSwitcher.vue?vue&type=style&index=0&id=08567d0a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08567d0a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","tabindex","_hoisted_5","_component_ToggleDark","_component_LanguageSwitcher","_component_Logo","_component_el_icon","_component_el_input","_component_el_button","_component_Footer","viewportStyle","title","fields","field","index","ref_for","ref","labelUnderlineWidths","label","modelValue","formData","$event","placeholder","showPassword","onKeyup","handleSubmit","onFocus","handleInputFocus","onBlur","handleInputBlur","fn","undefined","loading","disabled","computedSubmitText","mixins","backgroundManager","required","Array","submitText","backgroundKey","isAdmin","isFocused","viewportHeight","$t","minHeight","watch","handler","$nextTick","calculateLabelWidths","deep","components","Footer","ToggleDark","LanguageSwitcher","Logo","mounted","initFormData","initializeBackground","_handleViewportResize","handleViewportResize","bind","window","visualViewport","_initialHeight","addEventListener","beforeDestroy","removeEventListener","newFormData","forEach","length","labelRef","$refs","canvas","document","createElement","context","getContext","labelElement","computedStyle","getComputedStyle","font","fontWeight","fontSize","fontFamily","textWidth","measureText","Math","ceil","$emit","currentHeight","keyboardHeight","KEYBOARD_THRESHOLD","event","container","closest","wrapper","querySelector","classList","add","remove","toggleLocale","role","isZh","$i18n","locale","next","disableFooter","thisYear","footerLink","Date","getFullYear"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/293.24979b69.js.map.gz b/frontend-dist/js/293.24979b69.js.map.gz new file mode 100644 index 00000000..095b9b4e Binary files /dev/null and b/frontend-dist/js/293.24979b69.js.map.gz differ diff --git a/frontend-dist/js/293.4c283028.js.gz b/frontend-dist/js/293.4c283028.js.gz deleted file mode 100644 index aa5bc1ba..00000000 Binary files a/frontend-dist/js/293.4c283028.js.gz and /dev/null differ diff --git a/frontend-dist/js/293.4c283028.js.map b/frontend-dist/js/293.4c283028.js.map deleted file mode 100644 index 0df6f795..00000000 --- a/frontend-dist/js/293.4c283028.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/293.4c283028.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?5a8c","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/components/BaseLogin.vue?5d56","webpack://sanyue_imghub/./src/components/BaseLogin.vue","webpack://sanyue_imghub/./src/components/BaseLogin.vue?0ac4","webpack://sanyue_imghub/./src/components/Footer.vue?4f81","webpack://sanyue_imghub/./src/components/Footer.vue","webpack://sanyue_imghub/./src/components/Footer.vue?d468"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=c93807da&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=c93807da&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-c93807da\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock, withCtx as _withCtx, withKeys as _withKeys, createSlots as _createSlots, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"login-container\"\n};\nconst _hoisted_2 = {\n class: \"login-title\",\n tabindex: \"0\"\n};\nconst _hoisted_3 = {\n class: \"input-wrapper\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"loading-ring\"\n};\nconst _hoisted_5 = {\n key: 1\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_LanguageSwitcher = _resolveComponent(\"LanguageSwitcher\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_Footer = _resolveComponent(\"Footer\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"login\",\n style: _normalizeStyle($options.viewportStyle)\n }, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark\"\n }), _createVNode(_component_LanguageSwitcher, {\n class: \"language-switcher\"\n }), _createVNode(_component_Logo), _createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"h1\", _hoisted_2, _toDisplayString($props.title), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.fields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: field.key,\n class: \"input-container\"\n }, [_createElementVNode(\"label\", {\n class: \"input-name\",\n ref_for: true,\n ref: `inputLabel${index}`,\n style: _normalizeStyle({\n '--underline-width': $data.labelUnderlineWidths[index] + 'px'\n })\n }, _toDisplayString(field.label), 5), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_input, {\n modelValue: $data.formData[field.key],\n \"onUpdate:modelValue\": $event => $data.formData[field.key] = $event,\n placeholder: field.placeholder,\n type: field.type || 'text',\n \"show-password\": field.showPassword,\n class: \"password-input\",\n onKeyup: _withKeys($options.handleSubmit, [\"enter\", \"native\"]),\n onFocus: $options.handleInputFocus,\n onBlur: $options.handleInputBlur\n }, _createSlots({\n _: 2\n }, [field.icon ? {\n name: \"prefix\",\n fn: _withCtx(() => [_createVNode(_component_el_icon, {\n class: \"el-input__icon\"\n }, {\n default: _withCtx(() => [(_openBlock(), _createBlock(_resolveDynamicComponent(field.icon)))]),\n _: 2\n }, 1024)]),\n key: \"0\"\n } : undefined]), 1032, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\", \"type\", \"show-password\", \"onKeyup\", \"onFocus\", \"onBlur\"])])]);\n }), 128)), _createVNode(_component_el_button, {\n class: _normalizeClass([\"submit\", {\n 'is-loading': $props.loading\n }]),\n type: \"primary\",\n onClick: $options.handleSubmit,\n disabled: $props.loading\n }, {\n default: _withCtx(() => [$props.loading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4)) : (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString($options.computedSubmitText), 1))]),\n _: 1\n }, 8, [\"class\", \"onClick\", \"disabled\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n })], 4);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport LanguageSwitcher from '@/components/LanguageSwitcher.vue';\nimport Logo from '@/components/Logo.vue';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BaseLogin',\n mixins: [backgroundManager],\n props: {\n // 页面标题\n title: {\n type: String,\n required: true\n },\n // 输入字段配置\n fields: {\n type: Array,\n required: true\n // fields 格式: [{ key: 'username', label: '用户名', placeholder: '请输入用户名', type: 'text', showPassword: false }]\n },\n // 提交按钮文本\n submitText: {\n type: String,\n default: ''\n },\n // 背景图配置键名\n backgroundKey: {\n type: String,\n required: true\n },\n // 是否为管理端登录(影响背景样式)\n isAdmin: {\n type: Boolean,\n default: false\n },\n // 是否正在加载\n loading: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n formData: {},\n labelUnderlineWidths: [],\n isFocused: false,\n viewportHeight: 0\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n computedSubmitText() {\n return this.submitText || this.$t('login.submit');\n },\n viewportStyle() {\n // 当检测到虚拟键盘弹出时,将容器高度收缩到可见视口高度\n // 容器本身 flex 居中,高度缩小后登录卡片自然在可见区域内居中\n if (this.viewportHeight > 0) {\n return {\n height: `${this.viewportHeight}px`,\n minHeight: `${this.viewportHeight}px`\n };\n }\n return {};\n }\n },\n watch: {\n fields: {\n handler() {\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n },\n deep: true\n }\n },\n components: {\n Footer,\n ToggleDark,\n LanguageSwitcher,\n Logo\n },\n mounted() {\n // 初始化表单数据\n this.initFormData();\n // 初始化背景图\n this.initializeBackground(this.backgroundKey, '.login', !this.isAdmin, true);\n // 在下一个tick计算标签宽度,确保DOM已经渲染\n this.$nextTick(() => {\n this.calculateLabelWidths();\n });\n // 监听 visualViewport 变化,检测虚拟键盘弹出\n this._handleViewportResize = this.handleViewportResize.bind(this);\n if (window.visualViewport) {\n this._initialHeight = window.visualViewport.height;\n window.visualViewport.addEventListener('resize', this._handleViewportResize);\n }\n },\n beforeDestroy() {\n if (window.visualViewport && this._handleViewportResize) {\n window.visualViewport.removeEventListener('resize', this._handleViewportResize);\n }\n },\n methods: {\n initFormData() {\n // 根据字段配置初始化表单数据\n const newFormData = {};\n this.fields.forEach(field => {\n newFormData[field.key] = '';\n });\n this.formData = newFormData;\n // 初始化下划线宽度数组\n this.labelUnderlineWidths = new Array(this.fields.length).fill(0);\n },\n calculateLabelWidths() {\n // 计算每个标签的文字宽度\n this.$nextTick(() => {\n this.fields.forEach((field, index) => {\n const labelRef = this.$refs[`inputLabel${index}`];\n if (labelRef && labelRef[0]) {\n // 创建一个临时的canvas来测量文字宽度\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // 获取标签的计算样式\n const labelElement = labelRef[0];\n const computedStyle = window.getComputedStyle(labelElement);\n\n // 设置font样式以匹配标签\n context.font = `${computedStyle.fontWeight} ${computedStyle.fontSize} ${computedStyle.fontFamily}`;\n\n // 测量文字宽度\n const textWidth = context.measureText(field.label).width;\n\n // 添加一些额外的边距,确保下划线覆盖整个文字\n this.labelUnderlineWidths[index] = Math.ceil(textWidth) + 3;\n }\n });\n });\n },\n handleSubmit() {\n if (this.loading) return;\n // 触发父组件的提交事件,传递表单数据\n this.$emit('submit', {\n ...this.formData\n });\n },\n handleViewportResize() {\n if (!window.visualViewport) return;\n const currentHeight = window.visualViewport.height;\n // 键盘高度 = 初始视口高度 - 当前视口高度\n const keyboardHeight = this._initialHeight - currentHeight;\n // 设定阈值:视口缩小超过 150px 才认为是虚拟键盘弹出\n // 避免地址栏收缩等小幅变化误触发\n const KEYBOARD_THRESHOLD = 150;\n if (keyboardHeight > KEYBOARD_THRESHOLD) {\n // 将容器高度设为当前可见视口高度\n // flex 居中会让登录卡片自然在可见区域内居中,不会顶部溢出或底部留白\n this.viewportHeight = currentHeight;\n } else {\n this.viewportHeight = 0;\n }\n },\n handleInputFocus(event) {\n this.isFocused = true;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.add('focused');\n }\n }\n },\n handleInputBlur(event) {\n this.isFocused = false;\n const container = event.target.closest('.input-container');\n if (container) {\n const wrapper = container.querySelector('.input-wrapper');\n if (wrapper) {\n wrapper.classList.remove('focused');\n }\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BaseLogin.vue?vue&type=template&id=5b07fe04&scoped=true\"\nimport script from \"./BaseLogin.vue?vue&type=script&lang=js\"\nexport * from \"./BaseLogin.vue?vue&type=script&lang=js\"\n\nimport \"./BaseLogin.vue?vue&type=style&index=0&id=5b07fe04&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-5b07fe04\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"page-footer\"\n};\nconst _hoisted_2 = [\"href\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return !$options.disableFooter ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"p\", null, [_createTextVNode(\"© 2024-\" + _toDisplayString($options.thisYear) + \" Designed by \", 1), _cache[0] || (_cache[0] = _createElementVNode(\"a\", {\n class: \"footer-name\",\n href: \"https://github.com/MarSeventh\",\n target: \"_blank\"\n }, \"SanyueQi\", -1)), _cache[1] || (_cache[1] = _createTextVNode(\" for You! \", -1)), _createElementVNode(\"a\", {\n href: $options.footerLink,\n target: \"_blank\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"footer-link-icon\"\n })], 8, _hoisted_2)])])) : _createCommentVNode(\"\", true);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Footer',\n computed: {\n ...mapGetters(['userConfig']),\n footerLink() {\n return this.userConfig?.footerLink || 'https://github.com/MarSeventh';\n },\n thisYear() {\n return new Date().getFullYear();\n },\n disableFooter() {\n return this.userConfig?.disableFooter || false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Footer.vue?vue&type=template&id=08acbaa9&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=08acbaa9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08acbaa9\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","tabindex","_hoisted_5","_component_ToggleDark","_component_LanguageSwitcher","_component_Logo","_component_el_icon","_component_el_input","_component_el_button","_component_Footer","viewportStyle","title","fields","field","index","ref_for","ref","labelUnderlineWidths","label","modelValue","formData","$event","placeholder","showPassword","onKeyup","handleSubmit","onFocus","handleInputFocus","onBlur","handleInputBlur","fn","undefined","loading","disabled","computedSubmitText","mixins","backgroundManager","required","Array","submitText","backgroundKey","isAdmin","isFocused","viewportHeight","$t","minHeight","watch","handler","$nextTick","calculateLabelWidths","deep","components","Footer","ToggleDark","LanguageSwitcher","Logo","mounted","initFormData","initializeBackground","_handleViewportResize","handleViewportResize","bind","window","visualViewport","_initialHeight","addEventListener","beforeDestroy","removeEventListener","newFormData","forEach","length","labelRef","$refs","canvas","document","createElement","context","getContext","labelElement","computedStyle","getComputedStyle","font","fontWeight","fontSize","fontFamily","textWidth","measureText","Math","ceil","$emit","currentHeight","keyboardHeight","KEYBOARD_THRESHOLD","event","container","closest","wrapper","querySelector","classList","add","remove","disableFooter","thisYear","footerLink","Date","getFullYear"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/293.4c283028.js.map.gz b/frontend-dist/js/293.4c283028.js.map.gz deleted file mode 100644 index ff7b760b..00000000 Binary files a/frontend-dist/js/293.4c283028.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/331.096fa41f.js b/frontend-dist/js/331.096fa41f.js deleted file mode 100644 index 39ca05e6..00000000 --- a/frontend-dist/js/331.096fa41f.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[331],{7835:function(e,t,a){e.exports=a.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,a){e.exports=a.p+"img/background.de27f549.jpg"},16331:function(e,t,a){a.r(t),a.d(t,{default:function(){return C}});var n=a(80047),s=(a(85331),a(99648),a(56768));const i={class:"blocked-container"},o=["innerHTML"],r={class:"blocked-content"},l={class:"back-button-wrapper"},c={class:"status-animation"},u={class:"status-icon"},d={class:"status-badge"},g={class:"status-info"},m={class:"status-actions"},p={class:"help-info"},h={class:"quick-links"};function k(e,t,a,k,b,y){const f=(0,s.g2)("font-awesome-icon"),v=n.S2;return(0,s.uX)(),(0,s.CE)("div",i,[(0,s.Lk)("div",{class:"background-wrapper",innerHTML:e.backgroundImagesTemplate},null,8,o),(0,s.Lk)("div",r,[(0,s.Lk)("div",l,[(0,s.bF)(v,{class:"back-button",onClick:y.goHome,circle:"",size:"large"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"home"})]),_:1},8,["onClick"])]),(0,s.Lk)("div",c,[(0,s.Lk)("div",u,[(0,s.bF)(f,{icon:"ban",class:"ban-icon"}),(0,s.Lk)("div",d,[(0,s.bF)(f,{icon:"exclamation",class:"exclamation-icon"})])])]),(0,s.Lk)("div",g,[t[9]||(t[9]=(0,s.Lk)("h1",{class:"status-title"},"图片访问被禁止",-1)),t[10]||(t[10]=(0,s.Lk)("p",{class:"status-description"}," 抱歉,当前图片已被禁止访问。 ",-1)),t[11]||(t[11]=(0,s.Lk)("p",{class:"status-description-en"}," Sorry, current image is prohibited from being accessed. ",-1)),(0,s.Lk)("div",m,[(0,s.bF)(v,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:y.goHome},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"home",class:"btn-icon"}),t[3]||(t[3]=(0,s.eW)(" 返回首页 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(v,{size:"large",class:"action-btn secondary-btn",onClick:y.goBack},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"arrow-left",class:"btn-icon"}),t[4]||(t[4]=(0,s.eW)(" 返回上页 ",-1))]),_:1},8,["onClick"])]),(0,s.Lk)("div",p,[t[8]||(t[8]=(0,s.Lk)("p",{class:"help-text"},"您可以尝试:",-1)),(0,s.Lk)("div",h,[(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[0]||(t[0]=(...e)=>y.goHome&&y.goHome(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"cloud-upload-alt"}),t[5]||(t[5]=(0,s.eW)(" 图片上传 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[1]||(t[1]=(...e)=>y.refreshPage&&y.refreshPage(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"redo"}),t[6]||(t[6]=(0,s.eW)(" 刷新页面 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[2]||(t[2]=(...e)=>y.contactSupport&&y.contactSupport(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"question-circle"}),t[7]||(t[7]=(0,s.eW)(" 联系支持 ",-1))])])]),t[12]||(t[12]=(0,s.Lk)("div",{class:"powered-by"},[(0,s.Lk)("p",null,[(0,s.eW)("Powered By: "),(0,s.Lk)("a",{href:"https://github.com/MarSeventh/CloudFlare-ImgBed",class:"project-link"}," CloudFlare-ImgBed ")])],-1))])]),t[13]||(t[13]=(0,s.Fv)('
',1))])}a(44114);var b=a(74354),y=a(60782),f=a(48903),v={name:"BlockedImage",mixins:[f.A],computed:{...(0,y.L8)(["useDarkMode","userConfig"])},setup(){(0,b.u)({title:"Blocked Image",meta:[{name:"robots",content:"noindex, nofollow"},{name:"viewport",content:"width=device-width, initial-scale=1"},{charset:"UTF-8"}]})},mounted(){this.initializeBackground("uploadBkImg",".blocked-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},refreshPage(){window.location.reload()},contactSupport(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/issues","_blank")}}},I=a(71241);const B=(0,I.A)(v,[["render",k],["__scopeId","data-v-98114f90"]]);var C=B},48903:function(e,t,a){var n=a(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,n.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const a=document.createElement("img");a.id="bg2",a.className="background-image2",a.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(a,e.firstChild)},initializeBackground(e,t=".login",a=!1,n=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:a,autoCreateElements:n};const s=document.querySelector(t);this.prepareBackgroundContainer(s),n&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const i=document.getElementById("bg1"),o=document.getElementById("bg2");if(!i||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const r=this.userConfig?.[e];"bing"===r?this.setupBingWallpaper(i,o,t):Array.isArray(r)&&r.length>1?this.setupCustomWallpaperCarousel(i,o,r,t):Array.isArray(r)&&1===r.length?this.setupSingleCustomWallpaper(i,r[0],t):a&&this.setupDefaultWallpaper(i,t)},setupBingWallpaper(e,t,a){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,a,!0),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,a,n){this.loadBackgroundImage(e,a[this.customWallPaperIndex],n,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,a){this.loadBackgroundImage(e,t,a)},setupDefaultWallpaper(e,t){const n=this.useDarkMode,s=a(n?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,a,n=!1){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,n);const s=document.querySelector(a);this.prepareBackgroundContainer(s);const i=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity,n&&(e.style.transform="scale(1.045)")})})},o=new Image;o.onload=()=>{e.src=t,i()},o.onerror=()=>{e.src=t,i()},o.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const a=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${a}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,n=a?e:t,s=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const i=this.bingWallPapers[this.bingWallPaperIndex]?.url;n.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0);const o=new Image;o.onload=()=>{s.src=i,setTimeout(()=>{s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",setTimeout(()=>{n.style.opacity=0,this.prepareBackgroundMotion(n,!0)},1200)},50)},o.src=i},switchCustomWallpaper(e,t,a){const n=0!=e.style.opacity,s=n?e:t,i=n?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%a.length;const o=a[this.customWallPaperIndex];s.style.zIndex=-2,i.style.zIndex=-1,this.prepareBackgroundMotion(i,!0);const r=new Image;r.onload=()=>{i.src=o,setTimeout(()=>{i.style.opacity=this.bkOpacity,i.style.transform="scale(1.045)",setTimeout(()=>{s.style.opacity=0,this.prepareBackgroundMotion(s,!0)},1200)},50)},r.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),a=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),a&&(a.style.transition="none",a.style.opacity=0,a.removeAttribute("src"),setTimeout(()=>{a&&(a.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&t.removeAttribute("src")},1200)),a&&(a.style.opacity=0,setTimeout(()=>{a&&a.removeAttribute("src")},1200)))},smoothThemeTransition(e,t=".login",n=!1,s=!1){const i=this.userConfig?.[e];if(!n||void 0!==i)return void this.reinitializeBackground(e,t,n,s);const o=document.getElementById("bg1"),r=document.getElementById("bg2");if(!o||!r)return void this.reinitializeBackground(e,t,n,s);const l=0!=o.style.opacity?o:r,c=0!=o.style.opacity?r:o,u=this.useDarkMode,d=a(u?10732:7835),g=new Image;g.onload=()=>{c.src=d,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,n,s)},g.src=d},reinitializeBackground(e,t=".login",a=!1,n=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,a,n)},100)}}}}}]); -//# sourceMappingURL=331.096fa41f.js.map \ No newline at end of file diff --git a/frontend-dist/js/331.096fa41f.js.gz b/frontend-dist/js/331.096fa41f.js.gz deleted file mode 100644 index 239f6b94..00000000 Binary files a/frontend-dist/js/331.096fa41f.js.gz and /dev/null differ diff --git a/frontend-dist/js/331.096fa41f.js.map b/frontend-dist/js/331.096fa41f.js.map deleted file mode 100644 index 760cde56..00000000 --- a/frontend-dist/js/331.096fa41f.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/331.096fa41f.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/BlockImage.vue?6078","webpack://sanyue_imghub/./src/views/BlockImage.vue","webpack://sanyue_imghub/./src/views/BlockImage.vue?e417","webpack://sanyue_imghub/./src/mixins/backgroundManager.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"blocked-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"blocked-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-info\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"ban\",\n class: \"ban-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation\",\n class: \"exclamation-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"h1\", {\n class: \"status-title\"\n }, \"图片访问被禁止\", -1)), _cache[10] || (_cache[10] = _createElementVNode(\"p\", {\n class: \"status-description\"\n }, \" 抱歉,当前图片已被禁止访问。 \", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"status-description-en\"\n }, \" Sorry, current image is prohibited from being accessed. \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[3] || (_cache[3] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[8] || (_cache[8] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"您可以尝试:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 刷新页面 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.contactSupport && $options.contactSupport(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 联系支持 \", -1))])])]), _cache[12] || (_cache[12] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[13] || (_cache[13] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BlockedImage',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'Blocked Image',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.blocked-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n },\n contactSupport() {\n // 可以实现联系支持的逻辑\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/issues', '_blank');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BlockImage.vue?vue&type=template&id=98114f90&scoped=true\"\nimport script from \"./BlockImage.vue?vue&type=script&lang=js\"\nexport * from \"./BlockImage.vue?vue&type=script&lang=js\"\n\nimport \"./BlockImage.vue?vue&type=style&index=0&id=98114f90&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-98114f90\"]])\n\nexport default __exports__","/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\r\n }\r\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n if (enableZoom) {\r\n imgElement.style.transform = 'scale(1.045)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.removeAttribute('src')\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.removeAttribute('src')\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","type","goBack","href","args","refreshPage","contactSupport","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","open","__exports__","data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","mapGetters","bkInterval","userConfig","bkOpacity","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","injectBackgroundStyles","clearInterval","clearBackgroundImages","removeBackgroundStyles","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","opacity","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","preload","Image","onload","src","onerror","zoomDuration","Math","max","transition","transformOrigin","computedStyle","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","immediate","removeAttribute","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/331.096fa41f.js.map.gz b/frontend-dist/js/331.096fa41f.js.map.gz deleted file mode 100644 index 043c9ed5..00000000 Binary files a/frontend-dist/js/331.096fa41f.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/647.408915ac.js.gz b/frontend-dist/js/647.408915ac.js.gz deleted file mode 100644 index 159036ad..00000000 Binary files a/frontend-dist/js/647.408915ac.js.gz and /dev/null differ diff --git a/frontend-dist/js/647.408915ac.js.map b/frontend-dist/js/647.408915ac.js.map deleted file mode 100644 index d6f17bd8..00000000 --- a/frontend-dist/js/647.408915ac.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/647.408915ac.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?16f4","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?288e","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?d51c","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?7c9a","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?bd48","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.segment.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.helper.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.options.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.stack.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/simpleArc.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.drawing.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/index.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?d8f3","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?8791","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?83b1","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?74a9","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?028f","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?c551","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?4482","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js"],"sourcesContent":["import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\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 class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }]),\n ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=ed65892c&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=ed65892c&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-ed65892c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=715da8c8&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=715da8c8&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-715da8c8\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\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_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.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.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=6b0a5e1a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=6b0a5e1a&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-6b0a5e1a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=3554ed88&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=3554ed88&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-3554ed88\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: _normalizeClass(['group-icon', $options.getChannelIconClass(channelType.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: _normalizeClass(['select-option-icon', $options.getChannelIconClass(ch.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\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.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value,\n iconClass: this.getChannelIconClass(ch.value)\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n getChannelIconClass(type) {\n return `channel-brand-${type}`;\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=68503f89&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=68503f89&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-68503f89\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=a230355c&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=a230355c&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-a230355c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\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.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=f87cbcb2&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=f87cbcb2&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-f87cbcb2\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n key: 5,\n class: \"announcement-refresh-option\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\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_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.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, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])), setting.id === 'announcement' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_el_checkbox, {\n modelValue: $data.refreshAnnouncement,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.refreshAnnouncement = $event)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysPage.refreshAnnouncement')), 1)]),\n _: 1\n }, 8, [\"modelValue\"])])) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 即使公告内容未变化,也在本次保存时刷新公告已读状态\n refreshAnnouncement: false,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n ...this.settings,\n refreshAnnouncement: this.refreshAnnouncement\n })\n }).then(() => {\n this.refreshAnnouncement = false;\n this.$message.success(this.$t('sysPage.settingsSaved'));\n });\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=5fc03908&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=5fc03908&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-5fc03908\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\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_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, 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, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=69ae97d8&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=69ae97d8&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-69ae97d8\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=036a2d40&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=036a2d40&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-036a2d40\"]])\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\"\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=33933ada&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=33933ada&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-33933ada\"]])\n\nexport default __exports__","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_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","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","_defineProperty","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelIconClass","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","cfr2","s3","discord","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","refreshAnnouncement","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","viewBox","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/647.408915ac.js.map.gz b/frontend-dist/js/647.408915ac.js.map.gz deleted file mode 100644 index 398c2564..00000000 Binary files a/frontend-dist/js/647.408915ac.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/711.936a7109.js b/frontend-dist/js/711.936a7109.js new file mode 100644 index 00000000..4d0e9328 --- /dev/null +++ b/frontend-dist/js/711.936a7109.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[711],{5215:function(a,e,s){s.r(e),s.d(e,{default:function(){return F}});var i=s(80047),o=(s(85331),s(99648),s(56768));const t={class:"blocked-container"},c=["innerHTML"],n={class:"blocked-content"},l={class:"back-button-wrapper"},r={class:"status-animation"},d={class:"status-icon"},u={class:"status-badge"},k={class:"status-info"},p={class:"status-actions"},b={class:"help-info"},h={class:"quick-links"};function v(a,e,s,v,g,m){const f=(0,o.g2)("font-awesome-icon"),L=i.S2;return(0,o.uX)(),(0,o.CE)("div",t,[(0,o.Lk)("div",{class:"background-wrapper",innerHTML:a.backgroundImagesTemplate},null,8,c),(0,o.Lk)("div",n,[(0,o.Lk)("div",l,[(0,o.bF)(L,{class:"back-button",onClick:m.goHome,circle:"",size:"large"},{default:(0,o.k6)(()=>[(0,o.bF)(f,{icon:"home"})]),_:1},8,["onClick"])]),(0,o.Lk)("div",r,[(0,o.Lk)("div",d,[(0,o.bF)(f,{icon:"ban",class:"ban-icon"}),(0,o.Lk)("div",u,[(0,o.bF)(f,{icon:"exclamation",class:"exclamation-icon"})])])]),(0,o.Lk)("div",k,[e[9]||(e[9]=(0,o.Lk)("h1",{class:"status-title"},"图片访问被禁止",-1)),e[10]||(e[10]=(0,o.Lk)("p",{class:"status-description"}," 抱歉,当前图片已被禁止访问。 ",-1)),e[11]||(e[11]=(0,o.Lk)("p",{class:"status-description-en"}," Sorry, current image is prohibited from being accessed. ",-1)),(0,o.Lk)("div",p,[(0,o.bF)(L,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:m.goHome},{default:(0,o.k6)(()=>[(0,o.bF)(f,{icon:"home",class:"btn-icon"}),e[3]||(e[3]=(0,o.eW)(" 返回首页 ",-1))]),_:1},8,["onClick"]),(0,o.bF)(L,{size:"large",class:"action-btn secondary-btn",onClick:m.goBack},{default:(0,o.k6)(()=>[(0,o.bF)(f,{icon:"arrow-left",class:"btn-icon"}),e[4]||(e[4]=(0,o.eW)(" 返回上页 ",-1))]),_:1},8,["onClick"])]),(0,o.Lk)("div",b,[e[8]||(e[8]=(0,o.Lk)("p",{class:"help-text"},"您可以尝试:",-1)),(0,o.Lk)("div",h,[(0,o.Lk)("a",{href:"javascript:void(0)",onClick:e[0]||(e[0]=(...a)=>m.goHome&&m.goHome(...a)),class:"quick-link"},[(0,o.bF)(f,{icon:"cloud-upload-alt"}),e[5]||(e[5]=(0,o.eW)(" 图片上传 ",-1))]),(0,o.Lk)("a",{href:"javascript:void(0)",onClick:e[1]||(e[1]=(...a)=>m.refreshPage&&m.refreshPage(...a)),class:"quick-link"},[(0,o.bF)(f,{icon:"redo"}),e[6]||(e[6]=(0,o.eW)(" 刷新页面 ",-1))]),(0,o.Lk)("a",{href:"javascript:void(0)",onClick:e[2]||(e[2]=(...a)=>m.contactSupport&&m.contactSupport(...a)),class:"quick-link"},[(0,o.bF)(f,{icon:"question-circle"}),e[7]||(e[7]=(0,o.eW)(" 联系支持 ",-1))])])]),e[12]||(e[12]=(0,o.Lk)("div",{class:"powered-by"},[(0,o.Lk)("p",null,[(0,o.eW)("Powered By: "),(0,o.Lk)("a",{href:"https://github.com/MarSeventh/CloudFlare-ImgBed",class:"project-link"}," CloudFlare-ImgBed ")])],-1))])]),e[13]||(e[13]=(0,o.Fv)('
',1))])}s(44114);var g=s(74354),m=s(60782),f=s(48903),L={name:"BlockedImage",mixins:[f.A],computed:{...(0,m.L8)(["useDarkMode","userConfig"])},setup(){(0,g.u)({title:"Blocked Image",meta:[{name:"robots",content:"noindex, nofollow"},{name:"viewport",content:"width=device-width, initial-scale=1"},{charset:"UTF-8"}]})},mounted(){this.initializeBackground("uploadBkImg",".blocked-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},refreshPage(){window.location.reload()},contactSupport(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/issues","_blank")}}},w=s(71241);const C=(0,w.A)(L,[["render",v],["__scopeId","data-v-690a9bec"]]);var F=C}}]); +//# sourceMappingURL=711.936a7109.js.map \ No newline at end of file diff --git a/frontend-dist/js/711.936a7109.js.gz b/frontend-dist/js/711.936a7109.js.gz new file mode 100644 index 00000000..ac59e466 Binary files /dev/null and b/frontend-dist/js/711.936a7109.js.gz differ diff --git a/frontend-dist/js/711.936a7109.js.map b/frontend-dist/js/711.936a7109.js.map new file mode 100644 index 00000000..d19b783e --- /dev/null +++ b/frontend-dist/js/711.936a7109.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/711.936a7109.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/BlockImage.vue?6321","webpack://sanyue_imghub/./src/views/BlockImage.vue","webpack://sanyue_imghub/./src/views/BlockImage.vue?e417"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"blocked-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"blocked-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"status-animation\"\n};\nconst _hoisted_6 = {\n class: \"status-icon\"\n};\nconst _hoisted_7 = {\n class: \"status-badge\"\n};\nconst _hoisted_8 = {\n class: \"status-info\"\n};\nconst _hoisted_9 = {\n class: \"status-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-info\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"ban\",\n class: \"ban-icon\"\n }), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation\",\n class: \"exclamation-icon\"\n })])])]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"h1\", {\n class: \"status-title\"\n }, \"图片访问被禁止\", -1)), _cache[10] || (_cache[10] = _createElementVNode(\"p\", {\n class: \"status-description\"\n }, \" 抱歉,当前图片已被禁止访问。 \", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"status-description-en\"\n }, \" Sorry, current image is prohibited from being accessed. \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[3] || (_cache[3] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[8] || (_cache[8] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"您可以尝试:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 刷新页面 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.contactSupport && $options.contactSupport(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 联系支持 \", -1))])])]), _cache[12] || (_cache[12] = _createElementVNode(\"div\", {\n class: \"powered-by\"\n }, [_createElementVNode(\"p\", null, [_createTextVNode(\"Powered By: \"), _createElementVNode(\"a\", {\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n class: \"project-link\"\n }, \" CloudFlare-ImgBed \")])], -1))])]), _cache[13] || (_cache[13] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { useHead } from '@vueuse/head';\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'BlockedImage',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig'])\n },\n setup() {\n useHead({\n title: 'Blocked Image',\n meta: [{\n name: 'robots',\n content: 'noindex, nofollow'\n }, {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1'\n }, {\n charset: 'UTF-8'\n }]\n });\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.blocked-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n refreshPage() {\n window.location.reload();\n },\n contactSupport() {\n // 可以实现联系支持的逻辑\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/issues', '_blank');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./BlockImage.vue?vue&type=template&id=690a9bec&scoped=true\"\nimport script from \"./BlockImage.vue?vue&type=script&lang=js\"\nexport * from \"./BlockImage.vue?vue&type=script&lang=js\"\n\nimport \"./BlockImage.vue?vue&type=style&index=0&id=690a9bec&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-690a9bec\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","type","goBack","href","args","refreshPage","contactSupport","name","mixins","backgroundManager","computed","setup","u","title","meta","content","charset","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","open","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/711.936a7109.js.map.gz b/frontend-dist/js/711.936a7109.js.map.gz new file mode 100644 index 00000000..57e0747c Binary files /dev/null and b/frontend-dist/js/711.936a7109.js.map.gz differ diff --git a/frontend-dist/js/713.e720b926.js b/frontend-dist/js/713.e720b926.js new file mode 100644 index 00000000..f2822e04 --- /dev/null +++ b/frontend-dist/js/713.e720b926.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[713],{66653:function(a,s,o){o.r(s),o.d(s,{default:function(){return F}});var e=o(80047),i=(o(85331),o(99648),o(56768));const n={class:"not-found-container"},r=["innerHTML"],c={class:"not-found-content"},t={class:"back-button-wrapper"},l={class:"error-animation"},d={class:"error-image"},k=["src"],u={class:"error-info"},h={class:"error-actions"},g={class:"help-links"},p={class:"quick-links"};function f(a,s,o,f,v,b){const m=(0,i.g2)("font-awesome-icon"),L=e.S2;return(0,i.uX)(),(0,i.CE)("div",n,[(0,i.Lk)("div",{class:"background-wrapper",innerHTML:a.backgroundImagesTemplate},null,8,r),(0,i.Lk)("div",c,[(0,i.Lk)("div",t,[(0,i.bF)(L,{class:"back-button",onClick:b.goHome,circle:"",size:"large"},{default:(0,i.k6)(()=>[(0,i.bF)(m,{icon:"home"})]),_:1},8,["onClick"])]),(0,i.Lk)("div",l,[s[3]||(s[3]=(0,i.Lk)("div",{class:"error-number"},[(0,i.Lk)("span",{class:"four"},"4"),(0,i.Lk)("span",{class:"zero"},"0"),(0,i.Lk)("span",{class:"four"},"4")],-1)),(0,i.Lk)("div",d,[(0,i.Lk)("img",{src:b.errorImage,alt:"404",class:"floating-image"},null,8,k)])]),(0,i.Lk)("div",u,[s[10]||(s[10]=(0,i.Lk)("h1",{class:"error-title"},"页面走丢了",-1)),s[11]||(s[11]=(0,i.Lk)("p",{class:"error-description"}," 抱歉,您访问的页面可能已被删除、更名或暂时不可用 ",-1)),(0,i.Lk)("div",h,[(0,i.bF)(L,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:b.goHome},{default:(0,i.k6)(()=>[(0,i.bF)(m,{icon:"home",class:"btn-icon"}),s[4]||(s[4]=(0,i.eW)(" 返回首页 ",-1))]),_:1},8,["onClick"]),(0,i.bF)(L,{size:"large",class:"action-btn secondary-btn",onClick:b.goBack},{default:(0,i.k6)(()=>[(0,i.bF)(m,{icon:"arrow-left",class:"btn-icon"}),s[5]||(s[5]=(0,i.eW)(" 返回上页 ",-1))]),_:1},8,["onClick"])]),(0,i.Lk)("div",g,[s[9]||(s[9]=(0,i.Lk)("p",{class:"help-text"},"也许您想要:",-1)),(0,i.Lk)("div",p,[(0,i.Lk)("a",{href:"javascript:void(0)",onClick:s[0]||(s[0]=(...a)=>b.goHome&&b.goHome(...a)),class:"quick-link"},[(0,i.bF)(m,{icon:"cloud-upload-alt"}),s[6]||(s[6]=(0,i.eW)(" 图片上传 ",-1))]),(0,i.Lk)("a",{href:"javascript:void(0)",onClick:s[1]||(s[1]=(...a)=>b.goDashboard&&b.goDashboard(...a)),class:"quick-link"},[(0,i.bF)(m,{icon:"tachometer-alt"}),s[7]||(s[7]=(0,i.eW)(" 管理面板 ",-1))]),(0,i.Lk)("a",{href:"javascript:void(0)",onClick:s[2]||(s[2]=(...a)=>b.refreshPage&&b.refreshPage(...a)),class:"quick-link"},[(0,i.bF)(m,{icon:"redo"}),s[8]||(s[8]=(0,i.eW)(" 刷新页面 ",-1))])])])])]),s[12]||(s[12]=(0,i.Fv)('
',1))])}o(44114);var v=o(60782),b=o(48903),m={name:"NotFound",mixins:[b.A],computed:{...(0,v.L8)(["useDarkMode","userConfig"]),errorImage(){return o(96682)}},mounted(){this.initializeBackground("uploadBkImg",".not-found-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},goDashboard(){this.$router.push("/dashboard")},refreshPage(){window.location.reload()}}},L=o(71241);const C=(0,L.A)(m,[["render",f],["__scopeId","data-v-d1154f66"]]);var F=C},96682:function(a,s,o){a.exports=o.p+"img/404.8ed11fb3.png"}}]); +//# sourceMappingURL=713.e720b926.js.map \ No newline at end of file diff --git a/frontend-dist/js/713.e720b926.js.gz b/frontend-dist/js/713.e720b926.js.gz new file mode 100644 index 00000000..5b7ea432 Binary files /dev/null and b/frontend-dist/js/713.e720b926.js.gz differ diff --git a/frontend-dist/js/713.e720b926.js.map b/frontend-dist/js/713.e720b926.js.map new file mode 100644 index 00000000..0ab92d06 --- /dev/null +++ b/frontend-dist/js/713.e720b926.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/713.e720b926.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/NotFound.vue?a54b","webpack://sanyue_imghub/./src/views/NotFound.vue","webpack://sanyue_imghub/./src/views/NotFound.vue?5f0d"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"not-found-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"not-found-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"error-animation\"\n};\nconst _hoisted_6 = {\n class: \"error-image\"\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n class: \"error-info\"\n};\nconst _hoisted_9 = {\n class: \"error-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-links\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_cache[3] || (_cache[3] = _createElementVNode(\"div\", {\n class: \"error-number\"\n }, [_createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\"), _createElementVNode(\"span\", {\n class: \"zero\"\n }, \"0\"), _createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\")], -1)), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"img\", {\n src: $options.errorImage,\n alt: \"404\",\n class: \"floating-image\"\n }, null, 8, _hoisted_7)])]), _createElementVNode(\"div\", _hoisted_8, [_cache[10] || (_cache[10] = _createElementVNode(\"h1\", {\n class: \"error-title\"\n }, \"页面走丢了\", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"error-description\"\n }, \" 抱歉,您访问的页面可能已被删除、更名或暂时不可用 \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[9] || (_cache[9] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"也许您想要:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goDashboard && $options.goDashboard(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tachometer-alt\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 管理面板 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[8] || (_cache[8] = _createTextVNode(\" 刷新页面 \", -1))])])])])]), _cache[12] || (_cache[12] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'NotFound',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig']),\n errorImage() {\n // 使用项目中已有的404图片\n return require('@/assets/404.png');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.not-found-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n goDashboard() {\n this.$router.push('/dashboard');\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./NotFound.vue?vue&type=template&id=d1154f66&scoped=true\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport \"./NotFound.vue?vue&type=style&index=0&id=d1154f66&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-d1154f66\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","backgroundImagesTemplate","onClick","goHome","circle","size","default","icon","_","src","errorImage","alt","type","goBack","href","args","goDashboard","refreshPage","name","mixins","backgroundManager","computed","mounted","this","initializeBackground","beforeUnmount","clearBackgroundInterval","methods","$router","push","window","history","length","go","location","reload","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/713.e720b926.js.map.gz b/frontend-dist/js/713.e720b926.js.map.gz new file mode 100644 index 00000000..c504e1e1 Binary files /dev/null and b/frontend-dist/js/713.e720b926.js.map.gz differ diff --git a/frontend-dist/js/647.408915ac.js b/frontend-dist/js/784.1372cab1.js similarity index 90% rename from frontend-dist/js/647.408915ac.js rename to frontend-dist/js/784.1372cab1.js index ed805def..94dafaa9 100644 --- a/frontend-dist/js/647.408915ac.js +++ b/frontend-dist/js/784.1372cab1.js @@ -1,4 +1,4 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[647],{2893:function(t,e,s){s(85331)},3261:function(t,e,s){s(85331)},4885:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},15647:function(t,e,s){s.r(e),s.d(e,{default:function(){return Yg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>c.handleSelect(e.index)},[(0,i.bF)(h,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-ed65892c"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(91570));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],M={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},I={class:"calendar-grid"},U=["onClick"];function O(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:e[1]||(e[1]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",M,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:e[3]||(e[3]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>l.goToPreviousMonth&&l.goToPreviousMonth(...t))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>l.goToNextMonth&&l.goToNextMonth(...t))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",I,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":l.isInRange(t.key)}]),onClick:e=>l.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,U))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tl.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",lt,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",rt,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ct,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ht,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xt,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Mt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Dt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Vt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Lt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",It,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",Ut,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",qt,(0,n.v_)(e),1),(0,i.Lk)("span",Ht,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Qt,[(0,i.Lk)("div",Yt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",le,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",re,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ce,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",he,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>l.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698);var Pe=s(70797),Me={rE:"2.7.5"},De=(s(20116),s(91114));s(22489),s(13579); +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[784],{2893:function(t,e,s){s(85331)},3261:function(t,e,s){s(85331)},4885:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},34396:function(t,e,s){s(85331),s(4885)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},53676:function(t,e,s){s.d(e,{A:function(){return h}});var i=s(56768);const n={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},a={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},o={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function l(t,e,s,l,r,d){const c=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("span",(0,i.v6)(t.$attrs,{class:"channel-icon-wrapper"}),["telegram"===s.type?((0,i.uX)(),(0,i.CE)("svg",n,[...e[0]||(e[0]=[(0,i.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"===s.type?((0,i.uX)(),(0,i.CE)("svg",a,[...e[1]||(e[1]=[(0,i.Fv)('',9)])])):"webdav"===s.type?((0,i.uX)(),(0,i.CE)("svg",o,[...e[2]||(e[2]=[(0,i.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,i.uX)(),(0,i.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 t={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return t[this.type]||"server"}}},d=s(71241);const c=(0,d.A)(r,[["render",l],["__scopeId","data-v-33933ada"]]);var h=c},63003:function(t,e,s){s(85331)},63784:function(t,e,s){s.r(e),s.d(e,{default:function(){return Yg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>c.handleSelect(e.index)},[(0,i.bF)(h,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-ed65892c"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(91570));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],M={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},I={class:"calendar-grid"},U=["onClick"];function O(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:e[1]||(e[1]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",M,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:e[3]||(e[3]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>l.goToPreviousMonth&&l.goToPreviousMonth(...t))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>l.goToNextMonth&&l.goToNextMonth(...t))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",I,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":l.isInRange(t.key)}]),onClick:e=>l.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,U))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tl.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",lt,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",rt,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ct,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ht,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xt,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Mt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Dt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Vt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Lt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",It,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",Ut,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",qt,(0,n.v_)(e),1),(0,i.Lk)("span",Ht,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Qt,[(0,i.Lk)("div",Yt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",le,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",re,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ce,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",he,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>l.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698);var Pe=s(70797),Me={rE:"2.7.5"},De=(s(20116),s(91114));s(22489),s(13579); /*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme @@ -19,5 +19,5 @@ function ks(){}const ws=(()=>{let t=0;return()=>t++})();function Cs(t){return nu * (c) 2025 Chart.js Contributors * Released under the MIT License */ -class eo{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,s,i){const n=e.listeners[i],a=e.duration;n.forEach(i=>i({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var so=new eo;const io="transparent",no={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=qi(t||io),n=i.valid&&qi(e||io);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class ao{constructor(t,e,s,i){const n=e[s];i=Un([t.to,i,n,t.from]);const a=Un([t.from,n,i]);this._active=!0,this._fn=t.fn||no[t.type||typeof a],this._easing=zi[t.easing]||zi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Un([t.to,e,i,t.from]),this._from=Un([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Fs(n))return;const a={};for(const t of e)a[t]=n[t];(Ss(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=ro(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&lo(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(t,e));continue}const d=e[r];let c=n[r];const h=s.get(r);if(c){if(h&&c.active()){c.update(h,d,o);continue}c.cancel()}h&&h.duration?(n[r]=c=new ao(h,t,r,d),i.push(c)):t[r]=d}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(so.add(this._chart,s),!0):void 0}}function lo(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function _o(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,d=o.axis,c=bo(a,o,i),h=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function wo(t,e){return Rn(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Co(t,e,s){return Rn(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function So(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Fo=t=>"reset"===t||"none"===t,To=(t,e)=>e?t:Object.assign({},t),Po=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:po(s,!0),values:null};class Mo{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=mo(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&So(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Ms(s.xAxisID,ko(t,"x")),a=e.yAxisID=Ms(s.yAxisID,ko(t,"y")),o=e.rAxisID=Ms(s.rAxisID,ko(t,"r")),l=e.indexAxis,r=e.iAxisID=i(l,n,a,o),d=e.vAxisID=i(l,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(r),e.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&Di(this._data,this),t._stacked&&So(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Fs(e)){const t=this._cachedMeta;this._data=fo(e,t)}else if(s!==e){if(s){Di(s,this);const t=this._cachedMeta;So(t),t._parsed=[]}e&&Object.isExtensible(e)&&Mi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=mo(e.vScale,e),e.stack!==s.stack&&(i=!0,So(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(_o(this,e._parsed),e._stacked=mo(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,d,c=0===t&&e===i.length||s._sorted,h=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[t])?this.parseArrayData(s,i,t,e):Fs(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===r[o]||h&&r[o]e||c=0;--h)if(!p()){this.updateRangeFromParsed(r,t,u,l);break}return r}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=r.resolveNamedOptions(h,u,p,c);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(To(g,l))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(t,s,e))}const r=new oo(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Fo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Fo(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Fo(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(l(n),o=t;ot-e))}return t._cache.$bar}function Ao(t){const e=t.iScale,s=Do(e,t.type);let i,n,a,o,l=e._length;const r=()=>{32767!==a&&-32768!==a&&(Hs(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,l=tMath.abs(l)&&(r=l,d=o),e[s.axis]=d,e._custom={barStart:r,barEnd:d,start:n,end:a,min:o,max:l}}function Eo(t,e,s,i){return Ss(t)?Lo(t,e,s,i):e[s.axis]=s.parse(t,i),e}function Io(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),l=n===a,r=[];let d,c,h,u;for(d=s,c=s+i;d=s?1:-1)}function Ro(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),l=o&&o[s.axis],r=t=>{const e=t._parsed.find(t=>t[s.axis]===l),i=e&&e[t.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===e||!r(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Ms("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[t]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(e,i),d=a.axis,c=o.axis;for(let h=e;hvi(t,l,r,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>vi(t,l,r,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,d,h),m=p(ei,c,u),b=g(Ys,d,h),y=g(Ys+ei,c,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,De.A)(Ho,"id","bubble"),(0,De.A)(Ho,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,De.A)(Ho,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Mo{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Fs(s[t])){const{key:t="value"}=this._parsing;o=e=>+js(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?Gs*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,l;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,De.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,l)=>{const r=t.getDatasetMeta(0),d=r.controller.getStyle(l);return{text:e,fillStyle:d.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(l),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:l}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Qo extends Mo{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:l}=Oi(e,i,a);this._drawStart=o,this._drawCount=l,Ri(e)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},t),this.updateElements(i,o,l,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:d,includeOptions:c}=this._getSharedOptions(e,i),h=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=ci(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[h]=a.getPixelForValue(y[h],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[h]-x[h])>f,g&&(p.parsed=y,p.raw=r.data[v]),c&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,De.A)(Qo,"id","line"),(0,De.A)(Qo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,De.A)(Qo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Yo extends Mo{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,d=r.xCenter,c=r.yCenter,h=r.getIndexAngle(0)-.5*Ys;let u,p=h;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?pi(this.resolveDataElementOptions(t,e).angle||s):0}}(0,De.A)(Yo,"id","polarArea"),(0,De.A)(Yo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,De.A)(Yo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,De.A)(Go,"id","pie"),(0,De.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Mo{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=r.data[x]),h&&(d.options=c||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,d,i),y=s}this.updateSharedOptions(c,i,d)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,De.A)(Zo,"id","scatter"),(0,De.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,De.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function tl(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class el{static override(t){Object.assign(el.prototype,t)}constructor(t){(0,De.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return tl()}parse(){return tl()}format(){return tl()}add(){return tl()}diff(){return tl()}startOf(){return tl()}endOf(){return tl()}}var sl={_date:el};function il(t,e,s,i){const{controller:n,data:a,_sorted:o}=t,l=n._cachedMeta.iScale,r=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(l&&e===l.axis&&"r"!==e&&o&&a.length){const o=l._reversePixels?Fi:Si;if(!i){const i=o(a,e,s);if(r){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!Cs(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!Cs(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nl(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let l=0,r=a.length;l{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:r}),l=l||t.inRange(e.x,e.y,n))}),i&&!l?[]:a}var hl={evaluateInteractionItems:nl,modes:{index(t,e,s,i){const n=Sa(e,t),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o),r=[];return l.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=l[0].index,s=t.data[e];s&&!s.skip&&r.push({element:s,datasetIndex:t.index,index:e})}),r):[]},dataset(t,e,s,i){const n=Sa(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o);if(l.length>0){const e=l[0].datasetIndex,s=t.getDatasetMeta(e).data;l=[];for(let t=0;tt.pos===e)}function gl(t,e){return t.filter(t=>-1===ul.indexOf(t.pos)&&t.box.axis===e)}function fl(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function ml(t){const e=[];let s,i,n,a,o,l;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=fl(pl(e,"left"),!0),n=fl(pl(e,"right")),a=fl(pl(e,"top"),!0),o=fl(pl(e,"bottom")),l=gl(e,"x"),r=gl(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:pl(e,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function vl(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function _l(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function kl(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Fs(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&_l(o,a.getPadding());const l=Math.max(0,e.outerWidth-vl(o,t,"left","right")),r=Math.max(0,e.outerHeight-vl(o,t,"top","bottom")),d=l!==t.w,c=r!==t.h;return t.w=l,t.h=r,s.horizontal?{same:d,other:c}:{same:c,other:d}}function wl(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function Cl(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Sl(t,e,s,i){const n=[];let a,o,l,r,d,c;for(a=0,o=t.length,d=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=r.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,h=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);_l(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yl(r.concat(d),h);Sl(l.fullSize,p,h,g),Sl(r,p,h,g),Sl(d,p,h,g)&&Sl(r,p,h,g),wl(p),Tl(l.leftAndTop,p,h,g),p.x+=p.w,p.y+=p.h,Tl(l.rightAndBottom,p,h,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Vs(l.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Ml{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Dl extends Ml{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Al="$chartjs",$l={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vl=t=>null===t||""===t;function Ll(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Al]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Vl(n)){const e=Aa(t,"width");void 0!==e&&(t.width=e)}if(Vl(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Aa(t,"height");void 0!==e&&(t.height=e)}return t}const El=!!Da&&{passive:!0};function Il(t,e,s){t&&t.addEventListener(e,s,El)}function Ul(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,El)}function Ol(t,e){const s=$l[t.type]||t.type,{x:i,y:n}=Sa(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rl(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function Wl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.addedNodes,i),e=e&&!Rl(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Bl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.removedNodes,i),e=e&&!Rl(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const Nl=new Map;let zl=0;function jl(){const t=window.devicePixelRatio;t!==zl&&(zl=t,Nl.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function ql(t,e){Nl.size||window.addEventListener("resize",jl),Nl.set(t,e)}function Hl(t){Nl.delete(t),Nl.size||window.removeEventListener("resize",jl)}function Xl(t,e,s){const i=t.canvas,n=i&&ba(i);if(!n)return;const a=Vi((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),ql(t,a),o}function Kl(t,e,s){s&&s.disconnect(),"resize"===e&&Hl(t)}function Ql(t,e,s){const i=t.canvas,n=Vi(e=>{null!==t.ctx&&s(Ol(e,t))},t);return Il(i,e,n),n}class Yl extends Ml{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Ll(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Al])return!1;const s=e[Al].initial;["height","width"].forEach(t=>{const i=s[t];Cs(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Al],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:Wl,detach:Bl,resize:Xl},a=n[e]||Ql;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:Kl,detach:Kl,resize:Kl},a=n[e]||Ul;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Pa(t,e,s,i)}isAttached(t){const e=t&&ba(t);return!(!e||!e.isConnected)}}function Gl(t){return!ma()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Dl:Yl}class Jl{constructor(){(0,De.A)(this,"x",void 0),(0,De.A)(this,"y",void 0),(0,De.A)(this,"active",!1),(0,De.A)(this,"options",void 0),(0,De.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return ci(this.x)&&ci(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function Zl(t,e){const s=t.options.ticks,i=tr(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sr(e):[],o=a.length,l=a[0],r=a[o-1],d=[];if(o>n)return ir(e,d,a,o/n),d;const c=er(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(nr(e,d,c,Cs(i)?0:l-i,l),t=0,s=o-1;tn)return t}return Math.max(n,1)}function sr(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,lr=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,rr=(t,e)=>Math.min(e||t,t);function dr(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+l)))return d}function hr(t,e){Vs(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ps(s,Ps(i,s)),max:Ps(i,Ps(s,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$s(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),c=d.widest.width,h=d.highest.height,u=_i(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),c+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-ur(t.grid)-e.padding-pr(t.title,this.chart.options.font),l=Math.sqrt(c*c+h*h),r=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/l,-1,1))-Math.asin(_i(h/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pr(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=ur(n)+a):(t.height=this.maxHeight,t.width=ur(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=pi(this.labelRotation),d=Math.cos(r),c=Math.sin(r);if(o){const e=s.mirror?0:c*n.width+d*a.height;t.height=Math.min(this.maxHeight,t.height+e+l)}else{const e=s.mirror?0:d*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+l)}this._calculatePadding(e,i,c,d)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,h=0;l?r?(c=i*t.width,h=s*e.height):(c=s*t.height,h=i*e.width):"start"===n?h=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,h=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((h-d+a)*this.width/(this.width-d),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){$s(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return ki(this._alignToPixels?gn(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*i?o/s:l/i:l*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),d=this.ticks,c=d.length+(l?1:0),h=ur(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return gn(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-h,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+h;else if("left"===a)b=m(this.right),_=this.right-h,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+h;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+h}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-h,S=t.left,T=t.right}const M=Ms(i.ticks.maxTicksLimit,c),D=Math.max(1,Math.ceil(c/M));for(y=0;y0&&(a-=i/2);break}h={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:d,textAlign:u,textBaseline:P,translation:[v,_],backdrop:h}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-pi(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,l=a.widest.width;let r,d;return"left"===e?i?(d=this.right+n,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d+=l)):(d=this.right-o,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d=this.left)):"right"===e?i?(d=this.left+n,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d-=l)):(d=this.left+o,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d=this.right)):r="right",{textAlign:r,x:d}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),l=o.pop(),r=o.join(".");cn.route(a,n,r,l)})}function kr(t){return"id"in t&&"defaults"in t}class wr{constructor(){this.controllers=new xr(Mo,"datasets",!0),this.elements=new xr(Jl,"elements"),this.plugins=new xr(Object,"plugins"),this.scales=new xr(yr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):Vs(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=qs(t);$s(s["before"+i],[],s),e[t](s),$s(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Fr(t){const e={},s=[],i=Object.keys(Cr.plugins.items);for(let a=0;a1&&Vr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Ir(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function Ur(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return Ir(t,"x",s[0])||Ir(t,"y",s[0])}return{}}function Or(t,e){const s=an[t.type]||{scales:{}},i=e.scales||{},n=Dr(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Fs(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=Er(e,o,Ur(e,t),cn.scales[o.type]),r=$r(l,n),d=s.scales||{};a[e]=Rs(Object.create(null),[{axis:l},o,d[l],d[r]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Dr(n,e),l=an[n]||{},r=l.scales||{};Object.keys(r).forEach(t=>{const e=Ar(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:e},i[n],r[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Rs(e,[cn.scales[e.type],cn.scale])}),a}function Rr(t){const e=t.options||(t.options={});e.plugins=Ms(e.plugins,{}),e.scales=Or(t,e)}function Wr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Br(t){return t=t||{},t.data=Wr(t.data),Rr(t),t}const Nr=new Map,zr=new Set;function jr(t,e){let s=Nr.get(t);return s||(s=e(),Nr.set(t,s),zr.add(s)),s}const qr=(t,e,s)=>{const i=js(e,s);void 0!==i&&t.add(i)};class Hr{constructor(t){this._config=Br(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Wr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Rr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return jr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return jr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return jr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return jr(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const l=new Set;e.forEach(e=>{t&&(l.add(t),e.forEach(e=>qr(l,t,e))),e.forEach(t=>qr(l,i,t)),e.forEach(t=>qr(l,an[n]||{},t)),e.forEach(t=>qr(l,cn,t)),e.forEach(t=>qr(l,on,t))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),zr.has(e)&&a.set(e,r),r}chartOptionScopes(){const{options:t,type:e}=this;return[t,an[e]||{},cn.datasets[e]||{},{type:e},cn,on]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xr(this._resolverCache,t,i);let l=a;if(Qr(a,e)){n.$shared=!1,s=Xs(s)?s():s;const e=this.createResolver(t,s,o);l=Bn(a,s,e)}for(const r of e)n[r]=l[r];return n}createResolver(t,e,s=[""],i){const{resolver:n}=Xr(this._resolverCache,t,s);return Fs(e)?Bn(n,e,void 0,i):n}}function Xr(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=Wn(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kr=t=>Fs(t)&&Object.getOwnPropertyNames(t).some(e=>Xs(t[e]));function Qr(t,e){const{isScriptable:s,isIndexable:i}=Nn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(Xs(o)||Kr(o))||a&&Ss(o))return!0}return!1}var Yr="4.5.1";const Gr=["top","bottom","left","right","chartArea"];function Jr(t,e){return"top"===t||"bottom"===t||-1===Gr.indexOf(t)&&"x"===e}function Zr(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function td(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),$s(s&&s.onComplete,[t],e)}function ed(t){const e=t.chart,s=e.options.animation;$s(s&&s.onProgress,[t],e)}function sd(t){return ma()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const id={},nd=t=>{const e=sd(t);return Object.values(id).filter(t=>t.canvas===e).pop()};function ad(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function od(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class ld{static register(...t){Cr.add(...t),rd()}static unregister(...t){Cr.remove(...t),rd()}constructor(t,e){const s=this.config=new Hr(e),i=sd(t),n=nd(i);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,d=l&&l.width;this.id=ws(),this.ctx=o,this.canvas=l,this.width=d,this.height=r,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Sr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Li(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&l?(so.listen(this,"complete",td),so.listen(this,"progress",ed),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:i,_aspectRatio:n}=this;return Cs(t)?e&&n?n:i?s/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Cr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Ma(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(t,e){so.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Ma(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Vs(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=Er(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Vs(n,e=>{const n=e.options,a=n.id,o=Er(a,n),l=Ms(n.type,e.dtype);void 0!==n.position&&Jr(n.position,o)===Jr(e.dposition)||(n.position=e.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const t=Cr.getScale(l);r=new t({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,t)}),Vs(i,(t,e)=>{t||delete s[e]}),Vs(s,t=>{Pl.configure(this,t,t.options),Pl.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let r=0,d=this.data.datasets.length;r{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Zr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Vs(this.scales,t=>{Pl.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);Ks(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;ad(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Pl.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],Vs(this.boxes,t=>{s&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,s={meta:t,index:t.index,cancelable:!0},i=to(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(e,i),t.controller.draw(),i&&vn(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return yn(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=hl.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);Hs(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),so.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};Vs(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Vs(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Vs(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!Ls(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),l=Qs(t),r=od(t,this._lastEvent,s,l);s&&(this._lastEvent=null,$s(n.onHover,[t,o,this],this),l&&$s(n.onClick,[t,o,this],this));const d=!Ls(o,i);return(d||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=r,d}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function rd(){return Vs(ld.instances,t=>t._plugins.invalidate())}function dd(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=e,{borderWidth:d,borderJoinStyle:c}=r,h=Math.min(d/o,xi(i-s));if(t.beginPath(),t.arc(n,a,o-d/2,i+h/2,s-h/2),l>0){const e=Math.min(d/l,xi(i-s));t.arc(n,a,l+d/2,s-e/2,i+e/2,!0)}else{const e=Math.min(d/2,o*xi(i-s));if("round"===c)t.arc(n,a,e,s-Ys/2,i+Ys/2,!0);else if("bevel"===c){const o=2*e*e,l=-o*Math.cos(s+Ys/2)+n,r=-o*Math.sin(s+Ys/2)+a,d=o*Math.cos(i+Ys/2)+n,c=o*Math.sin(i+Ys/2)+a;t.lineTo(l,r),t.lineTo(d,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function cd(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=e;let d=n/l;t.beginPath(),t.arc(a,o,l,i-d,s+d),r>n?(d=n/r,t.arc(a,o,r,s+d,i-d,!0)):t.arc(a,o,n,s+ei,i-ei),t.closePath(),t.clip()}function hd(t){return $n(t,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(t,e,s,i){const n=hd(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),l=t=>{const e=(s-Math.min(a,t))*i/2;return _i(t,0,Math.min(a,e))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function gd(t,e,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:d,innerRadius:c}=e,h=Math.max(e.outerRadius+i+s-d,0),u=c>0?c+i+s+d:0;let p=0;const g=n-r;if(i){const t=c>0?c-i:0,e=h>0?h-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*h-s/Ys)/h,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(e,u,h,y-b),w=h-x,C=h-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,M=b+_/T,D=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,l,h,S,e),t.arc(o,l,h,e,F),v>0){const e=pd(C,F,o,l);t.arc(e.x,e.y,v,F,y+ei)}const s=pd(P,y,o,l);if(t.lineTo(s.x,s.y),k>0){const e=pd(P,D,o,l);t.arc(e.x,e.y,k,y+ei,D+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,l,u,y-k/u,i,!0),t.arc(o,l,u,i,b+_/u,!0),_>0){const e=pd(T,M,o,l);t.arc(e.x,e.y,_,M+Math.PI,b-ei)}const n=pd(w,b,o,l);if(t.lineTo(n.x,n.y),x>0){const e=pd(w,S,o,l);t.arc(e.x,e.y,x,b-ei,S)}}else{t.moveTo(o,l);const e=Math.cos(S)*h+o,s=Math.sin(S)*h+l;t.lineTo(e,s);const i=Math.cos(F)*h+o,n=Math.sin(F)*h+l;t.lineTo(i,n)}t.closePath()}function fd(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=e;let r=e.endAngle;if(a){gd(t,e,s,i,r,n);for(let e=0;e=Ys&&0===p&&"miter"!==c&&dd(t,e,f),a||(gd(t,e,s,i,f,n),t.stroke())}(0,De.A)(ld,"defaults",cn),(0,De.A)(ld,"instances",id),(0,De.A)(ld,"overrides",an),(0,De.A)(ld,"registry",Cr),(0,De.A)(ld,"version",Yr),(0,De.A)(ld,"getChart",nd);class bd extends Jl{constructor(t){super(),(0,De.A)(this,"circumference",void 0),(0,De.A)(this,"endAngle",void 0),(0,De.A)(this,"fullCircles",void 0),(0,De.A)(this,"innerRadius",void 0),(0,De.A)(this,"outerRadius",void 0),(0,De.A)(this,"pixelMargin",void 0),(0,De.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:t,y:e}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:d,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),h=(this.options.spacing+this.options.borderWidth)/2,u=Ms(c,l-o),p=vi(n,o,l)&&o!==l,g=u>=Gs||p,f=wi(a,r+h,d+h);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:l,spacing:r}=this.options,d=(i+n)/2,c=(a+o+r+l)/2;return{x:e+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(Ys,s||0)),r=i*l;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,fd(t,this,r,n,a),md(t,this,r,n,a),t.restore()}}function yd(t,e,s=e){t.lineCap=Ms(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Ms(s.borderDash,e.borderDash)),t.lineDashOffset=Ms(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Ms(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ms(s.borderWidth,e.borderWidth),t.strokeStyle=Ms(s.borderColor,e.borderColor)}function xd(t,e,s){t.lineTo(s.x,s.y)}function vd(t){return t.stepped?_n:t.tension||"monotone"===t.cubicInterpolationMode?kn:xd}function _d(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=e,r=Math.max(n,o),d=Math.min(a,l),c=nl&&a>l;return{count:i,start:r,loop:e.loop,ilen:d(o+(d?l-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(r&&(h=n[y(0)],t.moveTo(h.x,h.y)),c=0;c<=l;++c){if(h=n[y(c)],h.skip)continue;const e=h.x,s=h.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function Cd(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?wd:kd}function Sd(t){return t.stepped?Va:t.tension||"monotone"===t.cubicInterpolationMode?La:$a}function Fd(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),yd(t,e.options),t.stroke(n)}function Td(t,e,s,i){const{segments:n,options:a}=e,o=Cd(e);for(const l of n)yd(t,a,l.style),t.beginPath(),o(t,e,l,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,De.A)(bd,"id","arc"),(0,De.A)(bd,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,De.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,De.A)(bd,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Pd="function"===typeof Path2D;function Md(t,e,s,i){Pd&&!e.options.segment?Fd(t,e,s,i):Td(t,e,s,i)}class Dd extends Jl{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,t,i,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Xa(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ja(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],l=Sd(s);let r,d;for(r=0,d=a.length;r"borderDash"!==t&&"fill"!==t});class $d extends Jl{constructor(t){super(),(0,De.A)(this,"parsed",void 0),(0,De.A)(this,"skip",void 0),(0,De.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){e=Hd(t,e,n);const o=n[t],l=n[e];null!==i?(a.push({x:o.x,y:i}),a.push({x:l.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:l.y}))}),a}function Hd(t,e,s){for(;e>t;e--){const t=s[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Xd(t,e,s,i){return t&&e?i(t[s],e[s]):t?t[s]:e?e[s]:0}function Kd(t,e){let s=[],i=!1;return Ss(t)?(i=!0,s=t):s=qd(t,e),s.length?new Dd({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Qd(t){return t&&!1!==t.fill}function Yd(t,e,s){const i=t[e];let n=i.fill;const a=[e];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(t,e,s){const i=ec(t);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],e,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(t,e,s,i){return"-"!==t&&"+"!==t||(s=e+s),!(s===e||s<0||s>=i)&&s}function Zd(t,e){let s=null;return"start"===t?s=e.bottom:"end"===t?s=e.top:Fs(t)?s=e.getPixelForValue(t.value):e.getBasePixel&&(s=e.getBasePixel()),s}function tc(t,e,s){let i;return i="start"===t?s:"end"===t?e.options.reverse?e.min:e.max:Fs(t)?t.value:e.getBaseValue(),i}function ec(t){const e=t.options,s=e.fill;let i=Ms(s&&s.target,s);return void 0===i&&(i=!!e.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sc(t){const{scale:e,index:s,line:i}=t,n=[],a=i.segments,o=i.points,l=ic(e,s);l.push(Kd({x:null,y:e.bottom},i));for(let r=0;r=0;--o){const e=n[o].$filler;e&&(e.line.updateControlPoints(a,e.axis),i&&e.fill&&uc(t.ctx,e,a))}},beforeDatasetsDraw(t,e,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=t.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const e=i[n].$filler;Qd(e)&&uc(t.ctx,e,t.chartArea)}},beforeDatasetDraw(t,e,s){const i=e.meta.$filler;Qd(i)&&"beforeDatasetDraw"===s.drawTime&&uc(t.ctx,i,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vc=(t,e)=>{let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},_c=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class kc extends Jl{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=$s(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const s=t.labels,i=In(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=vc(s,n);let r,d;e.font=i.string,this.isHorizontal()?(r=this.maxWidth,d=this._fitRows(a,n,o,l)+10):(d=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],d=i+o;let c=t;n.textAlign="left",n.textBaseline="middle";let h=-1,u=-d;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(c+=d,r[r.length-(p>0?0:1)]=0,u+=d,h++),l[p]={left:0,top:u,row:h,width:g,height:i},r[r.length-1]+=g+o}),c}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],d=a-t;let c=o,h=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=wc(s,e,n,t,i);a>0&&u+m+2*o>d&&(c+=h+o,r.push({width:h,height:u}),p+=h+o,g++,h=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},h=Math.max(h,f),u+=m+o}),c+=h,r.push({width:h,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ua(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ii(s,this.left+i,this.right-this.lineWidths[n]);for(const l of e)n!==l.row&&(n=l.row,o=Ii(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+t+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const l of e)l.col!==n&&(n=l.col,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;xn(t,this),this._draw(),vn(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=cn.color,l=Ua(t.rtl,this.left,this.width),r=In(a.font),{padding:d}=a,c=r.size,h=c/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vc(a,c),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ms(s.lineWidth,1);if(i.fillStyle=Ms(s.fillStyle,o),i.lineCap=Ms(s.lineCap,"butt"),i.lineDashOffset=Ms(s.lineDashOffset,0),i.lineJoin=Ms(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ms(s.strokeStyle,o),i.setLineDash(Ms(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(t,p/2),d=e+h;bn(i,o,r,d,a.pointStyleWidth&&p)}else{const a=e+Math.max((c-g)/2,0),o=l.leftForLtr(t,p),r=Ln(s.borderRadius);i.beginPath(),Object.values(r).some(t=>0!==t)?Tn(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Fn(i,s.text,t,e+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ii(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ii(n,this.top+x+d,this.bottom-e[0].height),line:0},Oa(this.ctx,t.textDirection);const v=f+d;this.legendItems.forEach((o,c)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+h+g;let k=u.x,w=u.y;l.setWidth(this.width),y?c>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ii(n,this.left+d,this.right-s[u.line])):c>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+d,u.line++,w=u.y=Ii(n,this.top+x+d,this.bottom-e[u.line].height));const C=l.x(k);if(m(C,w,o),k=Ui(f,k+p+h,y?k+_:this.right,t.rtl),b(l.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const t=r.lineHeight;u.y+=Fc(o,t)+d}else u.y+=v}),Ra(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=In(e.font),i=En(e.padding);if(!e.display)return;const n=Ua(t.rtl,this.left,this.width),a=this.ctx,o=e.position,l=s.size/2,r=i.top+l;let d,c=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),d=this.top+r,c=Ii(t.align,c,this.right-h);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);d=r+Ii(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Ii(o,c,c+h);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Fn(a,e.text,u,d,s)}_computeTitleHeight(){const t=this.options.title,e=In(t.font),s=En(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(wi(t,this.left,this.right)&&wi(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function Sc(t,e,s){let i=t;return"string"!==typeof e.text&&(i=Fc(e,s)),i}function Fc(t,e){const s=t.text?t.text.length:0;return e*s}function Tc(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var Pc={id:"legend",_element:kc,start(t,e,s){const i=t.legend=new kc({ctx:t.ctx,options:s,chart:t});Pl.configure(t,i,s),Pl.addBox(t,i)},stop(t){Pl.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Pl.configure(t,i,s),i.options=s},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const r=t.controller.getStyle(s?0:void 0),d=En(r.borderWidth);return{text:e[t.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const Mc={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,l=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function $c(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Vc(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:l}=e,r=In(e.bodyFont),d=In(e.titleFont),c=In(e.footerFont),h=a.length,u=n.length,p=i.length,g=En(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,h&&(f+=h*d.lineHeight+(h-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*t+(b-p)*r.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=d.string,Vs(t.title,x),s.font=r.string,Vs(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,Vs(i,t=>{Vs(t.before,x),Vs(t.lines,x),Vs(t.after,x)}),y=0,s.font=c.string,Vs(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Lc(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Ec(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Ic(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=t;let d="center";return"center"===i?d=n<=(l+r)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Ec(d,t,e,s)&&(d="center"),d}function Uc(t,e,s){const i=s.yAlign||e.yAlign||Lc(t,s);return{xAlign:s.xAlign||e.xAlign||Ic(t,e,s,i),yAlign:i}}function Oc(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Rc(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Wc(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:l,yAlign:r}=s,d=n+a,{topLeft:c,topRight:h,bottomLeft:u,bottomRight:p}=Ln(o);let g=Oc(e,l);const f=Rc(e,r,d);return"center"===r?"left"===l?g+=d:"right"===l&&(g-=d):"left"===l?g-=Math.max(c,u)+n:"right"===l&&(g+=Math.max(h,p)+n),{x:_i(g,0,i.width-e.width),y:_i(f,0,i.height-e.height)}}function Bc(t,e,s){const i=En(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function Nc(t){return Dc([],Ac(t))}function zc(t,e,s){return Rn(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function jc(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const qc={beforeTitle:ks,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=jc(s,t);Dc(e.before,Ac(Hc(n,"beforeLabel",this,t))),Dc(e.lines,Hc(n,"label",this,t)),Dc(e.after,Ac(Hc(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return Nc(Hc(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=Hc(s,"beforeFooter",this,t),n=Hc(s,"footer",this,t),a=Hc(s,"afterFooter",this,t);let o=[];return o=Dc(o,Ac(i)),o=Dc(o,Ac(n)),o=Dc(o,Ac(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=e.length;ot.filter(e,i,n,s))),t.itemSort&&(r=r.sort((e,i)=>t.itemSort(e,i,s))),Vs(r,e=>{const s=jc(t.callbacks,e);i.push(Hc(s,"labelColor",this,e)),n.push(Hc(s,"labelPointStyle",this,e)),a.push(Hc(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=Mc[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=Vc(this,s),o=Object.assign({},t,e),l=Uc(this.chart,s,o),r=Wc(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:d,bottomRight:c}=Ln(o),{x:h,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=h,m=f-a,y=x+a,v=x-a):(f=h+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?h+Math.max(l,d)+a:"right"===i?h+p-Math.max(r,c)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=Ua(s.rtl,this.x,this.width);for(t.x=Bc(this,s.titleAlign,s),e.textAlign=r.textAlign(s.titleAlign),e.textBaseline="middle",a=In(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Tn(t,{x:e,y:p,w:r,h:l,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Tn(t,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,r,l),t.strokeRect(e,p,r,l),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,r-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:d}=s,c=In(s.bodyFont);let h=c.lineHeight,u=0;const p=Ua(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+h/2),t.y+=h+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Bc(this,f,s),e.fillStyle=s.bodyColor,Vs(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+d:r+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,Vs(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),h=Math.max(c.lineHeight,l)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Mc[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Vc(this,t),o=Object.assign({},s,this._size),l=Uc(e,t,o),r=Wc(t,o,l,e);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=s,this.drawBackground(n,t,i,e),Oa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ra(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!Ls(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),l=e||!Ls(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=Mc[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,De.A)(Xc,"positioners",Mc);var Kc={id:"tooltip",_element:Xc,positioners:Mc,afterInit(t,e,s){s&&(t.tooltip=new Xc({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:qc},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Qc=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Yc(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Qc(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Gc=(t,e)=>null===t?null:_i(Math.round(t),0,e);function Jc(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function th(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:d,maxTicks:c,maxDigits:h,includeBounds:u}=t,p=a||1,g=c-1,{min:f,max:m}=e,b=!Cs(o),y=!Cs(l),x=!Cs(d),v=(m-f)/(h+1);let _,k,w,C,S=li((m-f)/g/p)*p;if(Sg&&(S=li(C*S/g/p)*p),Cs(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&hi((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,c)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:t})}return y&&u&&w!==l?s.length&&oi(s[s.length-1].value,l,eh(l,v,t))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function eh(t,e,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,De.A)(Zc,"id","category"),(0,De.A)(Zc,"defaults",{ticks:{callback:Jc}});class sh extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Cs(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=ai(i),e=ai(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=th(i,n);return"ticks"===t.bounds&&ui(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Zi(t,this.chart.options.locale,this.options.ticks.format)}}class ih extends sh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?t:0,this.max=Ts(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,De.A)(ih,"id","linear"),(0,De.A)(ih,"defaults",{ticks:{callback:sn.formatters.numeric}});const nh=t=>Math.floor(ni(t)),ah=(t,e)=>Math.pow(10,nh(t)+e);function oh(t){const e=t/Math.pow(10,nh(t));return 1===e}function lh(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function rh(t,e){const s=e-t;let i=nh(s);while(lh(t,e,i)>10)i++;while(lh(t,e,i)<10)i--;return Math.min(i,nh(t))}function dh(t,{min:e,max:s}){e=Ps(t.min,e);const i=[],n=nh(e);let a=rh(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,d=Math.round((e-r)*o)/o,c=Math.floor((e-r)/l/10)*l*10;let h=Math.floor((d-c)/Math.pow(10,a)),u=Ps(t.min,Math.round((r+c+h*Math.pow(10,a))*o)/o);while(u=10?h=h<15?15:20:h++,h>=20&&(a++,h=2,o=a>=0?1:o),u=Math.round((r+c+h*Math.pow(10,a))*o)/o;const p=Ps(t.max,u);return i.push({value:p,major:oh(p),significand:h}),i}class ch extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=sh.prototype.parse.apply(this,[t,e]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?Math.max(0,t):null,this.max=Ts(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=t===ah(this.min,0)?ah(this.min,-1):ah(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(ah(s,-1)),a(ah(i,1)))),s<=0&&n(ah(i,-1)),i<=0&&a(ah(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dh(e,this);return"ticks"===t.bounds&&ui(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":Zi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ni(t),this._valueRange=ni(this.max)-ni(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ni(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function hh(t){const e=t.ticks;if(e.display&&t.display){const t=En(e.backdropPadding);return Ms(e.font&&e.font.size,cn.font.size)+t.height}return 0}function uh(t,e,s){return s=Ss(s)?s:[s],{w:pn(t,e.string,s),h:s.length*e.lineHeight}}function ph(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function gh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,l=o.centerPointLabels?Ys/a:0;for(let r=0;re.r&&(l=(i.end-e.r)/a,t.r=Math.max(t.r,e.r+l)),n.starte.b&&(r=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+r))}function mh(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=t.getPointPosition(e,i+n+o,a),d=Math.round(gi(xi(r.angle+ei))),c=_h(r.y,l.h,d),h=xh(d),u=vh(r.x,l.w,h);return{visible:!0,x:r.x,y:c,textAlign:h,left:u,top:c,right:u+l.w,bottom:c+l.h}}function bh(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=yn({x:s,y:i},e)||yn({x:s,y:a},e)||yn({x:n,y:i},e)||yn({x:n,y:a},e);return!o}function yh(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:hh(a)/2,additionalAngle:o?Ys/n:0};let d;for(let c=0;c270||s<90)&&(t-=e),t}function kh(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=e;if(!Cs(l)){const s=Ln(e.borderRadius),r=En(e.backdropPadding);t.fillStyle=l;const d=i-r.left,c=n-r.top,h=a-i+r.width,u=o-n+r.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Tn(t,{x:d,y:c,w:h,h:u,radius:s}),t.fill()):t.fillRect(d,c,h,u)}}function wh(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));kh(s,a,e);const o=In(a.font),{x:l,y:r,textAlign:d}=e;Fn(s,t._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Ch(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,Gs);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?gh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(t*e+pi(s))}getDistanceFromCenterForValue(t){if(Cs(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Cs(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){l=this.getDistanceFromCenterForValue(t.value);const s=this.getContext(e),o=i.setContext(s),r=n.setContext(s);Sh(this,o,l,a,r)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),r=this.getPointPosition(o,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const l=s.setContext(this.getContext(o)),r=In(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){t.font=r.string,a=t.measureText(i.label).width,t.fillStyle=l.backdropColor;const e=En(l.backdropPadding);t.fillRect(-a/2-e.left,-n-r.size/2-e.top,a+e.width,r.size+e.height)}Fn(t,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,De.A)(Th,"id","radialLinear"),(0,De.A)(Th,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,De.A)(Th,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,De.A)(Th,"descriptors",{angleLines:{_fallback:"grid"}});const Ph={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Mh=Object.keys(Ph);function Dh(t,e){return t-e}function Ah(t,e){if(Cs(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!ci(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $h(t,e,s,i){const n=Mh.length;for(let a=Mh.indexOf(t);a=Mh.indexOf(s);a--){const s=Mh[a];if(Ph[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return Mh[s?Mh.indexOf(s):0]}function Lh(t){for(let e=Mh.indexOf(t)+1,s=Mh.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Ih(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(e[r].major=!0);return e}function Uh(t,e,s){const i=[],n={},a=e.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$h(n.minUnit,e,s,this._getLabelCapacity(e)),o=Ms(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=ci(l)||!0===l,d={};let c,h,u=e;if(r&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,r?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(c=u,h=0;c+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[t,e,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,d=l&&o[l],c=r&&o[r],h=s[e],u=r&&c&&h&&h.major;return this._adapter.format(t,i||(u?c:d))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[l].pos&&e<=t[r].pos&&({lo:l,hi:r}=Si(t,"pos",e)),({pos:i,time:a}=t[l]),({pos:n,time:o}=t[r])):(e>=t[l].time&&e<=t[r].time&&({lo:l,hi:r}=Si(t,"time",e)),({time:i,pos:a}=t[l]),({time:n,pos:o}=t[r]));const d=n-i;return d?a+(o-a)*(e-i)/d:a}(0,De.A)(Oh,"id","time"),(0,De.A)(Oh,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class Wh extends Oh{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Rh(e,this.min),this._tableRange=Rh(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,l,r,d;for(a=0,o=t.length;a=e&&r<=s&&i.push(r);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Rh(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Rh(this._table,s*this._tableRange+this._minPos,!0)}}(0,De.A)(Wh,"id","timeseries"),(0,De.A)(Wh,"defaults",Oh.defaults);var Bh=s(90144);const Nh={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},zh={ariaLabel:{type:String},ariaDescribedby:{type:String}},jh={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Nh,...zh},qh="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Hh(t){return(0,Bh.ju)(t)?(0,Bh.ux)(t):t}function Xh(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Bh.ju)(e)?new Proxy(t,{}):t}function Kh(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Qh(t,e){t.labels=e}function Yh(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Gh(t,e){const s={labels:[],datasets:[]};return Qh(s,t.labels),Yh(s,t.datasets,e),s}const Jh=(0,i.pM)({props:jh,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Bh.KR)(null),o=(0,Bh.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:l}=t,r=Gh(s,l),d=Xh(r,s);o.value=new ld(a.value,{type:e,data:d,options:{...i},plugins:n})},r=()=>{const e=(0,Bh.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},d=e=>{e.update(t.updateMode)};return(0,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[l,r]=s;const c=(0,Bh.ux)(o.value);if(!c)return;let h=!1;if(n){const t=Hh(n),e=Hh(l);t&&t!==e&&(Kh(c,t),h=!0)}if(a){const e=Hh(a.labels),s=Hh(r.labels),i=Hh(a.datasets),n=Hh(r.datasets);e!==s&&(Qh(c.config.data,e),h=!0),i&&i!==n&&(Yh(c.config.data,i,t.datasetIdKey),h=!0)}h&&(0,i.dY)(()=>{d(c)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zh(t,e){return ld.register(e),(0,i.pM)({props:Nh,setup(e,s){let{expose:n}=s;const a=(0,Bh.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Jh,qh({ref:o},{type:t,...e}))}})}const tu=Zh("doughnut",Ko),eu=Zh("line",Qo);s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(t,e=""){if("AbortError"===t.name)return iu.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=iu[t.status];return s?s(e):new su(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?iu.NETWORK():new su(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return e}catch(a){const t=a instanceof su?a:nu(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Pe.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw nu(t,e)}const e=await t.json();if(!e.success)throw new su(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class lu{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Pe.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var ru=lu;class du{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:Me.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Pe.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var cu=du;class hu{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,d=0,c=0,h=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var uu=hu;ld.register(bd,Kc,Pc,Zc,ih,$d,Dd,xc);const pu=864e5;function gu(t){return String(t).padStart(2,"0")}function fu(t){return`${t.getFullYear()}-${gu(t.getMonth()+1)}-${gu(t.getDate())}`}function mu(){const t=new Date;t.setHours(0,0,0,0);const e=new Date(t.getTime()-6*pu);return[fu(e),fu(t)]}var bu={name:"SysCogStatus",components:{Doughnut:tu,Line:eu,DateRangeCalendar:H},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Me.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},currentTrendGroup(){const t=this.indexInfo.uploadTrend||{},e=t.groupBy||{};return e[this.trendGroupBy]||{series:[]}},trendRawLabels(){const t=this.indexInfo.uploadTrend||{};return t.labels||[]},trendRangeCrossesYear(){const t=new Set;return this.trendRawLabels.forEach(e=>{this.extractTrendLabelDates(e).forEach(e=>t.add(e.year))}),t.size>1},trendDisplayLabels(){return this.trendRawLabels.map(t=>this.formatTrendAxisLabel(t))},hasTrendData(){const t=this.indexInfo.uploadTrend||{};return(t.labels||[]).length>0},trendDateDialogWidth(){return window.innerWidth>768?"420px":"90%"},uploadTrendChartData(){const t=this.indexInfo.uploadTrend||{},e=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:t.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...e.map((t,e)=>{const s=this.getTrendColor(e);return{label:this.formatTrendSeriesName(t),data:t.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const t="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:t}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:t=>{const e=t?.[0]?.dataIndex;return this.trendRawLabels[e]||""},label:t=>{const e=t.parsed||{},s=void 0!==e.y?e.y:t.raw;return` ${t.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:t,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:t,precision:0,callback:t=>Number(t).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},getTrendColor(t){return this.trendColors[t%this.trendColors.length]},formatTrendSeriesName(t){return t?.isOther||"__other__"===t?.name?this.$t("sysStatus.otherChannels"):t?.name||this.$t("sysStatus.unknown")},hexToRgba(t,e){const s=(t||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${e})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${e})`},extractTrendLabelDates(t){const e=String(t||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return e.map(t=>{const[e,s,i]=t.split("-").map(Number);return{year:e,month:s,day:i}})},formatTrendAxisLabel(t){const e=this.extractTrendLabelDates(t);if(0===e.length)return t;const s=(t,e)=>{const s=`${t.month}/${t.day}`;return e?`${t.year}/${s}`:s};if(1===e.length)return s(e[0],this.trendRangeCrossesYear);const[i,n]=e;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(t){Array.isArray(t)&&2===t.length&&t[0]&&t[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:t,endDate:e}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:t,trendEndDate:e}),i=await(0,Pe.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const t=await i.json();this.indexInfo=t}}catch(t){console.error("获取索引信息失败:",t),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new ru({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new cu({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,c.A)(bu,[["render",Te],["__scopeId","data-v-6b0a5e1a"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687)),Tu=(s(18785),s(53676));const Pu=["onClick"];function Mu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=Tu.A;return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>l.toggleDropdown&&l.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>l.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.channelType?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:e.channelType,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["type","class"])):e.icon?((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:e.icon,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["icon","class"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,Pu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",components:{ChannelIcon:Tu.A},props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const Au=(0,c.A)(Du,[["render",Mu],["__scopeId","data-v-3554ed88"]]);var $u=Au;const Vu={class:"upload-settings"},Lu={class:"page-header"},Eu={class:"first-title"},Iu={class:"header-actions"},Uu={class:"group-header"},Ou={class:"group-title"},Ru={key:0,class:"load-balance-switch"},Wu={class:"switch-label"},Bu={key:0,class:"channel-cards"},Nu=["onMousemove","onMouseleave"],zu={class:"card-header"},ju={class:"card-title"},qu={class:"channel-name"},Hu={class:"card-body"},Xu={class:"card-info"},Ku={class:"info-item"},Qu={class:"info-text"},Yu={key:0,class:"info-item"},Gu={class:"info-text"},Ju={key:1,class:"info-item"},Zu=["title"],tp={class:"info-item"},ep={class:"info-text"},sp={key:0,class:"info-item"},ip=["title"],np={class:"info-item"},ap={class:"info-text"},op={class:"info-item"},lp={class:"info-text"},rp={class:"info-item"},dp={class:"info-text"},cp={class:"info-item"},hp=["title"],up={key:0,class:"info-item"},pp=["title"],gp={key:0,class:"quota-mini"},fp={class:"quota-text"},mp={class:"card-actions"},bp={key:1,class:"empty-tip"},yp={class:"channel-type-option"},xp={key:0,class:"form-warning",style:{"margin-top":"0"}},vp=["innerHTML"],_p={class:"form-warning"},kp={class:"quota-label"},wp={class:"quota-status"};function Cp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=$u,h=K.S2,u=Tu.A,p=Fu.u,f=Su.qi,m=k.ve,b=Cu.P9,y=Cu.AV,x=_u.xE,_=wu.WK,S=ku.lq,F=_u.US,T=w.kZ,P=vu.MF,M=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Vu,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Eu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Iu,[(0,i.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:l.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(h,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Uu,[(0,i.Lk)("div",Ou,[(0,i.bF)(u,{type:s.value,class:(0,n.C4)(["group-icon",l.getChannelIconClass(s.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(p,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ru,[(0,i.Lk)("span",Wu,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(f,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>l.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Bu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>l.handleCardMouseMove(t,s.value,o),onMouseleave:t=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",zu,[(0,i.Lk)("div",ju,[(0,i.Lk)("span",qu,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(f,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,C.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",Hu,[(0,i.Lk)("div",Xu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Ku,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Qu,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Gu,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Ju,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Zu)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",tp,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",ep,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",sp,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,ip)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",np,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",ap,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",op,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",lp,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",dp,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",cp,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",up,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,pp)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",gp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",fp,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",mp,[(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"danger",size:"small",onClick:t=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Nu))),128))])):((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(T,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(y,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(b,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.Lk)("span",yp,[(0,i.bF)(u,{type:t.value,class:(0,n.C4)(["select-option-icon",l.getChannelIconClass(t.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(t.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",xp,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,vp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameImmutableTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"])]),_:1}),(0,i.Lk)("div",_p,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(M,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(P,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(P,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(P,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(P,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(P,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(P,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(P,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(P,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",kp,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(h,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",wp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameEditDisabledTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var Sp={components:{ChannelIcon:Tu.A,CustomSelect:$u},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){return[{value:"",label:this.$t("common.all")},...this.channels.map(t=>({value:t.value,label:t.label,channelType:t.value,iconClass:this.getChannelIconClass(t.value)}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,l=`glow-${e}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelIconClass(t){return`channel-brand-${t}`},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.currentChannelIndex,i=e.channels[s]?.name||this.editChannel.name,n={...this.editChannel,name:i};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(n.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));n.headers=t,n.createDirectory=!1!==n.createDirectory,delete n.headersText}e.channels[this.currentChannelIndex]=n,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.warning"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Pe.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Fp=(0,c.A)(Sp,[["render",Cp],["__scopeId","data-v-68503f89"]]);var Tp=Fp,Pp=s(98469);s(49187);const Mp={class:"save-text"};function Dp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>l.handleClick&&l.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",Mp,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Ap={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const $p=(0,c.A)(Ap,[["render",Dp],["__scopeId","data-v-a230355c"]]);var Vp=$p,Lp=s(84757);s(5802),s(64752),s(38736);const Ep={class:"security-settings"},Ip={class:"first-settings"},Up={class:"first-title"},Op={class:"second-title"},Rp={style:{display:"flex",gap:"8px",width:"100%"}},Wp={class:"second-title"},Bp={style:{display:"flex",gap:"8px",width:"100%"}},Np={class:"second-title token-title"},zp={class:"token-actions"},jp={class:"token-table-container"},qp={class:"table-cell-content"},Hp={class:"table-cell-content"},Xp={class:"token-display"},Kp={class:"table-cell-content"},Qp={class:"table-cell-content"},Yp={class:"table-cell-content"},Gp={class:"table-cell-content"},Jp={class:"table-cell-content action-buttons"},Zp={class:"first-settings"},tg={class:"first-title"},eg={class:"second-title"},sg={class:"second-title"},ig={class:"query-param-list"},ng={class:"query-param-list"},ag={class:"first-settings"},og={class:"first-title"},lg={class:"second-title"},rg={class:"second-title"},dg={class:"second-title"},cg={class:"form-item-hint"},hg={class:"form-item-hint"},ug={style:{display:"flex",gap:"10px",width:"100%"}},pg={class:"dialog-footer"},gg={style:{display:"flex",gap:"10px",width:"100%"}},fg={class:"dialog-footer"},mg={class:"token-result"},bg={style:{"margin-bottom":"15px",color:"#e6a23c"}},yg={class:"dialog-footer"};function xg(t,e,s,a,o,l){const r=wu.WK,d=Pp.dI,c=_u.xE,h=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Lp.o8,m=Fu.u,b=Lp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Vp,T=Pp.o5,P=w.kZ,M=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ep,[(0,i.Lk)("div",Ip,[(0,i.Lk)("h3",Up,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Op,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(h,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Rp,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Wp,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(h,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Bp,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Np,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",zp,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",jp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",qp,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Hp,[(0,i.Lk)("span",Xp,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Kp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Qp,(0,n.v_)(l.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Yp,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Gp,(0,n.v_)(l.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Jp,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>l.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>l.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[M,o.tokenLoading]])])]),(0,i.Lk)("div",Zp,[(0,i.Lk)("h3",tg,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",eg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"]),(0,i.Lk)("h4",sg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.ipQuery"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.ipQueryTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.ipQuery,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableIpQuery")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.ipQuery.enabled,"onUpdate:modelValue":e[12]||(e[12]=t=>o.uploadSettings.ipQuery.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.ipQueryChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.ipQuery.channel,"onUpdate:modelValue":e[13]||(e[13]=t=>o.uploadSettings.ipQuery.channel=t),placeholder:t.$t("sysSecurity.ipQueryChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:t.$t("sysSecurity.customApi"),value:"customApi"},null,8,["label"])]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"customApi"===o.uploadSettings.ipQuery.channel?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(c,{label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.url,"onUpdate:modelValue":e[14]||(e[14]=t=>o.uploadSettings.ipQuery.customApi.url=t),placeholder:"https://api.example.com/ip"},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.queryParams")},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ig,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.params,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"query-param-row"},[(0,i.bF)(r,{modelValue:e.key,"onUpdate:modelValue":t=>e.key=t,placeholder:t.$t("sysSecurity.paramNamePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(r,{modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,placeholder:t.$t("sysSecurity.paramValuePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryParam(s),disabled:o.uploadSettings.ipQuery.customApi.params.length<=1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryParam},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addQueryParam")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"]),(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.responseFields"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.responseFieldsTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",ng,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.responseFields,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"response-field-row"},[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.responseFields[s],"onUpdate:modelValue":t=>o.uploadSettings.ipQuery.customApi.responseFields[s]=t,placeholder:t.$t("sysSecurity.responseFieldPathPlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,-1),disabled:0===s},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-up"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,1),disabled:s===o.uploadSettings.ipQuery.customApi.responseFields.length-1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-down"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryResponseField(s)},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryResponseField},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addResponseField")),1)]),_:1},8,["onClick"])])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",ag,[(0,i.Lk)("h3",og,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",lg,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",rg,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(h,{model:o.accessSettings,rules:l.accessRules,ref:"accessForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",dg,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[17]||(e[17]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(c,{label:t.$t("sysSecurity.userSessionMaxAge"),prop:"userSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[18]||(e[18]=t=>o.accessSettings.userSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",cg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminSessionMaxAge"),prop:"adminSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[19]||(e[19]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",hg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(P,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[27]||(e[27]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",pg,[(0,i.bF)(p,{onClick:e[26]||(e[26]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.neverExpire=t),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ug,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",fg,[(0,i.bF)(p,{onClick:e[34]||(e[34]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.neverExpire=t),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",gg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[38]||(e[38]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",yg,[(0,i.bF)(p,{type:"primary",onClick:e[37]||(e[37]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.Lk)("p",bg,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(h,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[36]||(e[36]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[M,o.loading]])}s(81148);const vg={s:1e3,m:6e4,h:36e5,d:864e5};function _g(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(vg[s])return new Date(i.getTime()+e*vg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function kg(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function wg(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=kg(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Cg={components:{FloatingSaveButton:Vp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{},ipQuery:{enabled:!1,channel:"customApi",customApi:{url:"",params:[{key:"ip",value:"{ip}"}],responseFields:[]}}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},accessRules(){const t=(t,e,s)=>{!Number.isInteger(e)||e<1||e>3650?s(new Error(this.$t("sysSecurity.sessionMaxAgeInvalid"))):s()};return{userSessionMaxAge:[{validator:t,trigger:"change"}],adminSessionMaxAge:[{validator:t,trigger:"change"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},methods:{normalizeIpQuerySettings(t={}){const e=t.ipQuery||{},s=e.customApi||{},i=Array.isArray(s.params)&&s.params.length>0?s.params.map(t=>({key:t?.key||"",value:t?.value||""})):[{key:"ip",value:"{ip}"}],n=Array.isArray(s.responseFields)?s.responseFields.map(t=>"string"===typeof t?t:t?.path||""):[];return{...t,moderate:t.moderate||{},ipQuery:{enabled:e.enabled??!1,channel:e.channel||"customApi",customApi:{url:s.url||"",params:i,responseFields:n}}}},addIpQueryParam(){this.uploadSettings.ipQuery.customApi.params.push({key:"",value:""})},removeIpQueryParam(t){this.uploadSettings.ipQuery.customApi.params.length<=1||this.uploadSettings.ipQuery.customApi.params.splice(t,1)},addIpQueryResponseField(){this.uploadSettings.ipQuery.customApi.responseFields.push("")},removeIpQueryResponseField(t){this.uploadSettings.ipQuery.customApi.responseFields.splice(t,1)},moveIpQueryResponseField(t,e){const s=this.uploadSettings.ipQuery.customApi.responseFields,i=t+e;if(i<0||i>=s.length)return;const[n]=s.splice(t,1);s.splice(i,0,n)},handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Pe.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=_g(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=_g(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Pe.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return wg(t)},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.accessForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.userSessionMaxAge>3650||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge)||this.accessSettings.adminSessionMaxAge>3650)return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Pe.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=this.normalizeIpQuerySettings(t.upload),this.accessSettings=t.access,this.oriUserPassword="",this.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Sg=(0,c.A)(Cg,[["render",xg],["__scopeId","data-v-f87cbcb2"]]);var Fg=Sg;const Tg={class:"page-settings"},Pg={class:"first-title"},Mg={key:5,class:"announcement-refresh-option"};function Dg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Cu.P9,h=Cu.AV,u=Su.qi,p=wu.WK,f=Pp.dI,m=_u.xE,b=_u.US,y=Vp,x=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Tg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(s,a)=>((0,i.uX)(),(0,i.CE)("div",{key:a,class:"first-settings"},[(0,i.Lk)("h3",Pg,(0,n.v_)(a),1),(0,i.bF)(b,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s,(s,a)=>((0,i.uX)(),(0,i.Wv)(m,{key:s.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(s,"label"))+" ",1),s.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:l.localized(s,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.value,label:l.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:1,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===s.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===s.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,type:"textarea",autosize:{minRows:2},resize:"vertical",disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])),"announcement"===s.id?((0,i.uX)(),(0,i.CE)("div",Mg,[(0,i.bF)(f,{modelValue:o.refreshAnnouncement,"onUpdate:modelValue":e[0]||(e[0]=t=>o.refreshAnnouncement=t)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysPage.refreshAnnouncement")),1)]),_:1},8,["modelValue"])])):(0,i.Q3)("",!0)]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(y,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[x,o.loading]])}var Ag=s(457),$g={components:{FloatingSaveButton:Vp},data(){return{settings:{config:[]},loading:!0,refreshAnnouncement:!1,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Pe.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...this.settings,refreshAnnouncement:this.refreshAnnouncement})}).then(()=>{this.refreshAnnouncement=!1,this.$message.success(this.$t("sysPage.settingsSaved"))})},async fetchAvailableChannels(){try{const t=await Ag.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Pe.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Vg=(0,c.A)($g,[["render",Dg],["__scopeId","data-v-5fc03908"]]);var Lg=Vg;const Eg={class:"others-settings"},Ig={class:"first-settings"},Ug={class:"first-title"},Og={class:"first-title"},Rg={class:"first-title"},Wg={class:"first-title"},Bg=["innerHTML"],Ng={class:"first-title"};function zg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Su.qi,h=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Eg,[(0,i.Lk)("div",Ig,[(0,i.Lk)("h3",Ug,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Og,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Rg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Wg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,Bg)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Ng,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var jg={components:{FloatingSaveButton:Vp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Pe.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Pe.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const qg=(0,c.A)(jg,[["render",zg],["__scopeId","data-v-69ae97d8"]]);var Hg=qg,Xg=s(48903),Kg={name:"SystemConfig",mixins:[Xg.A],data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:xu,SysCogUpload:Tp,SysCogSecurity:Fg,SysCogPage:Lg,SysCogOthers:Hg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return xu;case"upload":return Tp;case"security":return Fg;case"page":return Lg;case"others":return Hg;default:return xu}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Qg=(0,c.A)(Kg,[["render",x],["__scopeId","data-v-036a2d40"]]);var Yg=Qg},34396:function(t,e,s){s(85331),s(4885)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},53676:function(t,e,s){s.d(e,{A:function(){return h}});var i=s(56768);const n={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},a={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},o={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function l(t,e,s,l,r,d){const c=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("span",(0,i.v6)(t.$attrs,{class:"channel-icon-wrapper"}),["telegram"===s.type?((0,i.uX)(),(0,i.CE)("svg",n,[...e[0]||(e[0]=[(0,i.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"===s.type?((0,i.uX)(),(0,i.CE)("svg",a,[...e[1]||(e[1]=[(0,i.Fv)('',9)])])):"webdav"===s.type?((0,i.uX)(),(0,i.CE)("svg",o,[...e[2]||(e[2]=[(0,i.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,i.uX)(),(0,i.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 t={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return t[this.type]||"server"}}},d=s(71241);const c=(0,d.A)(r,[["render",l],["__scopeId","data-v-33933ada"]]);var h=c},63003:function(t,e,s){s(85331)},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},98642:function(t,e,s){s(85331)}}]); -//# sourceMappingURL=647.408915ac.js.map \ No newline at end of file +class eo{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,s,i){const n=e.listeners[i],a=e.duration;n.forEach(i=>i({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var so=new eo;const io="transparent",no={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=qi(t||io),n=i.valid&&qi(e||io);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class ao{constructor(t,e,s,i){const n=e[s];i=Un([t.to,i,n,t.from]);const a=Un([t.from,n,i]);this._active=!0,this._fn=t.fn||no[t.type||typeof a],this._easing=zi[t.easing]||zi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Un([t.to,e,i,t.from]),this._from=Un([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Fs(n))return;const a={};for(const t of e)a[t]=n[t];(Ss(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=ro(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&lo(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(t,e));continue}const d=e[r];let c=n[r];const h=s.get(r);if(c){if(h&&c.active()){c.update(h,d,o);continue}c.cancel()}h&&h.duration?(n[r]=c=new ao(h,t,r,d),i.push(c)):t[r]=d}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(so.add(this._chart,s),!0):void 0}}function lo(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function _o(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,d=o.axis,c=bo(a,o,i),h=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function wo(t,e){return Rn(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Co(t,e,s){return Rn(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function So(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Fo=t=>"reset"===t||"none"===t,To=(t,e)=>e?t:Object.assign({},t),Po=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:po(s,!0),values:null};class Mo{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=mo(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&So(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Ms(s.xAxisID,ko(t,"x")),a=e.yAxisID=Ms(s.yAxisID,ko(t,"y")),o=e.rAxisID=Ms(s.rAxisID,ko(t,"r")),l=e.indexAxis,r=e.iAxisID=i(l,n,a,o),d=e.vAxisID=i(l,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(r),e.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&Di(this._data,this),t._stacked&&So(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Fs(e)){const t=this._cachedMeta;this._data=fo(e,t)}else if(s!==e){if(s){Di(s,this);const t=this._cachedMeta;So(t),t._parsed=[]}e&&Object.isExtensible(e)&&Mi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=mo(e.vScale,e),e.stack!==s.stack&&(i=!0,So(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(_o(this,e._parsed),e._stacked=mo(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,d,c=0===t&&e===i.length||s._sorted,h=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[t])?this.parseArrayData(s,i,t,e):Fs(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===r[o]||h&&r[o]e||c=0;--h)if(!p()){this.updateRangeFromParsed(r,t,u,l);break}return r}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=r.resolveNamedOptions(h,u,p,c);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(To(g,l))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(t,s,e))}const r=new oo(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Fo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Fo(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Fo(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(l(n),o=t;ot-e))}return t._cache.$bar}function Ao(t){const e=t.iScale,s=Do(e,t.type);let i,n,a,o,l=e._length;const r=()=>{32767!==a&&-32768!==a&&(Hs(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,l=tMath.abs(l)&&(r=l,d=o),e[s.axis]=d,e._custom={barStart:r,barEnd:d,start:n,end:a,min:o,max:l}}function Eo(t,e,s,i){return Ss(t)?Lo(t,e,s,i):e[s.axis]=s.parse(t,i),e}function Io(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),l=n===a,r=[];let d,c,h,u;for(d=s,c=s+i;d=s?1:-1)}function Ro(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),l=o&&o[s.axis],r=t=>{const e=t._parsed.find(t=>t[s.axis]===l),i=e&&e[t.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===e||!r(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Ms("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[t]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(e,i),d=a.axis,c=o.axis;for(let h=e;hvi(t,l,r,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>vi(t,l,r,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,d,h),m=p(ei,c,u),b=g(Ys,d,h),y=g(Ys+ei,c,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,De.A)(Ho,"id","bubble"),(0,De.A)(Ho,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,De.A)(Ho,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Mo{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Fs(s[t])){const{key:t="value"}=this._parsing;o=e=>+js(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?Gs*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,l;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,De.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,l)=>{const r=t.getDatasetMeta(0),d=r.controller.getStyle(l);return{text:e,fillStyle:d.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(l),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:l}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Qo extends Mo{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:l}=Oi(e,i,a);this._drawStart=o,this._drawCount=l,Ri(e)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},t),this.updateElements(i,o,l,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:d,includeOptions:c}=this._getSharedOptions(e,i),h=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=ci(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[h]=a.getPixelForValue(y[h],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[h]-x[h])>f,g&&(p.parsed=y,p.raw=r.data[v]),c&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,De.A)(Qo,"id","line"),(0,De.A)(Qo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,De.A)(Qo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Yo extends Mo{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,d=r.xCenter,c=r.yCenter,h=r.getIndexAngle(0)-.5*Ys;let u,p=h;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?pi(this.resolveDataElementOptions(t,e).angle||s):0}}(0,De.A)(Yo,"id","polarArea"),(0,De.A)(Yo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,De.A)(Yo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,De.A)(Go,"id","pie"),(0,De.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Mo{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=r.data[x]),h&&(d.options=c||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,d,i),y=s}this.updateSharedOptions(c,i,d)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,De.A)(Zo,"id","scatter"),(0,De.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,De.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function tl(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class el{static override(t){Object.assign(el.prototype,t)}constructor(t){(0,De.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return tl()}parse(){return tl()}format(){return tl()}add(){return tl()}diff(){return tl()}startOf(){return tl()}endOf(){return tl()}}var sl={_date:el};function il(t,e,s,i){const{controller:n,data:a,_sorted:o}=t,l=n._cachedMeta.iScale,r=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(l&&e===l.axis&&"r"!==e&&o&&a.length){const o=l._reversePixels?Fi:Si;if(!i){const i=o(a,e,s);if(r){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!Cs(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!Cs(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nl(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let l=0,r=a.length;l{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:r}),l=l||t.inRange(e.x,e.y,n))}),i&&!l?[]:a}var hl={evaluateInteractionItems:nl,modes:{index(t,e,s,i){const n=Sa(e,t),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o),r=[];return l.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=l[0].index,s=t.data[e];s&&!s.skip&&r.push({element:s,datasetIndex:t.index,index:e})}),r):[]},dataset(t,e,s,i){const n=Sa(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o);if(l.length>0){const e=l[0].datasetIndex,s=t.getDatasetMeta(e).data;l=[];for(let t=0;tt.pos===e)}function gl(t,e){return t.filter(t=>-1===ul.indexOf(t.pos)&&t.box.axis===e)}function fl(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function ml(t){const e=[];let s,i,n,a,o,l;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=fl(pl(e,"left"),!0),n=fl(pl(e,"right")),a=fl(pl(e,"top"),!0),o=fl(pl(e,"bottom")),l=gl(e,"x"),r=gl(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:pl(e,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function vl(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function _l(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function kl(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Fs(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&_l(o,a.getPadding());const l=Math.max(0,e.outerWidth-vl(o,t,"left","right")),r=Math.max(0,e.outerHeight-vl(o,t,"top","bottom")),d=l!==t.w,c=r!==t.h;return t.w=l,t.h=r,s.horizontal?{same:d,other:c}:{same:c,other:d}}function wl(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function Cl(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Sl(t,e,s,i){const n=[];let a,o,l,r,d,c;for(a=0,o=t.length,d=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=r.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,h=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);_l(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yl(r.concat(d),h);Sl(l.fullSize,p,h,g),Sl(r,p,h,g),Sl(d,p,h,g)&&Sl(r,p,h,g),wl(p),Tl(l.leftAndTop,p,h,g),p.x+=p.w,p.y+=p.h,Tl(l.rightAndBottom,p,h,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Vs(l.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Ml{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Dl extends Ml{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Al="$chartjs",$l={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vl=t=>null===t||""===t;function Ll(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Al]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Vl(n)){const e=Aa(t,"width");void 0!==e&&(t.width=e)}if(Vl(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Aa(t,"height");void 0!==e&&(t.height=e)}return t}const El=!!Da&&{passive:!0};function Il(t,e,s){t&&t.addEventListener(e,s,El)}function Ul(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,El)}function Ol(t,e){const s=$l[t.type]||t.type,{x:i,y:n}=Sa(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rl(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function Wl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.addedNodes,i),e=e&&!Rl(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Bl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.removedNodes,i),e=e&&!Rl(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const Nl=new Map;let zl=0;function jl(){const t=window.devicePixelRatio;t!==zl&&(zl=t,Nl.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function ql(t,e){Nl.size||window.addEventListener("resize",jl),Nl.set(t,e)}function Hl(t){Nl.delete(t),Nl.size||window.removeEventListener("resize",jl)}function Xl(t,e,s){const i=t.canvas,n=i&&ba(i);if(!n)return;const a=Vi((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),ql(t,a),o}function Kl(t,e,s){s&&s.disconnect(),"resize"===e&&Hl(t)}function Ql(t,e,s){const i=t.canvas,n=Vi(e=>{null!==t.ctx&&s(Ol(e,t))},t);return Il(i,e,n),n}class Yl extends Ml{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Ll(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Al])return!1;const s=e[Al].initial;["height","width"].forEach(t=>{const i=s[t];Cs(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Al],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:Wl,detach:Bl,resize:Xl},a=n[e]||Ql;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:Kl,detach:Kl,resize:Kl},a=n[e]||Ul;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Pa(t,e,s,i)}isAttached(t){const e=t&&ba(t);return!(!e||!e.isConnected)}}function Gl(t){return!ma()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Dl:Yl}class Jl{constructor(){(0,De.A)(this,"x",void 0),(0,De.A)(this,"y",void 0),(0,De.A)(this,"active",!1),(0,De.A)(this,"options",void 0),(0,De.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return ci(this.x)&&ci(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function Zl(t,e){const s=t.options.ticks,i=tr(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sr(e):[],o=a.length,l=a[0],r=a[o-1],d=[];if(o>n)return ir(e,d,a,o/n),d;const c=er(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(nr(e,d,c,Cs(i)?0:l-i,l),t=0,s=o-1;tn)return t}return Math.max(n,1)}function sr(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,lr=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,rr=(t,e)=>Math.min(e||t,t);function dr(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+l)))return d}function hr(t,e){Vs(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ps(s,Ps(i,s)),max:Ps(i,Ps(s,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$s(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),c=d.widest.width,h=d.highest.height,u=_i(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),c+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-ur(t.grid)-e.padding-pr(t.title,this.chart.options.font),l=Math.sqrt(c*c+h*h),r=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/l,-1,1))-Math.asin(_i(h/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pr(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=ur(n)+a):(t.height=this.maxHeight,t.width=ur(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=pi(this.labelRotation),d=Math.cos(r),c=Math.sin(r);if(o){const e=s.mirror?0:c*n.width+d*a.height;t.height=Math.min(this.maxHeight,t.height+e+l)}else{const e=s.mirror?0:d*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+l)}this._calculatePadding(e,i,c,d)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,h=0;l?r?(c=i*t.width,h=s*e.height):(c=s*t.height,h=i*e.width):"start"===n?h=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,h=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((h-d+a)*this.width/(this.width-d),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){$s(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return ki(this._alignToPixels?gn(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*i?o/s:l/i:l*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),d=this.ticks,c=d.length+(l?1:0),h=ur(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return gn(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-h,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+h;else if("left"===a)b=m(this.right),_=this.right-h,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+h;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+h}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-h,S=t.left,T=t.right}const M=Ms(i.ticks.maxTicksLimit,c),D=Math.max(1,Math.ceil(c/M));for(y=0;y0&&(a-=i/2);break}h={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:d,textAlign:u,textBaseline:P,translation:[v,_],backdrop:h}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-pi(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,l=a.widest.width;let r,d;return"left"===e?i?(d=this.right+n,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d+=l)):(d=this.right-o,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d=this.left)):"right"===e?i?(d=this.left+n,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d-=l)):(d=this.left+o,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d=this.right)):r="right",{textAlign:r,x:d}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),l=o.pop(),r=o.join(".");cn.route(a,n,r,l)})}function kr(t){return"id"in t&&"defaults"in t}class wr{constructor(){this.controllers=new xr(Mo,"datasets",!0),this.elements=new xr(Jl,"elements"),this.plugins=new xr(Object,"plugins"),this.scales=new xr(yr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):Vs(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=qs(t);$s(s["before"+i],[],s),e[t](s),$s(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Fr(t){const e={},s=[],i=Object.keys(Cr.plugins.items);for(let a=0;a1&&Vr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Ir(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function Ur(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return Ir(t,"x",s[0])||Ir(t,"y",s[0])}return{}}function Or(t,e){const s=an[t.type]||{scales:{}},i=e.scales||{},n=Dr(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Fs(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=Er(e,o,Ur(e,t),cn.scales[o.type]),r=$r(l,n),d=s.scales||{};a[e]=Rs(Object.create(null),[{axis:l},o,d[l],d[r]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Dr(n,e),l=an[n]||{},r=l.scales||{};Object.keys(r).forEach(t=>{const e=Ar(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:e},i[n],r[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Rs(e,[cn.scales[e.type],cn.scale])}),a}function Rr(t){const e=t.options||(t.options={});e.plugins=Ms(e.plugins,{}),e.scales=Or(t,e)}function Wr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Br(t){return t=t||{},t.data=Wr(t.data),Rr(t),t}const Nr=new Map,zr=new Set;function jr(t,e){let s=Nr.get(t);return s||(s=e(),Nr.set(t,s),zr.add(s)),s}const qr=(t,e,s)=>{const i=js(e,s);void 0!==i&&t.add(i)};class Hr{constructor(t){this._config=Br(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Wr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Rr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return jr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return jr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return jr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return jr(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const l=new Set;e.forEach(e=>{t&&(l.add(t),e.forEach(e=>qr(l,t,e))),e.forEach(t=>qr(l,i,t)),e.forEach(t=>qr(l,an[n]||{},t)),e.forEach(t=>qr(l,cn,t)),e.forEach(t=>qr(l,on,t))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),zr.has(e)&&a.set(e,r),r}chartOptionScopes(){const{options:t,type:e}=this;return[t,an[e]||{},cn.datasets[e]||{},{type:e},cn,on]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xr(this._resolverCache,t,i);let l=a;if(Qr(a,e)){n.$shared=!1,s=Xs(s)?s():s;const e=this.createResolver(t,s,o);l=Bn(a,s,e)}for(const r of e)n[r]=l[r];return n}createResolver(t,e,s=[""],i){const{resolver:n}=Xr(this._resolverCache,t,s);return Fs(e)?Bn(n,e,void 0,i):n}}function Xr(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=Wn(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kr=t=>Fs(t)&&Object.getOwnPropertyNames(t).some(e=>Xs(t[e]));function Qr(t,e){const{isScriptable:s,isIndexable:i}=Nn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(Xs(o)||Kr(o))||a&&Ss(o))return!0}return!1}var Yr="4.5.1";const Gr=["top","bottom","left","right","chartArea"];function Jr(t,e){return"top"===t||"bottom"===t||-1===Gr.indexOf(t)&&"x"===e}function Zr(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function td(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),$s(s&&s.onComplete,[t],e)}function ed(t){const e=t.chart,s=e.options.animation;$s(s&&s.onProgress,[t],e)}function sd(t){return ma()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const id={},nd=t=>{const e=sd(t);return Object.values(id).filter(t=>t.canvas===e).pop()};function ad(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function od(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class ld{static register(...t){Cr.add(...t),rd()}static unregister(...t){Cr.remove(...t),rd()}constructor(t,e){const s=this.config=new Hr(e),i=sd(t),n=nd(i);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,d=l&&l.width;this.id=ws(),this.ctx=o,this.canvas=l,this.width=d,this.height=r,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Sr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Li(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&l?(so.listen(this,"complete",td),so.listen(this,"progress",ed),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:i,_aspectRatio:n}=this;return Cs(t)?e&&n?n:i?s/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Cr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Ma(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(t,e){so.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Ma(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Vs(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=Er(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Vs(n,e=>{const n=e.options,a=n.id,o=Er(a,n),l=Ms(n.type,e.dtype);void 0!==n.position&&Jr(n.position,o)===Jr(e.dposition)||(n.position=e.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const t=Cr.getScale(l);r=new t({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,t)}),Vs(i,(t,e)=>{t||delete s[e]}),Vs(s,t=>{Pl.configure(this,t,t.options),Pl.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let r=0,d=this.data.datasets.length;r{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Zr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Vs(this.scales,t=>{Pl.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);Ks(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;ad(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Pl.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],Vs(this.boxes,t=>{s&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,s={meta:t,index:t.index,cancelable:!0},i=to(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(e,i),t.controller.draw(),i&&vn(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return yn(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=hl.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);Hs(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),so.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};Vs(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Vs(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Vs(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!Ls(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),l=Qs(t),r=od(t,this._lastEvent,s,l);s&&(this._lastEvent=null,$s(n.onHover,[t,o,this],this),l&&$s(n.onClick,[t,o,this],this));const d=!Ls(o,i);return(d||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=r,d}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function rd(){return Vs(ld.instances,t=>t._plugins.invalidate())}function dd(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=e,{borderWidth:d,borderJoinStyle:c}=r,h=Math.min(d/o,xi(i-s));if(t.beginPath(),t.arc(n,a,o-d/2,i+h/2,s-h/2),l>0){const e=Math.min(d/l,xi(i-s));t.arc(n,a,l+d/2,s-e/2,i+e/2,!0)}else{const e=Math.min(d/2,o*xi(i-s));if("round"===c)t.arc(n,a,e,s-Ys/2,i+Ys/2,!0);else if("bevel"===c){const o=2*e*e,l=-o*Math.cos(s+Ys/2)+n,r=-o*Math.sin(s+Ys/2)+a,d=o*Math.cos(i+Ys/2)+n,c=o*Math.sin(i+Ys/2)+a;t.lineTo(l,r),t.lineTo(d,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function cd(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=e;let d=n/l;t.beginPath(),t.arc(a,o,l,i-d,s+d),r>n?(d=n/r,t.arc(a,o,r,s+d,i-d,!0)):t.arc(a,o,n,s+ei,i-ei),t.closePath(),t.clip()}function hd(t){return $n(t,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(t,e,s,i){const n=hd(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),l=t=>{const e=(s-Math.min(a,t))*i/2;return _i(t,0,Math.min(a,e))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function gd(t,e,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:d,innerRadius:c}=e,h=Math.max(e.outerRadius+i+s-d,0),u=c>0?c+i+s+d:0;let p=0;const g=n-r;if(i){const t=c>0?c-i:0,e=h>0?h-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*h-s/Ys)/h,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(e,u,h,y-b),w=h-x,C=h-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,M=b+_/T,D=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,l,h,S,e),t.arc(o,l,h,e,F),v>0){const e=pd(C,F,o,l);t.arc(e.x,e.y,v,F,y+ei)}const s=pd(P,y,o,l);if(t.lineTo(s.x,s.y),k>0){const e=pd(P,D,o,l);t.arc(e.x,e.y,k,y+ei,D+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,l,u,y-k/u,i,!0),t.arc(o,l,u,i,b+_/u,!0),_>0){const e=pd(T,M,o,l);t.arc(e.x,e.y,_,M+Math.PI,b-ei)}const n=pd(w,b,o,l);if(t.lineTo(n.x,n.y),x>0){const e=pd(w,S,o,l);t.arc(e.x,e.y,x,b-ei,S)}}else{t.moveTo(o,l);const e=Math.cos(S)*h+o,s=Math.sin(S)*h+l;t.lineTo(e,s);const i=Math.cos(F)*h+o,n=Math.sin(F)*h+l;t.lineTo(i,n)}t.closePath()}function fd(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=e;let r=e.endAngle;if(a){gd(t,e,s,i,r,n);for(let e=0;e=Ys&&0===p&&"miter"!==c&&dd(t,e,f),a||(gd(t,e,s,i,f,n),t.stroke())}(0,De.A)(ld,"defaults",cn),(0,De.A)(ld,"instances",id),(0,De.A)(ld,"overrides",an),(0,De.A)(ld,"registry",Cr),(0,De.A)(ld,"version",Yr),(0,De.A)(ld,"getChart",nd);class bd extends Jl{constructor(t){super(),(0,De.A)(this,"circumference",void 0),(0,De.A)(this,"endAngle",void 0),(0,De.A)(this,"fullCircles",void 0),(0,De.A)(this,"innerRadius",void 0),(0,De.A)(this,"outerRadius",void 0),(0,De.A)(this,"pixelMargin",void 0),(0,De.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:t,y:e}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:d,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),h=(this.options.spacing+this.options.borderWidth)/2,u=Ms(c,l-o),p=vi(n,o,l)&&o!==l,g=u>=Gs||p,f=wi(a,r+h,d+h);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:l,spacing:r}=this.options,d=(i+n)/2,c=(a+o+r+l)/2;return{x:e+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(Ys,s||0)),r=i*l;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,fd(t,this,r,n,a),md(t,this,r,n,a),t.restore()}}function yd(t,e,s=e){t.lineCap=Ms(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Ms(s.borderDash,e.borderDash)),t.lineDashOffset=Ms(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Ms(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ms(s.borderWidth,e.borderWidth),t.strokeStyle=Ms(s.borderColor,e.borderColor)}function xd(t,e,s){t.lineTo(s.x,s.y)}function vd(t){return t.stepped?_n:t.tension||"monotone"===t.cubicInterpolationMode?kn:xd}function _d(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=e,r=Math.max(n,o),d=Math.min(a,l),c=nl&&a>l;return{count:i,start:r,loop:e.loop,ilen:d(o+(d?l-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(r&&(h=n[y(0)],t.moveTo(h.x,h.y)),c=0;c<=l;++c){if(h=n[y(c)],h.skip)continue;const e=h.x,s=h.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function Cd(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?wd:kd}function Sd(t){return t.stepped?Va:t.tension||"monotone"===t.cubicInterpolationMode?La:$a}function Fd(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),yd(t,e.options),t.stroke(n)}function Td(t,e,s,i){const{segments:n,options:a}=e,o=Cd(e);for(const l of n)yd(t,a,l.style),t.beginPath(),o(t,e,l,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,De.A)(bd,"id","arc"),(0,De.A)(bd,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,De.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,De.A)(bd,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Pd="function"===typeof Path2D;function Md(t,e,s,i){Pd&&!e.options.segment?Fd(t,e,s,i):Td(t,e,s,i)}class Dd extends Jl{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,t,i,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Xa(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ja(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],l=Sd(s);let r,d;for(r=0,d=a.length;r"borderDash"!==t&&"fill"!==t});class $d extends Jl{constructor(t){super(),(0,De.A)(this,"parsed",void 0),(0,De.A)(this,"skip",void 0),(0,De.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){e=Hd(t,e,n);const o=n[t],l=n[e];null!==i?(a.push({x:o.x,y:i}),a.push({x:l.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:l.y}))}),a}function Hd(t,e,s){for(;e>t;e--){const t=s[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Xd(t,e,s,i){return t&&e?i(t[s],e[s]):t?t[s]:e?e[s]:0}function Kd(t,e){let s=[],i=!1;return Ss(t)?(i=!0,s=t):s=qd(t,e),s.length?new Dd({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Qd(t){return t&&!1!==t.fill}function Yd(t,e,s){const i=t[e];let n=i.fill;const a=[e];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(t,e,s){const i=ec(t);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],e,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(t,e,s,i){return"-"!==t&&"+"!==t||(s=e+s),!(s===e||s<0||s>=i)&&s}function Zd(t,e){let s=null;return"start"===t?s=e.bottom:"end"===t?s=e.top:Fs(t)?s=e.getPixelForValue(t.value):e.getBasePixel&&(s=e.getBasePixel()),s}function tc(t,e,s){let i;return i="start"===t?s:"end"===t?e.options.reverse?e.min:e.max:Fs(t)?t.value:e.getBaseValue(),i}function ec(t){const e=t.options,s=e.fill;let i=Ms(s&&s.target,s);return void 0===i&&(i=!!e.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sc(t){const{scale:e,index:s,line:i}=t,n=[],a=i.segments,o=i.points,l=ic(e,s);l.push(Kd({x:null,y:e.bottom},i));for(let r=0;r=0;--o){const e=n[o].$filler;e&&(e.line.updateControlPoints(a,e.axis),i&&e.fill&&uc(t.ctx,e,a))}},beforeDatasetsDraw(t,e,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=t.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const e=i[n].$filler;Qd(e)&&uc(t.ctx,e,t.chartArea)}},beforeDatasetDraw(t,e,s){const i=e.meta.$filler;Qd(i)&&"beforeDatasetDraw"===s.drawTime&&uc(t.ctx,i,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vc=(t,e)=>{let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},_c=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class kc extends Jl{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=$s(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const s=t.labels,i=In(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=vc(s,n);let r,d;e.font=i.string,this.isHorizontal()?(r=this.maxWidth,d=this._fitRows(a,n,o,l)+10):(d=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],d=i+o;let c=t;n.textAlign="left",n.textBaseline="middle";let h=-1,u=-d;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(c+=d,r[r.length-(p>0?0:1)]=0,u+=d,h++),l[p]={left:0,top:u,row:h,width:g,height:i},r[r.length-1]+=g+o}),c}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],d=a-t;let c=o,h=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=wc(s,e,n,t,i);a>0&&u+m+2*o>d&&(c+=h+o,r.push({width:h,height:u}),p+=h+o,g++,h=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},h=Math.max(h,f),u+=m+o}),c+=h,r.push({width:h,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ua(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ii(s,this.left+i,this.right-this.lineWidths[n]);for(const l of e)n!==l.row&&(n=l.row,o=Ii(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+t+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const l of e)l.col!==n&&(n=l.col,o=Ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;xn(t,this),this._draw(),vn(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=cn.color,l=Ua(t.rtl,this.left,this.width),r=In(a.font),{padding:d}=a,c=r.size,h=c/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vc(a,c),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ms(s.lineWidth,1);if(i.fillStyle=Ms(s.fillStyle,o),i.lineCap=Ms(s.lineCap,"butt"),i.lineDashOffset=Ms(s.lineDashOffset,0),i.lineJoin=Ms(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ms(s.strokeStyle,o),i.setLineDash(Ms(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(t,p/2),d=e+h;bn(i,o,r,d,a.pointStyleWidth&&p)}else{const a=e+Math.max((c-g)/2,0),o=l.leftForLtr(t,p),r=Ln(s.borderRadius);i.beginPath(),Object.values(r).some(t=>0!==t)?Tn(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Fn(i,s.text,t,e+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ii(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ii(n,this.top+x+d,this.bottom-e[0].height),line:0},Oa(this.ctx,t.textDirection);const v=f+d;this.legendItems.forEach((o,c)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+h+g;let k=u.x,w=u.y;l.setWidth(this.width),y?c>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ii(n,this.left+d,this.right-s[u.line])):c>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+d,u.line++,w=u.y=Ii(n,this.top+x+d,this.bottom-e[u.line].height));const C=l.x(k);if(m(C,w,o),k=Ui(f,k+p+h,y?k+_:this.right,t.rtl),b(l.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const t=r.lineHeight;u.y+=Fc(o,t)+d}else u.y+=v}),Ra(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=In(e.font),i=En(e.padding);if(!e.display)return;const n=Ua(t.rtl,this.left,this.width),a=this.ctx,o=e.position,l=s.size/2,r=i.top+l;let d,c=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),d=this.top+r,c=Ii(t.align,c,this.right-h);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);d=r+Ii(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Ii(o,c,c+h);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Fn(a,e.text,u,d,s)}_computeTitleHeight(){const t=this.options.title,e=In(t.font),s=En(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(wi(t,this.left,this.right)&&wi(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function Sc(t,e,s){let i=t;return"string"!==typeof e.text&&(i=Fc(e,s)),i}function Fc(t,e){const s=t.text?t.text.length:0;return e*s}function Tc(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var Pc={id:"legend",_element:kc,start(t,e,s){const i=t.legend=new kc({ctx:t.ctx,options:s,chart:t});Pl.configure(t,i,s),Pl.addBox(t,i)},stop(t){Pl.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Pl.configure(t,i,s),i.options=s},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const r=t.controller.getStyle(s?0:void 0),d=En(r.borderWidth);return{text:e[t.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const Mc={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,l=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function $c(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Vc(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:l}=e,r=In(e.bodyFont),d=In(e.titleFont),c=In(e.footerFont),h=a.length,u=n.length,p=i.length,g=En(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,h&&(f+=h*d.lineHeight+(h-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*t+(b-p)*r.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=d.string,Vs(t.title,x),s.font=r.string,Vs(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,Vs(i,t=>{Vs(t.before,x),Vs(t.lines,x),Vs(t.after,x)}),y=0,s.font=c.string,Vs(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Lc(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Ec(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Ic(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=t;let d="center";return"center"===i?d=n<=(l+r)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Ec(d,t,e,s)&&(d="center"),d}function Uc(t,e,s){const i=s.yAlign||e.yAlign||Lc(t,s);return{xAlign:s.xAlign||e.xAlign||Ic(t,e,s,i),yAlign:i}}function Oc(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Rc(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Wc(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:l,yAlign:r}=s,d=n+a,{topLeft:c,topRight:h,bottomLeft:u,bottomRight:p}=Ln(o);let g=Oc(e,l);const f=Rc(e,r,d);return"center"===r?"left"===l?g+=d:"right"===l&&(g-=d):"left"===l?g-=Math.max(c,u)+n:"right"===l&&(g+=Math.max(h,p)+n),{x:_i(g,0,i.width-e.width),y:_i(f,0,i.height-e.height)}}function Bc(t,e,s){const i=En(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function Nc(t){return Dc([],Ac(t))}function zc(t,e,s){return Rn(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function jc(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const qc={beforeTitle:ks,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=jc(s,t);Dc(e.before,Ac(Hc(n,"beforeLabel",this,t))),Dc(e.lines,Hc(n,"label",this,t)),Dc(e.after,Ac(Hc(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return Nc(Hc(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=Hc(s,"beforeFooter",this,t),n=Hc(s,"footer",this,t),a=Hc(s,"afterFooter",this,t);let o=[];return o=Dc(o,Ac(i)),o=Dc(o,Ac(n)),o=Dc(o,Ac(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=e.length;ot.filter(e,i,n,s))),t.itemSort&&(r=r.sort((e,i)=>t.itemSort(e,i,s))),Vs(r,e=>{const s=jc(t.callbacks,e);i.push(Hc(s,"labelColor",this,e)),n.push(Hc(s,"labelPointStyle",this,e)),a.push(Hc(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=Mc[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=Vc(this,s),o=Object.assign({},t,e),l=Uc(this.chart,s,o),r=Wc(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:d,bottomRight:c}=Ln(o),{x:h,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=h,m=f-a,y=x+a,v=x-a):(f=h+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?h+Math.max(l,d)+a:"right"===i?h+p-Math.max(r,c)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=Ua(s.rtl,this.x,this.width);for(t.x=Bc(this,s.titleAlign,s),e.textAlign=r.textAlign(s.titleAlign),e.textBaseline="middle",a=In(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Tn(t,{x:e,y:p,w:r,h:l,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Tn(t,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,r,l),t.strokeRect(e,p,r,l),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,r-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:d}=s,c=In(s.bodyFont);let h=c.lineHeight,u=0;const p=Ua(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+h/2),t.y+=h+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Bc(this,f,s),e.fillStyle=s.bodyColor,Vs(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+d:r+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,Vs(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),h=Math.max(c.lineHeight,l)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Mc[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Vc(this,t),o=Object.assign({},s,this._size),l=Uc(e,t,o),r=Wc(t,o,l,e);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=s,this.drawBackground(n,t,i,e),Oa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ra(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!Ls(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),l=e||!Ls(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=Mc[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,De.A)(Xc,"positioners",Mc);var Kc={id:"tooltip",_element:Xc,positioners:Mc,afterInit(t,e,s){s&&(t.tooltip=new Xc({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:qc},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Qc=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Yc(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Qc(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Gc=(t,e)=>null===t?null:_i(Math.round(t),0,e);function Jc(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function th(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:d,maxTicks:c,maxDigits:h,includeBounds:u}=t,p=a||1,g=c-1,{min:f,max:m}=e,b=!Cs(o),y=!Cs(l),x=!Cs(d),v=(m-f)/(h+1);let _,k,w,C,S=li((m-f)/g/p)*p;if(Sg&&(S=li(C*S/g/p)*p),Cs(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&hi((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,c)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:t})}return y&&u&&w!==l?s.length&&oi(s[s.length-1].value,l,eh(l,v,t))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function eh(t,e,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,De.A)(Zc,"id","category"),(0,De.A)(Zc,"defaults",{ticks:{callback:Jc}});class sh extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Cs(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=ai(i),e=ai(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=th(i,n);return"ticks"===t.bounds&&ui(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Zi(t,this.chart.options.locale,this.options.ticks.format)}}class ih extends sh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?t:0,this.max=Ts(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,De.A)(ih,"id","linear"),(0,De.A)(ih,"defaults",{ticks:{callback:sn.formatters.numeric}});const nh=t=>Math.floor(ni(t)),ah=(t,e)=>Math.pow(10,nh(t)+e);function oh(t){const e=t/Math.pow(10,nh(t));return 1===e}function lh(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function rh(t,e){const s=e-t;let i=nh(s);while(lh(t,e,i)>10)i++;while(lh(t,e,i)<10)i--;return Math.min(i,nh(t))}function dh(t,{min:e,max:s}){e=Ps(t.min,e);const i=[],n=nh(e);let a=rh(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,d=Math.round((e-r)*o)/o,c=Math.floor((e-r)/l/10)*l*10;let h=Math.floor((d-c)/Math.pow(10,a)),u=Ps(t.min,Math.round((r+c+h*Math.pow(10,a))*o)/o);while(u=10?h=h<15?15:20:h++,h>=20&&(a++,h=2,o=a>=0?1:o),u=Math.round((r+c+h*Math.pow(10,a))*o)/o;const p=Ps(t.max,u);return i.push({value:p,major:oh(p),significand:h}),i}class ch extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=sh.prototype.parse.apply(this,[t,e]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?Math.max(0,t):null,this.max=Ts(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=t===ah(this.min,0)?ah(this.min,-1):ah(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(ah(s,-1)),a(ah(i,1)))),s<=0&&n(ah(i,-1)),i<=0&&a(ah(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dh(e,this);return"ticks"===t.bounds&&ui(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":Zi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ni(t),this._valueRange=ni(this.max)-ni(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ni(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function hh(t){const e=t.ticks;if(e.display&&t.display){const t=En(e.backdropPadding);return Ms(e.font&&e.font.size,cn.font.size)+t.height}return 0}function uh(t,e,s){return s=Ss(s)?s:[s],{w:pn(t,e.string,s),h:s.length*e.lineHeight}}function ph(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function gh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,l=o.centerPointLabels?Ys/a:0;for(let r=0;re.r&&(l=(i.end-e.r)/a,t.r=Math.max(t.r,e.r+l)),n.starte.b&&(r=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+r))}function mh(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=t.getPointPosition(e,i+n+o,a),d=Math.round(gi(xi(r.angle+ei))),c=_h(r.y,l.h,d),h=xh(d),u=vh(r.x,l.w,h);return{visible:!0,x:r.x,y:c,textAlign:h,left:u,top:c,right:u+l.w,bottom:c+l.h}}function bh(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=yn({x:s,y:i},e)||yn({x:s,y:a},e)||yn({x:n,y:i},e)||yn({x:n,y:a},e);return!o}function yh(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:hh(a)/2,additionalAngle:o?Ys/n:0};let d;for(let c=0;c270||s<90)&&(t-=e),t}function kh(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=e;if(!Cs(l)){const s=Ln(e.borderRadius),r=En(e.backdropPadding);t.fillStyle=l;const d=i-r.left,c=n-r.top,h=a-i+r.width,u=o-n+r.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Tn(t,{x:d,y:c,w:h,h:u,radius:s}),t.fill()):t.fillRect(d,c,h,u)}}function wh(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));kh(s,a,e);const o=In(a.font),{x:l,y:r,textAlign:d}=e;Fn(s,t._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Ch(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,Gs);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?gh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(t*e+pi(s))}getDistanceFromCenterForValue(t){if(Cs(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Cs(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){l=this.getDistanceFromCenterForValue(t.value);const s=this.getContext(e),o=i.setContext(s),r=n.setContext(s);Sh(this,o,l,a,r)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),r=this.getPointPosition(o,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const l=s.setContext(this.getContext(o)),r=In(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){t.font=r.string,a=t.measureText(i.label).width,t.fillStyle=l.backdropColor;const e=En(l.backdropPadding);t.fillRect(-a/2-e.left,-n-r.size/2-e.top,a+e.width,r.size+e.height)}Fn(t,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,De.A)(Th,"id","radialLinear"),(0,De.A)(Th,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,De.A)(Th,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,De.A)(Th,"descriptors",{angleLines:{_fallback:"grid"}});const Ph={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Mh=Object.keys(Ph);function Dh(t,e){return t-e}function Ah(t,e){if(Cs(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!ci(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $h(t,e,s,i){const n=Mh.length;for(let a=Mh.indexOf(t);a=Mh.indexOf(s);a--){const s=Mh[a];if(Ph[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return Mh[s?Mh.indexOf(s):0]}function Lh(t){for(let e=Mh.indexOf(t)+1,s=Mh.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Ih(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(e[r].major=!0);return e}function Uh(t,e,s){const i=[],n={},a=e.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$h(n.minUnit,e,s,this._getLabelCapacity(e)),o=Ms(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=ci(l)||!0===l,d={};let c,h,u=e;if(r&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,r?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(c=u,h=0;c+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[t,e,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,d=l&&o[l],c=r&&o[r],h=s[e],u=r&&c&&h&&h.major;return this._adapter.format(t,i||(u?c:d))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[l].pos&&e<=t[r].pos&&({lo:l,hi:r}=Si(t,"pos",e)),({pos:i,time:a}=t[l]),({pos:n,time:o}=t[r])):(e>=t[l].time&&e<=t[r].time&&({lo:l,hi:r}=Si(t,"time",e)),({time:i,pos:a}=t[l]),({time:n,pos:o}=t[r]));const d=n-i;return d?a+(o-a)*(e-i)/d:a}(0,De.A)(Oh,"id","time"),(0,De.A)(Oh,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class Wh extends Oh{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Rh(e,this.min),this._tableRange=Rh(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,l,r,d;for(a=0,o=t.length;a=e&&r<=s&&i.push(r);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Rh(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Rh(this._table,s*this._tableRange+this._minPos,!0)}}(0,De.A)(Wh,"id","timeseries"),(0,De.A)(Wh,"defaults",Oh.defaults);var Bh=s(90144);const Nh={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},zh={ariaLabel:{type:String},ariaDescribedby:{type:String}},jh={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Nh,...zh},qh="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Hh(t){return(0,Bh.ju)(t)?(0,Bh.ux)(t):t}function Xh(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Bh.ju)(e)?new Proxy(t,{}):t}function Kh(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Qh(t,e){t.labels=e}function Yh(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Gh(t,e){const s={labels:[],datasets:[]};return Qh(s,t.labels),Yh(s,t.datasets,e),s}const Jh=(0,i.pM)({props:jh,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Bh.KR)(null),o=(0,Bh.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:l}=t,r=Gh(s,l),d=Xh(r,s);o.value=new ld(a.value,{type:e,data:d,options:{...i},plugins:n})},r=()=>{const e=(0,Bh.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},d=e=>{e.update(t.updateMode)};return(0,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[l,r]=s;const c=(0,Bh.ux)(o.value);if(!c)return;let h=!1;if(n){const t=Hh(n),e=Hh(l);t&&t!==e&&(Kh(c,t),h=!0)}if(a){const e=Hh(a.labels),s=Hh(r.labels),i=Hh(a.datasets),n=Hh(r.datasets);e!==s&&(Qh(c.config.data,e),h=!0),i&&i!==n&&(Yh(c.config.data,i,t.datasetIdKey),h=!0)}h&&(0,i.dY)(()=>{d(c)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zh(t,e){return ld.register(e),(0,i.pM)({props:Nh,setup(e,s){let{expose:n}=s;const a=(0,Bh.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Jh,qh({ref:o},{type:t,...e}))}})}const tu=Zh("doughnut",Ko),eu=Zh("line",Qo);s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(t,e=""){if("AbortError"===t.name)return iu.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=iu[t.status];return s?s(e):new su(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?iu.NETWORK():new su(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return e}catch(a){const t=a instanceof su?a:nu(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Pe.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw nu(t,e)}const e=await t.json();if(!e.success)throw new su(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class lu{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Pe.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var ru=lu;class du{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:Me.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Pe.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var cu=du;class hu{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,d=0,c=0,h=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var uu=hu;ld.register(bd,Kc,Pc,Zc,ih,$d,Dd,xc);const pu=864e5;function gu(t){return String(t).padStart(2,"0")}function fu(t){return`${t.getFullYear()}-${gu(t.getMonth()+1)}-${gu(t.getDate())}`}function mu(){const t=new Date;t.setHours(0,0,0,0);const e=new Date(t.getTime()-6*pu);return[fu(e),fu(t)]}var bu={name:"SysCogStatus",components:{Doughnut:tu,Line:eu,DateRangeCalendar:H},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Me.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},currentTrendGroup(){const t=this.indexInfo.uploadTrend||{},e=t.groupBy||{};return e[this.trendGroupBy]||{series:[]}},trendRawLabels(){const t=this.indexInfo.uploadTrend||{};return t.labels||[]},trendRangeCrossesYear(){const t=new Set;return this.trendRawLabels.forEach(e=>{this.extractTrendLabelDates(e).forEach(e=>t.add(e.year))}),t.size>1},trendDisplayLabels(){return this.trendRawLabels.map(t=>this.formatTrendAxisLabel(t))},hasTrendData(){const t=this.indexInfo.uploadTrend||{};return(t.labels||[]).length>0},trendDateDialogWidth(){return window.innerWidth>768?"420px":"90%"},uploadTrendChartData(){const t=this.indexInfo.uploadTrend||{},e=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:t.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...e.map((t,e)=>{const s=this.getTrendColor(e);return{label:this.formatTrendSeriesName(t),data:t.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const t="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:t}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:t=>{const e=t?.[0]?.dataIndex;return this.trendRawLabels[e]||""},label:t=>{const e=t.parsed||{},s=void 0!==e.y?e.y:t.raw;return` ${t.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:t,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:t,precision:0,callback:t=>Number(t).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},getTrendColor(t){return this.trendColors[t%this.trendColors.length]},formatTrendSeriesName(t){return t?.isOther||"__other__"===t?.name?this.$t("sysStatus.otherChannels"):t?.name||this.$t("sysStatus.unknown")},hexToRgba(t,e){const s=(t||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${e})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${e})`},extractTrendLabelDates(t){const e=String(t||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return e.map(t=>{const[e,s,i]=t.split("-").map(Number);return{year:e,month:s,day:i}})},formatTrendAxisLabel(t){const e=this.extractTrendLabelDates(t);if(0===e.length)return t;const s=(t,e)=>{const s=`${t.month}/${t.day}`;return e?`${t.year}/${s}`:s};if(1===e.length)return s(e[0],this.trendRangeCrossesYear);const[i,n]=e;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(t){Array.isArray(t)&&2===t.length&&t[0]&&t[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:t,endDate:e}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:t,trendEndDate:e}),i=await(0,Pe.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const t=await i.json();this.indexInfo=t}}catch(t){console.error("获取索引信息失败:",t),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new ru({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new cu({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,c.A)(bu,[["render",Te],["__scopeId","data-v-6b0a5e1a"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687)),Tu=(s(18785),s(53676));const Pu=["onClick"];function Mu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=Tu.A;return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>l.toggleDropdown&&l.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>l.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.channelType?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:e.channelType,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["type","class"])):e.icon?((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:e.icon,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["icon","class"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,Pu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",components:{ChannelIcon:Tu.A},props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const Au=(0,c.A)(Du,[["render",Mu],["__scopeId","data-v-de989c36"]]);var $u=Au;const Vu={class:"upload-settings"},Lu={class:"page-header"},Eu={class:"first-title"},Iu={class:"header-actions"},Uu={class:"group-header"},Ou={class:"group-title"},Ru={key:0,class:"load-balance-switch"},Wu={class:"switch-label"},Bu={key:0,class:"channel-cards"},Nu=["onMousemove","onMouseleave"],zu={class:"card-header"},ju={class:"card-title"},qu={class:"channel-name"},Hu={class:"card-body"},Xu={class:"card-info"},Ku={class:"info-item"},Qu={class:"info-text"},Yu={key:0,class:"info-item"},Gu={class:"info-text"},Ju={key:1,class:"info-item"},Zu=["title"],tp={class:"info-item"},ep={class:"info-text"},sp={key:0,class:"info-item"},ip=["title"],np={class:"info-item"},ap={class:"info-text"},op={class:"info-item"},lp={class:"info-text"},rp={class:"info-item"},dp={class:"info-text"},cp={class:"info-item"},hp=["title"],up={key:0,class:"info-item"},pp=["title"],gp={key:0,class:"quota-mini"},fp={class:"quota-text"},mp={class:"card-actions"},bp={key:1,class:"empty-tip"},yp={class:"channel-type-option"},xp={key:0,class:"form-warning",style:{"margin-top":"0"}},vp=["innerHTML"],_p={class:"form-warning"},kp={class:"quota-label"},wp={class:"quota-status"};function Cp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=$u,h=K.S2,u=Tu.A,p=Fu.u,f=Su.qi,m=k.ve,b=Cu.P9,y=Cu.AV,x=_u.xE,_=wu.WK,S=ku.lq,F=_u.US,T=w.kZ,P=vu.MF,M=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Vu,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Eu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Iu,[(0,i.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:l.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(h,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Uu,[(0,i.Lk)("div",Ou,[(0,i.bF)(u,{type:s.value,class:(0,n.C4)(["group-icon",l.getChannelIconClass(s.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(p,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ru,[(0,i.Lk)("span",Wu,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(f,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>l.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Bu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>l.handleCardMouseMove(t,s.value,o),onMouseleave:t=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",zu,[(0,i.Lk)("div",ju,[(0,i.Lk)("span",qu,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(f,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,C.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",Hu,[(0,i.Lk)("div",Xu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Ku,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Qu,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Gu,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Ju,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Zu)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",tp,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",ep,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",sp,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,ip)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",np,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",ap,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",op,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",lp,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",dp,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",cp,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",up,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,pp)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",gp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",fp,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",mp,[(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"danger",size:"small",onClick:t=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Nu))),128))])):((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(T,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(y,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(b,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.Lk)("span",yp,[(0,i.bF)(u,{type:t.value,class:(0,n.C4)(["select-option-icon",l.getChannelIconClass(t.value)])},null,8,["type","class"]),(0,i.Lk)("span",null,(0,n.v_)(t.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",xp,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,vp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameImmutableTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"])]),_:1}),(0,i.Lk)("div",_p,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(M,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(P,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(P,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(P,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(P,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(P,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(P,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(P,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(P,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",kp,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(h,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",wp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameEditDisabledTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var Sp={components:{ChannelIcon:Tu.A,CustomSelect:$u},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){return[{value:"",label:this.$t("common.all")},...this.channels.map(t=>({value:t.value,label:t.label,channelType:t.value,iconClass:this.getChannelIconClass(t.value)}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,l=`glow-${e}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelIconClass(t){return`channel-brand-${t}`},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.currentChannelIndex,i=e.channels[s]?.name||this.editChannel.name,n={...this.editChannel,name:i};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(n.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));n.headers=t,n.createDirectory=!1!==n.createDirectory,delete n.headersText}e.channels[this.currentChannelIndex]=n,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.warning"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Pe.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Fp=(0,c.A)(Sp,[["render",Cp],["__scopeId","data-v-68503f89"]]);var Tp=Fp,Pp=s(98469);s(49187);const Mp={class:"save-text"};function Dp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>l.handleClick&&l.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",Mp,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Ap={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const $p=(0,c.A)(Ap,[["render",Dp],["__scopeId","data-v-a230355c"]]);var Vp=$p,Lp=s(84757);s(5802),s(64752),s(38736);const Ep={class:"security-settings"},Ip={class:"first-settings"},Up={class:"first-title"},Op={class:"second-title"},Rp={style:{display:"flex",gap:"8px",width:"100%"}},Wp={class:"second-title"},Bp={style:{display:"flex",gap:"8px",width:"100%"}},Np={class:"second-title token-title"},zp={class:"token-actions"},jp={class:"token-table-container"},qp={class:"table-cell-content"},Hp={class:"table-cell-content"},Xp={class:"token-display"},Kp={class:"table-cell-content"},Qp={class:"table-cell-content"},Yp={class:"table-cell-content"},Gp={class:"table-cell-content"},Jp={class:"table-cell-content action-buttons"},Zp={class:"first-settings"},tg={class:"first-title"},eg={class:"second-title"},sg={class:"second-title"},ig={class:"query-param-list"},ng={class:"query-param-list"},ag={class:"first-settings"},og={class:"first-title"},lg={class:"second-title"},rg={class:"second-title"},dg={class:"second-title"},cg={class:"form-item-hint"},hg={class:"form-item-hint"},ug={style:{display:"flex",gap:"10px",width:"100%"}},pg={class:"dialog-footer"},gg={style:{display:"flex",gap:"10px",width:"100%"}},fg={class:"dialog-footer"},mg={class:"token-result"},bg={style:{"margin-bottom":"15px",color:"#e6a23c"}},yg={class:"dialog-footer"};function xg(t,e,s,a,o,l){const r=wu.WK,d=Pp.dI,c=_u.xE,h=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Lp.o8,m=Fu.u,b=Lp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Vp,T=Pp.o5,P=w.kZ,M=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ep,[(0,i.Lk)("div",Ip,[(0,i.Lk)("h3",Up,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Op,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(h,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Rp,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Wp,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(h,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Bp,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Np,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",zp,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",jp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",qp,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Hp,[(0,i.Lk)("span",Xp,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Kp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Qp,(0,n.v_)(l.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Yp,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Gp,(0,n.v_)(l.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Jp,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>l.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>l.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[M,o.tokenLoading]])])]),(0,i.Lk)("div",Zp,[(0,i.Lk)("h3",tg,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",eg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"]),(0,i.Lk)("h4",sg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.ipQuery"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.ipQueryTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.ipQuery,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableIpQuery")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.ipQuery.enabled,"onUpdate:modelValue":e[12]||(e[12]=t=>o.uploadSettings.ipQuery.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.ipQueryChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.ipQuery.channel,"onUpdate:modelValue":e[13]||(e[13]=t=>o.uploadSettings.ipQuery.channel=t),placeholder:t.$t("sysSecurity.ipQueryChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:t.$t("sysSecurity.customApi"),value:"customApi"},null,8,["label"])]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"customApi"===o.uploadSettings.ipQuery.channel?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(c,{label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.url,"onUpdate:modelValue":e[14]||(e[14]=t=>o.uploadSettings.ipQuery.customApi.url=t),placeholder:"https://api.example.com/ip"},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.queryParams")},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ig,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.params,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"query-param-row"},[(0,i.bF)(r,{modelValue:e.key,"onUpdate:modelValue":t=>e.key=t,placeholder:t.$t("sysSecurity.paramNamePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(r,{modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,placeholder:t.$t("sysSecurity.paramValuePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryParam(s),disabled:o.uploadSettings.ipQuery.customApi.params.length<=1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryParam},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addQueryParam")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"]),(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.responseFields"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.responseFieldsTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",ng,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.responseFields,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"response-field-row"},[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.responseFields[s],"onUpdate:modelValue":t=>o.uploadSettings.ipQuery.customApi.responseFields[s]=t,placeholder:t.$t("sysSecurity.responseFieldPathPlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,-1),disabled:0===s},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-up"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,1),disabled:s===o.uploadSettings.ipQuery.customApi.responseFields.length-1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-down"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryResponseField(s)},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryResponseField},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addResponseField")),1)]),_:1},8,["onClick"])])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",ag,[(0,i.Lk)("h3",og,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",lg,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",rg,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(h,{model:o.accessSettings,rules:l.accessRules,ref:"accessForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",dg,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[17]||(e[17]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(c,{label:t.$t("sysSecurity.userSessionMaxAge"),prop:"userSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[18]||(e[18]=t=>o.accessSettings.userSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",cg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminSessionMaxAge"),prop:"adminSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[19]||(e[19]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",hg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(P,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[27]||(e[27]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",pg,[(0,i.bF)(p,{onClick:e[26]||(e[26]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.neverExpire=t),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ug,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",fg,[(0,i.bF)(p,{onClick:e[34]||(e[34]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.neverExpire=t),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",gg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[38]||(e[38]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",yg,[(0,i.bF)(p,{type:"primary",onClick:e[37]||(e[37]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.Lk)("p",bg,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(h,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[36]||(e[36]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[M,o.loading]])}s(81148);const vg={s:1e3,m:6e4,h:36e5,d:864e5};function _g(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(vg[s])return new Date(i.getTime()+e*vg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function kg(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function wg(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=kg(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Cg={components:{FloatingSaveButton:Vp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{},ipQuery:{enabled:!1,channel:"customApi",customApi:{url:"",params:[{key:"ip",value:"{ip}"}],responseFields:[]}}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},accessRules(){const t=(t,e,s)=>{!Number.isInteger(e)||e<1||e>3650?s(new Error(this.$t("sysSecurity.sessionMaxAgeInvalid"))):s()};return{userSessionMaxAge:[{validator:t,trigger:"change"}],adminSessionMaxAge:[{validator:t,trigger:"change"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},methods:{normalizeIpQuerySettings(t={}){const e=t.ipQuery||{},s=e.customApi||{},i=Array.isArray(s.params)&&s.params.length>0?s.params.map(t=>({key:t?.key||"",value:t?.value||""})):[{key:"ip",value:"{ip}"}],n=Array.isArray(s.responseFields)?s.responseFields.map(t=>"string"===typeof t?t:t?.path||""):[];return{...t,moderate:t.moderate||{},ipQuery:{enabled:e.enabled??!1,channel:e.channel||"customApi",customApi:{url:s.url||"",params:i,responseFields:n}}}},addIpQueryParam(){this.uploadSettings.ipQuery.customApi.params.push({key:"",value:""})},removeIpQueryParam(t){this.uploadSettings.ipQuery.customApi.params.length<=1||this.uploadSettings.ipQuery.customApi.params.splice(t,1)},addIpQueryResponseField(){this.uploadSettings.ipQuery.customApi.responseFields.push("")},removeIpQueryResponseField(t){this.uploadSettings.ipQuery.customApi.responseFields.splice(t,1)},moveIpQueryResponseField(t,e){const s=this.uploadSettings.ipQuery.customApi.responseFields,i=t+e;if(i<0||i>=s.length)return;const[n]=s.splice(t,1);s.splice(i,0,n)},handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Pe.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=_g(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=_g(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Pe.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return wg(t)},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.accessForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.userSessionMaxAge>3650||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge)||this.accessSettings.adminSessionMaxAge>3650)return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Pe.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=this.normalizeIpQuerySettings(t.upload),this.accessSettings=t.access,this.oriUserPassword="",this.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Sg=(0,c.A)(Cg,[["render",xg],["__scopeId","data-v-f87cbcb2"]]);var Fg=Sg;const Tg={class:"page-settings"},Pg={class:"first-title"},Mg={key:5,class:"announcement-refresh-option"};function Dg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Cu.P9,h=Cu.AV,u=Su.qi,p=wu.WK,f=Pp.dI,m=_u.xE,b=_u.US,y=Vp,x=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Tg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(s,a)=>((0,i.uX)(),(0,i.CE)("div",{key:a,class:"first-settings"},[(0,i.Lk)("h3",Pg,(0,n.v_)(a),1),(0,i.bF)(b,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s,(s,a)=>((0,i.uX)(),(0,i.Wv)(m,{key:s.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(s,"label"))+" ",1),s.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:l.localized(s,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.value,label:l.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:1,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===s.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===s.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,type:"textarea",autosize:{minRows:2},resize:"vertical",disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])),"announcement"===s.id?((0,i.uX)(),(0,i.CE)("div",Mg,[(0,i.bF)(f,{modelValue:o.refreshAnnouncement,"onUpdate:modelValue":e[0]||(e[0]=t=>o.refreshAnnouncement=t)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysPage.refreshAnnouncement")),1)]),_:1},8,["modelValue"])])):(0,i.Q3)("",!0)]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(y,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[x,o.loading]])}var Ag=s(457),$g={components:{FloatingSaveButton:Vp},data(){return{settings:{config:[]},loading:!0,refreshAnnouncement:!1,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Pe.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...this.settings,refreshAnnouncement:this.refreshAnnouncement})}).then(()=>{this.refreshAnnouncement=!1,this.$message.success(this.$t("sysPage.settingsSaved"))})},async fetchAvailableChannels(){try{const t=await Ag.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Pe.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Vg=(0,c.A)($g,[["render",Dg],["__scopeId","data-v-5fc03908"]]);var Lg=Vg;const Eg={class:"others-settings"},Ig={class:"first-settings"},Ug={class:"first-title"},Og={class:"first-title"},Rg={class:"first-title"},Wg={class:"first-title"},Bg=["innerHTML"],Ng={class:"first-title"};function zg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Su.qi,h=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Eg,[(0,i.Lk)("div",Ig,[(0,i.Lk)("h3",Ug,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Og,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Rg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Wg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,Bg)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Ng,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var jg={components:{FloatingSaveButton:Vp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Pe.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Pe.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const qg=(0,c.A)(jg,[["render",zg],["__scopeId","data-v-69ae97d8"]]);var Hg=qg,Xg=s(48903),Kg={name:"SystemConfig",mixins:[Xg.A],data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:xu,SysCogUpload:Tp,SysCogSecurity:Fg,SysCogPage:Lg,SysCogOthers:Hg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return xu;case"upload":return Tp;case"security":return Fg;case"page":return Lg;case"others":return Hg;default:return xu}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Qg=(0,c.A)(Kg,[["render",x],["__scopeId","data-v-036a2d40"]]);var Yg=Qg},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},98642:function(t,e,s){s(85331)}}]); +//# sourceMappingURL=784.1372cab1.js.map \ No newline at end of file diff --git a/frontend-dist/js/784.1372cab1.js.gz b/frontend-dist/js/784.1372cab1.js.gz new file mode 100644 index 00000000..3da43552 Binary files /dev/null and b/frontend-dist/js/784.1372cab1.js.gz differ diff --git a/frontend-dist/js/784.1372cab1.js.map b/frontend-dist/js/784.1372cab1.js.map new file mode 100644 index 00000000..2f3a5060 --- /dev/null +++ b/frontend-dist/js/784.1372cab1.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/784.1372cab1.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?4482","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?16f4","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?288e","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?d51c","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?7c9a","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?bd48","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.segment.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.helper.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.options.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.stack.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/simpleArc.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.drawing.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/index.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?8b7b","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?8791","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?83b1","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?74a9","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?028f","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?c551","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js"],"sourcesContent":["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\"\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=33933ada&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=33933ada&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-33933ada\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\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 class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }]),\n ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=ed65892c&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=ed65892c&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-ed65892c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=715da8c8&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=715da8c8&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-715da8c8\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\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_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.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.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=6b0a5e1a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=6b0a5e1a&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-6b0a5e1a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=de989c36&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=de989c36&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-de989c36\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: _normalizeClass(['group-icon', $options.getChannelIconClass(channelType.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: _normalizeClass(['select-option-icon', $options.getChannelIconClass(ch.value)])\n }, null, 8, [\"type\", \"class\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\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.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value,\n iconClass: this.getChannelIconClass(ch.value)\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n getChannelIconClass(type) {\n return `channel-brand-${type}`;\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=68503f89&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=68503f89&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-68503f89\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=a230355c&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=a230355c&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-a230355c\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\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.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=f87cbcb2&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=f87cbcb2&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-f87cbcb2\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n key: 5,\n class: \"announcement-refresh-option\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\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_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.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, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])), setting.id === 'announcement' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_el_checkbox, {\n modelValue: $data.refreshAnnouncement,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.refreshAnnouncement = $event)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysPage.refreshAnnouncement')), 1)]),\n _: 1\n }, 8, [\"modelValue\"])])) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 即使公告内容未变化,也在本次保存时刷新公告已读状态\n refreshAnnouncement: false,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n ...this.settings,\n refreshAnnouncement: this.refreshAnnouncement\n })\n }).then(() => {\n this.refreshAnnouncement = false;\n this.$message.success(this.$t('sysPage.settingsSaved'));\n });\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=5fc03908&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=5fc03908&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-5fc03908\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\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_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, 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, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=69ae97d8&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=69ae97d8&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-69ae97d8\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=036a2d40&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=036a2d40&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-036a2d40\"]])\n\nexport default __exports__","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };"],"names":["_hoisted_1","key","class","viewBox","xmlns","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","$attrs","type","d","icon","fontAwesomeIcon","name","inheritAttrs","props","String","required","computed","icons","cfr2","s3","discord","this","__exports__","isCollapse","ref","style","sidebarStyle","menuItems","item","index","activeIndex","onClick","$event","handleSelect","$t","titleKey","args","toggleCollapse","default","Boolean","data","expandedWidth","collapsedWidth","window","innerWidth","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_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","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","_defineProperty","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelIconClass","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","refreshAnnouncement","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/784.1372cab1.js.map.gz b/frontend-dist/js/784.1372cab1.js.map.gz new file mode 100644 index 00000000..d2eb62d0 Binary files /dev/null and b/frontend-dist/js/784.1372cab1.js.map.gz differ diff --git a/frontend-dist/js/800.e2c8a8a6.js b/frontend-dist/js/800.e2c8a8a6.js new file mode 100644 index 00000000..5cc0dc88 --- /dev/null +++ b/frontend-dist/js/800.e2c8a8a6.js @@ -0,0 +1,2 @@ +(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[800],{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 l=["href","target"],i=["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,i)],10,l)}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},808:function(e,t,o){"use strict";o.d(t,{A:function(){return m}});var s=o(56768),a=o(45130),l=o(24232);const i={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,l.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",i,[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-c93807da"]]);var m=h},2893:function(e,t,o){"use strict";o(85331)},3261: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 i}),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 l=function(e,t,o,s){return new(o||(o=Promise))(function(a,l){function i(e){try{r(s.next(e))}catch(e){l(e)}}function n(e){try{r(s.throw(e))}catch(e){l(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(i,n)}r((s=s.apply(e,t||[])).next())})};function i(e,t=.92,o=s.JPEG){return l(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,l){function i(e){try{r(s.next(e))}catch(e){l(e)}}function n(e){try{r(s.throw(e))}catch(e){l(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(i,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 l=atob(o[1]);let i=l.length;const n=new Uint8Array(i);for(;i--;)n[i]=l.charCodeAt(i);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,l){function i(e){try{r(s.next(e))}catch(e){l(e)}}function n(e){try{r(s.throw(e))}catch(e){l(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(i,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 l,i;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;i=e.width*t,l=e.height*t}else i=o.width||o.height*e.width/e.height||e.width,l=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=i,s.width=l):(s.height=l,s.width=i),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,l){function i(e){try{r(s.next(e))}catch(e){l(e)}}function n(e){try{r(s.throw(e))}catch(e){l(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(i,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 l=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;a(t.type)&&(n=t.type,l=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield i(u,t.quality,n),g=yield d(h,l);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,l=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 i(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-l)-Math.abs(.75*t.length-l))[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)},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)),l=(o(37952),o(30650)),i=(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=i.qk,$=l.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)},53676: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"},l={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},i={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"}),["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",l,[...t[1]||(t[1]=[(0,s.Fv)('',9)])])):"webdav"===o.type?((0,s.uX)(),(0,s.CE)("svg",i,[...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-33933ada"]]);var u=c},54800:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return To}});var s=o(78507),a=(o(85331),o(213),o(80047)),l=(o(99648),o(56768)),i=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"],A={class:"list-meta"},M={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,V,W){const B=(0,l.g2)("font-awesome-icon"),H=a.S2,Q=s.R7;return(0,l.uX)(),(0,l.CE)("div",{class:(0,i.C4)(["history-container",{active:o.show}])},[(0,l.Lk)("div",n,[(0,l.Lk)("div",r,[(0,l.Lk)("h2",null,(0,i.v_)(e.$t("uploadHistory.title")),1),(0,l.Lk)("span",d,(0,i.v_)(e.$t("uploadHistory.totalRecords",{count:V.totalCount})),1)]),(0,l.Lk)("div",c,[(0,l.bF)(Q,{content:e.$t("uploadHistory.switchView"),placement:"bottom"},{default:(0,l.k6)(()=>[(0,l.bF)(H,{circle:"",onClick:W.toggleViewMode},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"grid"===V.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,l.bF)(Q,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom"},{default:(0,l.k6)(()=>[(0,l.bF)(H,{circle:"",type:"danger",onClick:W.clearHistory},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,l.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"times"})]),_:1})])]),V.historyList.length>0?((0,l.uX)(),(0,l.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>W.handleScroll&&W.handleScroll(...e))},[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(W.groupedHistory,e=>((0,l.uX)(),(0,l.CE)("div",{key:e.date,class:"history-group"},[(0,l.Lk)("div",u,[t[4]||(t[4]=(0,l.Lk)("div",{class:"timeline-dot"},null,-1)),(0,l.Lk)("span",p,(0,i.v_)(e.date),1)]),"grid"===V.viewMode?((0,l.uX)(),(0,l.CE)("div",h,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(e.items,e=>((0,l.uX)(),(0,l.CE)("div",{key:e.time,class:"grid-item"},[(0,l.Lk)("div",m,[W.isImage(e.name)?((0,l.uX)(),(0,l.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>W.handleImageError&&W.handleImageError(...e))},null,40,g)):W.isVideo(e.name)?((0,l.uX)(),(0,l.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,l.uX)(),(0,l.CE)("div",y,[(0,l.bF)(B,{icon:"file",class:"file-icon"})])),(0,l.Lk)("div",b,[(0,l.Lk)("div",k,[(0,l.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>W.copyLink(e.url)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,l.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>W.openLink(e.url)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,l.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>W.deleteItem(e)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,l.Lk)("div",v,[(0,l.Lk)("div",{class:"file-name",title:e.name},(0,i.v_)(e.name),9,C),(0,l.Lk)("div",w,(0,i.v_)(W.formatTime(e.time)),1)])]))),128))])):((0,l.uX)(),(0,l.CE)("div",F,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(e.items,e=>((0,l.uX)(),(0,l.CE)("div",{key:e.time,class:"list-item"},[(0,l.Lk)("div",L,[W.isImage(e.name)?((0,l.uX)(),(0,l.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>W.handleImageError&&W.handleImageError(...e))},null,40,U)):W.isVideo(e.name)?((0,l.uX)(),(0,l.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,l.uX)(),(0,l.CE)("div",S,[(0,l.bF)(B,{icon:"file"})]))]),(0,l.Lk)("div",T,[(0,l.Lk)("div",{class:"file-name",title:e.name},(0,i.v_)(e.name),9,_),(0,l.Lk)("div",{class:"file-url",title:e.url},(0,i.v_)(e.url),9,x)]),(0,l.Lk)("div",A,[(0,l.Lk)("div",M,(0,i.v_)(W.formatTime(e.time)),1)]),(0,l.Lk)("div",R,[(0,l.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>W.copyLink(e.url)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,l.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>W.openLink(e.url)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,l.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>W.deleteItem(e)},{default:(0,l.k6)(()=>[(0,l.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),W.hasMore?((0,l.uX)(),(0,l.CE)("div",D,[V.loadingMore?((0,l.uX)(),(0,l.CE)("div",E,[(0,l.bF)(B,{icon:"spinner",spin:""}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadHistory.loading")),1)])):((0,l.uX)(),(0,l.CE)("div",I,(0,i.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):V.historyList.length>0?((0,l.uX)(),(0,l.CE)("div",N,(0,i.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,l.Q3)("",!0)],544)):((0,l.uX)(),(0,l.CE)("div",P,[(0,l.bF)(B,{icon:"history",class:"empty-icon"}),(0,l.Lk)("p",null,(0,i.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701);var V={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"),l=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${a} ${l}:${i}:${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)}}},W=o(71241);const B=(0,W.A)(V,[["render",z],["__scopeId","data-v-f70e7770"]]);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(53676));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"},le={key:0,class:"setting-item"},ie={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"},Ae={key:0,class:"dialog-section"},Me={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,l.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,l.uX)(),(0,l.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,l.k6)(()=>[(0,l.Lk)("div",Z,[(0,l.Lk)("div",ee,[(0,l.Lk)("span",te,(0,i.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,l.Lk)("div",oe,[(0,l.Lk)("div",se,[(0,l.Lk)("span",ae,(0,i.v_)(e.$t("uploadSettings.channelType")),1),(0,l.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,l.k6)(()=>[(0,l.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"telegram",class:"channel-icon channel-brand-telegram"}),t[13]||(t[13]=(0,l.Lk)("span",null,"TG",-1))]),_:1}),(0,l.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"cfr2",class:"channel-icon channel-brand-cfr2"}),t[14]||(t[14]=(0,l.Lk)("span",null,"R2",-1))]),_:1}),(0,l.bF)(u,{label:"s3",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"s3",class:"channel-icon channel-brand-s3"}),t[15]||(t[15]=(0,l.Lk)("span",null,"S3",-1))]),_:1}),(0,l.bF)(u,{label:"discord",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"discord",class:"channel-icon channel-brand-discord"}),t[16]||(t[16]=(0,l.Lk)("span",null,"DC",-1))]),_:1}),(0,l.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"huggingface",class:"channel-icon channel-brand-huggingface"}),t[17]||(t[17]=(0,l.Lk)("span",null,"HF",-1))]),_:1}),(0,l.bF)(u,{label:"webdav",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(c,{type:"webdav",class:"channel-icon channel-brand-webdav"}),t[18]||(t[18]=(0,l.Lk)("span",null,"WD",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,l.uX)(),(0,l.CE)("div",le,[(0,l.Lk)("span",ie,[(0,l.eW)((0,i.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,l.bF)(m,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,l.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,l.k6)(()=>[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(o.currentChannelList,e=>((0,l.uX)(),(0,l.Wv)(g,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,l.Q3)("",!0),(0,l.Lk)("div",ne,[(0,l.Lk)("span",re,(0,i.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,l.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,l.Lk)("div",de,[(0,l.Lk)("span",ce,[(0,l.eW)((0,i.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,l.bF)(m,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,l.bF)(b,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,l.Lk)("div",ue,[(0,l.Lk)("div",pe,[(0,l.Lk)("span",he,(0,i.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,l.Lk)("div",me,[(0,l.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,l.k6)(()=>[(0,l.bF)(u,{label:"default",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"cog",class:"radio-icon"}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,l.bF)(u,{label:"index",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"hashtag",class:"radio-icon"}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,l.bF)(u,{label:"origin",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"file-signature",class:"radio-icon"}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,l.bF)(u,{label:"short",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"compress-alt",class:"radio-icon"}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,l.Lk)("div",ge,[(0,l.Lk)("div",fe,[(0,l.Lk)("span",ye,(0,i.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,l.bF)(m,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,l.Lk)("div",be,[(0,l.Lk)("div",ke,[(0,l.Lk)("span",ve,[(0,l.eW)((0,i.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,l.bF)(m,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,l.bF)(b,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,l.Lk)("div",Ce,[(0,l.Lk)("span",we,(0,i.v_)(e.$t("uploadSettings.fileCompress")),1),(0,l.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,l.uX)(),(0,l.CE)("div",Fe,[(0,l.Lk)("span",Le,[(0,l.eW)((0,i.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,l.bF)(m,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,l.Lk)("div",Ue,[(0,l.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,l.Lk)("div",$e,[(0,l.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,l.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,l.Q3)("",!0),o.customerCompress?((0,l.uX)(),(0,l.CE)("div",Se,[(0,l.Lk)("span",Te,[(0,l.eW)((0,i.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,l.bF)(m,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,l.Lk)("div",_e,[(0,l.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,l.Lk)("div",xe,[(0,l.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,l.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,l.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,l.uX)(),(0,l.CE)("div",Ae,[(0,l.Lk)("div",Me,[(0,l.Lk)("span",Re,(0,i.v_)(e.$t("uploadSettings.serverCompress")),1),(0,l.bF)(m,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,l.k6)(()=>[(0,l.bF)(h,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,l.Lk)("div",De,[(0,l.Lk)("div",Ee,[(0,l.Lk)("span",Ie,(0,i.v_)(e.$t("uploadSettings.enableCompress")),1),(0,l.bF)(b,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,l.Q3)("",!0),(0,l.Lk)("div",Ne,[(0,l.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.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 Ve=(0,W.A)(ze,[["render",Pe]]);var We=Ve,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 lt(e,t,o,s,a,n){const r=(0,l.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=Qe.ve,p=(0,l.g2)("Link"),h=He.tk,m=(0,l.g2)("Delete");return(0,l.uX)(),(0,l.CE)("div",qe,[(0,l.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,l.uX)(),(0,l.CE)("video",je,[(0,l.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,Ge),t[7]||(t[7]=(0,l.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,l.uX)(),(0,l.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,l.uX)(),(0,l.CE)("div",Je,[(0,l.bF)(r,{icon:"file",class:"file-icon"})]))],8,Oe),(0,l.Lk)("div",Ye,[(0,l.Lk)("div",Ze,[(0,l.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,l.uX)(),(0,l.CE)("div",et,[(0,l.Lk)("div",tt,[(0,l.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,l.k6)(()=>[...t[8]||(t[8]=[(0,l.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,l.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,l.k6)(()=>[...t[9]||(t[9]=[(0,l.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,l.Lk)("div",ot,[(0,l.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,l.k6)(()=>[...t[10]||(t[10]=[(0,l.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,l.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,l.k6)(()=>[...t[11]||(t[11]=[(0,l.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,l.uX)(),(0,l.CE)("div",st,[(0,l.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,l.Lk)("div",at,[(0,l.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,l.bF)(h,null,{default:(0,l.k6)(()=>[(0,l.bF)(p)]),_:1})]),(0,l.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,l.bF)(h,null,{default:(0,l.k6)(()=>[(0,l.bF)(m)]),_:1})])])])}var it=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:it.Link,Delete:it.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return 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 l=a.length+4,i=t-l-3;return i<=0?e.substring(0,t-3)+"...":s.substring(0,i)+"..."+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,W.A)(dt,[["render",lt],["__scopeId","data-v-698179d6"]]);var ut=ct,pt=o(62086),ht=(o(40670),o(88830),o(23597),o(70683)),mt=(o(95385),o(3261),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={class:"upload-list-dashboard-action"},Ct={class:"modern-action-group"},wt={class:"modern-dropdown-item-content"},Ft={class:"modern-action-btn modern-action-btn-danger"};function Lt(e,t,n,r,d,c){const u=(0,l.g2)("CameraFilled"),p=He.tk,h=mt.j5,m=G.WK,g=a.S2,f=J.Zh,y=J.MQ,b=ht.Ik,k=(0,l.g2)("List"),v=(0,l.g2)("Checked"),C=(0,l.g2)("Failed"),w=Xe.$g,F=(0,l.g2)("font-awesome-icon"),L=s.R7,U=j.qi,$=pt.c6,S=pt.Iy,T=pt.dW,_=ut,x=Be.kA;return(0,l.uX)(),(0,l.CE)("div",gt,[(0,l.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,l.Lk)("div",ft,null,512),"default"===n.uploadMethod?((0,l.uX)(),(0,l.Wv)(h,{key:0,class:(0,i.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,l.k6)(()=>[(0,l.bF)(p,{class:(0,i.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,l.k6)(()=>[(0,l.bF)(u)]),_:1},8,["class"]),(0,l.Lk)("div",{class:(0,i.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,l.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,l.uX)(),(0,l.CE)("div",bt,[(0,l.bF)(b,{class:(0,i.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,l.k6)(()=>[(0,l.bF)(m,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,l.Lk)("div",kt,[(0,l.bF)(g,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,l.bF)(y,{modelValue:d.pasteUploadMethod,"onUpdate:modelValue":t[3]||(t[3]=e=>d.pasteUploadMethod=e),class:"paste-card-method-group",size:c.pasteCardMethodButtonSize},{default:(0,l.k6)(()=>[(0,l.bF)(f,{label:"save"},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.pasteSave")),1)]),_:1}),(0,l.bF)(f,{label:"external"},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.pasteExternal")),1)]),_:1})]),_:1},8,["modelValue","size"])])]),_:1},8,["class"])])):(0,l.Q3)("",!0),(0,l.bF)(b,{class:(0,i.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length,"is-uploading":d.uploading}])},{default:(0,l.k6)(()=>[(0,l.Lk)("div",{class:(0,i.C4)(["upload-list-container",{"upload-list-busy":d.fileList.length}])},[(0,l.bF)(x,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,l.k6)(()=>[(0,l.Lk)("div",{class:(0,i.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,l.bF)(w,{class:"upload-list-dashboard-title"},{default:(0,l.k6)(()=>[(0,l.bF)(p,null,{default:(0,l.k6)(()=>[(0,l.bF)(k)]),_:1}),(0,l.eW)((0,i.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,l.bF)(p,null,{default:(0,l.k6)(()=>[(0,l.bF)(v)]),_:1}),(0,l.eW)((0,i.v_)(c.uploadSuccessCount)+" ",1),(0,l.bF)(p,null,{default:(0,l.k6)(()=>[(0,l.bF)(C)]),_:1}),(0,l.eW)((0,i.v_)(c.uploadErrorCount),1)]),_:1}),(0,l.Lk)("div",vt,[(0,l.Lk)("div",Ct,[(0,l.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.Lk)("button",{class:"modern-action-btn modern-action-btn-copy",onClick:t[4]||(t[4]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,l.bF)(F,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,l.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(T,null,{dropdown:(0,l.k6)(()=>[(0,l.bF)(S,{class:"modern-dropdown-menu"},{default:(0,l.k6)(()=>[(0,l.bF)($,null,{default:(0,l.k6)(()=>[(0,l.Lk)("div",wt,[(0,l.Lk)("span",null,(0,i.v_)(e.$t("uploadForm.autoRetry")),1),(0,l.bF)(U,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[6]||(t[6]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,l.k6)(()=>[(0,l.Lk)("button",{class:"modern-action-btn modern-action-btn-retry",onClick:t[5]||(t[5]=(...e)=>c.retryError&&c.retryError(...e))},[(0,l.bF)(F,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,l.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top"},{default:(0,l.k6)(()=>[(0,l.bF)(T,null,{dropdown:(0,l.k6)(()=>[(0,l.bF)(S,{class:"modern-dropdown-menu"},{default:(0,l.k6)(()=>[(0,l.bF)($,{onClick:c.clearFileList},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,l.bF)($,{onClick:c.clearSuccessList},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,l.k6)(()=>[(0,l.Lk)("button",Ft,[(0,l.bF)(F,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(d.fileList.slice().reverse(),e=>((0,l.uX)(),(0,l.Wv)(_,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[7]||(t[7]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979);var Ut=o(457),$t=o(76334),St=o(60782);function Tt(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function _t(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function xt(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=Tt(e.srcID,e.name,t);Object.assign(e,o)})}const At=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Mt=(e,t)=>e>>>t|e<<32-t;function Rt(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=Mt(o[u-15],7)^Mt(o[u-15],18)^o[u-15]>>>3,t=Mt(o[u-2],17)^Mt(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,a,l,i,n,r,d,c]=t;for(let u=0;u<64;u++){const e=Mt(n,6)^Mt(n,11)^Mt(n,25),t=n&r^~n&d,p=c+e+t+At[u]+o[u]>>>0,h=Mt(s,2)^Mt(s,13)^Mt(s,22),m=s&a^s&l^a&l,g=h+m>>>0;c=d,d=r,r=n,n=i+p>>>0,i=l,l=a,a=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+a>>>0,t[2]=t[2]+l>>>0,t[3]=t[3]+i>>>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 Dt(){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 l=0;if(o>0){const s=64-o,i=Math.min(s,a.length);t.set(a.subarray(0,i),o),o+=i,l=i,64===o&&(Rt(t,e),o=0)}while(l+64<=a.length)Rt(a.subarray(l,l+64),e),l+=64;l56&&(t.fill(0,o,64),Rt(t,e),o=0),t.fill(0,o,56);const l=new DataView(t.buffer);l.setUint32(56,Math.floor(a/4294967296),!1),l.setUint32(60,a>>>0,!1),Rt(t,e);let i="";for(let t=0;t<8;t++)i+=e[t].toString(16).padStart(8,"0");return i}}}async function Et(e){const t=Dt(),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(){xt(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&xt(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,St.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 l=a.length+4,i=t-l-3;return i<=0?e.substring(0,t-3)+"...":s.substring(0,i)+"..."+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,l="external"===s?"default":this.uploadNameType,i=new AbortController;this.abortControllers.set(e.file.uid,i);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Et(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Ut.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+l+"&autoRetry="+a+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:i.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,l=e.file.size,i=e.file.type||"application/octet-stream",n=Math.ceil(l/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 Et(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",i),t.append("totalChunks",n.toString());const h=await(0,Ut.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,l),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",i);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,Ut.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=Tt(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(_t(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 l=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,i=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(l)$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 l=this.uploadCount++,i=this.serverCompress&&a.size/1024/1024<10&&"telegram"===this.uploadChannel;0===l?n(a,i):setTimeout(()=>{n(a,i),this.uploadCount--},300*l)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(i){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=>_t(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`,i=`[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:l,ubbURL:i,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)&&Ut.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 l=o.headers["content-disposition"];if(l){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(l);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(a){s=""}}""===s&&(o=t.exec(l),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 i=o.data,n=new File([i],s,{type:i.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await Et(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),a=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const l=await(0,Ut.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(!l.data.success)throw new Error(l.data.error||"Failed to get upload URL");const i=l.data;if(console.log("Upload info:",i),i.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(i.needsLfs&&i.uploadAction){const{href:t,header:s}=i.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,i,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,Ut.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:i.fullId,filePath:i.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:i.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:l}=s,i=parseInt(l.chunk_size),n=Object.keys(l).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${i}`);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*i,a=Math.min(s+i,e.file.size),n=e.file.slice(s,a);console.log(`Uploading part ${u}/${d}`);const c=await fetch(l[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"),l=a.getContext("2d");s.onload=()=>{a.width=s.width,a.height=s.height,l.drawImage(s,0,0),a.toBlob(a=>{if(a){const o=e.name,s=o.lastIndexOf("."),l=s>0?o.substring(0,s)+".webp":o+".webp",i=new File([a],l,{type:"image/webp"});i.uid=e.uid,t(i)}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 Nt=(0,W.A)(It,[["render",Lt],["__scopeId","data-v-fca24b68"]]);var Pt=Nt,zt=o(732),Vt=o(33892),Wt=o(45130);const Bt={class:"directory-suggestion-input",ref:"wrapperRef"},Ht={class:"suggestion-dropdown"},Qt={class:"suggestion-list"},Xt=["title","onMousedown"];function qt(e,t,o,s,a,n){const r=G.WK;return(0,l.uX)(),(0,l.CE)("div",Bt,[(0,l.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,l.bo)((0,l.Lk)("div",Ht,[(0,l.Lk)("ul",Qt,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(a.suggestions,(e,t)=>((0,l.uX)(),(0,l.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Wt.D$)(t=>n.selectItem(e),["prevent"])},(0,i.v_)(e.value),41,Xt))),128))])],512),[[Wt.aG,a.dropdownVisible&&a.suggestions.length>0]])],512)}var Ot={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 Ut.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]||"",l=s.slice(0,-1).filter(Boolean),i=l.length>0?`/${l.join("/")}/`:"/";return{segmentInput:a,parentPath:i}},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,W.A)(Ot,[["render",qt],["__scopeId","data-v-28b8eda7"]]);var Gt=jt,Kt=o(808);const Jt={class:"container"},Yt={class:"upload-home"},Zt={class:"quick-toolbar-actions"},eo={class:"quick-toolbar-actions-inner"},to={class:"header"},oo={class:"title"},so={class:"title-crayon-text","aria-hidden":"true"},ao={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},lo={class:"dialog-section"},io={class:"section-header"},no={class:"section-title"},ro={class:"section-content"},co={class:"dialog-section"},uo={class:"section-header"},po={class:"section-title"},ho={class:"section-content"},mo={class:"setting-item"},go={class:"setting-label"},fo={key:0,class:"setting-item"},yo={class:"setting-label"},bo={class:"dialog-action"},ko=["innerHTML"],vo={class:"dialog-footer"};function Co(e,t,o,n,r,d){const c=Kt.A,u=(0,l.g2)("font-awesome-icon"),p=a.S2,h=pt.c6,m=pt.Iy,g=pt.dW,f=Gt,y=G.WK,b=Vt.A,k=s.R7,v=zt.A,C=Pt,w=J.ll,F=J.MQ,L=j.qi,U=X.kZ,$=We,S=Q.A,T=H;return(0,l.uX)(),(0,l.CE)("div",Jt,[(0,l.Lk)("div",Yt,[(0,l.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,l.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,l.k6)(()=>[(0,l.bF)(m,null,{default:(0,l.k6)(()=>[(0,l.bF)(h,{command:"showHistory"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.history")),1)]),_:1}),(0,l.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,l.bF)(h,{command:"toggleLanguage"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,l.bF)(h,{command:"viewDocs"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"more-button"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,l.Lk)("div",{class:(0,i.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,l.Lk)("div",{class:(0,i.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,l.uX)(),(0,l.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,l.uX)(),(0,l.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,l.uX)(),(0,l.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,l.k6)(()=>[(0,l.bF)(p,{class:"directory-tree-trigger"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,l.Q3)("",!0)],2),(0,l.bF)(k,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip},{default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,l.k6)(()=>["default"===r.uploadMethod?((0,l.uX)(),(0,l.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,l.uX)(),(0,l.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,l.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,l.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,l.k6)(()=>[(0,l.bF)(m,null,{default:(0,l.k6)(()=>[(0,l.bF)(h,{command:"toggleTheme"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,l.eW)(" "+(0,i.v_)(d.getThemeText()),1)]),_:1}),(0,l.bF)(h,{command:"toggleUploadMethod"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,l.eW)(" "+(0,i.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,l.bF)(h,{command:"showHistory"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.history")),1)]),_:1}),(0,l.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,l.bF)(h,{command:"toggleLanguage"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,l.bF)(h,{command:"viewDocs"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,l.eW)(" "+(0,i.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"mobile-more-button"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,l.Lk)("div",{class:(0,i.C4)(["quick-toolbar",{"is-expanded":r.isQuickToolbarOpen}]),onMouseleave:t[5]||(t[5]=(...e)=>d.handleQuickToolbarLeave&&d.handleQuickToolbarLeave(...e))},[(0,l.Lk)("div",Zt,[(0,l.Lk)("div",eo,[(0,l.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.logout"),placement:"left","hide-after":0},{default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"quick-toolbar-button",onClick:t[2]||(t[2]=e=>d.handleQuickToolbarCommand("logout"))},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"sign-out-alt",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,l.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.manage"),placement:"left","hide-after":0},{default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"quick-toolbar-button",onClick:t[3]||(t[3]=e=>d.handleQuickToolbarCommand("manage"))},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"cog",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"]),(0,l.bF)(k,{disabled:d.disableTooltip||!r.isQuickToolbarOpen,content:e.$t("upload.linkFormat"),placement:"left","hide-after":0},{default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"quick-toolbar-button",onClick:t[4]||(t[4]=e=>d.handleQuickToolbarCommand("linkFormat"))},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"link",class:"quick-toolbar-icon"})]),_:1})]),_:1},8,["disabled","content"])])]),(0,l.bF)(k,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"left","hide-after":0},{default:(0,l.k6)(()=>[(0,l.bF)(p,{class:"quick-toolbar-button",onClick:d.openCompressDialog},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"cloud-upload",class:"quick-toolbar-icon"})]),_:1},8,["onClick"])]),_:1},8,["disabled","content"]),(0,l.bF)(p,{class:(0,i.C4)(["quick-toolbar-button quick-toolbar-more",{"is-active":r.isQuickToolbarOpen}]),"aria-expanded":r.isQuickToolbarOpen,onMouseenter:d.handleQuickToolbarMoreEnter,onClick:d.toggleQuickToolbar},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"chevron-down",class:"quick-toolbar-icon quick-toolbar-toggle-icon"})]),_:1},8,["class","aria-expanded","onMouseenter","onClick"])],34),(0,l.bF)(v,{useConfigLink:!0}),(0,l.Lk)("div",to,[(0,l.Lk)("h1",oo,[(0,l.Lk)("span",so,(0,i.v_)(d.ownerName)+" ImgHub",1),(0,l.Lk)("a",ao,(0,i.v_)(d.ownerName),1),t[24]||(t[24]=(0,l.eW)(" ImgHub ",-1))])]),(0,l.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,l.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,l.k6)(()=>[(0,l.Lk)("div",lo,[(0,l.Lk)("div",io,[(0,l.Lk)("span",no,(0,i.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,l.Lk)("div",ro,[(0,l.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,l.k6)(()=>[(0,l.bF)(w,{value:"url",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"link",class:"radio-icon"}),(0,l.Lk)("span",null,(0,i.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,l.bF)(w,{value:"md",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"code",class:"radio-icon"}),t[25]||(t[25]=(0,l.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,l.bF)(w,{value:"html",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[26]||(t[26]=(0,l.Lk)("span",null,"HTML",-1))]),_:1}),(0,l.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[27]||(t[27]=(0,l.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,l.Lk)("div",co,[(0,l.Lk)("div",uo,[(0,l.Lk)("span",po,(0,i.v_)(e.$t("settings.customLink")),1),(0,l.bF)(k,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,l.k6)(()=>[(0,l.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,l.Lk)("div",ho,[(0,l.Lk)("div",mo,[(0,l.Lk)("span",go,(0,i.v_)(e.$t("settings.enableCustom")),1),(0,l.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,l.uX)(),(0,l.CE)("div",fo,[(0,l.Lk)("span",yo,(0,i.v_)(e.$t("settings.customPrefix")),1),(0,l.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,l.Q3)("",!0)])]),(0,l.Lk)("div",bo,[(0,l.bF)(p,{type:"primary",onClick:t[9]||(t[9]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,l.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,l.bF)(S,{class:"footer"}),(0,l.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,l.k6)(()=>[(0,l.Lk)("span",vo,[(0,l.bF)(p,{type:"primary",onClick:d.acknowledgeAnnouncement},{default:(0,l.k6)(()=>[(0,l.eW)((0,i.v_)(e.$t("upload.announcementAck")),1)]),_:1},8,["onClick"])])]),default:(0,l.k6)(()=>[(0,l.Lk)("div",{innerHTML:r.announcementContent},null,8,ko)]),_:1},8,["title","modelValue","width"]),(0,l.bF)(T,{show:r.showHistory,onClose:t[23]||(t[23]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var wo=o(46638),Fo=o(48903),Lo=o(90144),Uo=o(62388),$o={name:"UploadHome",mixins:[Fo.A],data(){return{selectedUrlForm:(0,Lo.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,Uo.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,St.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:Pt,Footer:Q.A,ToggleDark:Kt.A,Logo:zt.A,UploadHistory:H,UploadSettingsDialog:We,DirectoryTreePicker:Vt.A,DirectorySuggestionInput:Gt},methods:{async fetchAvailableChannels(){try{const e=await Ut.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,Uo.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(){Ut.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,wo.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,wo.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 So=(0,W.A)($o,[["render",Co],["__scopeId","data-v-51cecbb0"]]);var To=So},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 i}});o(44114);var s=o(25507),a=o(16915);let l=!1;async function i(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||l||(l=!0,s.A.commit("setAdminLoggedIn",!1),a.A.push("/adminLogin").finally(()=>{l=!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 l={key:0,class:"page-footer"},i=["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",l,[(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,i)])]))}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)}}]); +//# sourceMappingURL=800.e2c8a8a6.js.map \ No newline at end of file diff --git a/frontend-dist/js/800.e2c8a8a6.js.gz b/frontend-dist/js/800.e2c8a8a6.js.gz new file mode 100644 index 00000000..9fe3c3ad Binary files /dev/null and b/frontend-dist/js/800.e2c8a8a6.js.gz differ diff --git a/frontend-dist/js/800.e2c8a8a6.js.map b/frontend-dist/js/800.e2c8a8a6.js.map new file mode 100644 index 00000000..9059bb35 --- /dev/null +++ b/frontend-dist/js/800.e2c8a8a6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/800.e2c8a8a6.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/Logo.vue?a6d2","webpack://sanyue_imghub/./src/components/Logo.vue","webpack://sanyue_imghub/./src/components/Logo.vue?4125","webpack://sanyue_imghub/./src/components/ToggleDark.vue?5a8c","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?4482","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?0f8d","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?2681","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?5e70","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?79b9","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?8d36","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"],"sourcesContent":["import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = [\"href\", \"target\"];\nconst _hoisted_2 = [\"alt\", \"src\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"a\", {\n href: $options.logoHref,\n target: $props.target,\n class: _normalizeClass(_ctx.logo - _ctx.link)\n }, [_createElementVNode(\"img\", {\n class: _normalizeClass($options.logoClasses),\n alt: $props.alt,\n src: $options.logoUrl\n }, null, 10, _hoisted_2)], 10, _hoisted_1);\n}","import { mapGetters } from 'vuex';\nexport default {\n name: 'Logo',\n props: {\n // Logo链接地址(可被用户配置覆盖)\n href: {\n type: String,\n default: 'https://github.com/MarSeventh/CloudFlare-ImgBed'\n },\n // 链接打开方式\n target: {\n type: String,\n default: '_blank',\n // _blank, _self, _parent, _top\n validator: value => ['_blank', '_self', '_parent', '_top'].includes(value)\n },\n // 图片alt文本\n alt: {\n type: String,\n default: 'Sanyue logo'\n },\n // 自定义logo图片URL(可选)\n customSrc: {\n type: String,\n default: ''\n },\n // Logo位置样式\n position: {\n type: String,\n default: 'fixed',\n // fixed, relative, absolute\n validator: value => ['fixed', 'relative', 'absolute', 'static'].includes(value)\n },\n // Logo大小\n size: {\n type: String,\n default: 'normal',\n // small, normal, large\n validator: value => ['small', 'normal', 'large'].includes(value)\n },\n // 是否启用悬停动画\n enableHover: {\n type: Boolean,\n default: true\n },\n // 是否允许使用用户配置的链接(仅上传页面启用)\n useConfigLink: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n ...mapGetters(['userConfig']),\n logoUrl() {\n // 优先级:customSrc > 用户配置 > 默认图片\n return this.customSrc || this.userConfig?.logoUrl || require('../assets/logo.png');\n },\n logoHref() {\n // 只有启用 useConfigLink 时才使用用户配置的链接\n if (this.useConfigLink && this.userConfig?.logoLink) {\n return this.userConfig.logoLink;\n }\n return this.href;\n },\n logoClasses() {\n return {\n 'logo': true,\n [`logo--${this.position}`]: true,\n [`logo--${this.size}`]: true,\n 'logo--hover-enabled': this.enableHover\n };\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./Logo.vue?vue&type=template&id=17f54292&scoped=true\"\nimport script from \"./Logo.vue?vue&type=script&lang=js\"\nexport * from \"./Logo.vue?vue&type=script&lang=js\"\n\nimport \"./Logo.vue?vue&type=style&index=0&id=17f54292&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17f54292\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=c93807da&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=c93807da&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-c93807da\"]])\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 { 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 { 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\"\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=33933ada&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=33933ada&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-33933ada\"]])\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 }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\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=f70e7770&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=f70e7770&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-f70e7770\"]])\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 channel-brand-telegram\"\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 channel-brand-cfr2\"\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 channel-brand-s3\"\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 channel-brand-discord\"\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 channel-brand-huggingface\"\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 channel-brand-webdav\"\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=bb927c90\"\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=698179d6&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=698179d6&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-698179d6\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-copy\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn modern-action-btn-retry\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.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=fca24b68&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=fca24b68&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-fca24b68\"]])\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 }, {\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 }, {\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 }, {\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 }, {\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 }, {\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=51cecbb0&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=51cecbb0&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-51cecbb0\"]])\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__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","href","logoHref","target","class","logo","link","logoClasses","alt","src","logoUrl","name","props","type","String","default","validator","value","includes","customSrc","position","size","enableHover","Boolean","useConfigLink","computed","this","userConfig","logoLink","__exports__","id","_hoisted_3","_hoisted_4","_component_font_awesome_icon","onClick","args","handleToggleClick","mode","isAuto","key","icon","style","isDark","width","height","viewBox","fill","stroke","x","y","cx","cy","r","mask","opacity","x1","y1","x2","y2","_","data","$store","getters","useDarkMode","cusDarkMode","methods","commit","t","e","module","exports","n","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","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","quality","isNaN","accuracy","filter","sort","abs","pow","v","_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","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","required","icons","cfr2","s3","discord","_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","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","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"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/800.e2c8a8a6.js.map.gz b/frontend-dist/js/800.e2c8a8a6.js.map.gz new file mode 100644 index 00000000..104022e4 Binary files /dev/null and b/frontend-dist/js/800.e2c8a8a6.js.map.gz differ diff --git a/frontend-dist/js/903.57f9fe60.js b/frontend-dist/js/903.57f9fe60.js new file mode 100644 index 00000000..8b055899 --- /dev/null +++ b/frontend-dist/js/903.57f9fe60.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[903],{7835:function(e,t,n){e.exports=n.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,n){e.exports=n.p+"img/background.de27f549.jpg"},48903:function(e,t,n){n(18111),n(7588);var a=n(60782);const r="wallpaper-active",s="wallpaper-background-active";t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null,backgroundLoadGeneration:0,backgroundCleanupTimer:null}},computed:{...(0,a.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},setWallpaperActive(e,t=null){document.body&&(document.querySelectorAll(`.${s}`).forEach(e=>{e.classList.remove(s)}),document.body.classList.toggle(r,e),e&&t&&t.classList.add(s))},isBackgroundLoadCurrent(e){return e===this.backgroundLoadGeneration},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const n=document.createElement("img");n.id="bg2",n.className="background-image2",n.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(n,e.firstChild)},initializeBackground(e,t=".login",n=!1,a=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundLoadGeneration+=1,this.setWallpaperActive(!1),this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:n,autoCreateElements:a};const r=document.querySelector(t);this.prepareBackgroundContainer(r),a&&(!r||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(r));const s=document.getElementById("bg1"),o=document.getElementById("bg2");if(!s||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const i=this.userConfig?.[e];"bing"===i?this.setupBingWallpaper(s,o,t):Array.isArray(i)&&i.length>1?this.setupCustomWallpaperCarousel(s,o,i,t):Array.isArray(i)&&1===i.length?this.setupSingleCustomWallpaper(s,i[0],t):n&&this.setupDefaultWallpaper(s,t)},setupBingWallpaper(e,t,n){const a=this.backgroundLoadGeneration;this.$store.dispatch("fetchBingWallPapers").then(()=>{this.isBackgroundLoadCurrent(a)&&0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,n,!0,a),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t,n)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,n,a){this.loadBackgroundImage(e,n[this.customWallPaperIndex],a,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,n,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,n){this.loadBackgroundImage(e,t,n)},setupDefaultWallpaper(e,t){const a=this.useDarkMode,r=n(a?10732:7835);this.loadBackgroundImage(e,r,t)},loadBackgroundImage(e,t,n,a=!1,r=this.backgroundLoadGeneration){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,a);const s=document.querySelector(n);this.prepareBackgroundContainer(s);const o=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.isBackgroundLoadCurrent(r)&&(e.style.opacity=this.bkOpacity,a&&(e.style.transform="scale(1.045)"),this.setWallpaperActive(!0,s))})})};if(!t)return e.removeAttribute("src"),void this.setWallpaperActive(!1);const i=new Image;i.onload=()=>{this.isBackgroundLoadCurrent(r)&&(e.src=t,o())},i.onerror=()=>{this.isBackgroundLoadCurrent(r)&&(e.style.opacity=0,e.removeAttribute("src"),this.setWallpaperActive(!1),console.warn("背景图片加载失败,已保留页面原有背景"))},i.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const n=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${n}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t,n){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,r=a?e:t,s=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const o=this.bingWallPapers[this.bingWallPaperIndex]?.url,i=this.backgroundLoadGeneration;if(!o)return;const l=new Image;l.onload=()=>{this.isBackgroundLoadCurrent(i)&&(r.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0),s.src=o,setTimeout(()=>{this.isBackgroundLoadCurrent(i)&&(s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",this.setWallpaperActive(!0,document.querySelector(n)),setTimeout(()=>{this.isBackgroundLoadCurrent(i)&&(r.style.opacity=0,this.prepareBackgroundMotion(r,!0))},1200))},50))},l.onerror=()=>{this.isBackgroundLoadCurrent(i)&&console.warn("下一张 Bing 壁纸加载失败,继续显示当前壁纸")},l.src=o},switchCustomWallpaper(e,t,n,a){const r=0!=e.style.opacity,s=r?e:t,o=r?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%n.length;const i=n[this.customWallPaperIndex],l=this.backgroundLoadGeneration;if(!i)return;const c=new Image;c.onload=()=>{this.isBackgroundLoadCurrent(l)&&(s.style.zIndex=-2,o.style.zIndex=-1,this.prepareBackgroundMotion(o,!0),o.src=i,setTimeout(()=>{this.isBackgroundLoadCurrent(l)&&(o.style.opacity=this.bkOpacity,o.style.transform="scale(1.045)",this.setWallpaperActive(!0,document.querySelector(a)),setTimeout(()=>{this.isBackgroundLoadCurrent(l)&&(s.style.opacity=0,this.prepareBackgroundMotion(s,!0))},1200))},50))},c.onerror=()=>{this.isBackgroundLoadCurrent(l)&&console.warn("下一张自定义壁纸加载失败,继续显示当前壁纸")},c.src=i},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),n=document.getElementById("bg2");this.backgroundLoadGeneration+=1,this.backgroundCleanupTimer&&(clearTimeout(this.backgroundCleanupTimer),this.backgroundCleanupTimer=null),e?(this.setWallpaperActive(!1),t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),n&&(n.style.transition="none",n.style.opacity=0,n.removeAttribute("src"),setTimeout(()=>{n&&(n.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0),n&&(n.style.opacity=0),this.backgroundCleanupTimer=setTimeout(()=>{t&&t.removeAttribute("src"),n&&n.removeAttribute("src"),this.setWallpaperActive(!1),this.backgroundCleanupTimer=null},1200))},smoothThemeTransition(e,t=".login",a=!1,r=!1){const s=this.userConfig?.[e];if(!a||void 0!==s)return void this.reinitializeBackground(e,t,a,r);const o=document.getElementById("bg1"),i=document.getElementById("bg2");if(!o||!i)return void this.reinitializeBackground(e,t,a,r);const l=0!=o.style.opacity?o:i,c=0!=o.style.opacity?i:o,u=this.useDarkMode,d=n(u?10732:7835),g=new Image,m=this.backgroundLoadGeneration;g.onload=()=>{this.isBackgroundLoadCurrent(m)&&(c.onload=()=>{c.onload=null,this.isBackgroundLoadCurrent(m)&&(l.style.opacity=0,setTimeout(()=>{this.isBackgroundLoadCurrent(m)&&(c.style.opacity=this.bkOpacity)},50))},c.src=d)},g.onerror=()=>{this.isBackgroundLoadCurrent(m)&&console.warn("主题背景图加载失败,继续显示当前壁纸")},g.src=d},reinitializeBackground(e,t=".login",n=!1,a=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,n,a)},100)}}}}}]); +//# sourceMappingURL=903.57f9fe60.js.map \ No newline at end of file diff --git a/frontend-dist/js/903.57f9fe60.js.gz b/frontend-dist/js/903.57f9fe60.js.gz new file mode 100644 index 00000000..a03d64e6 Binary files /dev/null and b/frontend-dist/js/903.57f9fe60.js.gz differ diff --git a/frontend-dist/js/903.57f9fe60.js.map b/frontend-dist/js/903.57f9fe60.js.map new file mode 100644 index 00000000..baa23c8e --- /dev/null +++ b/frontend-dist/js/903.57f9fe60.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/903.57f9fe60.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\nconst WALLPAPER_ACTIVE_CLASS = 'wallpaper-active'\nconst WALLPAPER_CONTAINER_ACTIVE_CLASS = 'wallpaper-background-active'\n\nexport default {\n data() {\n return {\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\n // 存储初始化参数,用于主题切换时重新初始化\n backgroundInitParams: null,\n backgroundLoadGeneration: 0,\n backgroundCleanupTimer: null,\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\n },\n\n /**\n * 同步页面壁纸状态。只有成功加载的壁纸才允许页面容器变为透明。\n * @param {boolean} active - 是否已有可显示的壁纸\n * @param {HTMLElement|null} container - 当前壁纸所在的页面容器\n */\n setWallpaperActive(active, container = null) {\n if (!document.body) return\n\n document.querySelectorAll(`.${WALLPAPER_CONTAINER_ACTIVE_CLASS}`).forEach((element) => {\n element.classList.remove(WALLPAPER_CONTAINER_ACTIVE_CLASS)\n })\n\n document.body.classList.toggle(WALLPAPER_ACTIVE_CLASS, active)\n if (active && container) {\n container.classList.add(WALLPAPER_CONTAINER_ACTIVE_CLASS)\n }\n },\n\n isBackgroundLoadCurrent(generation) {\n return generation === this.backgroundLoadGeneration\n },\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\n }\n\n // 新页面在壁纸成功加载前保留自身底色,并使旧的异步加载结果失效\n this.backgroundLoadGeneration += 1\n this.setWallpaperActive(false)\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\n const loadGeneration = this.backgroundLoadGeneration\n this.$store.dispatch('fetchBingWallPapers').then(() => {\n if (!this.isBackgroundLoadCurrent(loadGeneration) || this.bingWallPapers.length === 0) return\n\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true, loadGeneration)\n \n this.backgroundInterval = setInterval(() => {\n this.switchBingWallpaper(bg1, bg2, containerSelector)\n }, this.bkInterval)\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\n \n this.backgroundInterval = setInterval(() => {\n this.switchCustomWallpaper(bg1, bg2, wallpapers, containerSelector)\n }, this.bkInterval)\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false, loadGeneration = this.backgroundLoadGeneration) {\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n imgElement.style.opacity = this.bkOpacity\n if (enableZoom) {\n imgElement.style.transform = 'scale(1.045)'\n }\n this.setWallpaperActive(true, container)\n })\n })\n }\n\n if (!imageSrc) {\n imgElement.removeAttribute('src')\n this.setWallpaperActive(false)\n return\n }\n\n const preload = new Image()\n preload.onload = () => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n imgElement.src = imageSrc\n showImage()\n }\n preload.onerror = () => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n imgElement.style.opacity = 0\n imgElement.removeAttribute('src')\n this.setWallpaperActive(false)\n console.warn('背景图片加载失败,已保留页面原有背景')\n }\n preload.src = imageSrc\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2, containerSelector) {\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\n const loadGeneration = this.backgroundLoadGeneration\n if (!nextUrl) return\n\n const preload = new Image()\n preload.onload = () => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n // 新图成功加载后再调整层级,失败时继续显示当前壁纸\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n this.prepareBackgroundMotion(nextBg, true)\n nextBg.src = nextUrl\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\n setTimeout(() => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\n nextBg.style.transform = 'scale(1.045)'\n this.setWallpaperActive(true, document.querySelector(containerSelector))\n \n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\n setTimeout(() => { \n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n curBg.style.opacity = 0 \n this.prepareBackgroundMotion(curBg, true)\n }, 1200)\r\n }, 50)\n }\n preload.onerror = () => {\n if (this.isBackgroundLoadCurrent(loadGeneration)) {\n console.warn('下一张 Bing 壁纸加载失败,继续显示当前壁纸')\n }\n }\n preload.src = nextUrl\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers, containerSelector) {\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\n const nextUrl = wallpapers[this.customWallPaperIndex]\n const loadGeneration = this.backgroundLoadGeneration\n if (!nextUrl) return\n\n const preload = new Image()\n preload.onload = () => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n // 新图成功加载后再调整层级,失败时继续显示当前壁纸\n curBg.style.zIndex = -2\n nextBg.style.zIndex = -1\n this.prepareBackgroundMotion(nextBg, true)\n nextBg.src = nextUrl\n \n setTimeout(() => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n nextBg.style.opacity = this.bkOpacity\n nextBg.style.transform = 'scale(1.045)'\n this.setWallpaperActive(true, document.querySelector(containerSelector))\n \n setTimeout(() => { \n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n curBg.style.opacity = 0 \n this.prepareBackgroundMotion(curBg, true)\n }, 1200)\r\n }, 50)\n }\n preload.onerror = () => {\n if (this.isBackgroundLoadCurrent(loadGeneration)) {\n console.warn('下一张自定义壁纸加载失败,继续显示当前壁纸')\n }\n }\n preload.src = nextUrl\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\n const bg1 = document.getElementById('bg1')\n const bg2 = document.getElementById('bg2')\n\n // 使尚未完成的预加载回调失效\n this.backgroundLoadGeneration += 1\n if (this.backgroundCleanupTimer) {\n clearTimeout(this.backgroundCleanupTimer)\n this.backgroundCleanupTimer = null\n }\n \n if (immediate) {\n this.setWallpaperActive(false)\n // 立即清除,不使用过渡效果\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\r\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\n // 使用过渡效果淡出\n if (bg1) {\n bg1.style.opacity = 0\n }\n if (bg2) {\n bg2.style.opacity = 0\n }\n this.backgroundCleanupTimer = setTimeout(() => {\n if (bg1) bg1.removeAttribute('src')\n if (bg2) bg2.removeAttribute('src')\n this.setWallpaperActive(false)\n this.backgroundCleanupTimer = null\n }, 1200)\n }\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\n const loadGeneration = this.backgroundLoadGeneration\n preloadImg.onload = () => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n // 设置下一个背景的图片源\n nextBg.onload = () => {\n nextBg.onload = null\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n\n // 淡出当前背景\n currentBg.style.opacity = 0\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\n if (!this.isBackgroundLoadCurrent(loadGeneration)) return\n nextBg.style.opacity = this.bkOpacity\n }, 50) // 50ms 延迟,让淡出效果先开始\n }\n nextBg.src = newThemeImage\n }\n \n preloadImg.onerror = () => {\n if (this.isBackgroundLoadCurrent(loadGeneration)) {\n console.warn('主题背景图加载失败,继续显示当前壁纸')\n }\n }\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n"],"names":["WALLPAPER_ACTIVE_CLASS","WALLPAPER_CONTAINER_ACTIVE_CLASS","data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","backgroundLoadGeneration","backgroundCleanupTimer","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","setWallpaperActive","active","container","body","querySelectorAll","forEach","element","classList","toggle","add","isBackgroundLoadCurrent","generation","createBackgroundElements","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","loadGeneration","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","opacity","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","removeAttribute","preload","Image","onload","src","onerror","zoomDuration","Math","max","transition","transformOrigin","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","clearTimeout","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/903.57f9fe60.js.map.gz b/frontend-dist/js/903.57f9fe60.js.map.gz new file mode 100644 index 00000000..c931ae38 Binary files /dev/null and b/frontend-dist/js/903.57f9fe60.js.map.gz differ diff --git a/frontend-dist/js/967.f004078f.js b/frontend-dist/js/967.f004078f.js deleted file mode 100644 index a3368a72..00000000 --- a/frontend-dist/js/967.f004078f.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[967],{7835:function(e,t,a){e.exports=a.p+"img/background-light.f17603bc.jpg"},10732:function(e,t,a){e.exports=a.p+"img/background.de27f549.jpg"},48903:function(e,t,a){var n=a(60782);t.A={data(){return{bingWallPaperIndex:0,customWallPaperIndex:0,backgroundInterval:null,backgroundInitParams:null}},computed:{...(0,n.L8)(["userConfig","bingWallPapers","useDarkMode"]),bkInterval(){return this.userConfig?.bkInterval||3e3},bkOpacity(){return this.userConfig?.bkOpacity||1},backgroundImagesTemplate(){return'\n Background Image\n Background Image\n '},backgroundImagesStyles(){return"\n .background-image1 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n .background-image2 {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n pointer-events: none;\n opacity: 0;\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\n transform: scale(1);\n transform-origin: center center;\n will-change: opacity, transform;\n filter: var(--background-image-filter, brightness(1));\n }\n "}},watch:{useDarkMode(e,t){e!==t&&this.backgroundInitParams&&this.$nextTick(()=>{this.smoothThemeTransition(this.backgroundInitParams.configKey,this.backgroundInitParams.containerSelector,this.backgroundInitParams.useDefaultBackground,this.backgroundInitParams.autoCreateElements)})}},mounted(){this.injectBackgroundStyles()},beforeUnmount(){this.backgroundInterval&&clearInterval(this.backgroundInterval),this.clearBackgroundImages(!0),this.removeBackgroundStyles()},methods:{injectBackgroundStyles(){const e="background-manager-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=this.backgroundImagesStyles,document.head.appendChild(t)}},removeBackgroundStyles(){const e="background-manager-styles",t=document.getElementById(e);t&&t.remove()},createBackgroundElements(e){if(!e)return void console.warn("未提供有效的容器元素");if(document.getElementById("bg1")||document.getElementById("bg2"))return;const t=document.createElement("img");t.id="bg1",t.className="background-image1",t.alt="Background Image";const a=document.createElement("img");a.id="bg2",a.className="background-image2",a.alt="Background Image",e.insertBefore(t,e.firstChild),e.insertBefore(a,e.firstChild)},initializeBackground(e,t=".login",a=!1,n=!1){if(!1===this.userConfig?.wallpaperEnabled)return void this.clearBackgroundImages(!0);this.backgroundInitParams={configKey:e,containerSelector:t,useDefaultBackground:a,autoCreateElements:n};const s=document.querySelector(t);this.prepareBackgroundContainer(s),n&&(!s||document.getElementById("bg1")&&document.getElementById("bg2")||this.createBackgroundElements(s));const r=document.getElementById("bg1"),o=document.getElementById("bg2");if(!r||!o)return void console.warn("背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements");const i=this.userConfig?.[e];"bing"===i?this.setupBingWallpaper(r,o,t):Array.isArray(i)&&i.length>1?this.setupCustomWallpaperCarousel(r,o,i,t):Array.isArray(i)&&1===i.length?this.setupSingleCustomWallpaper(r,i[0],t):a&&this.setupDefaultWallpaper(r,t)},setupBingWallpaper(e,t,a){this.$store.dispatch("fetchBingWallPapers").then(()=>{0!==this.bingWallPapers.length&&(this.loadBackgroundImage(e,this.bingWallPapers[this.bingWallPaperIndex]?.url,a,!0),this.backgroundInterval=setInterval(()=>{this.switchBingWallpaper(e,t)},this.bkInterval))})},setupCustomWallpaperCarousel(e,t,a,n){this.loadBackgroundImage(e,a[this.customWallPaperIndex],n,!0),this.backgroundInterval=setInterval(()=>{this.switchCustomWallpaper(e,t,a)},this.bkInterval)},setupSingleCustomWallpaper(e,t,a){this.loadBackgroundImage(e,t,a)},setupDefaultWallpaper(e,t){const n=this.useDarkMode,s=a(n?10732:7835);this.loadBackgroundImage(e,s,t)},loadBackgroundImage(e,t,a,n=!1){e.style.zIndex=-1,e.style.opacity=0,this.prepareBackgroundMotion(e,n);const s=document.querySelector(a);this.prepareBackgroundContainer(s);const r=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.style.opacity=this.bkOpacity,n&&(e.style.transform="scale(1.045)")})})},o=new Image;o.onload=()=>{e.src=t,r()},o.onerror=()=>{e.src=t,r()},o.src=t},prepareBackgroundMotion(e,t=!1){if(!e)return;const a=Math.max(this.bkInterval+1200,4200);e.style.transition=t?`opacity 1.2s ease-in-out, filter 0.3s ease, transform ${a}ms ease-out`:"opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease",e.style.transformOrigin="center center",e.style.transform="scale(1)"},prepareBackgroundContainer(e){if(!e)return;const t=window.getComputedStyle(e);"static"===t.position&&(e.style.position="relative"),"auto"===t.zIndex&&(e.style.zIndex="0"),e.style.isolation="isolate"},switchBingWallpaper(e,t){if(0===this.bingWallPapers.length)return;const a=0!=e.style.opacity,n=a?e:t,s=a?t:e;this.bingWallPaperIndex=(this.bingWallPaperIndex+1)%this.bingWallPapers.length;const r=this.bingWallPapers[this.bingWallPaperIndex]?.url;n.style.zIndex=-2,s.style.zIndex=-1,this.prepareBackgroundMotion(s,!0);const o=new Image;o.onload=()=>{s.src=r,setTimeout(()=>{s.style.opacity=this.bkOpacity,s.style.transform="scale(1.045)",setTimeout(()=>{n.style.opacity=0,this.prepareBackgroundMotion(n,!0)},1200)},50)},o.src=r},switchCustomWallpaper(e,t,a){const n=0!=e.style.opacity,s=n?e:t,r=n?t:e;this.customWallPaperIndex=(this.customWallPaperIndex+1)%a.length;const o=a[this.customWallPaperIndex];s.style.zIndex=-2,r.style.zIndex=-1,this.prepareBackgroundMotion(r,!0);const i=new Image;i.onload=()=>{r.src=o,setTimeout(()=>{r.style.opacity=this.bkOpacity,r.style.transform="scale(1.045)",setTimeout(()=>{s.style.opacity=0,this.prepareBackgroundMotion(s,!0)},1200)},50)},i.src=o},clearBackgroundInterval(){this.backgroundInterval&&(clearInterval(this.backgroundInterval),this.backgroundInterval=null)},clearBackgroundImages(e=!1){const t=document.getElementById("bg1"),a=document.getElementById("bg2");e?(t&&(t.style.transition="none",t.style.opacity=0,t.removeAttribute("src"),setTimeout(()=>{t&&(t.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50)),a&&(a.style.transition="none",a.style.opacity=0,a.removeAttribute("src"),setTimeout(()=>{a&&(a.style.transition="opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease")},50))):(t&&(t.style.opacity=0,setTimeout(()=>{t&&t.removeAttribute("src")},1200)),a&&(a.style.opacity=0,setTimeout(()=>{a&&a.removeAttribute("src")},1200)))},smoothThemeTransition(e,t=".login",n=!1,s=!1){const r=this.userConfig?.[e];if(!n||void 0!==r)return void this.reinitializeBackground(e,t,n,s);const o=document.getElementById("bg1"),i=document.getElementById("bg2");if(!o||!i)return void this.reinitializeBackground(e,t,n,s);const l=0!=o.style.opacity?o:i,c=0!=o.style.opacity?i:o,d=this.useDarkMode,u=a(d?10732:7835),g=new Image;g.onload=()=>{c.src=u,c.onload=()=>{l.style.opacity=0,setTimeout(()=>{c.style.opacity=this.bkOpacity},50)}},g.onerror=()=>{console.warn("主题背景图预加载失败,回退到直接切换"),this.reinitializeBackground(e,t,n,s)},g.src=u},reinitializeBackground(e,t=".login",a=!1,n=!1){this.clearBackgroundInterval(),this.clearBackgroundImages(!0),this.bingWallPaperIndex=0,this.customWallPaperIndex=0,setTimeout(()=>{this.initializeBackground(e,t,a,n)},100)}}}},84967:function(e,t,a){a.r(t),a.d(t,{default:function(){return B}});var n=a(80047),s=(a(85331),a(99648),a(56768));const r={class:"not-found-container"},o=["innerHTML"],i={class:"not-found-content"},l={class:"back-button-wrapper"},c={class:"error-animation"},d={class:"error-image"},u=["src"],g={class:"error-info"},m={class:"error-actions"},p={class:"help-links"},h={class:"quick-links"};function k(e,t,a,k,b,y){const f=(0,s.g2)("font-awesome-icon"),I=n.S2;return(0,s.uX)(),(0,s.CE)("div",r,[(0,s.Lk)("div",{class:"background-wrapper",innerHTML:e.backgroundImagesTemplate},null,8,o),(0,s.Lk)("div",i,[(0,s.Lk)("div",l,[(0,s.bF)(I,{class:"back-button",onClick:y.goHome,circle:"",size:"large"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"home"})]),_:1},8,["onClick"])]),(0,s.Lk)("div",c,[t[3]||(t[3]=(0,s.Lk)("div",{class:"error-number"},[(0,s.Lk)("span",{class:"four"},"4"),(0,s.Lk)("span",{class:"zero"},"0"),(0,s.Lk)("span",{class:"four"},"4")],-1)),(0,s.Lk)("div",d,[(0,s.Lk)("img",{src:y.errorImage,alt:"404",class:"floating-image"},null,8,u)])]),(0,s.Lk)("div",g,[t[10]||(t[10]=(0,s.Lk)("h1",{class:"error-title"},"页面走丢了",-1)),t[11]||(t[11]=(0,s.Lk)("p",{class:"error-description"}," 抱歉,您访问的页面可能已被删除、更名或暂时不可用 ",-1)),(0,s.Lk)("div",m,[(0,s.bF)(I,{type:"primary",size:"large",class:"action-btn primary-btn",onClick:y.goHome},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"home",class:"btn-icon"}),t[4]||(t[4]=(0,s.eW)(" 返回首页 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(I,{size:"large",class:"action-btn secondary-btn",onClick:y.goBack},{default:(0,s.k6)(()=>[(0,s.bF)(f,{icon:"arrow-left",class:"btn-icon"}),t[5]||(t[5]=(0,s.eW)(" 返回上页 ",-1))]),_:1},8,["onClick"])]),(0,s.Lk)("div",p,[t[9]||(t[9]=(0,s.Lk)("p",{class:"help-text"},"也许您想要:",-1)),(0,s.Lk)("div",h,[(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[0]||(t[0]=(...e)=>y.goHome&&y.goHome(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"cloud-upload-alt"}),t[6]||(t[6]=(0,s.eW)(" 图片上传 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[1]||(t[1]=(...e)=>y.goDashboard&&y.goDashboard(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"tachometer-alt"}),t[7]||(t[7]=(0,s.eW)(" 管理面板 ",-1))]),(0,s.Lk)("a",{href:"javascript:void(0)",onClick:t[2]||(t[2]=(...e)=>y.refreshPage&&y.refreshPage(...e)),class:"quick-link"},[(0,s.bF)(f,{icon:"redo"}),t[8]||(t[8]=(0,s.eW)(" 刷新页面 ",-1))])])])])]),t[12]||(t[12]=(0,s.Fv)('
',1))])}a(44114);var b=a(60782),y=a(48903),f={name:"NotFound",mixins:[y.A],computed:{...(0,b.L8)(["useDarkMode","userConfig"]),errorImage(){return a(96682)}},mounted(){this.initializeBackground("uploadBkImg",".not-found-container",!1,!0)},beforeUnmount(){this.clearBackgroundInterval()},methods:{goHome(){this.$router.push("/")},goBack(){window.history.length>1?this.$router.go(-1):this.$router.push("/")},goDashboard(){this.$router.push("/dashboard")},refreshPage(){window.location.reload()}}},I=a(71241);const v=(0,I.A)(f,[["render",k],["__scopeId","data-v-59d53856"]]);var B=v},96682:function(e,t,a){e.exports=a.p+"img/404.8ed11fb3.png"}}]); -//# sourceMappingURL=967.f004078f.js.map \ No newline at end of file diff --git a/frontend-dist/js/967.f004078f.js.gz b/frontend-dist/js/967.f004078f.js.gz deleted file mode 100644 index 235c7874..00000000 Binary files a/frontend-dist/js/967.f004078f.js.gz and /dev/null differ diff --git a/frontend-dist/js/967.f004078f.js.map b/frontend-dist/js/967.f004078f.js.map deleted file mode 100644 index a40380a6..00000000 --- a/frontend-dist/js/967.f004078f.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/967.f004078f.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/mixins/backgroundManager.js","webpack://sanyue_imghub/./src/views/NotFound.vue?30c5","webpack://sanyue_imghub/./src/views/NotFound.vue","webpack://sanyue_imghub/./src/views/NotFound.vue?5f0d"],"sourcesContent":["/**\r\n * 背景图管理 Mixin\r\n * 用于统一管理页面背景图的加载和轮播逻辑\r\n */\r\n\r\nimport { mapGetters } from 'vuex'\nimport '@/styles/background.css'\n\r\nexport default {\r\n data() {\r\n return {\r\n bingWallPaperIndex: 0,\r\n customWallPaperIndex: 0,\r\n backgroundInterval: null, // 存储轮播定时器\r\n // 存储初始化参数,用于主题切换时重新初始化\r\n backgroundInitParams: null,\r\n }\r\n },\r\n computed: {\r\n ...mapGetters(['userConfig', 'bingWallPapers', 'useDarkMode']),\r\n bkInterval() {\r\n return this.userConfig?.bkInterval || 3000\r\n },\r\n bkOpacity() {\r\n return this.userConfig?.bkOpacity || 1\r\n },\r\n // 提供背景图片元素的模板\r\n backgroundImagesTemplate() {\r\n return `\r\n \"Background\r\n \"Background\r\n `\r\n },\r\n // 提供背景图片的CSS样式\r\n backgroundImagesStyles() {\r\n return `\r\n .background-image1 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n .background-image2 {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n z-index: -1;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 1.2s ease-in-out, filter 0.3s ease, transform 4.2s ease-out;\r\n transform: scale(1);\r\n transform-origin: center center;\r\n will-change: opacity, transform;\r\n filter: var(--background-image-filter, brightness(1));\r\n }\r\n `\r\n }\r\n },\r\n\r\n watch: {\r\n // 监听深色模式切换\r\n useDarkMode(newVal, oldVal) {\r\n // 只有在值真正改变且已经初始化过背景时才平滑切换主题\r\n if (newVal !== oldVal && this.backgroundInitParams) {\r\n this.$nextTick(() => {\r\n this.smoothThemeTransition(\r\n this.backgroundInitParams.configKey,\r\n this.backgroundInitParams.containerSelector,\r\n this.backgroundInitParams.useDefaultBackground,\r\n this.backgroundInitParams.autoCreateElements\r\n )\r\n })\r\n }\r\n }\r\n },\r\n\r\n mounted() {\r\n // 动态注入背景图片的CSS样式\r\n this.injectBackgroundStyles()\r\n },\r\n\r\n beforeUnmount() {\r\n // 组件销毁前清除定时器\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n }\r\n // 立即清除背景图片,不使用过渡效果\r\n this.clearBackgroundImages(true)\r\n // 移除动态注入的样式\r\n this.removeBackgroundStyles()\r\n },\r\n\r\n methods: {\r\n /**\r\n * 动态注入背景图片样式\r\n */\r\n injectBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = this.backgroundImagesStyles\r\n document.head.appendChild(style)\r\n }\r\n },\r\n\r\n /**\r\n * 移除动态注入的样式\r\n */\r\n removeBackgroundStyles() {\r\n const styleId = 'background-manager-styles'\r\n const existingStyle = document.getElementById(styleId)\r\n if (existingStyle) {\r\n existingStyle.remove()\r\n }\r\n },\r\n\r\n /**\r\n * 动态创建背景图片元素\r\n * @param {HTMLElement} container - 要插入背景图片的容器元素\r\n */\r\n createBackgroundElements(container) {\r\n if (!container) {\r\n console.warn('未提供有效的容器元素')\r\n return\r\n }\r\n\r\n // 检查是否已经存在背景图片元素\r\n if (document.getElementById('bg1') || document.getElementById('bg2')) {\r\n return\r\n }\r\n\r\n // 创建 bg1 元素\r\n const bg1 = document.createElement('img')\r\n bg1.id = 'bg1'\r\n bg1.className = 'background-image1'\r\n bg1.alt = 'Background Image'\r\n \r\n // 创建 bg2 元素\r\n const bg2 = document.createElement('img')\r\n bg2.id = 'bg2'\r\n bg2.className = 'background-image2'\r\n bg2.alt = 'Background Image'\r\n\r\n // 将元素插入到容器的开头\r\n container.insertBefore(bg1, container.firstChild)\r\n container.insertBefore(bg2, container.firstChild)\r\n },\r\n /**\r\n * 初始化背景图\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器,用于设置透明背景\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n initializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n // 如果全局壁纸开关关闭,直接清理背景并返回\r\n if (this.userConfig?.wallpaperEnabled === false) {\r\n this.clearBackgroundImages(true);\r\n return;\r\n }\r\n\r\n // 保存初始化参数,用于主题切换时重新初始化\r\n this.backgroundInitParams = {\r\n configKey,\r\n containerSelector,\r\n useDefaultBackground,\r\n autoCreateElements\r\n }\r\n\r\n // 如果需要自动创建元素且元素不存在,则创建\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n if (autoCreateElements) {\r\n if (container && (!document.getElementById('bg1') || !document.getElementById('bg2'))) {\r\n this.createBackgroundElements(container)\r\n }\r\n }\r\n\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n console.warn('背景图元素 #bg1 或 #bg2 未找到,请确保页面中包含这些元素或启用 autoCreateElements')\r\n return\r\n }\r\n\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n\r\n if (backgroundConfig === 'bing') {\r\n this.setupBingWallpaper(bg1, bg2, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length > 1) {\r\n this.setupCustomWallpaperCarousel(bg1, bg2, backgroundConfig, containerSelector)\r\n } else if (Array.isArray(backgroundConfig) && backgroundConfig.length === 1) {\r\n this.setupSingleCustomWallpaper(bg1, backgroundConfig[0], containerSelector)\r\n } else if (useDefaultBackground) {\r\n this.setupDefaultWallpaper(bg1, containerSelector)\r\n }\r\n },\r\n\r\n /**\r\n * 设置 Bing 壁纸轮播\r\n */\r\n setupBingWallpaper(bg1, bg2, containerSelector) {\r\n this.$store.dispatch('fetchBingWallPapers').then(() => {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n this.loadBackgroundImage(bg1, this.bingWallPapers[this.bingWallPaperIndex]?.url, containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchBingWallpaper(bg1, bg2)\r\n }, this.bkInterval)\r\n })\r\n },\r\n\r\n /**\r\n * 设置自定义壁纸轮播\r\n */\r\n setupCustomWallpaperCarousel(bg1, bg2, wallpapers, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpapers[this.customWallPaperIndex], containerSelector, true)\r\n \r\n this.backgroundInterval = setInterval(() => {\r\n this.switchCustomWallpaper(bg1, bg2, wallpapers)\r\n }, this.bkInterval)\r\n },\r\n\r\n /**\r\n * 设置单张自定义壁纸\r\n */\r\n setupSingleCustomWallpaper(bg1, wallpaperUrl, containerSelector) {\r\n this.loadBackgroundImage(bg1, wallpaperUrl, containerSelector)\r\n },\r\n\r\n /**\r\n * 设置默认壁纸\r\n */\r\n setupDefaultWallpaper(bg1, containerSelector) {\r\n // 根据当前深色模式状态选择背景图\r\n const isDark = this.useDarkMode\r\n const defaultImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n \r\n this.loadBackgroundImage(bg1, defaultImage, containerSelector)\r\n },\r\n\r\n /**\r\n * 加载背景图片\r\n */\r\n loadBackgroundImage(imgElement, imageSrc, containerSelector, enableZoom = false) {\r\n // 确保初始化时层级正确\r\n imgElement.style.zIndex = -1\r\n imgElement.style.opacity = 0\r\n this.prepareBackgroundMotion(imgElement, enableZoom)\r\n const container = document.querySelector(containerSelector)\r\n this.prepareBackgroundContainer(container)\r\n\r\n const showImage = () => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n imgElement.style.opacity = this.bkOpacity\r\n if (enableZoom) {\r\n imgElement.style.transform = 'scale(1.045)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.onerror = () => {\r\n imgElement.src = imageSrc\r\n showImage()\r\n }\r\n preload.src = imageSrc\r\n },\r\n\r\n prepareBackgroundMotion(imgElement, enableZoom = false) {\r\n if (!imgElement) return\r\n\r\n const zoomDuration = Math.max(this.bkInterval + 1200, 4200)\r\n imgElement.style.transition = enableZoom\r\n ? `opacity 1.2s ease-in-out, filter 0.3s ease, transform ${zoomDuration}ms ease-out`\r\n : 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n imgElement.style.transformOrigin = 'center center'\r\n imgElement.style.transform = 'scale(1)'\r\n },\r\n \r\n prepareBackgroundContainer(container) {\r\n if (!container) return\r\n\r\n const computedStyle = window.getComputedStyle(container)\r\n if (computedStyle.position === 'static') {\r\n container.style.position = 'relative'\r\n }\r\n\r\n if (computedStyle.zIndex === 'auto') {\r\n container.style.zIndex = '0'\r\n }\r\n\r\n container.style.isolation = 'isolate'\r\n },\r\n\r\n /**\r\n * 切换 Bing 壁纸\r\n */\r\n switchBingWallpaper(bg1, bg2) {\r\n if (this.bingWallPapers.length === 0) return\r\n\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.bingWallPaperIndex = (this.bingWallPaperIndex + 1) % this.bingWallPapers.length\r\n const nextUrl = this.bingWallPapers[this.bingWallPaperIndex]?.url\r\n\r\n // 【层级魔法】:让旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n // 稍微延迟 50ms,确保浏览器把新图渲染到 DOM 上且层级已更新\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity // 新图直接在顶层优雅淡入\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n // 等新图 1.2s 完全覆盖后,在底下默默把旧图透明度归零,毫无视觉断层\r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 切换自定义壁纸\r\n */\r\n switchCustomWallpaper(bg1, bg2, wallpapers) {\r\n const isBg1Current = bg1.style.opacity != 0\r\n const curBg = isBg1Current ? bg1 : bg2\r\n const nextBg = isBg1Current ? bg2 : bg1\r\n \r\n this.customWallPaperIndex = (this.customWallPaperIndex + 1) % wallpapers.length\r\n const nextUrl = wallpapers[this.customWallPaperIndex]\r\n\r\n // 旧图垫底,新图置顶\r\n curBg.style.zIndex = -2\r\n nextBg.style.zIndex = -1\r\n this.prepareBackgroundMotion(nextBg, true)\r\n\r\n const preload = new Image()\r\n preload.onload = () => {\r\n nextBg.src = nextUrl\r\n \r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n nextBg.style.transform = 'scale(1.045)'\r\n \r\n setTimeout(() => { \r\n curBg.style.opacity = 0 \r\n this.prepareBackgroundMotion(curBg, true)\r\n }, 1200)\r\n }, 50)\r\n }\r\n preload.src = nextUrl\r\n },\r\n\r\n /**\r\n * 清除背景轮播定时器\r\n */\r\n clearBackgroundInterval() {\r\n if (this.backgroundInterval) {\r\n clearInterval(this.backgroundInterval)\r\n this.backgroundInterval = null\r\n }\r\n },\r\n\r\n /**\r\n * 清除背景图片显示(带过渡效果)\r\n * @param {boolean} immediate - 是否立即清除,不使用过渡效果\r\n */\r\n clearBackgroundImages(immediate = false) {\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (immediate) {\r\n // 立即清除,不使用过渡效果\r\n if (bg1) {\r\n bg1.style.transition = 'none'\r\n bg1.style.opacity = 0\r\n bg1.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg1) bg1.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n if (bg2) {\r\n bg2.style.transition = 'none'\r\n bg2.style.opacity = 0\r\n bg2.removeAttribute('src')\n // 恢复过渡效果\r\n setTimeout(() => {\r\n if (bg2) bg2.style.transition = 'opacity 1.2s ease-in-out, filter 0.3s ease, transform 0.3s ease'\r\n }, 50)\r\n }\r\n } else {\r\n // 使用过渡效果淡出\r\n if (bg1) {\r\n bg1.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg1) bg1.removeAttribute('src')\n }, 1200)\r\n }\r\n if (bg2) {\r\n bg2.style.opacity = 0\r\n setTimeout(() => {\r\n if (bg2) bg2.removeAttribute('src')\n }, 1200)\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * 平滑主题切换(用于响应主题模式变化)\r\n * @param {string} configKey - 用户配置中的背景图配置键名\r\n * @param {string} containerSelector - 容器选择器\r\n * @param {boolean} useDefaultBackground - 是否使用默认背景图\r\n * @param {boolean} autoCreateElements - 是否自动创建背景元素\r\n */\r\n smoothThemeTransition(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n const backgroundConfig = this.userConfig?.[configKey]\r\n \r\n // 如果不是默认背景配置,则直接重新初始化(自定义背景不受主题影响)\r\n if (!useDefaultBackground || backgroundConfig !== undefined) {\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 对于默认背景,执行平滑过渡\r\n const bg1 = document.getElementById('bg1')\r\n const bg2 = document.getElementById('bg2')\r\n \r\n if (!bg1 || !bg2) {\r\n // 如果背景元素不存在,直接重新初始化\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n return\r\n }\r\n\r\n // 确定当前显示的背景和下一个背景\r\n const currentBg = bg1.style.opacity != 0 ? bg1 : bg2\r\n const nextBg = bg1.style.opacity != 0 ? bg2 : bg1\r\n\r\n // 获取新主题对应的背景图\r\n const isDark = this.useDarkMode\r\n const newThemeImage = isDark \r\n ? require('@/assets/background.jpg') \r\n : require('@/assets/background-light.jpg')\r\n\r\n // 预加载新背景图\r\n const preloadImg = new Image()\r\n preloadImg.onload = () => {\r\n // 设置下一个背景的图片源\r\n nextBg.src = newThemeImage\r\n \r\n // 等待图片加载完成后执行淡入淡出过渡\r\n nextBg.onload = () => {\r\n // 淡出当前背景\r\n currentBg.style.opacity = 0\r\n \r\n // 稍微延迟后淡入新背景,确保过渡效果平滑\r\n setTimeout(() => {\r\n nextBg.style.opacity = this.bkOpacity\r\n }, 50) // 50ms 延迟,让淡出效果先开始\r\n }\r\n }\r\n \r\n preloadImg.onerror = () => {\r\n // 如果预加载失败,回退到直接重新初始化\r\n console.warn('主题背景图预加载失败,回退到直接切换')\r\n this.reinitializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }\r\n \r\n preloadImg.src = newThemeImage\r\n },\r\n\r\n /**\r\n * 重新初始化背景图(用于响应配置变化)\r\n */\r\n reinitializeBackground(configKey, containerSelector = '.login', useDefaultBackground = false, autoCreateElements = false) {\r\n this.clearBackgroundInterval()\r\n this.clearBackgroundImages(true) // 使用立即清除\r\n this.bingWallPaperIndex = 0\r\n this.customWallPaperIndex = 0\r\n \r\n // 延迟一小段时间确保清理完成\r\n setTimeout(() => {\r\n this.initializeBackground(configKey, containerSelector, useDefaultBackground, autoCreateElements)\r\n }, 100)\r\n }\r\n }\r\n}\r\n","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"not-found-container\"\n};\nconst _hoisted_2 = [\"innerHTML\"];\nconst _hoisted_3 = {\n class: \"not-found-content\"\n};\nconst _hoisted_4 = {\n class: \"back-button-wrapper\"\n};\nconst _hoisted_5 = {\n class: \"error-animation\"\n};\nconst _hoisted_6 = {\n class: \"error-image\"\n};\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n class: \"error-info\"\n};\nconst _hoisted_9 = {\n class: \"error-actions\"\n};\nconst _hoisted_10 = {\n class: \"help-links\"\n};\nconst _hoisted_11 = {\n class: \"quick-links\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"background-wrapper\",\n innerHTML: _ctx.backgroundImagesTemplate\n }, null, 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_button, {\n class: \"back-button\",\n onClick: $options.goHome,\n circle: \"\",\n size: \"large\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_5, [_cache[3] || (_cache[3] = _createElementVNode(\"div\", {\n class: \"error-number\"\n }, [_createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\"), _createElementVNode(\"span\", {\n class: \"zero\"\n }, \"0\"), _createElementVNode(\"span\", {\n class: \"four\"\n }, \"4\")], -1)), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"img\", {\n src: $options.errorImage,\n alt: \"404\",\n class: \"floating-image\"\n }, null, 8, _hoisted_7)])]), _createElementVNode(\"div\", _hoisted_8, [_cache[10] || (_cache[10] = _createElementVNode(\"h1\", {\n class: \"error-title\"\n }, \"页面走丢了\", -1)), _cache[11] || (_cache[11] = _createElementVNode(\"p\", {\n class: \"error-description\"\n }, \" 抱歉,您访问的页面可能已被删除、更名或暂时不可用 \", -1)), _createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"large\",\n class: \"action-btn primary-btn\",\n onClick: $options.goHome\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"home\",\n class: \"btn-icon\"\n }), _cache[4] || (_cache[4] = _createTextVNode(\" 返回首页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n size: \"large\",\n class: \"action-btn secondary-btn\",\n onClick: $options.goBack\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-left\",\n class: \"btn-icon\"\n }), _cache[5] || (_cache[5] = _createTextVNode(\" 返回上页 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])]), _createElementVNode(\"div\", _hoisted_10, [_cache[9] || (_cache[9] = _createElementVNode(\"p\", {\n class: \"help-text\"\n }, \"也许您想要:\", -1)), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goHome && $options.goHome(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload-alt\"\n }), _cache[6] || (_cache[6] = _createTextVNode(\" 图片上传 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.goDashboard && $options.goDashboard(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"tachometer-alt\"\n }), _cache[7] || (_cache[7] = _createTextVNode(\" 管理面板 \", -1))]), _createElementVNode(\"a\", {\n href: \"javascript:void(0)\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.refreshPage && $options.refreshPage(...args)),\n class: \"quick-link\"\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[8] || (_cache[8] = _createTextVNode(\" 刷新页面 \", -1))])])])])]), _cache[12] || (_cache[12] = _createStaticVNode(\"
\", 1))]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { mapGetters } from 'vuex';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'NotFound',\n mixins: [backgroundManager],\n computed: {\n ...mapGetters(['useDarkMode', 'userConfig']),\n errorImage() {\n // 使用项目中已有的404图片\n return require('@/assets/404.png');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('uploadBkImg', '.not-found-container', false, true);\n },\n beforeUnmount() {\n // 清理背景轮播定时器\n this.clearBackgroundInterval();\n },\n methods: {\n goHome() {\n this.$router.push('/');\n },\n goBack() {\n if (window.history.length > 1) {\n this.$router.go(-1);\n } else {\n this.$router.push('/');\n }\n },\n goDashboard() {\n this.$router.push('/dashboard');\n },\n refreshPage() {\n window.location.reload();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./NotFound.vue?vue&type=template&id=59d53856&scoped=true\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport \"./NotFound.vue?vue&type=style&index=0&id=59d53856&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-59d53856\"]])\n\nexport default __exports__"],"names":["data","bingWallPaperIndex","customWallPaperIndex","backgroundInterval","backgroundInitParams","computed","mapGetters","bkInterval","this","userConfig","bkOpacity","backgroundImagesTemplate","backgroundImagesStyles","watch","useDarkMode","newVal","oldVal","$nextTick","smoothThemeTransition","configKey","containerSelector","useDefaultBackground","autoCreateElements","mounted","injectBackgroundStyles","beforeUnmount","clearInterval","clearBackgroundImages","removeBackgroundStyles","methods","styleId","document","getElementById","style","createElement","id","textContent","head","appendChild","existingStyle","remove","createBackgroundElements","container","console","warn","bg1","className","alt","bg2","insertBefore","firstChild","initializeBackground","wallpaperEnabled","querySelector","prepareBackgroundContainer","backgroundConfig","setupBingWallpaper","Array","isArray","length","setupCustomWallpaperCarousel","setupSingleCustomWallpaper","setupDefaultWallpaper","$store","dispatch","then","bingWallPapers","loadBackgroundImage","url","setInterval","switchBingWallpaper","wallpapers","switchCustomWallpaper","wallpaperUrl","isDark","defaultImage","require","imgElement","imageSrc","enableZoom","zIndex","opacity","prepareBackgroundMotion","showImage","requestAnimationFrame","transform","preload","Image","onload","src","onerror","zoomDuration","Math","max","transition","transformOrigin","computedStyle","window","getComputedStyle","position","isolation","isBg1Current","curBg","nextBg","nextUrl","setTimeout","clearBackgroundInterval","immediate","removeAttribute","undefined","reinitializeBackground","currentBg","newThemeImage","preloadImg","_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","innerHTML","onClick","goHome","circle","size","default","icon","_","errorImage","type","goBack","href","args","goDashboard","refreshPage","name","mixins","backgroundManager","$router","push","history","go","location","reload","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/967.f004078f.js.map.gz b/frontend-dist/js/967.f004078f.js.map.gz deleted file mode 100644 index f2c6f25a..00000000 Binary files a/frontend-dist/js/967.f004078f.js.map.gz and /dev/null differ diff --git a/frontend-dist/js/app.4fc1f60f.js b/frontend-dist/js/app.4fc1f60f.js deleted file mode 100644 index c25d3c2a..00000000 --- a/frontend-dist/js/app.4fc1f60f.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(173),t.e(30),t.e(136)]).then(t.bind(t,21136)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(21),t.e(293),t.e(804)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(21),t.e(173),t.e(22),t.e(30),t.e(390)]).then(t.bind(t,99702)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(21),t.e(173),t.e(22),t.e(322),t.e(449)]).then(t.bind(t,75449)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(21),t.e(173),t.e(22),t.e(322),t.e(647)]).then(t.bind(t,15647)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(21),t.e(293),t.e(488)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>t.e(331).then(t.bind(t,16331))},{path:"/whiteliston",name:"whiteliston",component:()=>t.e(278).then(t.bind(t,18278))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(267).then(t.bind(t,16267))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>t.e(967).then(t.bind(t,84967))}],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+"."+{21:"618c6fee",22:"f752503c",136:"e7c2a2d2",267:"6c191923",278:"740dc6f4",293:"4c283028",331:"096fa41f",390:"b089c785",449:"865896d4",488:"ca0cfcd4",647:"408915ac",804:"e8b06fe3",967:"f004078f"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{30:"755fb9d7",136:"93acb05d",173:"5edc1a8c",267:"d120d397",278:"f8d0bad0",322:"2b40f004",331:"12334816",390:"9faa139f",449:"0a847317",488:"64e37d88",647:"4c84bc35",804:"64e37d88",967:"b80746a3"}[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(800)]).then(t.bind(t,54800)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(903),t.e(293),t.e(804)]).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(390)]).then(t.bind(t,99702)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(449)]).then(t.bind(t,75449)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(784)]).then(t.bind(t,63784)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(903),t.e(293),t.e(488)]).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(231)]).then(t.bind(t,36967))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(267).then(t.bind(t,16267))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Promise.all([t.e(903),t.e(713)]).then(t.bind(t,66653))}],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+"."+{22:"b436b08e",231:"f4621e12",267:"6c191923",293:"24979b69",390:"b089c785",449:"865896d4",488:"ca0cfcd4",711:"936a7109",713:"e720b926",784:"1372cab1",800:"e2c8a8a6",804:"e8b06fe3",903:"57f9fe60"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{30:"6059b3ba",173:"de17907f",231:"fe297c4d",267:"3cab111c",322:"2b40f004",390:"c7e1825f",449:"0a847317",488:"be127f60",711:"b4e5e6b5",713:"0bba8175",784:"e670981c",800:"c2738ec8",804:"be127f60"}[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 + \".\" + {\"21\":\"618c6fee\",\"22\":\"f752503c\",\"136\":\"e7c2a2d2\",\"267\":\"6c191923\",\"278\":\"740dc6f4\",\"293\":\"4c283028\",\"331\":\"096fa41f\",\"390\":\"b089c785\",\"449\":\"865896d4\",\"488\":\"ca0cfcd4\",\"647\":\"408915ac\",\"804\":\"e8b06fe3\",\"967\":\"f004078f\"}[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 + \".\" + {\"30\":\"755fb9d7\",\"136\":\"93acb05d\",\"173\":\"5edc1a8c\",\"267\":\"d120d397\",\"278\":\"f8d0bad0\",\"322\":\"2b40f004\",\"331\":\"12334816\",\"390\":\"9faa139f\",\"449\":\"0a847317\",\"488\":\"64e37d88\",\"647\":\"4c84bc35\",\"804\":\"64e37d88\",\"967\":\"b80746a3\"}[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 = {\"30\":1,\"136\":1,\"173\":1,\"267\":1,\"278\":1,\"322\":1,\"331\":1,\"390\":1,\"449\":1,\"488\":1,\"647\":1,\"804\":1,\"967\":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.c6d14a33.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 + \".\" + {\"22\":\"b436b08e\",\"231\":\"f4621e12\",\"267\":\"6c191923\",\"293\":\"24979b69\",\"390\":\"b089c785\",\"449\":\"865896d4\",\"488\":\"ca0cfcd4\",\"711\":\"936a7109\",\"713\":\"e720b926\",\"784\":\"1372cab1\",\"800\":\"e2c8a8a6\",\"804\":\"e8b06fe3\",\"903\":\"57f9fe60\"}[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 + \".\" + {\"30\":\"6059b3ba\",\"173\":\"de17907f\",\"231\":\"fe297c4d\",\"267\":\"3cab111c\",\"322\":\"2b40f004\",\"390\":\"c7e1825f\",\"449\":\"0a847317\",\"488\":\"be127f60\",\"711\":\"b4e5e6b5\",\"713\":\"0bba8175\",\"784\":\"e670981c\",\"800\":\"c2738ec8\",\"804\":\"be127f60\"}[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 = {\"30\":1,\"173\":1,\"231\":1,\"267\":1,\"322\":1,\"390\":1,\"449\":1,\"488\":1,\"711\":1,\"713\":1,\"784\":1,\"800\":1,\"804\":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.c6d14a33.js.map.gz b/frontend-dist/js/app.c6d14a33.js.map.gz new file mode 100644 index 00000000..f600de02 Binary files /dev/null and b/frontend-dist/js/app.c6d14a33.js.map.gz differ