lvc-ui 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lvc-ui.min.js +2 -2
- package/package.json +1 -1
package/dist/lvc-ui.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* LvcUI v0.1.
|
|
2
|
+
* LvcUI v0.1.3
|
|
3
3
|
* LVC 工具库 - Vue 2.x 组件 + 工具集合 (UMD 单文件打包)
|
|
4
4
|
*
|
|
5
5
|
* 包含模块:
|
|
@@ -18,4 +18,4 @@
|
|
|
18
18
|
* - lvc-odometer 依赖外部 Odometer 库, dist 目录已提供 odometer.min.js + odometer-theme-minimal.css
|
|
19
19
|
* - Bus / SocketClient / createFetch 等工具依赖浏览器环境 (window / document / fetch 等)
|
|
20
20
|
*/
|
|
21
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).LvcUI={})}(this,function(e){"use strict";function t(){try{if(window.top&&window.top.location.origin===window.location.origin)return window.top}catch(e){}return window}function n(e,t){if("undefined"!=typeof document&&!document.getElementById(e)){var n=document.createElement("style");n.id=e,n.textContent=t,document.head.appendChild(n)}}var i=null;function s(){if(i)return i;if("undefined"!=typeof window&&window.Vue)return window.Vue;throw new Error("[LvcUI] Vue 未找到, 请先引入 Vue 2.x 或调用 Vue.use(LvcUI)")}var l=[];function a(e){return new(s())(e)}a.component=function(e,t){l.push({name:e,def:t})},a.prototype={};var o=a,r={},c={px2Echarts(e,t=1280,n=800,i=!0){if("undefined"==typeof window)return e;if(i&&1===Math.abs(e))return 1;const s=window.innerWidth,l=window.innerHeight,a=Math.min(s,l),o=Math.min(t,n);return parseFloat((e*(a/o)).toFixed(2))}};function d(e){if(!i){i=e;for(var t=0;t<l.length;t++){var n=l[t];e.component(n.name,n.def)}for(var s=Object.keys(a.prototype),o=0;o<s.length;o++)e.prototype[s[o]]=a.prototype[s[o]]}}!function(e){const n=t();if(n.__BUS__)return void(e.$Bus=n.__BUS__);const i={},s={},l=Math.random().toString(36).slice(2),a="lvc-bus",o="BroadcastChannel"in e?new BroadcastChannel(a):null;function r(e,t,n){(i[e]||[]).forEach(e=>{try{e(t,n)}catch(e){}})}function c(t){if(e===n){r(t.event,t.data);for(let e=0;e<n.frames.length;e++)try{n.frames[e].postMessage(t,"*")}catch{}}else n.postMessage(t,"*")}const d={on(e,t){(i[e]||(i[e]=[])).push(t)},off(e,t){t?i[e]=(i[e]||[]).filter(e=>e!==t):delete i[e]},once(e,t){const n=i=>{t(i),d.off(e,n)};d.on(e,n)},emit(e,t){const n={__bus:1,event:e,data:t,tab:l};r(e,t),o&&o.postMessage(n);try{localStorage.setItem(a,JSON.stringify({...n,t:Date.now()}))}catch{}c(n)},request(e,t,n=5e3){const i=Date.now()+Math.random();return new Promise((l,a)=>{s[i]=l,d.emit("__bus_req__",{id:i,event:e,data:t}),setTimeout(()=>{s[i]&&(delete s[i],a("timeout"))},n)})}};d.on("__bus_req__",async({id:e,event:t,data:n})=>{const s=i[t]?.[0];if(!s)return;const l=await s(n);d.emit("__bus_res__",{id:e,res:l})}),d.on("__bus_res__",({id:e,res:t})=>{const n=s[e];n&&(n(t),delete s[e])}),o&&(o.onmessage=e=>{const t=e.data;t&&t.__bus&&t.tab!==l&&r(t.event,t.data)}),e.addEventListener("storage",e=>{if(e.key!==a)return;const t=JSON.parse(e.newValue||"{}");t.__bus&&t.tab!==l&&r(t.event,t.data)}),e.addEventListener("message",t=>{const i=t.data;i&&i.__bus&&(e===n&&c(i),r(i.event,i.data))}),n.__BUS__=d,e.$Bus=d}("undefined"!=typeof window?window:this),function(){n("lvc-loading-style",'\n .lvc-loading-mask {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(6, 23, 39, 0.8); /* 匹配你项目的 #061727 并带透明度 */\n backdrop-filter: blur(2px); /* 微微的毛玻璃效果 */\n z-index: 9999998; /* 比 Message 稍微低一点 */\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n user-select: none;\n }\n\n .lvc-loading-mask.is-visible {\n opacity: 1;\n }\n\n .lvc-loading-spinner {\n position: relative;\n width: 6vmin;\n height: 6vmin;\n margin-bottom: 2vmin;\n }\n\n .lvc-loading-spinner::before {\n content: "";\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 50%;\n border: 0.3vmin solid transparent;\n border-top-color: #12bbed;\n border-bottom-color: #12bbed;\n animation: lvc-spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;\n }\n\n .lvc-loading-spinner::after {\n content: "";\n position: absolute;\n top: 1vmin; left: 1vmin; right: 1vmin; bottom: 1vmin;\n border-radius: 50%;\n border: 0.3vmin solid transparent;\n border-left-color: #7dd3fc;\n border-right-color: #7dd3fc;\n animation: lvc-spin-reverse 1s linear infinite;\n }\n\n .lvc-loading-text {\n color: #12bbed;\n font-size: 1.6vmin;\n letter-spacing: 0.2vmin;\n font-weight: bold;\n text-shadow: 0 0 0.5vmin rgba(18, 187, 237, 0.5); /* 霓虹发光效果 */\n animation: lvc-pulse 2s ease-in-out infinite;\n }\n\n @keyframes lvc-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes lvc-spin-reverse {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(-360deg); }\n }\n @keyframes lvc-pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n }\n ');let e=null;const t={show(t={}){"string"==typeof t&&(t={text:t});const n=t.text||"加载中...";if(e)return e.setText(n),e;const i=document.createElement("div");i.className="lvc-loading-mask";const s=document.createElement("div");s.className="lvc-loading-spinner";const l=document.createElement("div");return l.className="lvc-loading-text",l.textContent=n,i.appendChild(s),i.appendChild(l),document.body.appendChild(i),requestAnimationFrame(()=>{i.classList.add("is-visible")}),e={setText(e){l.textContent=e},close(){if(!i.parentNode)return;i.classList.remove("is-visible");const t=()=>{i.parentNode&&i.parentNode.removeChild(i),i.removeEventListener("transitionend",t),e=null};i.addEventListener("transitionend",t),setTimeout(()=>{i.parentNode&&(i.parentNode.removeChild(i),e=null)},400)}},e},close(){e&&e.close()}};window.LvcLoading=t,void 0!==o&&(o.prototype.$lvcLoading=t)}(),function(){n("lvc-message-style","\n .lvc-message-container {\n position: fixed;\n top: 3vmin;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1.5vmin;\n z-index: 9999999;\n pointer-events: none;\n }\n\n .lvc-message {\n display: flex;\n align-items: center;\n gap: 1vmin;\n padding: 1vmin 2.5vmin;\n border-radius: 0.5vmin;\n text-align: center;\n font-size: 1.6vmin;\n color: #e0f2fe;\n background: #0d2339;\n border: 1px solid #1e4469;\n box-shadow: 0 0.5vmin 1.5vmin rgba(0, 0, 0, 0.5);\n pointer-events: auto;\n transition: all 0.3s ease-in-out;\n transform: translateY(0);\n opacity: 1;\n user-select: none;\n }\n\n .lvc-message--info {\n border-color: #12bbed;\n }\n .lvc-message--success {\n border-color: #10b981;\n color: #10b981;\n }\n .lvc-message--warning {\n border-color: #f59e0b;\n color: #f59e0b;\n }\n .lvc-message--error {\n border-color: #ef4444;\n color: #ef4444;\n }\n\n .lvc-message-icon {\n font-size: 1.6vmin;\n display: inline-block;\n }\n\n .lvc-message-text {\n color: #e0f2fe;\n font-weight: 500;\n }\n\n .lvc-message-enter,\n .lvc-message-leave {\n opacity: 0;\n transform: translateY(-2vmin);\n }\n ");let e=null;const t=function(t){"string"==typeof t&&(t={message:t});const n=t.type||"info",i=t.message||"",s=void 0!==t.duration?t.duration:2e3;e||(e=document.createElement("div"),e.className="lvc-message-container",document.body.appendChild(e));const l=document.createElement("div");l.innerHTML=`\n <span class="lvc-message-icon">${{info:"ℹ",success:"✔",warning:"⚠",error:"✖"}[n]}</span>\n <span class="lvc-message-text">${i}</span>\n `,l.className=`lvc-message lvc-message--${n} lvc-message-enter`,e.appendChild(l),requestAnimationFrame(()=>{l.classList.remove("lvc-message-enter")}),s>0&&setTimeout(()=>{l.classList.add("lvc-message-leave");const e=()=>{l.parentNode&&l.parentNode.removeChild(l),l.removeEventListener("transitionend",e)};l.addEventListener("transitionend",e),setTimeout(()=>{l.parentNode&&l.parentNode.removeChild(l)},400)},s)};["success","warning","info","error"].forEach(e=>{t[e]=n=>("string"==typeof n&&(n={message:n}),n.type=e,t(n))}),window.LvcMessage=t,void 0!==o&&(o.prototype.$lvcMessage=t)}(),function(){n("lvc-button-style","\n .lvc-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n cursor: pointer;\n background: rgba(30, 68, 105, 0.4);\n border: 1px solid #1e4469;\n color: #fff;\n text-align: center;\n box-sizing: border-box;\n outline: none;\n margin: 0;\n transition: 0.1s;\n font-weight: 500;\n padding: 1.2vmin 2.5vmin;\n font-size: 1.4vmin;\n border-radius: 0.4vmin;\n user-select: none;\n vertical-align: middle;\n gap: 0.7vmin;\n line-height: 1;\n }\n\n .lvc-button--primary { background-color: rgba(18, 187, 237, 0.8); border-color: #12bbed; color: #fff; }\n .lvc-button--success { background-color: rgba(103, 194, 58, 0.8); border-color: #67c23a; color: #fff; }\n .lvc-button--warning { background-color: rgba(230, 162, 60, 0.8); border-color: #e6a23c; color: #fff; }\n .lvc-button--danger { background-color: rgba(245, 108, 108, 0.8); border-color: #f56c6c; color: #fff; }\n .lvc-button--info { background-color: rgba(144, 147, 153, 0.8); border-color: #909399; color: #fff; }\n\n .lvc-button--primary:hover { background-color: rgba(18, 187, 237, 1); }\n .lvc-button--success:hover { background-color: rgba(103, 194, 58, 1); }\n .lvc-button--warning:hover { background-color: rgba(230, 162, 60, 1); }\n .lvc-button--danger:hover { background-color: rgba(245, 108, 108, 1); }\n .lvc-button--info:hover { background-color: rgba(144, 147, 153, 1); }\n\n .lvc-button.is-plain { background: transparent; }\n .lvc-button--primary.is-plain { color: #12bbed; background: rgba(18, 187, 237, 0.1); }\n .lvc-button--success.is-plain { color: #67c23a; background: rgba(103, 194, 58, 0.1); }\n .lvc-button--danger.is-plain { color: #f56c6c; background: rgba(245, 108, 108, 0.1); }\n\n .lvc-button.is-round { border-radius: 2.5vmin; }\n .lvc-button.is-circle { border-radius: 50%; padding: 1.2vmin; }\n\n .lvc-button.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background-image: none;\n }\n\n .lvc-button .lvc-icon-loading {\n margin-right: 0.8vmin;\n display: inline-block;\n width: 1.4vmin;\n height: 1.4vmin;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: 50%;\n animation: lvc-rotate 1s linear infinite;\n }\n\n @keyframes lvc-rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n ");const e={name:"lvcButton",props:{type:{type:String,default:"default"},plain:{type:Boolean,default:!1},round:{type:Boolean,default:!1},circle:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},icon:{type:String,default:""}},methods:{handleClick(e){this.disabled||this.loading||this.$emit("click",e)}},template:'\n <button\n class="lvc-button"\n :disabled="disabled || loading"\n :class="[\n \'lvc-button--\' + type,\n {\n \'is-plain\': plain,\n \'is-round\': round,\n \'is-circle\': circle,\n \'is-disabled\': disabled || loading\n }\n ]"\n @click="handleClick"\n >\n <i v-if="loading" class="lvc-icon-loading"></i>\n <i v-if="icon && !loading" :class="icon"></i>\n <span v-if="$slots.default"><slot></slot></span>\n </button>\n '};o.component("lvc-button",e),r.lvcButton=e}(),n("lvc-switch-style","\n .lvc-switch{\n position: relative;\n display: inline-block;\n transition: 0.3s;\n }\n \n /* 禁用状态的视觉反馈,稍微降低透明度 */\n .lvc-switch.is-disabled {\n opacity: 0.6;\n }\n\n .lvc-dot{\n position: absolute;\n border-radius: 50%;\n transition: 0.3s;\n }\n "),o.component("lvc-switch",{name:"lvcSwitch",template:'\n <div\n class="lvc-switch"\n :class="{ \'is-disabled\': disabled }"\n :style="switchStyle"\n @click="toggle"\n >\n <div class="lvc-dot" :style="dotStyle"></div>\n </div>\n ',props:{value:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},width:{type:Number,default:34},height:{type:Number,default:18},activeColor:{type:String,default:"#42A3D6"},inactiveColor:{type:String,default:"#395E7C"},dotColor:{type:String,default:"#ffffff"}},computed:{dotSize(){return this.height-4},switchStyle(){return{width:this.width+"px",height:this.height+"px",borderRadius:this.height/2+"px",background:this.value?this.activeColor:this.inactiveColor,position:"relative",cursor:this.disabled?"not-allowed":"pointer",transition:"0.3s"}},dotStyle(){const e=this.value?this.width-this.height+2:2;return{width:this.dotSize+"px",height:this.dotSize+"px",background:this.dotColor,borderRadius:"50%",position:"absolute",top:"2px",left:e+"px",transition:"0.3s"}}},methods:{toggle(){this.disabled||(this.$emit("input",!this.value),this.$emit("change",!this.value))}}}),n("lvc-odometer-style","\n .lvc-odometer{\n display: inline-flex;\n align-items: center;\n height: fit-content;\n overflow: hidden;\n gap: 0.2em;\n }\n "),o.component("lvc-odometer",{name:"lvc-odometer",props:{value:{type:Number,default:0},duration:{type:Number,default:1e3},maxAnimations:{type:Number,default:1/0},unit:{type:String,default:""},unitSize:{type:String,default:"inherit"},unitPosition:{type:String,default:"right"}},data:()=>({od:null}),mounted(){this.od=new Odometer({el:this.$refs.odo,value:this.value,duration:this.duration,maxAnimations:this.maxAnimations})},watch:{value(e){this.od&&this.od.update(e)}},template:'\n <div class="lvc-odometer">\n <slot name="unit-left">\n <span \n v-if="unit && unitPosition===\'left\'" \n class="odometer-unit odometer-unit-left"\n :style="{fontSize: unitSize}"\n >\n {{unit}}\n </span>\n </slot>\n\n <span \n class="odometer-value"\n ref="odo">\n </span>\n\n <slot name="unit-right">\n <span \n v-if="unit && unitPosition===\'right\'" \n class="odometer-unit"\n :style="{fontSize: unitSize}"\n >\n {{unit}}\n </span>\n </slot>\n\n </div>\n '}),n("lvc-load-more-style",'\n .lvc-load-more {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 2vmin 0;\n width: 100%;\n min-height: 7.5vmin;\n color: #fff;\n font-size: 1.8vmin;\n user-select: none;\n height: 7.5vmin;\n }\n\n .lvc-load-more-spinner {\n position: relative;\n width: 2.5vmin;\n height: 2.5vmin;\n margin-right: 1vmin;\n border-radius: 50%;\n border: 0.2vmin solid transparent;\n border-top-color: #12bbed;\n border-bottom-color: #12bbed;\n animation: lvc-lm-spin 1s linear infinite;\n }\n \n .lvc-load-more-spinner::after {\n content: "";\n position: absolute;\n top: 0.3vmin; left: 0.3vmin; right: 0.3vmin; bottom: 0.3vmin;\n border-radius: 50%;\n border: 0.2vmin solid transparent;\n border-left-color: #7dd3fc;\n border-right-color: #7dd3fc;\n animation: lvc-lm-spin-reverse 0.8s linear infinite;\n }\n\n .lvc-load-more-text {\n color: #fff;\n opacity: 0.8;\n letter-spacing: 0.1vmin;\n }\n\n .lvc-load-more-disabled {\n color: #fff;\n }\n\n @keyframes lvc-lm-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes lvc-lm-spin-reverse {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(-360deg); }\n }\n '),o.component("lvc-load-more",{props:{loading:{type:Boolean,default:!1},finished:{type:Boolean,default:!1},distance:{type:String,default:"0px"},container:{type:String,default:""},loadingText:{type:String,default:"正在加载更多..."},finishedText:{type:String,default:"没有更多数据了"}},data:()=>({observer:null}),mounted(){this.initObserver()},beforeDestroy(){this.observer&&(this.observer.disconnect(),this.observer=null)},methods:{initObserver(){const e={root:this.container?document.querySelector(this.container):null,rootMargin:`0px 0px ${this.distance} 0px`,threshold:0};this.observer=new IntersectionObserver(e=>{e[0].isIntersecting&&this.handleIntersect()},e),this.observer.observe(this.$el)},handleIntersect(){this.loading||this.finished||this.$emit("load")}},watch:{loading(e){e||this.finished||this.$nextTick(()=>{this.observer&&this.$el&&(this.observer.unobserve(this.$el),this.observer.observe(this.$el))})}},template:'\n <div class="lvc-load-more">\n \x3c!-- 正在加载状态 --\x3e\n <template v-if="loading">\n <div class="lvc-load-more-spinner"></div>\n <span class="lvc-load-more-text">{{ loadingText }}</span>\n </template>\n \n \x3c!-- 加载完毕状态 --\x3e\n <template v-else-if="finished">\n <span class="lvc-load-more-text lvc-load-more-disabled">{{ finishedText }}</span>\n </template>\n\n \x3c!-- 默认什么都不显示,作为触发底线即可 --\x3e\n <template v-else>\n \x3c!-- 空标签,仅作探测器占位 --\x3e\n </template>\n </div>\n '}),function(){n("lvc-select-style","\n .lvc-select {\n position: relative;\n display: inline-block;\n font-size: 1.9391vmin;\n color: #fff;\n user-select: none;\n height: 100%;\n width: 100%;\n z-index: 10;\n /* 修复字体模糊 */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .lvc-select-wrapper {\n background: #0d2339;\n border: 1px solid #1e4469;\n border-radius: 0.831vmin;\n padding: 1.108vmin 1.662vmin;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1.108vmin;\n transition: all 0.3s;\n height: 100%;\n box-sizing: border-box;\n }\n\n .lvc-select-wrapper:hover,\n .lvc-select-wrapper.is-active {\n border-color: #12bbed;\n box-shadow: 0 0 1.385vmin rgba(18, 187, 237, 0.3);\n }\n\n .lvc-select-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #fff;\n font-size: 1.8006vmin;\n /* 修复字体模糊 */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .lvc-select-placeholder {\n color: #DFFBFF;\n opacity: 0.5;\n }\n\n .lvc-select-suffix {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2vmin;\n position: relative;\n }\n\n .lvc-icon-arrow {\n color: #12bbed;\n font-size: 1.385vmin;\n transition: transform 0.3s, opacity 0.2s;\n }\n\n .lvc-icon-clear {\n position: absolute;\n color: #4a637a;\n font-size: 1.6vmin;\n transition: color 0.2s;\n opacity: 0;\n z-index: 2;\n }\n\n .lvc-icon-clear:hover {\n color: #12bbed;\n }\n\n .lvc-select-wrapper:hover .is-clearable .lvc-icon-clear {\n opacity: 1;\n }\n .lvc-select-wrapper:hover .is-clearable .lvc-icon-arrow {\n opacity: 0;\n }\n\n .lvc-select-dropdown {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n background: #0b1a2a;\n border: 1px solid #12bbed;\n box-shadow: 0 1.385vmin 4.1551vmin rgba(0, 0, 0, 0.7);\n border-radius: 0.831vmin;\n z-index: 10000;\n overflow: hidden;\n opacity: 0;\n transition: opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1);\n /* 修复字体模糊 */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n backface-visibility: hidden;\n transform-style: preserve-3d;\n }\n\n .lvc-select-list {\n list-style: none;\n padding: 0.5vmin 0;\n margin: 0;\n max-height: 25vmin;\n overflow-y: auto;\n /* 修复字体模糊 */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .lvc-select-list::-webkit-scrollbar {\n width: 0.554vmin;\n }\n .lvc-select-list::-webkit-scrollbar-thumb {\n background: #1e4469;\n border-radius: 0.277vmin;\n }\n .lvc-select-list::-webkit-scrollbar-thumb:hover {\n background: #12bbed;\n }\n\n .lvc-select-item {\n padding: 1.108vmin 1.662vmin;\n cursor: pointer;\n font-size: 1.662vmin;\n color: rgba(223, 251, 255, 0.7);\n transition: all 0.2s;\n /* 修复字体模糊 */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .lvc-select-item:hover {\n background: rgba(18, 187, 237, 0.1);\n color: #fff;\n }\n\n .lvc-select-item.is-selected {\n background: #0B4868;\n color: #fff;\n font-weight: bold;\n }\n\n .lvc-select-item.is-disabled {\n color: #3d5061;\n cursor: not-allowed;\n background: transparent !important;\n }\n\n .lvc-select-fade-enter-active,\n .lvc-select-fade-leave-active {\n transition: opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .lvc-select-fade-enter,\n .lvc-select-fade-leave-to {\n opacity: 0;\n transform: translateY(-1vmin);\n }\n ");let e=[],t=0;const i={name:"lvcSelect",props:{value:{type:[String,Number],default:""},options:{type:Array,default:()=>[]},placeholder:{type:String,default:"请选择"},clearable:{type:Boolean,default:!0}},template:'\n <div class="lvc-select" ref="selectContainer">\n <div class="lvc-select-wrapper" :class="{ \'is-active\': isOpen }" @click="toggleDropdown">\n <span class="lvc-select-label" :class="{ \'lvc-select-placeholder\': !selectedLabel }">\n {{ selectedLabel || placeholder }}\n </span>\n <div class="lvc-select-suffix" :class="{ \'is-clearable\': clearable && value !== \'\' && value !== null }">\n <span v-if="clearable" class="lvc-icon-clear" @click.stop="handleClear">✕</span>\n <span class="lvc-icon-arrow" :style="{ transform: isOpen ? \'rotate(180deg)\' : \'none\' }">{{"▼"}}</span>\n </div>\n </div>\n </div>\n',data:()=>({isOpen:!1,dropdownElement:null,overlayElement:null,selectId:"lvc-select-"+ ++t}),computed:{selectedLabel(){const e=this.options.find(e=>e.value===this.value);return e?e.label:""}},methods:{toggleDropdown(){this.isOpen?this.closeDropdown():(this.closeOtherSelects(),this.openDropdown())},openDropdown(){this.isOpen=!0,e.push(this),this.$nextTick(()=>{this.createDropdown()})},closeDropdown(){this.isOpen=!1,e=e.filter(e=>e.selectId!==this.selectId),this.removeDropdown()},closeOtherSelects(){e.forEach(e=>{e.selectId!==this.selectId&&e.closeDropdown()})},createDropdown(){this.removeDropdown(),this.dropdownElement=document.createElement("div"),this.dropdownElement.className="lvc-select-dropdown";const e=document.createElement("ul");e.className="lvc-select-list",this.options.forEach(t=>{const n=document.createElement("li");n.className=`lvc-select-item ${t.value===this.value?"is-selected":""} ${t.disabled?"is-disabled":""}`,n.textContent=t.label,n.addEventListener("click",e=>{e.stopPropagation(),this.selectOption(t)}),e.appendChild(n)}),this.dropdownElement.appendChild(e),document.body.appendChild(this.dropdownElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",document.body.appendChild(this.overlayElement),this.updateDropdownPosition(),this.addEventListeners(),setTimeout(()=>{this.dropdownElement&&(this.dropdownElement.style.opacity="1",this.dropdownElement.style.transform="translateY(0)")},10)},updateDropdownPosition(){const e=this.$el.querySelector(".lvc-select-wrapper");if(e&&this.dropdownElement){const t=e.getBoundingClientRect();this.dropdownElement.style.width=`${t.width}px`,this.dropdownElement.offsetHeight;const n=this.dropdownElement.getBoundingClientRect();let i=t.bottom+8,s=t.left;const l=window.innerHeight,a=window.innerWidth;i+n.height>l&&(i=t.top-n.height-8,i<0&&(i=t.bottom+8,this.dropdownElement.style.maxHeight=l-i-10+"px")),s+n.width>a&&(s=a-n.width-10,s<0&&(s=10,this.dropdownElement.style.width=a-20+"px")),this.dropdownElement.style.position="fixed",this.dropdownElement.style.top=`${Math.round(i)}px`,this.dropdownElement.style.left=`${Math.round(s)}px`}},addEventListeners(){this.handleScroll=this.updateDropdownPosition.bind(this),this.handleResize=this.updateDropdownPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removeDropdown(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.dropdownElement&&this.dropdownElement.parentNode&&(document.body.removeChild(this.dropdownElement),this.dropdownElement=null)},selectOption(e){e.disabled||(this.$emit("input",e),this.$emit("change",e),this.closeDropdown())},handleClear(){this.$emit("input",""),this.$emit("change",""),this.$emit("clear"),this.closeDropdown()},clickOutside(e){const t=this.$refs.selectContainer;!t||t.contains(e.target)||this.dropdownElement&&this.dropdownElement.contains(e.target)||this.closeDropdown()},bindGlobalClickEvents(){if(window.top&&window.top!==window)try{const e=()=>this.closeDropdown();this._topHandler=e,window.top.document.addEventListener("click",e)}catch(e){}if(window.parent&&window.parent!==window)try{const e=()=>this.closeDropdown();this._parentHandler=e,window.parent.document.addEventListener("click",e)}catch(e){}},unbindGlobalClickEvents(){if(window.top&&window.top!==window&&this._topHandler)try{window.top.document.removeEventListener("click",this._topHandler)}catch(e){}if(window.parent&&window.parent!==window&&this._parentHandler)try{window.parent.document.removeEventListener("click",this._parentHandler)}catch(e){}}},mounted(){document.addEventListener("click",this.clickOutside),this.bindGlobalClickEvents()},beforeDestroy(){document.removeEventListener("click",this.clickOutside),this.unbindGlobalClickEvents(),this.closeDropdown()}};o.component("lvc-select",i),r.lvcSelect=i}(),function(){n("lvc-table-style",'\n .lvc-table-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: rgba(13, 35, 57, 0.4);\n border: 1px solid #1e4469;\n border-radius: 0.831vmin;\n overflow: hidden;\n color: #fff;\n font-size: 1.462vmin;\n }\n\n .lvc-table-header-wrapper {\n background: rgba(30, 68, 105, 0.6);\n border-bottom: 2px solid #12bbed;\n flex-shrink: 0;\n }\n\n .lvc-table-body-wrapper {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n \n .lvc-table-body-wrapper::-webkit-scrollbar { width: 0.554vmin; }\n .lvc-table-body-wrapper::-webkit-scrollbar-thumb { background: #1e4469; border-radius: 0.277vmin; }\n\n .lvc-table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n .lvc-table th, .lvc-table td {\n padding: 2vmin 1.6vmin;\n border-bottom: 1px solid rgba(30, 68, 105, 0.3);\n position: relative;\n height: 4.5vmin; \n box-sizing: border-box;\n text-align: left;\n }\n\n .lvc-table-column-center { text-align: center !important; }\n .lvc-table-column-right { text-align: right !important; }\n .lvc-table-column-left { text-align: left !important; }\n\n .lvc-checkbox {\n position: relative;\n cursor: pointer;\n display: inline-block;\n vertical-align: middle;\n width: 1.8vmin;\n height: 1.8vmin;\n border: 1px solid #12bbed;\n border-radius: 0.3vmin;\n background: rgba(18, 187, 237, 0.1);\n transition: background 0.2s;\n box-sizing: border-box; \n }\n \n .lvc-checkbox.checked {\n background: #12bbed;\n }\n \n .lvc-checkbox.checked::after {\n content: "";\n position: absolute;\n left: 0.5vmin;\n top: 0.1vmin;\n width: 0.5vmin;\n height: 0.9vmin;\n border: solid #0d2339;\n border-width: 0 0.2vmin 0.2vmin 0;\n transform: rotate(45deg);\n }\n\n .lvc-sort-box {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n margin-left: 0.5vmin;\n vertical-align: middle;\n cursor: pointer;\n }\n .lvc-sort-caret {\n width: 0;\n height: 0;\n border: 0.5vmin solid transparent;\n }\n .lvc-sort-up { border-bottom-color: #4e6a86; margin-bottom: 0.2vmin; }\n .lvc-sort-down { border-top-color: #4e6a86; }\n \n .sorting-asc .lvc-sort-up { border-bottom-color: #12bbed; }\n .sorting-desc .lvc-sort-down { border-top-color: #12bbed; }\n\n .lvc-table th.is-sortable {\n cursor: pointer;\n user-select: none;\n }\n .lvc-table th.is-sortable:hover {\n background: rgba(18, 187, 237, 0.1);\n }\n\n .lvc-table-body-wrapper tr:hover {\n background: rgba(18, 187, 237, 0.05);\n }\n .lvc-table-body-wrapper tr.is-selected {\n background: rgba(18, 187, 237, 0.15);\n }\n\n .lvc-table-empty {\n padding: 5vmin 0;\n text-align: center;\n color: rgba(223, 251, 255, 0.5);\n }\n ');const e={name:"lvcTable",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},stripe:{type:Boolean,default:!0},selection:{type:Boolean,default:!1}},data:()=>({selectedRows:[],sortProp:"",sortOrder:""}),computed:{processedData(){let e=[...this.data];return this.sortProp&&this.sortOrder&&e.sort((e,t)=>{const n=e[this.sortProp],i=t[this.sortProp];if(n===i)return 0;const s=n>i?1:-1;return"asc"===this.sortOrder?s:-s}),e},isAllSelected(){return this.data.length>0&&this.selectedRows.length===this.data.length}},methods:{toggleRowSelection(e){const t=this.selectedRows.findIndex(t=>t===e);t>-1?this.selectedRows.splice(t,1):this.selectedRows.push(e),this.$emit("selection-change",[...this.selectedRows])},toggleAllSelection(){this.isAllSelected?this.selectedRows=[]:this.selectedRows=[...this.data],this.$emit("selection-change",[...this.selectedRows])},handleSort(e){e.sortable&&(this.sortProp!==e.prop?(this.sortProp=e.prop,this.sortOrder="asc"):"asc"===this.sortOrder?this.sortOrder="desc":"desc"===this.sortOrder&&(this.sortOrder="",this.sortProp=""),this.$emit("sort-change",{prop:this.sortProp,order:this.sortOrder}))}},template:'\n <div class="lvc-table-container">\n <div class="lvc-table-header-wrapper">\n <table class="lvc-table">\n <colgroup>\n <col v-if="selection" width="50">\n <col v-for="col in columns" :key="col.prop" :width="col.width || \'\'">\n </colgroup>\n <thead>\n <tr>\n <th v-if="selection" style="text-align: center;">\n <div class="lvc-checkbox" :class="{checked: isAllSelected}" @click="toggleAllSelection"></div>\n </th>\n <th v-for="col in columns" \n :key="col.prop" \n :class="[\n col.align ? \'lvc-table-column-\' + col.align : \'\',\n { \'is-sortable\': col.sortable },\n sortProp === col.prop ? \'sorting-\' + sortOrder : \'\'\n ]"\n @click="handleSort(col)">\n <slot v-if="$scopedSlots[\'header-\' + col.prop.toLowerCase()]" :name="\'header-\' + col.prop.toLowerCase()" :column="col"></slot>\n <template v-else>{{ col.label }}</template>\n <span v-if="col.sortable" class="lvc-sort-box">\n <i class="lvc-sort-caret lvc-sort-up"></i>\n <i class="lvc-sort-caret lvc-sort-down"></i>\n </span>\n </th>\n </tr>\n </thead>\n </table>\n </div>\n\n <div class="lvc-table-body-wrapper">\n <table class="lvc-table" :class="{ \'lvc-table-stripe\': stripe }">\n <colgroup>\n <col v-if="selection" width="50">\n <col v-for="col in columns" :key="col.prop" :width="col.width || \'\'">\n </colgroup>\n <tbody>\n <tr v-for="(row, rowIndex) in processedData" \n :key="rowIndex"\n :class="{ \'is-selected\': selectedRows.includes(row) }">\n <td v-if="selection" style="text-align: center;">\n <div class="lvc-checkbox" :class="{checked: selectedRows.includes(row)}" @click="toggleRowSelection(row)"></div>\n </td>\n <td v-for="col in columns" \n :key="col.prop" \n :class="col.align ? \'lvc-table-column-\' + col.align : \'\'">\n <slot v-if="$scopedSlots[col.prop.toLowerCase()]" :name="col.prop.toLowerCase()" :row="row" :index="rowIndex"></slot>\n <template v-else>{{ row[col.prop] }}</template>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-if="!data || data.length === 0" class="lvc-table-empty">暂无数据</div>\n </div>\n </div>\n '};o.component("lvc-table",e),r.lvcTable=e}(),function(){n("lvc-date-style",'\n .lvc-date-picker {\n position: relative;\n display: inline-block;\n font-size: 1.9391vmin;\n color: #fff;\n user-select: none;\n height: 100%;\n }\n\n input:focus {\n outline: none;\n border: none;\n box-shadow: none;\n }\n\n .lvc-input-wrapper {\n background: #0d2339;\n border: 1px solid #1e4469;\n border-radius: 0.831vmin;\n padding: 1.108vmin 1.662vmin;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 1.108vmin;\n min-width: 33.241vmin;\n transition: all 0.3s;\n height: 100%;\n }\n\n .lvc-input-wrapper:hover,\n .lvc-input-wrapper.is-active {\n border-color: #12bbed;\n box-shadow: 0 0 1.385vmin rgba(18, 187, 237, 0.3);\n }\n\n .lvc-inner-input {\n background: transparent;\n border: none;\n color: #fff;\n outline: none;\n width: 100%;\n text-align: center;\n cursor: pointer;\n font-size: 1.8006vmin;\n }\n\n .lvc-input-wrapper > input::placeholder {\n color: #DFFBFF;\n opacity: .5;\n }\n .lvc-input-wrapper > input::-moz-placeholder {\n color: #DFFBFF;\n opacity: .5;\n }\n .lvc-input-wrapper > input:-ms-input-placeholder {\n color: #DFFBFF;\n opacity: .5;\n }\n\n .lvc-separator {\n color: #4a637a;\n font-size: 1.662vmin;\n }\n\n .lvc-icon-arrow {\n color: #12bbed;\n font-size: 1.385vmin;\n transition: transform 0.3s;\n }\n\n .lvc-picker-panel {\n position: absolute;\n top: 6.6482vmin;\n left: 0;\n background: #0b1a2a;\n border: 1px solid #12bbed;\n box-shadow: 0 1.385vmin 4.1551vmin rgba(0, 0, 0, 0.7);\n border-radius: 1.108vmin;\n padding: 2.0776vmin;\n z-index: 9999;\n }\n\n .lvc-time-bar {\n display: flex;\n gap: 1.385vmin;\n margin-bottom: 1.108vmin;\n }\n\n .lvc-time-slot {\n flex: 1;\n position: relative;\n }\n\n .lvc-time-btn {\n background: rgba(18, 187, 237, 0.05);\n border: 1px solid #1e4469;\n border-radius: 0.554vmin;\n padding: 0.277vmin 0.831vmin;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n }\n\n .lvc-time-btn.is-active {\n border-color: #12bbed;\n background: rgba(18, 187, 237, 0.15);\n }\n\n .lvc-time-val {\n font-family: monospace;\n font-size: 2.2161vmin;\n color: #12bbed;\n font-weight: bold;\n }\n\n .lvc-label {\n font-size: 1.385vmin;\n color: #5d758c;\n }\n\n .lvc-time-dropdown {\n position: absolute;\n top: 7.2022vmin;\n left: 50%;\n transform: translateX(-50%);\n background: #0d2339;\n border: 1px solid #12bbed;\n border-radius: 0.554vmin;\n padding: 1.108vmin;\n display: flex;\n gap: 0.554vmin;\n z-index: 10001;\n box-shadow: 0 0.6925vmin 2.7701vmin rgba(0, 0, 0, 0.8);\n }\n\n .lvc-scroll-col {\n width: 6.2327vmin;\n height: 22.1607vmin;\n overflow-y: auto;\n background: #081625;\n scrollbar-width: none;\n }\n\n .lvc-scroll-col::-webkit-scrollbar {\n display: none;\n }\n\n .lvc-scroll-col ul {\n list-style: none;\n padding: 0;\n margin: 0;\n text-align: center;\n }\n\n .lvc-scroll-col li {\n padding: 0.831vmin 0;\n cursor: pointer;\n color: #8cabc4;\n font-size: 1.8006vmin;\n }\n\n .lvc-scroll-col li:hover {\n color: #fff;\n background: rgba(18, 187, 237, 0.1);\n }\n\n .lvc-scroll-col li.is-selected {\n color: #fff;\n background: #12bbed;\n border-radius: 0.554vmin;\n }\n\n .lvc-time-divider {\n align-self: center;\n color: #12bbed;\n font-weight: bold;\n }\n\n /* Calendar */\n .lvc-calendars-wrap {\n display: flex;\n gap: 2.7701vmin;\n }\n\n .lvc-calendar-box {\n width: 30.4709vmin;\n }\n\n .lvc-cal-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1.662vmin;\n color: #12bbed;\n }\n\n .lvc-nav-btn {\n cursor: pointer;\n padding: 0 1.108vmin;\n font-size: 2.2161vmin;\n }\n\n .lvc-cal-week {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n text-align: center;\n color: #4a637a;\n font-size: 1.662vmin;\n margin-bottom: 1.108vmin;\n }\n\n .lvc-cal-days {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n text-align: center;\n }\n\n .lvc-day {\n height: 4.1551vmin;\n line-height: 4.1551vmin;\n font-size: 1.662vmin;\n cursor: pointer;\n border-radius: 0.554vmin;\n margin: 1px 0;\n position: relative;\n }\n\n .lvc-day:not(.is-empty):hover {\n background: rgba(18, 187, 237, 0.2);\n }\n\n .lvc-day.is-active {\n background: #12bbed !important;\n color: #fff;\n font-weight: bold;\n }\n\n .lvc-day.is-in-range {\n background: rgba(18, 187, 237, 0.1);\n color: #12bbed;\n border-radius: 0;\n }\n\n .lvc-day.is-in-hover-range {\n background: rgba(18, 187, 237, 0.2);\n color: #fff;\n border-radius: 0;\n }\n\n .lvc-day.is-today::after {\n content: "";\n position: absolute;\n bottom: 0.4155vmin;\n left: 50%;\n width: 0.554vmin;\n height: 0.554vmin;\n background: #12bbed;\n border-radius: 50%;\n transform: translateX(-50%);\n }\n\n .lvc-panel-footer {\n border-top: 1px solid rgba(255, 255, 255, 0.05);\n margin-top: 0.554vmin;\n padding-top: 1.662vmin;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .lvc-action-link {\n font-size: 1.662vmin;\n color: #5d758c;\n cursor: pointer;\n }\n\n .lvc-action-link:hover {\n color: #12bbed;\n }\n\n .lvc-right-actions {\n display: flex;\n gap: 1.385vmin;\n }\n\n .lvc-action-btn {\n font-size: 1.662vmin;\n cursor: pointer;\n padding: 0.554vmin 1.662vmin;\n border-radius: 0.554vmin;\n }\n\n .lvc-action-btn.is-outline {\n border: 1px solid #1e4469;\n color: #8cabc4;\n }\n\n .lvc-action-btn.is-primary {\n background: #12bbed;\n color: #fff;\n }\n\n .lvc-fade-enter-active,\n .lvc-fade-leave-active {\n transition: opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .lvc-fade-enter,\n .lvc-fade-leave-to {\n opacity: 0;\n transform: translateY(1.662vmin) scale(0.98);\n }\n\n .lvc-time-fade-enter-active,\n .lvc-time-fade-leave-active {\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n\n .lvc-time-fade-enter,\n .lvc-time-fade-leave-to {\n opacity: 0;\n transform: translate(-50%, 1.385vmin);\n }\n ');let e=[],t=0;const i={name:"lvcDatePicker",props:{value:{type:[String,Array],default:""},type:{type:String,default:"date"},rangeSeparator:{type:String,default:"至"},singlePanel:{type:Boolean,default:!1}},template:'\n <div class="lvc-date-picker" ref="pickerContainer">\n <div class="lvc-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="showDoubleInput">\n <input class="lvc-inner-input" readonly :value="displayValues[0]" placeholder="开始时间" />\n <span class="lvc-separator">{{ rangeSeparator }}</span>\n <input class="lvc-inner-input" readonly :value="displayValues[1]" placeholder="结束时间" />\n </template>\n <template v-else>\n <input class="lvc-inner-input" readonly :value="value" placeholder="请选择日期时间" />\n </template>\n <span class="lvc-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date;return{isPanelOpen:!1,activeTimePop:null,timeState:{start:{h:"00",m:"00"},end:{h:"00",m:"00"}},selectingRangePart:"start",calendars:[{year:e.getFullYear(),month:e.getMonth()},{year:e.getFullYear(),month:e.getMonth()+1>11?0:e.getMonth()+1}],panelElement:null,datePickerId:"lvc-date-picker-"+ ++t,hoverDate:null}},computed:{isRangeMode(){return this.type.includes("range")},showDoubleInput(){return this.type.includes("range")||"datetimestartorend"===this.type},supportTime(){return this.type.includes("time")},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]},visibleCalendars(){return(!this.singlePanel||"daterange"!==this.type&&"datetimerange"!==this.type)&&this.isRangeMode?this.calendars:[this.calendars[0]]}},methods:{formatPad:e=>String(e).padStart(2,"0"),handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherDatePickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},closePanel(){this.isPanelOpen=!1,this.selectingRangePart="start",e=e.filter(e=>e.datePickerId!==this.datePickerId),this.removePanel()},closeOtherDatePickers(){e.forEach(e=>{e.datePickerId!==this.datePickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-picker-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.385vmin 4.1551vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1.108vmin",this.panelElement.style.padding="2.0776vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation(),this.activeTimePop=null}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",e=>{}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){const e=this.showDoubleInput?["start","end"]:["start"],t=this.visibleCalendars;let n="";return this.supportTime&&(n=`\n <div class="lvc-time-bar">\n ${e.map(e=>`\n <div class="lvc-time-slot" data-mode="${e}">\n <div class="lvc-time-btn ${this.activeTimePop===e?"is-active":""}">\n <span class="lvc-label">${"start"===e?this.showDoubleInput?"起始":"时间":"结束"}</span>\n <span class="lvc-time-val">${this.timeState[e].h}:${this.timeState[e].m}</span>\n </div>\n ${this.activeTimePop===e?this.generateTimeDropdownHTML(e):""}\n </div>\n `).join("")}\n </div>\n `),n+`\n <div class="lvc-calendars-wrap">\n ${t.map((e,t)=>`\n <div class="lvc-calendar-box" data-idx="${t}">\n <div class="lvc-cal-head">\n <span class="lvc-nav-btn" data-direction="-1">❮</span>\n <strong>${e.year}年 ${e.month+1}月</strong>\n <span class="lvc-nav-btn" data-direction="1">❯</span>\n </div>\n <div class="lvc-cal-week">\n ${["日","一","二","三","四","五","六"].map(e=>`<div>${e}</div>`).join("")}\n </div>\n <div class="lvc-cal-days">\n ${Array.from({length:this.getMonthOffset(e)},(e,t)=>'<div class="lvc-day is-empty"></div>').join("")}\n ${Array.from({length:this.getDaysCount(e)},(t,n)=>{const i=n+1,s=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(i)}`,l=this.getDayStateClass(e,i);return`<div class="lvc-day ${Object.entries(l).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-date="${s}">${i}</div>`}).join("")}\n </div>\n </div>\n `).join("")}\n </div>\n \n <div class="lvc-panel-footer">\n <span class="lvc-action-link" data-action="clear">清空</span>\n <div class="lvc-right-actions">\n <span class="lvc-action-btn is-outline" data-action="setToNow">此刻</span>\n <span class="lvc-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},generateTimeDropdownHTML(e){return`\n <div class="lvc-time-dropdown">\n <div class="lvc-scroll-col" data-part="h">\n <ul>\n ${Array.from({length:24},(t,n)=>{const i=this.formatPad(n);return`<li class="${i===this.timeState[e].h?"is-selected":""}" data-value="${i}">${i}</li>`}).join("")}\n </ul>\n </div>\n <div class="lvc-time-divider">:</div>\n <div class="lvc-scroll-col" data-part="m">\n <ul>\n ${Array.from({length:60},(t,n)=>{const i=this.formatPad(n);return`<li class="${i===this.timeState[e].m?"is-selected":""}" data-value="${i}">${i}</li>`}).join("")}\n </ul>\n </div>\n </div>\n `},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-time-slot").forEach(e=>{const t=e.dataset.mode,n=e.querySelector(".lvc-time-btn");n&&n.addEventListener("click",e=>{e.stopPropagation(),this.handleToggleTimePop(t)})}),this.panelElement.querySelectorAll(".lvc-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction),n=e.closest(".lvc-calendar-box");if(n){const i=parseInt(n.dataset.idx);e.addEventListener("click",e=>{e.stopPropagation(),this.handleMonthNav(i,t)})}}),this.panelElement.querySelectorAll(".lvc-day:not(.is-empty)").forEach(e=>{const t=e.dataset.date;if(t){const[n,i,s]=t.split("-").map(Number),l={year:n,month:i-1};e.addEventListener("click",e=>{e.stopPropagation(),this.handleDateSelection(l,s)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.value[0]&&(this.hoverDate=t,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverDate&&(this.hoverDate=null,this.clearHoverRangeStyle())}))}}),this.panelElement.querySelectorAll(".lvc-action-link, .lvc-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"setToNow":this.handleSetToNow();break;case"confirm":this.handleConfirm()}})}),this.panelElement.querySelectorAll(".lvc-time-dropdown").forEach(e=>{e.addEventListener("click",e=>{e.stopPropagation()}),e.querySelectorAll(".lvc-scroll-col").forEach(e=>{const t=e.dataset.part,n=e.closest(".lvc-time-slot");if(n){const i=n.dataset.mode;e.querySelectorAll("li").forEach(e=>{e.addEventListener("click",n=>{n.stopPropagation();const s=e.dataset.value;this.handleSelectTime(i,t,s)})})}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left;const s=window.innerHeight,l=window.innerWidth,a=this.panelElement.getBoundingClientRect();n+a.height>s&&(n=t.top-a.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px")),i+a.width>l&&(i=l-a.width-.1731,i<0&&(i=.1731,this.panelElement.style.width=l-.3463+"px")),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},handleToggleTimePop(e){this.activeTimePop===e?this.activeTimePop=null:this.activeTimePop=e,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},autoScrollTime(e){},handleSelectTime(e,t,n){this.timeState[e][t]=n,this.emitInternalChange(),"m"===t?(this.activeTimePop=null,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})):this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleMonthNav(e,t){const n=this.calendars[e],i=new Date(n.year,n.month+t,1);if(n.year=i.getFullYear(),n.month=i.getMonth(),this.isRangeMode){const t=0===e?1:0,i=0===e?1:-1,s=new Date(n.year,n.month+i,1);this.calendars[t].year=s.getFullYear(),this.calendars[t].month=s.getMonth()}this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},getMonthOffset:e=>new Date(e.year,e.month,1).getDay(),getDaysCount:e=>new Date(e.year,e.month+1,0).getDate(),handleDateSelection(e,t){const n=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(t)}`;if(this.hoverDate=null,"datetimestartorend"===this.type){const e=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,t=this.supportTime?`${n} ${this.timeState.end.h}:${this.timeState.end.m}`:n;this.$emit("input",[e,t]),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}else if(this.isRangeMode){let e=Array.isArray(this.value)?[...this.value]:["",""];const t=!!e[0],i=!!e[1];if(t&&i)e[0]=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,e[1]="",this.selectingRangePart="end";else if("start"===this.selectingRangePart)e[0]=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,e[1]&&e[0]>e[1]&&(e[1]=""),this.selectingRangePart="end";else{if(e[1]=this.supportTime?`${n} ${this.timeState.end.h}:${this.timeState.end.m}`:n,e[1]<e[0]){const t=e[0];e[0]=e[1],e[1]=t}this.selectingRangePart="start"}this.$emit("input",e),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}else{const e=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n;this.$emit("input",e),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}},getDayStateClass(e,t){const n=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(t)}`,i=new Date;let s={"is-today":n===`${i.getFullYear()}-${this.formatPad(i.getMonth()+1)}-${this.formatPad(i.getDate())}`};if(!this.value)return s;if("datetimestartorend"===this.type){const e=Array.isArray(this.value)&&this.value[0]?this.value[0].slice(0,10):"";return{...s,"is-active":e===n}}if(this.isRangeMode){const e=(this.value[0]||"").slice(0,10),t=(this.value[1]||"").slice(0,10),i={...s,"is-active":e&&n===e||t&&n===t,"is-in-range":e&&t&&n>e&&n<t};if("end"===this.selectingRangePart&&e&&this.hoverDate){const t=this.hoverDate;n>(e<t?e:t)&&n<(e<t?t:e)&&(i["is-in-hover-range"]=!0)}return i}return{...s,"is-active":"string"==typeof this.value&&this.value.slice(0,10)===n}},updateHoverRangeStyle(){if(!this.panelElement||!this.hoverDate||!this.value[0])return;const e=(this.value[0]||"").slice(0,10),t=this.hoverDate,n=e<t?e:t,i=e<t?t:e;this.panelElement.querySelectorAll(".lvc-day:not(.is-empty)").forEach(e=>{const t=e.dataset.date;t&&t>n&&t<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-day.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},syncInternalStateFromValue(){if(this.showDoubleInput){const e=Array.isArray(this.value)?this.value:["",""];this.timeState.start=this.splitTime(e[0]),this.timeState.end=this.splitTime(e[1])}else this.timeState.start=this.splitTime(this.value)},splitTime(e){if(e&&e.includes(" ")){const t=e.split(" ")[1].split(":");return{h:t[0]||"00",m:t[1]||"00"}}return{h:"00",m:"00"}},emitInternalChange(){if(this.value)if(this.showDoubleInput){let e=Array.isArray(this.value)?[...this.value]:["",""];e[0]&&(e[0]=e[0].slice(0,10)+` ${this.timeState.start.h}:${this.timeState.start.m}`),e[1]&&(e[1]=e[1].slice(0,10)+` ${this.timeState.end.h}:${this.timeState.end.m}`),this.$emit("input",e)}else{let e=this.value.slice(0,10)+` ${this.timeState.start.h}:${this.timeState.start.m}`;this.$emit("input",e)}},handleClear(){this.$emit("input",this.showDoubleInput?["",""]:""),this.activeTimePop=null,this.selectingRangePart="start",this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleSetToNow(){const e=new Date,t=`${e.getFullYear()}-${this.formatPad(e.getMonth()+1)}-${this.formatPad(e.getDate())}`,n=this.formatPad(e.getHours()),i=this.formatPad(e.getMinutes()),s=this.supportTime?`${t} ${n}:${i}`:t;if("datetimestartorend"===this.type)this.timeState.start={h:n,m:i},this.timeState.end={h:n,m:i},this.$emit("input",[s,s]);else if(this.isRangeMode){let e=Array.isArray(this.value)?[...this.value]:["",""];const t=this.selectingRangePart;if(this.timeState[t]={h:n,m:i},"start"===t)e[0]||e[1]?s<e[1]?(e[0]=s,this.timeState.start={h:n,m:i}):s>e[1]?(e[1]=s,this.timeState.end={h:n,m:i}):e[1]&&e[0]>e[1]&&(e[1]=""):(e[0]=s,this.timeState.start={h:n,m:i});else if(s>e[0])e[1]=s,this.timeState.end={h:n,m:i};else if(s<e[0]){const t=e[0];e[1]=t,e[0]=s,this.timeState.start={h:n,m:i},this.timeState.end={h:"00",m:"00"}}else e[0]&&e[1]<e[0]&&(e[0]=s,this.timeState.start={h:n,m:i});this.$emit("input",e)}else this.timeState.start={h:n,m:i},this.$emit("input",s);this.activeTimePop=null,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleConfirm(){this.closePanel(),this.$emit("confirm",this.value)},handleListScroll(e,t,n){},clickOutside(e){const t=this.$refs.pickerContainer;if(t)return t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)?void 0:(this.closePanel(),void(this.activeTimePop=null))}},mounted(){document.addEventListener("click",this.clickOutside)},beforeDestroy(){document.removeEventListener("click",this.clickOutside),this.closePanel()}};o.component("lvc-date-picker",i),r.lvcDatePicker=i}(),n("lvc-time-style","\n .lvc-time-picker {\n position: relative;\n display: inline-block;\n font-size: 1.4vmin;\n color: #fff;\n user-select: none;\n width: 100%;\n height: 100%;\n }\n\n .lvc-time-input-wrapper {\n background: #0d2339;\n border: 1px solid #297077;\n border-radius: 0.831vmin;\n padding: 0 1.108vmin;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: space-between;\n transition: all 0.3s;\n height: 100%;\n width: 100%;\n }\n\n .lvc-time-input-wrapper:hover,\n .lvc-time-input-wrapper.is-active {\n border-color: #12bbed;\n }\n\n .lvc-time-value {\n color: #e0f2fe;\n }\n\n .lvc-time-icon {\n color: #7dd3fc;\n font-size: 1.2vmin;\n transition: transform 0.3s;\n }\n \n .lvc-time-input-wrapper.is-active .lvc-time-icon {\n transform: rotate(180deg);\n }\n\n /* 下拉面板,移除 top/left,改为 fixed 定位 */\n .lvc-time-panel {\n position: fixed;\n background: #0d253f;\n border: 1px solid #1a3a5a;\n border-radius: 0.5vmin;\n box-shadow: 0 0.5vmin 1.5vmin rgba(0, 0, 0, 0.5);\n z-index: 999999;\n display: flex;\n flex-direction: column;\n width: 20vmin;\n /* 动画效果可选 */\n transition: top 0.1s, left 0.1s; \n }\n\n .lvc-time-spinner {\n display: flex;\n height: 25vmin;\n padding: 1vmin 0;\n }\n\n .lvc-time-column {\n flex: 1;\n overflow-y: auto;\n scrollbar-width: none;\n text-align: center;\n scroll-behavior: smooth;\n }\n\n .lvc-time-column::-webkit-scrollbar {\n display: none;\n }\n\n .lvc-time-item {\n padding: 1vmin 0;\n cursor: pointer;\n color: #7dd3fc;\n transition: all 0.2s;\n font-size: 1.3vmin;\n }\n\n .lvc-time-item:hover {\n background: rgba(18, 187, 237, 0.1);\n }\n\n .lvc-time-item.is-selected {\n color: #fff;\n background: #12bbed;\n font-weight: bold;\n }\n\n .lvc-time-item.is-disabled {\n color: #475569;\n cursor: not-allowed;\n background: transparent;\n }\n\n .lvc-time-footer {\n border-top: 1px solid #1a3a5a;\n padding: 0.8vmin;\n display: flex;\n justify-content: flex-end;\n gap: 0.8vmin;\n }\n\n .lvc-btn {\n padding: 0.5vmin 1.5vmin;\n border-radius: 0.3vmin;\n cursor: pointer;\n font-size: 1.2vmin;\n border: none;\n outline: none;\n transition: opacity 0.2s;\n }\n \n .lvc-btn:active {\n opacity: 0.8;\n }\n\n .lvc-btn-cancel {\n background: transparent;\n color: #7dd3fc;\n }\n\n .lvc-btn-confirm {\n background: #12bbed;\n color: #fff;\n }\n "),o.component("lvc-time-picker",{props:{value:{type:String,default:"00:00"},disabled:{type:Boolean,default:!1}},data:()=>({isPanelOpen:!1,tempHour:"00",tempMinute:"00",overlayElement:null}),computed:{hours(){const e=[];for(let t=0;t<=24;t++)e.push(String(t).padStart(2,"0"));return e},minutes(){const e=[];for(let t=0;t<60;t++)e.push(String(t).padStart(2,"0"));return e}},watch:{value:{immediate:!0,handler(e){const t=e||"00:00",[n,i]=t.split(":");this.tempHour=n||"00",this.tempMinute=i||"00"}}},methods:{togglePanel(){this.isPanelOpen=!this.isPanelOpen,this.isPanelOpen?(this.createOverlay(),this.$nextTick(()=>{this.updatePosition(),this.scrollToSelected()})):this.removeOverlay()},closePanel(){this.isPanelOpen=!1,this.removeOverlay()},createOverlay(){this.overlayElement||(this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:999998;",document.body.appendChild(this.overlayElement))},removeOverlay(){this.overlayElement&&this.overlayElement.parentNode&&(this.overlayElement.parentNode.removeChild(this.overlayElement),this.overlayElement=null)},selectHour(e){this.tempHour=e,"24"===e&&(this.tempMinute="00")},selectMinute(e){"24"!==this.tempHour&&(this.tempMinute=e)},handleConfirm(){const e=`${this.tempHour}:${this.tempMinute}`;this.$emit("input",e),this.$emit("change",e),this.closePanel()},scrollToSelected(){const e=this.$refs.panel.querySelectorAll(".hour-column .lvc-time-item"),t=this.$refs.panel.querySelectorAll(".minute-column .lvc-time-item"),n=Array.from(e).find(e=>e.dataset.val===this.tempHour),i=Array.from(t).find(e=>e.dataset.val===this.tempMinute);n&&n.scrollIntoView({block:"center",behavior:"auto"}),i&&i.scrollIntoView({block:"center",behavior:"auto"})},updatePosition(){if(!this.isPanelOpen||!this.$refs.panel||!this.$refs.inputWrapper)return;const e=this.$refs.inputWrapper.getBoundingClientRect(),t=this.$refs.panel,n=t.offsetHeight||.25*window.innerHeight,i=window.innerHeight-e.bottom,s=e.top;t.style.top=i<n&&s>i?e.top-n-8+"px":`${e.bottom+8}px`,t.style.left=`${e.left}px`},handleOutsideClick(e){const t=this.$refs.inputWrapper&&this.$refs.inputWrapper.contains(e.target),n=this.$refs.panel&&this.$refs.panel.contains(e.target);t||n||this.closePanel()},handleScroll(){this.isPanelOpen&&this.updatePosition()}},mounted(){this.$refs.panel&&document.body.appendChild(this.$refs.panel),document.addEventListener("click",this.handleOutsideClick),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.updatePosition)},beforeDestroy(){this.$refs.panel&&this.$refs.panel.parentNode&&this.$refs.panel.parentNode.removeChild(this.$refs.panel),document.removeEventListener("click",this.handleOutsideClick),window.removeEventListener("scroll",this.handleScroll,!0),window.removeEventListener("resize",this.updatePosition)},template:'\n <div class="lvc-time-picker">\n \x3c!-- 输入框显示区 --\x3e\n <div ref="inputWrapper" class="lvc-time-input-wrapper" :class="{\'is-active\': isPanelOpen && !disabled}" @click.stop="togglePanel">\n <span class="lvc-time-value">{{ value }}</span>\n <span class="lvc-time-icon">▼</span>\n </div>\n\n \x3c!-- 下拉面板:v-show 保证 DOM 存在,方便挂载到 Body --\x3e\n <div ref="panel" class="lvc-time-panel" v-show="isPanelOpen && !disabled" @click.stop>\n <div class="lvc-time-spinner">\n \x3c!-- 小时列 --\x3e\n <div class="lvc-time-column hour-column">\n <div \n v-for="h in hours" \n :key="\'h\'+h" \n :data-val="h"\n class="lvc-time-item" \n :class="{\'is-selected\': tempHour === h}"\n @click="selectHour(h)"\n >{{ h }}</div>\n </div>\n \x3c!-- 分钟列 --\x3e\n <div class="lvc-time-column minute-column">\n <div \n v-for="m in minutes" \n :key="\'m\'+m" \n :data-val="m"\n class="lvc-time-item" \n :class="{\n \'is-selected\': tempMinute === m, \n \'is-disabled\': tempHour === \'24\' && m !== \'00\'\n }"\n @click="selectMinute(m)"\n >{{ m }}</div>\n </div>\n </div>\n <div class="lvc-time-footer">\n <button class="lvc-btn lvc-btn-cancel" @click="closePanel">取消</button>\n <button class="lvc-btn lvc-btn-confirm" @click="handleConfirm">确定</button>\n </div>\n </div>\n </div>\n '}),function(){n("lvc-year-picker-style",'\n .lvc-year-picker {\n position: relative;\n display: inline-block;\n font-size: 1.8vmin;\n color: #fff;\n user-select: none;\n height: 100%;\n }\n\n .lvc-year-input-wrapper {\n background: #0d2339;\n border: 1px solid #1e4469;\n border-radius: 0.8vmin;\n padding: 0.6vmin 1vmin;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.8vmin;\n min-width: 10vmin;\n transition: all 0.3s;\n height: 100%;\n }\n\n .lvc-year-separator {\n color: #5d758c;\n font-size: 1.385vmin;\n flex-shrink: 0;\n }\n\n .lvc-year-input-wrapper:hover,\n .lvc-year-input-wrapper.is-active {\n border-color: #12bbed;\n box-shadow: 0 0 1.2vmin rgba(18, 187, 237, 0.3);\n }\n\n .lvc-year-inner-input {\n background: transparent;\n border: none;\n color: #fff;\n outline: none;\n width: 100%;\n text-align: center;\n cursor: pointer;\n font-size: 1.3vmin;\n }\n\n .lvc-year-icon-arrow {\n color: #12bbed;\n font-size: 1.385vmin;\n transition: transform 0.3s;\n }\n\n .lvc-year-panel {\n position: absolute;\n top: 5vmin;\n left: 50%;\n transform: translateX(-50%);\n background: #0b1a2a;\n border: 1px solid #12bbed;\n box-shadow: 0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7);\n border-radius: 1vmin;\n padding: 1.5vmin;\n z-index: 9999;\n min-width: 24vmin;\n }\n\n .lvc-year-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1vmin;\n color: #12bbed;\n font-size: 1.6vmin;\n }\n\n .lvc-year-nav-btn {\n cursor: pointer;\n padding: 0.3vmin 0.8vmin;\n font-size: 1.4vmin;\n color: #12bbed;\n transition: color 0.2s;\n }\n\n .lvc-year-nav-btn:hover {\n color: #fff;\n }\n\n .lvc-year-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n }\n\n .lvc-year-cell {\n position: relative;\n height: 4.5vmin;\n width: 6.5vmin;\n line-height: 4.5vmin;\n text-align: center;\n font-size: 1.662vmin;\n cursor: pointer;\n border-radius: 0.5vmin;\n color: #8ab4d4;\n transition: all 0.2s;\n }\n\n .lvc-year-cell:hover {\n background: rgba(18, 187, 237, 0.2);\n color: #fff;\n }\n\n .lvc-year-cell.is-active {\n background: #12bbed;\n color: #fff;\n font-weight: bold;\n }\n\n .lvc-year-cell.is-in-range {\n background: rgba(18, 187, 237, 0.15);\n color: #12bbed;\n border-radius: 0;\n }\n\n .lvc-year-cell.is-in-hover-range {\n background: rgba(18, 187, 237, 0.25);\n color: #fff;\n border-radius: 0;\n }\n\n .lvc-year-cell.is-current::after {\n content: "";\n position: absolute;\n bottom: 0.5vmin;\n left: 50%;\n width: 0.6vmin;\n height: 0.4vmin;\n background: #12bbed;\n border-radius: 50%;\n transform: translateX(-50%);\n }\n\n .lvc-year-panel-footer {\n border-top: 1px solid rgba(255, 255, 255, 0.05);\n margin-top: 1vmin;\n padding-top: 1vmin;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 1vmin;\n }\n\n .lvc-year-right-actions {\n display: flex;\n gap: 1vmin;\n }\n\n .lvc-year-action-btn {\n font-size: 1.662vmin;\n cursor: pointer;\n padding: 0.554vmin 1.662vmin;\n border-radius: 0.5vmin;\n transition: all 0.2s;\n }\n\n .lvc-year-action-btn.is-outline {\n border: 1px solid #1e4469;\n color: #8ab4d4;\n }\n\n .lvc-year-action-btn.is-outline:hover {\n border-color: #12bbed;\n color: #12bbed;\n }\n\n .lvc-year-action-btn.is-primary {\n background: #12bbed;\n color: #fff;\n }\n\n .lvc-year-action-btn.is-primary:hover {\n background: #0ea8d4;\n }\n\n .lvc-year-fade-enter-active,\n .lvc-year-fade-leave-active {\n transition: opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .lvc-year-fade-enter,\n .lvc-year-fade-leave-to {\n opacity: 0;\n transform: translateY(1.662vmin) scale(0.98);\n }\n ');let e=[],t=0;const i={name:"lvcYearPicker",props:{value:{type:[String,Array],default:""},yearRange:{type:Number,default:5},type:{type:String,default:"year"},rangeSeparator:{type:String,default:"至"}},template:'\n <div class="lvc-year-picker" ref="pickerContainer">\n <div class="lvc-year-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="isRangeMode">\n <input class="lvc-year-inner-input" readonly :value="displayValues[0]" placeholder="开始年份" />\n <span class="lvc-year-separator">{{ rangeSeparator }}</span>\n <input class="lvc-year-inner-input" readonly :value="displayValues[1]" placeholder="结束年份" />\n </template>\n <template v-else>\n <input class="lvc-year-inner-input" readonly :value="displayValue" placeholder="请选择年份" />\n </template>\n <span class="lvc-year-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date,n="yearrange"===this.type;let i;if(this.value)if(n){const t=Array.isArray(this.value)?this.value:["",""];i=t[0]?parseInt(t[0]):e.getFullYear()}else i=parseInt(this.value);else i=e.getFullYear();return{isPanelOpen:!1,currentYear:i,currentYearNow:e.getFullYear(),tempYear:i,rangeStart:i-this.yearRange,tempStartYear:i,tempEndYear:i,selectingRangePart:"start",hoverYear:null,panelElement:null,overlayElement:null,yearPickerId:"lvc-year-picker-"+ ++t}},computed:{isRangeMode(){return"yearrange"===this.type},displayValue(){return this.value||""},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]},yearList(){const e=[];for(let t=0;t<2*this.yearRange+1;t++)e.push(this.rangeStart+t);return e},displayRange(){return`${this.rangeStart} - ${this.rangeStart+2*this.yearRange}`}},mounted(){this._onDocClick=e=>{this.clickOutside(e)},document.addEventListener("click",this._onDocClick)},beforeDestroy(){document.removeEventListener("click",this._onDocClick),this.closePanel()},watch:{value(e){if(this.isRangeMode){const t=Array.isArray(e)?e:["",""];t[0]&&(this.tempStartYear=parseInt(t[0])),t[1]&&(this.tempEndYear=parseInt(t[1]))}else e&&(this.tempYear=parseInt(e))}},methods:{handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherYearPickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},syncInternalStateFromValue(){if(this.isRangeMode){const e=Array.isArray(this.value)?this.value:["",""];e[0]?this.tempStartYear=parseInt(e[0]):this.tempStartYear=(new Date).getFullYear(),e[1]?this.tempEndYear=parseInt(e[1]):this.tempEndYear=this.tempStartYear,this.currentYear=this.tempStartYear,this.rangeStart=this.currentYear-this.yearRange,this.selectingRangePart="start"}else{const e=this.value?parseInt(this.value):(new Date).getFullYear();this.tempYear=e,this.currentYear=this.tempYear,this.rangeStart=this.currentYear-this.yearRange}},closePanel(){this.isPanelOpen=!1,e=e.filter(e=>e.yearPickerId!==this.yearPickerId),this.removePanel()},closeOtherYearPickers(){e.forEach(e=>{e.yearPickerId!==this.yearPickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-year-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateX(-50%) translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1vmin",this.panelElement.style.padding="1.5vmin",this.panelElement.style.minWidth="24vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation()}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",()=>{this.closePanel()}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateX(-50%) translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){return`\n <div class="lvc-year-panel-header">\n <span class="lvc-year-nav-btn" data-direction="-1">◀</span>\n <span>${this.displayRange}</span>\n <span class="lvc-year-nav-btn" data-direction="1">▶</span>\n </div>\n <div class="lvc-year-grid">\n ${this.yearList.map(e=>{const t=this.getYearCellClasses(e);return`<span class="${Object.entries(t).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-year="${e}">${e}</span>`}).join("")}\n </div>\n <div class="lvc-year-panel-footer">\n <span class="lvc-year-action-btn is-outline" data-action="clear">清空</span>\n <div class="lvc-year-right-actions">\n <span class="lvc-year-action-btn is-outline" data-action="cancel">取消</span>\n <span class="lvc-year-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},getYearCellClasses(e){let t={"lvc-year-cell":!0,"is-current":e===this.currentYearNow};if(this.isRangeMode){const n=null!==this.tempStartYear,i=null!==this.tempEndYear;t["is-active"]=n&&e===this.tempStartYear||i&&e===this.tempEndYear,t["is-in-range"]=n&&i&&e>this.tempStartYear&&e<this.tempEndYear}else t["is-active"]=this.tempYear===e;return t},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-year-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction);e.addEventListener("click",e=>{e.stopPropagation(),-1===t?this.prevRange():this.nextRange()})}),this.panelElement.querySelectorAll(".lvc-year-cell").forEach(e=>{const t=parseInt(e.dataset.year);e.addEventListener("click",e=>{e.stopPropagation(),this.selectYear(t)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.tempStartYear&&(this.hoverYear=t,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverYear&&(this.hoverYear=null,this.clearHoverRangeStyle())}))}),this.panelElement.querySelectorAll(".lvc-year-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"cancel":this.handleCancel();break;case"confirm":this.handleConfirm()}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-year-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left+t.width/2;const s=window.innerHeight,l=window.innerWidth,a=this.panelElement.getBoundingClientRect();n+a.height>s&&(n=t.top-a.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px"));const o=a.width/2;i-o<0?i=o+.1731:i+o>l&&(i=l-o-.1731),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},updateHoverRangeStyle(){if(!this.panelElement||null===this.hoverYear||null===this.tempStartYear)return;const e=this.tempStartYear,t=this.hoverYear,n=Math.min(e,t),i=Math.max(e,t);this.panelElement.querySelectorAll(".lvc-year-cell").forEach(e=>{const t=parseInt(e.dataset.year);t>n&&t<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-year-cell.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},prevRange(){this.rangeStart-=2*this.yearRange+1,this.updatePanelContent()},nextRange(){this.rangeStart+=2*this.yearRange+1,this.updatePanelContent()},selectYear(e){if(this.hoverYear=null,this.isRangeMode){const t=null!==this.tempStartYear,n=null!==this.tempEndYear;"start"===this.selectingRangePart||t&&n?(this.tempStartYear=e,this.tempEndYear=null,this.selectingRangePart="end"):(e<this.tempStartYear?(this.tempEndYear=this.tempStartYear,this.tempStartYear=e):this.tempEndYear=e,this.selectingRangePart="start"),this.tempStartYear&&this.tempEndYear?this.$emit("input",[String(this.tempStartYear),String(this.tempEndYear)]):this.tempStartYear&&this.$emit("input",[String(this.tempStartYear),""])}else{this.tempYear=e;const t=String(this.tempYear);this.$emit("input",t)}this.updatePanelContent()},handleClear(){this.isRangeMode?(this.$emit("input",["",""]),this.tempStartYear=null,this.tempEndYear=null,this.selectingRangePart="start"):(this.$emit("input",""),this.tempYear=null),this.isPanelOpen&&this.updatePanelContent()},handleCancel(){this.closePanel()},handleConfirm(){if(this.isRangeMode){if(this.tempStartYear&&this.tempEndYear){const e=String(this.tempStartYear),t=String(this.tempEndYear);this.$emit("input",[e,t]),this.$emit("confirm",[e,t]),this.$emit("change",[e,t])}}else{const e=String(this.tempYear);this.$emit("input",e),this.$emit("confirm",e),this.$emit("change",e)}this.closePanel()},clickOutside(e){const t=this.$refs.pickerContainer;t&&(t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)||this.closePanel())}}};o.component("lvc-year-picker",i),r.lvcYearPicker=i}(),function(){n("lvc-month-picker-style",'\n .lvc-month-picker {\n position: relative;\n display: inline-block;\n font-size: 1.8vmin;\n color: #fff;\n user-select: none;\n height: 100%;\n }\n\n .lvc-month-input-wrapper {\n background: #0d2339;\n border: 1px solid #1e4469;\n border-radius: 0.8vmin;\n padding: 0.6vmin 1vmin;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.8vmin;\n min-width: 14vmin;\n transition: all 0.3s;\n height: 100%;\n }\n\n .lvc-month-separator {\n color: #5d758c;\n font-size: 1.385vmin;\n flex-shrink: 0;\n }\n\n .lvc-month-input-wrapper:hover,\n .lvc-month-input-wrapper.is-active {\n border-color: #12bbed;\n box-shadow: 0 0 1.2vmin rgba(18, 187, 237, 0.3);\n }\n\n .lvc-month-inner-input {\n background: transparent;\n border: none;\n color: #fff;\n outline: none;\n width: 100%;\n text-align: center;\n cursor: pointer;\n font-size: 1.3vmin;\n }\n\n .lvc-month-icon-arrow {\n color: #12bbed;\n font-size: 1.385vmin;\n transition: transform 0.3s;\n }\n\n .lvc-month-panel {\n position: absolute;\n top: 5vmin;\n left: 50%;\n transform: translateX(-50%);\n background: #0b1a2a;\n border: 1px solid #12bbed;\n box-shadow: 0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7);\n border-radius: 1vmin;\n padding: 1.5vmin;\n z-index: 9999;\n min-width: 28vmin;\n }\n\n .lvc-month-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1vmin;\n color: #12bbed;\n font-size: 1.6vmin;\n }\n\n .lvc-month-nav-btn {\n cursor: pointer;\n padding: 0.3vmin 0.8vmin;\n font-size: 1.4vmin;\n color: #12bbed;\n transition: color 0.2s;\n }\n\n .lvc-month-nav-btn:hover {\n color: #fff;\n }\n\n .lvc-month-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n }\n\n .lvc-month-cell {\n position: relative;\n height: 4.5vmin;\n line-height: 4.5vmin;\n text-align: center;\n font-size: 1.662vmin;\n cursor: pointer;\n border-radius: 0.5vmin;\n color: #8ab4d4;\n transition: all 0.2s;\n }\n\n .lvc-month-cell:hover {\n background: rgba(18, 187, 237, 0.2);\n color: #fff;\n }\n\n .lvc-month-cell.is-active {\n background: #12bbed;\n color: #fff;\n font-weight: bold;\n }\n\n .lvc-month-cell.is-in-range {\n background: rgba(18, 187, 237, 0.15);\n color: #12bbed;\n border-radius: 0;\n }\n\n .lvc-month-cell.is-in-hover-range {\n background: rgba(18, 187, 237, 0.25);\n color: #fff;\n border-radius: 0;\n }\n\n .lvc-month-cell.is-range-end {\n border-top-right-radius: 0.5vmin;\n border-bottom-right-radius: 0.5vmin;\n }\n\n .lvc-month-cell.is-range-start {\n border-top-left-radius: 0.5vmin;\n border-bottom-left-radius: 0.5vmin;\n }\n\n .lvc-month-cell.is-current::after {\n content: "";\n position: absolute;\n bottom: 0.5vmin;\n left: 50%;\n width: 0.6vmin;\n height: 0.6vmin;\n background: #12bbed;\n border-radius: 50%;\n transform: translateX(-50%);\n }\n\n .lvc-month-panel-footer {\n border-top: 1px solid rgba(255, 255, 255, 0.05);\n margin-top: 1vmin;\n padding-top: 1vmin;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 1vmin;\n }\n\n .lvc-month-right-actions {\n display: flex;\n gap: 1vmin;\n }\n\n .lvc-month-action-btn {\n font-size: 1.662vmin;\n cursor: pointer;\n padding: 0.554vmin 1.662vmin;\n border-radius: 0.5vmin;\n transition: all 0.2s;\n }\n\n .lvc-month-action-btn.is-outline {\n border: 1px solid #1e4469;\n color: #8ab4d4;\n }\n\n .lvc-month-action-btn.is-outline:hover {\n border-color: #12bbed;\n color: #12bbed;\n }\n\n .lvc-month-action-btn.is-primary {\n background: #12bbed;\n color: #fff;\n }\n\n .lvc-month-action-btn.is-primary:hover {\n background: #0ea8d4;\n }\n\n .lvc-month-fade-enter-active,\n .lvc-month-fade-leave-active {\n transition: opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .lvc-month-fade-enter,\n .lvc-month-fade-leave-to {\n opacity: 0;\n transform: translateY(1.662vmin) scale(0.98);\n }\n ');let e=[],t=0;const i={name:"lvcMonthPicker",props:{value:{type:[String,Array],default:""},type:{type:String,default:"month"},rangeSeparator:{type:String,default:"至"},singlePlaceholder:{type:String,default:"请选择月份"},startPlaceholder:{type:String,default:"开始月份"},endPlaceholder:{type:String,default:"结束月份"}},template:'\n <div class="lvc-month-picker" ref="pickerContainer">\n <div class="lvc-month-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="isRangeMode">\n <input class="lvc-month-inner-input" readonly :value="displayValues[0]" :placeholder="startPlaceholder" />\n <span class="lvc-month-separator">{{ rangeSeparator }}</span>\n <input class="lvc-month-inner-input" readonly :value="displayValues[1]" :placeholder="endPlaceholder" />\n </template>\n <template v-else>\n <input class="lvc-month-inner-input" readonly :value="displayValue" :placeholder="singlePlaceholder" />\n </template>\n <span class="lvc-month-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date,n="monthrange"===this.type;let i,s;if(this.value)if(n){const t=Array.isArray(this.value)?this.value:["",""];if(t[0]){const e=new Date(t[0]);i=e.getFullYear(),s=e.getMonth()+1}else i=e.getFullYear(),s=e.getMonth()+1}else{const e=new Date(this.value);i=e.getFullYear(),s=e.getMonth()+1}else i=e.getFullYear(),s=e.getMonth()+1;return{isPanelOpen:!1,currentYear:i,currentYearNow:e.getFullYear(),currentMonth:e.getMonth()+1,selectedYear:i,selectedMonth:s,tempYear:i,tempMonth:s,tempStartYear:i,tempStartMonth:s,tempEndYear:i,tempEndMonth:s,selectingRangePart:"start",hoverMonth:null,panelElement:null,overlayElement:null,monthPickerId:"lvc-month-picker-"+ ++t}},watch:{value(e){if(this.isRangeMode){const t=Array.isArray(e)?e:["",""];if(t[0]){const e=new Date(t[0]);this.tempStartYear=e.getFullYear(),this.tempStartMonth=e.getMonth()+1}if(t[1]){const e=new Date(t[1]);this.tempEndYear=e.getFullYear(),this.tempEndMonth=e.getMonth()+1}}else if(e){const t=new Date(e),n=t.getFullYear(),i=t.getMonth()+1;this.tempYear=n,this.tempMonth=i,this.selectedYear=n,this.selectedMonth=i}}},computed:{isRangeMode(){return"monthrange"===this.type},displayValue(){return this.value||""},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]}},mounted(){this._onDocClick=e=>{this.clickOutside(e)},document.addEventListener("click",this._onDocClick)},beforeDestroy(){document.removeEventListener("click",this._onDocClick),this.closePanel()},methods:{_parseValue(e){if(!e){const e=new Date;return{year:e.getFullYear(),month:e.getMonth()+1}}const t=e.split("-");return{year:parseInt(t[0]),month:parseInt(t[1])}},handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherMonthPickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},syncInternalStateFromValue(){if(this.isRangeMode){const e=Array.isArray(this.value)?this.value:["",""];if(e[0]){const t=new Date(e[0]);this.tempStartYear=t.getFullYear(),this.tempStartMonth=t.getMonth()+1,this.currentYear=this.tempStartYear}else{const e=new Date;this.tempStartYear=e.getFullYear(),this.tempStartMonth=e.getMonth()+1,this.currentYear=this.tempStartYear}if(e[1]){const t=new Date(e[1]);this.tempEndYear=t.getFullYear(),this.tempEndMonth=t.getMonth()+1}else this.tempEndYear=this.tempStartYear,this.tempEndMonth=this.tempStartMonth;this.selectingRangePart="start"}else{const e=this._parseValue(this.value);this.tempYear=e.year,this.tempMonth=e.month,this.currentYear=this.tempYear,this.selectedYear=this.tempYear,this.selectedMonth=this.tempMonth}},closePanel(){this.isPanelOpen=!1,e=e.filter(e=>e.monthPickerId!==this.monthPickerId),this.removePanel()},closeOtherMonthPickers(){e.forEach(e=>{e.monthPickerId!==this.monthPickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-month-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateX(-50%) translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1vmin",this.panelElement.style.padding="1.5vmin",this.panelElement.style.minWidth="28vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation()}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",()=>{this.closePanel()}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateX(-50%) translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){return`\n <div class="lvc-month-panel-header">\n <span class="lvc-month-nav-btn" data-direction="-1">◀</span>\n <span>${this.currentYear}年</span>\n <span class="lvc-month-nav-btn" data-direction="1">▶</span>\n </div>\n <div class="lvc-month-grid">\n ${Array.from({length:12},(e,t)=>{const n=t+1,i=this.getMonthCellClasses(n);return`<span class="${Object.entries(i).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-month="${n}">${n}月</span>`}).join("")}\n </div>\n <div class="lvc-month-panel-footer">\n <span class="lvc-month-action-btn is-outline" data-action="clear">清空</span>\n <div class="lvc-month-right-actions">\n <span class="lvc-month-action-btn is-outline" data-action="cancel">取消</span>\n <span class="lvc-month-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},getMonthCellClasses(e){let t={"lvc-month-cell":!0,"is-current":e===this.currentMonth&&this.currentYear===this.currentYearNow};if(this.isRangeMode){const n=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,i=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`,s=`${this.currentYear}-${String(e).padStart(2,"0")}`,l=null!==this.tempStartYear,a=null!==this.tempEndYear;t["is-active"]=l&&s===n||a&&s===i,t["is-in-range"]=l&&a&&s>n&&s<i,t["is-range-start"]=l&&s===n,t["is-range-end"]=a&&s===i}else t["is-active"]=this.tempMonth===e&&this.currentYear===this.tempYear;return t},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-month-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction);e.addEventListener("click",e=>{e.stopPropagation(),-1===t?this.prevYear():this.nextYear()})}),this.panelElement.querySelectorAll(".lvc-month-cell").forEach(e=>{const t=parseInt(e.dataset.month);e.addEventListener("click",e=>{e.stopPropagation(),this.selectMonth(t)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.tempStartYear&&(this.hoverMonth=`${this.currentYear}-${String(t).padStart(2,"0")}`,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverMonth&&(this.hoverMonth=null,this.clearHoverRangeStyle())}))}),this.panelElement.querySelectorAll(".lvc-month-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"cancel":this.handleCancel();break;case"confirm":this.handleConfirm()}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-month-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left+t.width/2;const s=window.innerHeight,l=window.innerWidth,a=this.panelElement.getBoundingClientRect();n+a.height>s&&(n=t.top-a.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px"));const o=a.width/2;i-o<0?i=o+.1731:i+o>l&&(i=l-o-.1731),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},updateHoverRangeStyle(){if(!this.panelElement||!this.hoverMonth||!this.tempStartYear)return;const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=this.hoverMonth,n=e<t?e:t,i=e<t?t:e;this.panelElement.querySelectorAll(".lvc-month-cell").forEach(e=>{const t=parseInt(e.dataset.month),s=`${this.currentYear}-${String(t).padStart(2,"0")}`;s>n&&s<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-month-cell.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},prevYear(){this.currentYear--,this.updatePanelContent()},nextYear(){this.currentYear++,this.updatePanelContent()},selectMonth(e){if(this.hoverMonth=null,this.isRangeMode){const t=`${this.currentYear}-${String(e).padStart(2,"0")}`,n=this.tempStartYear?`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`:"",i=!!this.tempStartYear,s=!!this.tempEndYear;if("start"===this.selectingRangePart||i&&s?(this.tempStartYear=this.currentYear,this.tempStartMonth=e,this.tempEndYear=null,this.tempEndMonth=null,this.selectingRangePart="end"):(t<n?(this.tempEndYear=this.tempStartYear,this.tempEndMonth=this.tempStartMonth,this.tempStartYear=this.currentYear,this.tempStartMonth=e):(this.tempEndYear=this.currentYear,this.tempEndMonth=e),this.selectingRangePart="start"),this.tempStartYear&&this.tempEndYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`;this.$emit("input",[e,t])}else if(this.tempStartYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`;this.$emit("input",[e,""])}}else{this.tempMonth=e,this.tempYear=this.currentYear;const t=String(this.tempMonth).padStart(2,"0"),n=`${this.tempYear}-${t}`;this.$emit("input",n)}this.updatePanelContent()},handleClear(){this.isRangeMode?(this.$emit("input",["",""]),this.tempStartYear=null,this.tempStartMonth=null,this.tempEndYear=null,this.tempEndMonth=null,this.selectingRangePart="start"):(this.$emit("input",""),this.tempYear=null,this.tempMonth=null),this.isPanelOpen&&this.updatePanelContent()},handleCancel(){this.closePanel()},handleConfirm(){if(this.isRangeMode){if(this.tempStartYear&&this.tempEndYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`;this.$emit("input",[e,t]),this.$emit("confirm",[e,t])}}else{const e=String(this.tempMonth).padStart(2,"0"),t=`${this.tempYear}-${e}`;this.$emit("input",t),this.$emit("confirm",t)}this.closePanel()},clickOutside(e){const t=this.$refs.pickerContainer;t&&(t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)||this.closePanel())}}};o.component("lvc-month-picker",i),r.lvcMonthPicker=i}(),function(){const e=document.createElement("style");function t(e,n){if(-1!==e.indexOf(n.id))return!0;if(!n.children||0===n.children.length)return!1;for(let i=0;i<n.children.length;i++)if(t(e,n.children[i]))return!0;return!1}e.id="lvc-tree-style",e.textContent=[".lvc-tree { user-select: none; overflow-y: auto; }",".lvc-tree::-webkit-scrollbar { width: 0.4vmin; }",".lvc-tree::-webkit-scrollbar-track { background: rgba(10, 22, 40, 0.3); }",".lvc-tree::-webkit-scrollbar-thumb { background: #1e3a5f; border-radius: 0.2vmin; }",".lvc-tree::-webkit-scrollbar-thumb:hover { background: #22a6b3; }",".lvc-tree-node { }",".lvc-tree-node-content { display: flex; align-items: stretch; }",".lvc-tree-node-left { display: inline-flex; align-items: center; flex-shrink: 0; }",".lvc-tree-node-right { display: flex; align-items: center; flex: 1; padding: 0.6vmin 0.8vmin; cursor: pointer; border-radius: 0.4vmin; transition: background 0.2s; font-size: 1.2vmin; color: #cfefff; min-width: 0; }",".lvc-tree-node-right:hover { background: rgba(34, 166, 179, 0.15); }",".lvc-tree-node-right.selected { background: rgba(34, 166, 179, 0.25); color: #22a6b3; }",".lvc-tree-node-arrow { width: 2vmin; font-size: 1.2vmin; color: #8ab4d4; transition: transform 0.2s; display: inline-block; text-align: center; flex-shrink: 0; }",".lvc-tree-node-arrow.expanded { transform: rotate(90deg); }",".lvc-tree-node-arrow-placeholder { width: 1.5vmin; display: inline-block; flex-shrink: 0; }",".lvc-tree-node-icon { width: 1.5vmin; height: 1.5vmin; margin-right: 0.8vmin; display: inline-flex; align-items: center; justify-content: center; font-size: 1.2vmin; flex-shrink: 0; }",'.lvc-tree-node-icon.folder::before { content: "\\1F4C1"; }','.lvc-tree-node-icon.meter::before { content: "\\1F4CA"; }','.lvc-tree-node-icon.data::before { content: "\\1F4C8"; }','.lvc-tree-node-icon.device::before { content: "\\2699\\FE0F"; }','.lvc-tree-node-icon.default::before { content: "\\1F4C4"; }',".lvc-tree-node-label { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }",".lvc-tree-node-children { padding-left: 1.5vmin; }",".lvc-tree-checkbox { display: inline-flex; align-items: center; margin-right: 0.6vmin;margin-left: 0.6vmin; flex-shrink: 0; cursor: pointer; }",".lvc-tree-checkbox input { display: none; }",".lvc-tree-checkbox .checkbox-box { width: 1.4vmin; height: 1.4vmin; border: 0.15vmin solid #4a7899; border-radius: 0.2vmin; display: inline-flex; align-items: center; justify-content: center; transition: all 0.2s; background: transparent; position: relative; }",".lvc-tree-checkbox:hover .checkbox-box { border-color: #22a6b3; }",".lvc-tree-checkbox.checked .checkbox-box { background: #22a6b3; border-color: #22a6b3; }",'.lvc-tree-checkbox.checked .checkbox-box::after { content: ""; width: 0.4vmin; height: 0.7vmin; border: 0.15vmin solid #fff; border-top: none; border-left: none; transform: rotate(45deg) translate(-0.05vmin, -0.1vmin); }',".lvc-tree-checkbox.indeterminate .checkbox-box { background: #22a6b3; border-color: #22a6b3; }",'.lvc-tree-checkbox.indeterminate .checkbox-box::after { content: ""; width: 0.7vmin; height: 0.15vmin; background: #fff; border-radius: 0.1vmin; }'].join("\n"),document.getElementById("lvc-tree-style")||document.head.appendChild(e);const n={name:"LvcTree",components:{"lvc-tree-node":{name:"LvcTreeNode",props:{node:{type:Object,required:!0},selectedId:{type:[String,Number],default:null},defaultExpandAll:{type:Boolean,default:!1},showCheckbox:{type:Boolean,default:!1},checkedKeys:{type:Array,default:()=>[]},filterText:{type:String,default:""},filterNodeMethod:{type:Function,default:null},autoExpandOnFilter:{type:Boolean,default:!0},isRoot:{type:Boolean,default:!1}},data(){return{expanded:void 0!==this.node.expanded?this.node.expanded:this.defaultExpandAll}},watch:{filterText:{handler(e){this.autoExpandOnFilter&&e&&this.hasChildren?this._nodeMatchesFilter(this.node)&&(this.expanded=!0):this.expanded=this.isRoot},immediate:!1}},template:['<div class="lvc-tree-node" v-show="isVisible">',' <div class="lvc-tree-node-content">',' <span class="lvc-tree-node-left">',' <span v-if="hasChildren" class="lvc-tree-node-arrow" :class="{ expanded: expanded }" @click.stop="handleToggle">▶</span>',' <span v-else class="lvc-tree-node-arrow-placeholder"></span>',' <span v-if="showCheckbox" class="lvc-tree-checkbox" :class="checkboxClass" @click.stop.prevent="handleCheck">',' <span class="checkbox-box"></span>'," </span>"," </span>",' <span class="lvc-tree-node-right" :class="{ selected: node.id === selectedId }" @click="handleClick">',' <span v-if="nodeIcon" class="lvc-tree-node-icon" :class="nodeIcon"></span>',' <span class="lvc-tree-node-label" :title="node.label">{{ node.label }}</span>'," </span>"," </div>",' <div v-if="expanded && hasChildren" class="lvc-tree-node-children">',' <lvc-tree-node v-for="child in node.children" :key="child.id" :node="child" :selected-id="selectedId" :default-expand-all="defaultExpandAll" :show-checkbox="showCheckbox" :checked-keys="checkedKeys" :filter-text="filterText" :filter-node-method="filterNodeMethod" :auto-expand-on-filter="autoExpandOnFilter" @select="$emit(\'select\', $event)" @toggle="$emit(\'toggle\', $event)" @check-change="$emit(\'check-change\', $event)"></lvc-tree-node>'," </div>","</div>"].join("\n"),computed:{hasChildren(){return this.node.children&&this.node.children.length>0},nodeIcon(){return this.node.icon||""},isChecked(){return-1!==this.checkedKeys.indexOf(this.node.id)},childCheckedCount(){if(!this.hasChildren)return 0;let e=0;for(let n=0;n<this.node.children.length;n++){const i=this.node.children[n];(-1!==this.checkedKeys.indexOf(i.id)||t(this.checkedKeys,i))&&e++}return e},isIndeterminate(){if(!this.hasChildren)return!1;const e=this.childCheckedCount;return e>0&&e<this.node.children.length},checkboxClass(){return this.isChecked?"checked":this.isIndeterminate?"indeterminate":""},isVisible(){return!this.filterText||!this.filterNodeMethod||!!this.filterNodeMethod(this.filterText,this.node)||!!this.hasChildren&&this._hasVisibleChild(this.node.children)}},methods:{handleClick(){try{this.showCheckbox?this.handleCheck():this.$emit("select",this.node)}catch(e){console.error("[LvcTree] click event error:",e)}},handleToggle(){try{this.expanded=!this.expanded,this.$emit("toggle",{node:this.node,expanded:this.expanded})}catch(e){console.error("[LvcTree] toggle event error:",e)}},handleCheck(){try{let e;e=!this.isIndeterminate&&!this.isChecked;const t=this._collectVisibleDescendantIds(this.node),n=!(this.filterText&&this.filterNodeMethod)||this.filterNodeMethod(this.filterText,this.node)?[this.node.id,...t]:t;this.$emit("check-change",{node:this.node,checked:e,indeterminate:!1,affectedIds:n})}catch(e){console.error("[LvcTree] check event error:",e)}},_collectDescendantIds(e){const t=[];if(e.children&&e.children.length>0)for(let n=0;n<e.children.length;n++){const i=e.children[n];t.push(i.id),t.push(...this._collectDescendantIds(i))}return t},_collectVisibleDescendantIds(e){const t=[];if(!e.children||0===e.children.length)return t;for(let n=0;n<e.children.length;n++){const i=e.children[n];this._isNodeVisible(i)&&((!(this.filterText&&this.filterNodeMethod)||this.filterNodeMethod(this.filterText,i))&&t.push(i.id),t.push(...this._collectVisibleDescendantIds(i)))}return t},_isNodeVisible(e){if(!this.filterText||!this.filterNodeMethod)return!0;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._isNodeVisible(e.children[t]))return!0;return!1},_hasVisibleChild(e){if(!e||0===e.length)return!1;for(let t=0;t<e.length;t++){const n=e[t];if(this.filterNodeMethod(this.filterText,n))return!0;if(n.children&&n.children.length>0&&this._hasVisibleChild(n.children))return!0}return!1},_nodeMatchesFilter(e){if(!this.filterText||!this.filterNodeMethod)return!1;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._nodeMatchesFilter(e.children[t]))return!0;return!1}}}},props:{data:{type:Array,default:()=>[]},selectedId:{type:[String,Number],default:null},defaultExpandAll:{type:Boolean,default:!1},showCheckbox:{type:Boolean,default:!1},defaultCheckedKeys:{type:Array,default:()=>[]},maxCheck:{type:Number,default:0},filterNodeMethod:{type:Function,default:null},autoExpandOnFilter:{type:Boolean,default:!0}},data(){return{checkedKeys:this.defaultCheckedKeys.slice(),filterText:""}},watch:{defaultCheckedKeys:{handler(e){this.checkedKeys=e.slice()},deep:!0},filterText(e){this.$emit("filter-change",e)}},template:['<div class="lvc-tree">',' <lvc-tree-node v-for="node in data" :key="node.id" :node="node" :selected-id="selectedId" :default-expand-all="defaultExpandAll" :show-checkbox="showCheckbox" :checked-keys="checkedKeys" :filter-text="filterText" :filter-node-method="filterNodeMethod" :auto-expand-on-filter="autoExpandOnFilter" :is-root="true" @select="$emit(\'select\', $event)" @toggle="$emit(\'toggle\', $event)" @check-change="onCheckChange"></lvc-tree-node>',' <div v-if="!data || data.length === 0" class="lvc-tree-empty" style="text-align:center;color:#8ab4d4;padding:2vmin 0;font-size:1.2vmin;">暂无数据</div>',"</div>"].join("\n"),methods:{filter(e){this.checkedKeys.length>0&&(this.checkedKeys=[],this.$emit("check-change",{node:null,checked:!1,indeterminate:!1,checkedKeys:[],checkedNodes:[]})),this.filterText=e},onCheckChange(e){try{const t=e.node.id,n=e.checked,i=e.affectedIds||[];if(n)for(let e=0;e<i.length;e++)-1===this.checkedKeys.indexOf(i[e])&&this.checkedKeys.push(i[e]);else for(let e=i.length-1;e>=0;e--){const t=this.checkedKeys.indexOf(i[e]);-1!==t&&this.checkedKeys.splice(t,1)}this._updateAncestors(this.data,t);const s=this._countCheckedLeaves(this.data);if(this.maxCheck>0&&s>this.maxCheck){const e=this._collectLimitedKeys(this.maxCheck);this.checkedKeys=e,this._updateAllAncestors(),this.$emit("max-check-exceeded",{max:this.maxCheck,actual:s})}const l=this._collectCheckedNodesWithAncestors(this.data);this.$emit("check-change",{node:e.node,checked:n,indeterminate:!1,checkedKeys:this.checkedKeys.slice(),checkedNodes:l})}catch(e){console.error("[LvcTree] check-change handler error:",e)}},_updateAncestors(e,t){const n=this._getParentChain(this.data,t);for(let e=0;e<n.length;e++){const t=n[e];let i=!0;for(let e=0;e<t.children.length;e++){const n=t.children[e];if(!this._isNodeFullyChecked(n)){i=!1;break}}if(i&&t.children.length>0)-1===this.checkedKeys.indexOf(t.id)&&this.checkedKeys.push(t.id);else{const e=this.checkedKeys.indexOf(t.id);-1!==e&&this.checkedKeys.splice(e,1)}}},_getParentChain(e,t,n){n=n||[];for(let i=0;i<e.length;i++){const s=e[i];if(s.children&&s.children.length>0){for(let e=0;e<s.children.length;e++)if(s.children[e].id===t)return n.unshift(s),this._getParentChain(this.data,s.id,n),n;const e=this._getParentChain(s.children,t,n);if(e.length>0)return e}}return n},_isNodeFullyChecked(e){if(-1===this.checkedKeys.indexOf(e.id))return!1;if(!e.children||0===e.children.length)return!0;for(let t=0;t<e.children.length;t++)if(!this._isNodeFullyChecked(e.children[t]))return!1;return!0},_isDescendant(e,t){if(!e.children||0===e.children.length)return!1;for(let n=0;n<e.children.length;n++){const i=e.children[n];if(i.id===t)return!0;if(this._isDescendant(i,t))return!0}return!1},getCheckedKeys(){return this.checkedKeys.slice()},setCheckedKeys(e){this.checkedKeys=e.slice()},getHalfCheckedKeys(){const e=[];return this._collectHalfChecked(this.data,e),e},_collectHalfChecked(e,t){for(let n=0;n<e.length;n++){const i=e[n];if(i.children&&i.children.length>0){let e=0;for(let t=0;t<i.children.length;t++)-1!==this.checkedKeys.indexOf(i.children[t].id)&&e++;e>0&&e<i.children.length&&t.push(i.id),this._collectHalfChecked(i.children,t)}}},_isNodeVisible(e){if(!this.filterText||!this.filterNodeMethod)return!0;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._isNodeVisible(e.children[t]))return!0;return!1},_countCheckedLeaves(e){e=e||this.data;let t=0;for(let n=0;n<e.length;n++){const i=e[n];this._isNodeVisible(i)&&(i.children&&i.children.length>0?t+=this._countCheckedLeaves(i.children):-1!==this.checkedKeys.indexOf(i.id)&&t++)}return t},_collectLimitedKeys(e){const t=new Set;let n=0;const i=(s,l)=>{for(let a=0;a<s.length;a++){const o=s[a];if(n>=e)return;if(this._isNodeVisible(o))if(o.children&&o.children.length>0)if(-1!==this.checkedKeys.indexOf(o.id))i(o.children,l.concat(o.id));else for(let t=0;t<o.children.length;t++){if(n>=e)return;const s=o.children[t];(-1!==this.checkedKeys.indexOf(s.id)||this._hasCheckedDescendant(s))&&i([s],l.concat(o.id))}else if(-1!==this.checkedKeys.indexOf(o.id)){n++;for(let e=0;e<l.length;e++)t.add(l[e]);t.add(o.id)}}};return i(this.data,[]),Array.from(t)},_hasCheckedDescendant(e){if(!e.children||0===e.children.length)return!1;for(let t=0;t<e.children.length;t++){const n=e.children[t];if(-1!==this.checkedKeys.indexOf(n.id)||this._hasCheckedDescendant(n))return!0}return!1},_updateAllAncestors(){const e=t=>{for(let n=0;n<t.length;n++){const i=t[n];if(i.children&&i.children.length>0){e(i.children);let t=!0;for(let e=0;e<i.children.length;e++)if(!this._isNodeFullyChecked(i.children[e])){t=!1;break}if(t&&i.children.length>0)-1===this.checkedKeys.indexOf(i.id)&&this.checkedKeys.push(i.id);else{const e=this.checkedKeys.indexOf(i.id);-1!==e&&this.checkedKeys.splice(e,1)}}}};e(this.data)},_collectCheckedNodesWithAncestors(e){const n=[];for(let i=0;i<e.length;i++){const s=e[i];if(-1!==this.checkedKeys.indexOf(s.id))n.push(this._deepCopyNode(s));else if(s.children&&s.children.length>0&&t(this.checkedKeys,s)){const e=this._collectCheckedNodesWithAncestors(s.children);if(e.length>0){const t=Object.assign({},s);t.children=e,n.push(t)}}}return n},_deepCopyNode(e){const t=Object.assign({},e);return e.children&&e.children.length>0?t.children=e.children.map(e=>this._deepCopyNode(e)):t.children=[],t}}};void 0!==o&&(r.LvcTree=n,o.component("lvc-tree",n))}(),function(){n("lvc-dialog-style","\n :root {\n --lvc-primary: #12bbed;\n --lvc-bg-dark: #0b1a2a;\n --lvc-bg-input: #0d2339;\n --lvc-border: #1e4469;\n --lvc-text: #fff;\n --lvc-text-dim: #8cabc4;\n }\n\n .lvc-dialog-mask {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n backdrop-filter: blur(4px);\n }\n\n .lvc-dialog-box {\n background: var(--lvc-bg-dark);\n border: 1px solid var(--lvc-primary);\n border-radius: 1.108vmin;\n box-shadow: 0 1.385vmin 5.54vmin rgba(0, 0, 0, 0.8);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 44.32vmin;\n max-width: 90vw;\n color: var(--lvc-text);\n font-size: 1.9391vmin;\n }\n\n .lvc-dialog-header {\n padding: 2.216vmin 2.77vmin;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid rgba(18, 187, 237, 0.1);\n }\n\n .lvc-dialog-title {\n font-weight: bold;\n color: var(--lvc-primary);\n letter-spacing: 0.138vmin;\n }\n\n .lvc-dialog-close {\n cursor: pointer;\n color: var(--lvc-text-dim);\n font-size: 2.493vmin;\n transition: all 0.3s;\n line-height: 1;\n }\n\n .lvc-dialog-close:hover {\n color: var(--lvc-primary);\n transform: rotate(90deg);\n }\n\n .lvc-dialog-body {\n padding: 2.77vmin;\n min-height: 11.08vmin;\n max-height: 70vh;\n overflow-y: auto;\n line-height: 1.6;\n }\n\n .lvc-dialog-footer {\n padding: 1.662vmin 2.77vmin;\n display: flex;\n justify-content: flex-end;\n gap: 1.662vmin;\n background: rgba(18, 187, 237, 0.03);\n }\n\n .lvc-dialog-btn {\n padding: 0.831vmin 2.216vmin;\n font-size: 1.662vmin;\n border-radius: 0.554vmin;\n cursor: pointer;\n transition: all 0.3s;\n border: 1px solid var(--lvc-border);\n background: transparent;\n color: var(--lvc-text-dim);\n }\n\n .lvc-dialog-btn:hover {\n border-color: var(--lvc-primary);\n color: var(--lvc-text);\n box-shadow: 0 0 1.108vmin rgba(18, 187, 237, 0.2);\n }\n\n .lvc-dialog-btn-primary {\n background: var(--lvc-primary);\n border-color: var(--lvc-primary);\n color: #fff;\n }\n\n .lvc-dialog-btn-primary:hover {\n background: #15d2ff;\n box-shadow: 0 0 1.662vmin rgba(18, 187, 237, 0.4);\n }\n\n /* 动画 */\n .lvc-dialog-fade-enter-active, .lvc-dialog-fade-leave-active {\n transition: opacity 0.3s;\n }\n .lvc-dialog-fade-enter, .lvc-dialog-fade-leave-to {\n opacity: 0;\n }\n\n .lvc-dialog-zoom-enter-active, .lvc-dialog-zoom-leave-active {\n transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n .lvc-dialog-zoom-enter, .lvc-dialog-zoom-leave-to {\n transform: scale(0.9) translateY(-2.77vmin);\n }\n ");const e={name:"lvcDialog",props:{visible:{type:Boolean,default:!1},title:{type:String,default:"提示"},content:{type:String,default:""},width:{type:String,default:"44.32vmin"},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},showCancel:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},showFooter:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0}},template:'\n <transition name="lvc-dialog-fade">\n <div v-if="visible" class="lvc-dialog-mask" @click.self="handleMaskClick">\n <transition name="lvc-dialog-zoom">\n <div v-if="visible" class="lvc-dialog-box" :style="{ width: width }">\n <div class="lvc-dialog-header">\n <span class="lvc-dialog-title">{{ title }}</span>\n <span v-if="showClose" class="lvc-dialog-close" @click="close">×</span>\n </div>\n <div class="lvc-dialog-body">\n <slot>{{ content }}</slot>\n </div>\n <div class="lvc-dialog-footer" v-if="showFooter">\n <button v-if="showCancel" class="lvc-dialog-btn" @click="handleCancel">{{ cancelText }}</button>\n <button class="lvc-dialog-btn lvc-dialog-btn-primary" @click="handleConfirm">{{ confirmText }}</button>\n </div>\n </div>\n </transition>\n </div>\n </transition>\n',methods:{close(){this.$emit("update:visible",!1),this.$emit("close")},handleCancel(){this.$emit("cancel"),this.close()},handleConfirm(){this.$emit("confirm")},handleMaskClick(){this.closeOnClickModal&&this.close()}}};o.component("lvc-dialog",e),window.lvcDialog={show(e={}){const t=document.createElement("div");return document.body.appendChild(t),new(s())({el:t,data:()=>({visible:!1,...e}),template:'\n <lvc-dialog \n :visible.sync="visible"\n v-bind="$data"\n @confirm="onConfirmAction"\n @cancel="onCancelAction"\n @close="destroy">\n </lvc-dialog>\n ',methods:{async onConfirmAction(){e.onConfirm&&!1===await e.onConfirm()||(this.visible=!1)},onCancelAction(){e.onCancel&&e.onCancel()},destroy(){setTimeout(()=>{this.$destroy(),this.$el.parentNode&&this.$el.parentNode.removeChild(this.$el)},500)}},mounted(){this.visible=!0}})}},r.lvcDialog=e}(),"undefined"!=typeof window&&window.Vue&&d(window.Vue);var h="undefined"!=typeof window?window:{};e.install=d,e.CanvasTopologyUtils=class{constructor(e,t,n=1280){this.canvas=document.getElementById(e),this.container=document.querySelector(t),this.ctx=this.canvas.getContext("2d"),this.baseWidth=n,this.scale=1,this.imgCache={},this.dpr=window.devicePixelRatio||1,this.init()}init(){const e=this.container.clientWidth,t=this.container.clientHeight;this.scale=Math.max(.5,e/this.baseWidth),this.canvas.width=e*this.dpr,this.canvas.height=t*this.dpr,this.canvas.style.width=e+"px",this.canvas.style.height=t+"px",this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(this.dpr,this.dpr)}s(e){return e*this.scale}clear(){this.ctx.clearRect(0,0,this.canvas.width/this.dpr,this.canvas.height/this.dpr)}_buildPath(e){const t=this.ctx;if(e&&0!==e.length){t.beginPath(),t.moveTo(this.s(e[0][0]),this.s(e[0][1]));for(let n=1;n<e.length;n++){const i=e[n];2===i.length?t.lineTo(this.s(i[0]),this.s(i[1])):4===i.length?t.quadraticCurveTo(this.s(i[0]),this.s(i[1]),this.s(i[2]),this.s(i[3])):6===i.length&&t.bezierCurveTo(this.s(i[0]),this.s(i[1]),this.s(i[2]),this.s(i[3]),this.s(i[4]),this.s(i[5]))}}}drawDashLine(e,t={}){const{color:n="rgba(255,255,255,0.2)",width:i=2,dash:s=[4,4]}=t,l=this.ctx;l.save(),this._buildPath(e),l.setLineDash(s.map(e=>this.s(e))),l.lineWidth=this.s(i),l.strokeStyle=n,l.stroke(),l.restore()}drawFlowLine(e,t={}){const{color:n="#00e5ff",width:i=2,dash:s=[10,20],offset:l=0,shadowBlur:a=8,shadowColor:o="#00e5ff"}=t,r=this.ctx;r.save(),this._buildPath(e),r.setLineDash(s.map(e=>this.s(e))),r.lineDashOffset=-this.s(l),r.lineWidth=this.s(i),r.strokeStyle=n,r.shadowBlur=this.s(a),r.shadowColor=o,r.stroke(),r.restore()}drawImage(e,t,n,i,s,l=!0){this.imgCache[e]||(this.imgCache[e]=new Image,this.imgCache[e].src=e);const a=this.imgCache[e];if(a.complete){const e=this.s(i),o=this.s(s),r=l?this.s(t)-e/2:this.s(t),c=l?this.s(n)-o/2:this.s(n);this.ctx.drawImage(a,r,c,e,o)}}drawText(e,t,n,i={}){const{fontSize:s=12,color:l="#fff",align:a="center",baseline:o="top",fontWeight:r="normal"}=i,c=this.ctx;c.save(),c.font=`${r} ${Math.round(this.s(s))}px "PingFang SC", "Microsoft YaHei", Arial`,c.fillStyle=l,c.textAlign=a,c.textBaseline=o,c.fillText(e,this.s(t),this.s(n)),c.restore()}drawNodeImgText(e){const{url:t,x:n,y:i,w:s,h:l,text:a,fontSize:o=12,textColor:r="#fff",gap:c=5}=e;if(this.drawImage(t,n,i,s,l,!0),a){const e=i+l/2+c;this.drawText(a,n,e,{fontSize:o,color:r})}}drawCircle(e,t,n,i={}){const{fillStyle:s,strokeStyle:l,lineWidth:a=2,shadowBlur:o=0,shadowColor:r="transparent"}=i,c=this.ctx;c.save(),c.beginPath(),c.arc(this.s(e),this.s(t),this.s(n),0,2*Math.PI),o>0&&(c.shadowBlur=this.s(o),c.shadowColor=r),s&&(c.fillStyle=s,c.fill()),l&&(c.lineWidth=this.s(a),c.strokeStyle=l,c.stroke()),c.restore()}drawPolygon(e,t={}){const{fillStyle:n,strokeStyle:i,lineWidth:s=2}=t;if(!e||e.length<2)return;const l=this.ctx;l.save(),l.beginPath(),l.moveTo(this.s(e[0][0]),this.s(e[0][1]));for(let t=1;t<e.length;t++)l.lineTo(this.s(e[t][0]),this.s(e[t][1]));l.closePath(),n&&(l.fillStyle=n,l.fill()),i&&(l.lineWidth=this.s(s),l.strokeStyle=i,l.stroke()),l.restore()}drawNode(e,t,n,i,s,l=!1,a=15,o=12){const r=this.ctx,c=this.s(e),d=this.s(t),h=this.s(n),p=this.s(a);r.save(),r.shadowBlur=this.s(15),r.shadowColor=i,r.beginPath(),r.arc(c,d,h,0,2*Math.PI),r.fillStyle="#26455C",r.fill(),r.strokeStyle=i,r.lineWidth=this.s(2),r.stroke(),r.shadowBlur=0,r.beginPath(),r.arc(c,d,.6*h,0,2*Math.PI),r.fillStyle=i,r.fill(),r.textAlign="center",r.textBaseline="middle",r.textAlign="center",r.textBaseline="middle";const m=l?this.s(o):this.s(o+2);if(r.font=`${m}px sans-serif`,l&&s.includes("\n")){const e=s.split("\n");r.fillStyle="#fff",r.fillText(e[0],c,d+h+p),r.fillStyle=i,r.font=`bold ${m+1}px sans-serif`,r.fillText(e[1],c,d+h+2*p)}else r.fillStyle="#fff",r.fillText(s,c,d-h-p);r.restore()}drawFlowCurve(e,t,n){const i=this.ctx,s=Math.atan2(t.y-e.y,t.x-e.x),l=this.s(e.x+Math.cos(s)*e.r),a=this.s(e.y+Math.sin(s)*e.r),o=this.s(t.x-Math.cos(s)*t.r),r=this.s(t.y-Math.sin(s)*t.r),c={x:(l+o)/2,y:(a+r)/2-this.s(10)};i.save(),i.beginPath(),i.moveTo(l,a),i.quadraticCurveTo(c.x,c.y,o,r),i.strokeStyle="#26455C",i.lineWidth=this.s(2),i.stroke(),i.setLineDash([this.s(8),this.s(8)]),i.lineDashOffset=-this.s(n),i.strokeStyle="rgba(0, 243, 255, 1)",i.stroke(),i.restore()}},e.px2EchartsUrils=c,e.createFetch=function(e={}){const t={baseURL:"",headers:{"Content-Type":"application/json"},timeout:1e4,retries:1,retryDelay:500,cache:0,credentials:"same-origin",responseType:"json",mock:!1,concurrency:1/0,dedupe:!0,debounce:200,getToken:()=>localStorage.getItem("emstoken"),refreshToken:async()=>{const e=await fetch("/auth/refresh",{method:"POST",credentials:"same-origin"});if(!e.ok)throw new Error("refresh failed");const t=await e.json();return localStorage.setItem("emstoken",t.token),t.token},onRefreshFail:()=>{localStorage.removeItem("emstoken"),window.location="/login"},onError:e=>{console.error("API ERROR:",e)},showLog:!1,...e},n=new Map,i=new Map,s=new Map;let l=0;const a=[];let o=0;const r=new Set,c={request:{handlers:[]},response:{handlers:[]}},d=new Set;function h(e){r.forEach(t=>{try{t(e)}catch(e){console.error(e)}})}function p(e){return r.add(e),()=>r.delete(e)}function m(e,t,n,i){let s=`${e.toUpperCase()} ${t}`;return n&&(s+="?"+new URLSearchParams(n).toString()),i&&"string"!=typeof i?s+=" body:"+JSON.stringify(i):i&&(s+=" body:"+i),s}function v(e={}){const{method:r="GET",url:d="",params:p=null,body:v=null,headers:u={},debounce:f=t.debounce}=e,g=function(e,t){return e?/^https?:\/\//.test(t)?t:e.replace(/\/+$/,"")+"/"+String(t).replace(/^\/+/,""):t}(t.baseURL,d),b={...e,method:r.toUpperCase(),url:g,headers:{...t.headers||{},...u||{}}};let y=Promise.resolve(b);return c.request.handlers.forEach(({fulfilled:e,rejected:t})=>{y=y.then(t=>e?e(t):t,t)}),y=y.then(e=>{const r=t.getToken?.();r&&!e.headers.Authorization&&(e.headers.Authorization="Bearer "+r);const c=()=>{return s=()=>async function(e){const{url:s,method:l="GET",params:a,body:o,headers:r={},timeout:c=t.timeout,retries:d=t.retries,retryDelay:h=t.retryDelay,cache:p=t.cache,responseType:v=t.responseType,mock:u=t.mock,dedupe:f=t.dedupe}=e;if(u)return"function"==typeof u?await u(e):u;let g=s;if(a){const e=new URLSearchParams(a).toString();g+=(g.includes("?")?"&":"?")+e}const b=m(l,g,null,o);if(f&&n.has(b))return n.get(b);if("GET"===l&&p>0&&i.has(b)){const e=i.get(b);if(Date.now()<e.expiry)return e.data;i.delete(b)}const y=new AbortController,w=y.signal;let k;c>0&&(k=setTimeout(()=>y.abort(),c));let x=0;const E=async()=>{x++;try{const n={method:l,headers:r,credentials:t.credentials,signal:w};null!=o&&(o instanceof FormData||o instanceof Blob?n.body=o:"object"==typeof o&&r["Content-Type"]?.includes("application/json")?n.body=JSON.stringify(o):n.body=o);const s=await fetch(g,n);if(!s.ok){const t=new Error(`HTTP ${s.status}`);throw t.status=s.status,t.config=e,t}let a;return a="json"===v?await s.json():"text"===v?await s.text():"blob"===v?await s.blob():await s.text(),"GET"===l&&p>0&&i.set(b,{data:a,expiry:Date.now()+p}),a}catch(e){if(x<=d)return await new Promise(e=>setTimeout(e,h*x)),E();throw e}finally{k&&clearTimeout(k)}},S=E();return f&&n.set(b,S),S.finally(()=>n.delete(b)),S}(e),new Promise((e,n)=>{const i=()=>{l++,o++,h(o),s().then(e).catch(n).finally(()=>{l--,o=Math.max(0,o-1),h(o),a.length>0&&l<t.concurrency&&a.shift()()})};l<t.concurrency?i():a.push(i)});var s};if(f>0){const t=m(e.method,e.url,e.params,e.body);return s.has(t)&&clearTimeout(s.get(t)),new Promise((e,n)=>{const i=setTimeout(()=>{s.delete(t),c().then(e).catch(n)},f);s.set(t,i)})}return c()}),y.catch(e=>(t.onError?.(e),Promise.reject(e)))}function u(e,t={}){return v({method:"GET",url:e,...t})}function f(e,t,n={}){return v({method:"POST",url:e,body:t,...n})}return{request:v,get:u,post:f,put:function(e,t,n={}){return v({method:"PUT",url:e,body:t,...n})},delete:function(e,t={}){return v({method:"DELETE",url:e,...t})},poll:function(e,t={},n={}){const{method:i="GET",interval:s=5e3,immediate:l=!0,jitter:a=1e3,backoff:o=!0,maxInterval:r=6e4,requestOptions:c={},callback:h=null,errorCallback:p=null,stateful:m=!1,state:v=null}=n;let g=null,b=!1,y=!1,w=!1,k=s;const x=new Map;function E(e,t){x.has(e)&&x.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`Event handler error for ${e}:`,t)}})}const S=async()=>{if(!(b||y||w)){w=!0;try{let n;m&&v&&(v.loading=!0),n="POST"===i?await f(e,t,c):await u(e,{params:t,...c}),k=s,m&&v&&(v.data=n,v.error=null,v.loading=!1),h&&"function"==typeof h&&h(n),E("data",n)}catch(e){m&&v&&(v.error=e,v.loading=!1),p&&"function"==typeof p&&p(e),E("error",e),o&&(k=Math.min(2*k,r))}finally{if(w=!1,!b&&!y){const e=k+(a?Math.random()*a:0);g=setTimeout(S,e)}}}},P=()=>{b=!1,y=!1,l?S():g=setTimeout(S,s)},C={start:P,pause:()=>{y=!0,clearTimeout(g)},resume:()=>{y&&(y=!1,S())},stop:()=>{b=!0,y=!1,clearTimeout(g),d.delete(C),x.clear()},on:function(e,t){return x.has(e)||x.set(e,[]),x.get(e).push(t),()=>{const n=x.get(e),i=n.indexOf(t);i>-1&&n.splice(i,1)}},emit:E,get data(){return v?.data??null},get loading(){return v?.loading??!1},get error(){return v?.error??null}};return d.add(C),P(),C},stopAllPoll:function(){d.forEach(e=>e.stop()),d.clear()},createCancelToken:function(){const e=new AbortController;return{signal:e.signal,cancel:()=>e.abort()}},onLoading:function(e){return p(e)},subscribeLoading:p,interceptors:c,setToken:function(e){null==e?localStorage.removeItem("emstoken"):localStorage.setItem("emstoken",e)},_internal:{pending:n,cacheMap:i}}},e.createRouter=function(e={}){return{vm:null,routes:e.routes||{},default:e.default||"",beforeHooks:[],current:"",parent:e.parent||"",level:e.level||1,isResolving:!1,errorPage:e.errorPage||(1===e.level?"./#/404":"../../#/404"),loginPage:e.loginPage||(1===e.level?"./#/login":"../../#/login"),init(e){this.vm=e;const n=t();void 0===n.__isGoLogin__&&(n.__isGoLogin__=!1),this.beforeEach((e,t,i)=>{const s=localStorage.getItem("tianshui-token");if(e.meta?.requiresAuth)if(s)i();else{if(n.__isGoLogin__)return void i(!1);n.__isGoLogin__=!0,i(!1),n.alert("该页面需要登录,请前往登录页"),n.location.replace("./#/login")}else i()}),this._listener=()=>this.resolve();const i=n;i.addEventListener("hashchange",this._listener),window.addEventListener("beforeunload",()=>{i.removeEventListener("hashchange",this._listener)}),this.resolve()},getRouteConfig(e){const t=this.routes[e];return t?"string"==typeof t?{path:t,meta:{}}:{path:t.path,meta:t.meta||{}}:null},resolve(){if(this.isResolving)return;this.isResolving=!0;const e=t(),n=(e.location.hash||"").replace(/^#\/?/,"").split("/").filter(Boolean);if(this.parent&&n[0]!==this.parent)return void(this.isResolving=!1);let i=n[this.level-1];if(!i&&this.default){i=this.default,n[this.level-1]=i;const t="/"+n.join("/");if(e.location.hash.replace(/^#\/?/,"")!==t.replace(/^\//,""))return e.location.hash=t,void(this.isResolving=!1)}const s=this.getRouteConfig(i);if(!s){if(i){if("login"===i||"login.html"===i)return console.warn(`[Router] login: 层级 ${this.level} 路由 ${i}`),e.location.replace(this.loginPage),void(this.isResolving=!1);console.warn(`[Router] 404: 层级 ${this.level} 找不到路由 ${i}`),e.location.replace(this.errorPage)}return void(this.isResolving=!1)}if(this.current===i)return void(this.isResolving=!1);const l=this.current;this.runBeforeHooks({name:i,meta:s.meta},l,t=>{this.isResolving=!1,!1!==t?"string"!=typeof t?(this.current=i,this.vm&&(this.vm.navPath=s.path,this.vm.activeMenu=i)):this.push(t):l?this.push(l):e.__isGoLogin__||e.location.replace(this.loginPage)})},push(e){const n=t();let i=(n.location.hash||"").replace(/^#\/?/,"").split("/").filter(Boolean);i[this.level-1]=e,i=i.slice(0,this.level),n.location.hash="/"+i.join("/")},beforeEach(e){this.beforeHooks.push(e)},runBeforeHooks(e,t,n){let i=0;const s=l=>{!1!==l&&"string"!=typeof l?i>=this.beforeHooks.length?n():(0,this.beforeHooks[i++])(e,t,s):n(l)};s()}}},e.SocketClient=class{constructor(e,t={}){this.url=e,this.options={heartbeatInterval:3e4,reconnectInterval:5e3,maxReconnectAttempts:5,pingMessage:"ping",...t},this.socket=null,this.reconnectAttempts=0,this.isManualClose=!1,this.messageQueue=[],this.listeners=new Map,this.heartbeatTimer=null,this.serverTimeoutTimer=null,this.connect()}connect(){if(!this.socket||this.socket.readyState!==WebSocket.OPEN&&this.socket.readyState!==WebSocket.CONNECTING)try{this.socket=new WebSocket(this.url),this.initEvents()}catch(e){console.error("WebSocket 建立失败:",e),this.reconnect()}}initEvents(){this.socket.onopen=e=>{console.log("WebSocket 连接成功"),this.reconnectAttempts=0,this.isManualClose=!1,this.startHeartbeat(),this.flushQueue(),this.emit("open",e)},this.socket.onmessage=e=>{this.resetHeartbeat();let t=e.data;try{t=JSON.parse(e.data)}catch(e){}const n=t.topic||t.type;n&&this.emit(n,t),this.emit("message",t)},this.socket.onclose=e=>{this.stopHeartbeat(),this.emit("close",e),this.isManualClose||this.reconnect()},this.socket.onerror=e=>{console.error("WebSocket 异常"),this.emit("error",e)}}send(e){const t="object"==typeof e?JSON.stringify(e):e;this.socket&&this.socket.readyState===WebSocket.OPEN?this.socket.send(t):(console.warn("WebSocket 未连接,消息已进入队列"),this.messageQueue.push(t))}flushQueue(){for(;this.messageQueue.length>0&&this.socket.readyState===WebSocket.OPEN;){const e=this.messageQueue.shift();this.socket.send(e)}}reconnect(){if(-1!==this.options.maxReconnectAttempts&&this.reconnectAttempts>=this.options.maxReconnectAttempts)return void console.error("WebSocket 重连次数达到上限");this.reconnectAttempts++,console.log(`WebSocket 正在尝试第 ${this.reconnectAttempts} 次重连...`);let e=this.options.reconnectInterval*Math.pow(1.5,this.reconnectAttempts-1);e=Math.min(e,6e4),setTimeout(()=>{this.connect()},e)}startHeartbeat(){this.heartbeatTimer=setInterval(()=>{this.send(this.options.pingMessage),this.serverTimeoutTimer=setTimeout(()=>{console.warn("WebSocket 心跳超时,主动断开重连"),this.socket.close()},this.options.heartbeatInterval/2)},this.options.heartbeatInterval)}resetHeartbeat(){clearTimeout(this.serverTimeoutTimer)}stopHeartbeat(){clearInterval(this.heartbeatTimer),clearTimeout(this.serverTimeoutTimer)}close(){this.isManualClose=!0,this.stopHeartbeat(),this.socket&&this.socket.close()}on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){if(!this.listeners.has(e))return;if(!t)return void this.listeners.delete(e);const n=this.listeners.get(e),i=n.indexOf(t);-1!==i&&n.splice(i,1),0===n.length&&this.listeners.delete(e)}emit(e,t){const n=this.listeners.get(e);n&&n.forEach(e=>e(t))}},e.Bus=h.$Bus,e.LvcLoading=h.LvcLoading,e.LvcMessage=h.LvcMessage,e.lvcDialog=h.lvcDialog,e.lvcButton=r.lvcButton,e.lvcSelect=r.lvcSelect,e.lvcTable=r.lvcTable,e.lvcDatePicker=r.lvcDatePicker,e.lvcYearPicker=r.lvcYearPicker,e.lvcMonthPicker=r.lvcMonthPicker,e.lvcDialogComponent=r.lvcDialog,e.LvcTree=r.LvcTree,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
21
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).LvcUI={})}(this,function(e){"use strict";function t(){try{if(window.top&&window.top.location.origin===window.location.origin)return window.top}catch(e){}return window}function n(e,t){if("undefined"!=typeof document&&!document.getElementById(e)){var n=document.createElement("style");n.id=e,n.textContent=t,document.head.appendChild(n)}}var i=null;function s(){if(i)return i;if("undefined"!=typeof window&&window.Vue)return window.Vue;throw new Error("[LvcUI] Vue 未找到, 请先引入 Vue 2.x 或调用 Vue.use(LvcUI)")}var l=[];function o(e){return new(s())(e)}o.component=function(e,t){l.push({name:e,def:t})},o.prototype={};var a=o,r={},c={px2Echarts(e,t=1280,n=800,i=!0){if("undefined"==typeof window)return e;if(i&&1===Math.abs(e))return 1;const s=window.innerWidth,l=window.innerHeight,o=Math.min(s,l),a=Math.min(t,n);return parseFloat((e*(o/a)).toFixed(2))}};function d(e){if(!i){i=e;for(var t=0;t<l.length;t++){var n=l[t];e.component(n.name,n.def)}for(var s=Object.keys(o.prototype),a=0;a<s.length;a++)e.prototype[s[a]]=o.prototype[s[a]]}}!function(e){const n=t();if(n.__BUS__)return void(e.$Bus=n.__BUS__);const i={},s={},l=Math.random().toString(36).slice(2),o="lvc-bus",a="BroadcastChannel"in e?new BroadcastChannel(o):null;function r(e,t,n){(i[e]||[]).forEach(e=>{try{e(t,n)}catch(e){}})}function c(t){if(e===n){r(t.event,t.data);for(let e=0;e<n.frames.length;e++)try{n.frames[e].postMessage(t,"*")}catch{}}else n.postMessage(t,"*")}const d={on(e,t){(i[e]||(i[e]=[])).push(t)},off(e,t){t?i[e]=(i[e]||[]).filter(e=>e!==t):delete i[e]},once(e,t){const n=i=>{t(i),d.off(e,n)};d.on(e,n)},emit(e,t){const n={__bus:1,event:e,data:t,tab:l};r(e,t),a&&a.postMessage(n);try{localStorage.setItem(o,JSON.stringify({...n,t:Date.now()}))}catch{}c(n)},request(e,t,n=5e3){const i=Date.now()+Math.random();return new Promise((l,o)=>{s[i]=l,d.emit("__bus_req__",{id:i,event:e,data:t}),setTimeout(()=>{s[i]&&(delete s[i],o("timeout"))},n)})}};d.on("__bus_req__",async({id:e,event:t,data:n})=>{const s=i[t]?.[0];if(!s)return;const l=await s(n);d.emit("__bus_res__",{id:e,res:l})}),d.on("__bus_res__",({id:e,res:t})=>{const n=s[e];n&&(n(t),delete s[e])}),a&&(a.onmessage=e=>{const t=e.data;t&&t.__bus&&t.tab!==l&&r(t.event,t.data)}),e.addEventListener("storage",e=>{if(e.key!==o)return;const t=JSON.parse(e.newValue||"{}");t.__bus&&t.tab!==l&&r(t.event,t.data)}),e.addEventListener("message",t=>{const i=t.data;i&&i.__bus&&(e===n&&c(i),r(i.event,i.data))}),n.__BUS__=d,e.$Bus=d}("undefined"!=typeof window?window:this),function(){n("lvc-loading-style",'.lvc-loading-mask{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(6,23,39,0.8);backdrop-filter:blur(2px);z-index:9999998;display:flex;flex-direction:column;align-items:center;justify-content:center;opacity:0;transition:opacity 0.3s ease-in-out;user-select:none;}.lvc-loading-mask.is-visible{opacity:1;}.lvc-loading-spinner{position:relative;width:6vmin;height:6vmin;margin-bottom:2vmin;}.lvc-loading-spinner::before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:50%;border:0.3vmin solid transparent;border-top-color:#12bbed;border-bottom-color:#12bbed;animation:lvc-spin 1.5s cubic-bezier(0.68,-0.55,0.265,1.55) infinite;}.lvc-loading-spinner::after{content:"";position:absolute;top:1vmin;left:1vmin;right:1vmin;bottom:1vmin;border-radius:50%;border:0.3vmin solid transparent;border-left-color:#7dd3fc;border-right-color:#7dd3fc;animation:lvc-spin-reverse 1s linear infinite;}.lvc-loading-text{color:#12bbed;font-size:1.6vmin;letter-spacing:0.2vmin;font-weight:bold;text-shadow:0 0 0.5vmin rgba(18,187,237,0.5);animation:lvc-pulse 2s ease-in-out infinite;}@keyframes lvc-spin{0%{transform:rotate(0deg);}100%{transform:rotate(360deg);}}@keyframes lvc-spin-reverse{0%{transform:rotate(0deg);}100%{transform:rotate(-360deg);}}@keyframes lvc-pulse{0%,100%{opacity:0.6;}50%{opacity:1;}}');let e=null;const t={show(t={}){"string"==typeof t&&(t={text:t});const n=t.text||"加载中...";if(e)return e.setText(n),e;const i=document.createElement("div");i.className="lvc-loading-mask";const s=document.createElement("div");s.className="lvc-loading-spinner";const l=document.createElement("div");return l.className="lvc-loading-text",l.textContent=n,i.appendChild(s),i.appendChild(l),document.body.appendChild(i),requestAnimationFrame(()=>{i.classList.add("is-visible")}),e={setText(e){l.textContent=e},close(){if(!i.parentNode)return;i.classList.remove("is-visible");const t=()=>{i.parentNode&&i.parentNode.removeChild(i),i.removeEventListener("transitionend",t),e=null};i.addEventListener("transitionend",t),setTimeout(()=>{i.parentNode&&(i.parentNode.removeChild(i),e=null)},400)}},e},close(){e&&e.close()}};window.LvcLoading=t,void 0!==a&&(a.prototype.$lvcLoading=t)}(),function(){n("lvc-message-style",".lvc-message-container{position:fixed;top:3vmin;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:1.5vmin;z-index:9999999;pointer-events:none;}.lvc-message{display:flex;align-items:center;gap:1vmin;padding:1vmin 2.5vmin;border-radius:0.5vmin;text-align:center;font-size:1.6vmin;color:#e0f2fe;background:#0d2339;border:1px solid #1e4469;box-shadow:0 0.5vmin 1.5vmin rgba(0,0,0,0.5);pointer-events:auto;transition:all 0.3s ease-in-out;transform:translateY(0);opacity:1;user-select:none;}.lvc-message--info{border-color:#12bbed;}.lvc-message--success{border-color:#10b981;color:#10b981;}.lvc-message--warning{border-color:#f59e0b;color:#f59e0b;}.lvc-message--error{border-color:#ef4444;color:#ef4444;}.lvc-message-icon{font-size:1.6vmin;display:inline-block;}.lvc-message-text{color:#e0f2fe;font-weight:500;}.lvc-message-enter,.lvc-message-leave{opacity:0;transform:translateY(-2vmin);}");let e=null;const t=function(t){"string"==typeof t&&(t={message:t});const n=t.type||"info",i=t.message||"",s=void 0!==t.duration?t.duration:2e3;e||(e=document.createElement("div"),e.className="lvc-message-container",document.body.appendChild(e));const l=document.createElement("div");l.innerHTML=`\n <span class="lvc-message-icon">${{info:"ℹ",success:"✔",warning:"⚠",error:"✖"}[n]}</span>\n <span class="lvc-message-text">${i}</span>\n `,l.className=`lvc-message lvc-message--${n} lvc-message-enter`,e.appendChild(l),requestAnimationFrame(()=>{l.classList.remove("lvc-message-enter")}),s>0&&setTimeout(()=>{l.classList.add("lvc-message-leave");const e=()=>{l.parentNode&&l.parentNode.removeChild(l),l.removeEventListener("transitionend",e)};l.addEventListener("transitionend",e),setTimeout(()=>{l.parentNode&&l.parentNode.removeChild(l)},400)},s)};["success","warning","info","error"].forEach(e=>{t[e]=n=>("string"==typeof n&&(n={message:n}),n.type=e,t(n))}),window.LvcMessage=t,void 0!==a&&(a.prototype.$lvcMessage=t)}(),function(){n("lvc-button-style",".lvc-button{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;cursor:pointer;background:rgba(30,68,105,0.4);border:1px solid #1e4469;color:#fff;text-align:center;box-sizing:border-box;outline:none;margin:0;transition:0.1s;font-weight:500;padding:1.2vmin 2.5vmin;font-size:1.4vmin;border-radius:0.4vmin;user-select:none;vertical-align:middle;gap:0.7vmin;line-height:1;}.lvc-button--primary{background-color:rgba(18,187,237,0.8);border-color:#12bbed;color:#fff;}.lvc-button--success{background-color:rgba(103,194,58,0.8);border-color:#67c23a;color:#fff;}.lvc-button--warning{background-color:rgba(230,162,60,0.8);border-color:#e6a23c;color:#fff;}.lvc-button--danger{background-color:rgba(245,108,108,0.8);border-color:#f56c6c;color:#fff;}.lvc-button--info{background-color:rgba(144,147,153,0.8);border-color:#909399;color:#fff;}.lvc-button--primary:hover{background-color:rgba(18,187,237,1);}.lvc-button--success:hover{background-color:rgba(103,194,58,1);}.lvc-button--warning:hover{background-color:rgba(230,162,60,1);}.lvc-button--danger:hover{background-color:rgba(245,108,108,1);}.lvc-button--info:hover{background-color:rgba(144,147,153,1);}.lvc-button.is-plain{background:transparent;}.lvc-button--primary.is-plain{color:#12bbed;background:rgba(18,187,237,0.1);}.lvc-button--success.is-plain{color:#67c23a;background:rgba(103,194,58,0.1);}.lvc-button--danger.is-plain{color:#f56c6c;background:rgba(245,108,108,0.1);}.lvc-button.is-round{border-radius:2.5vmin;}.lvc-button.is-circle{border-radius:50%;padding:1.2vmin;}.lvc-button.is-disabled{cursor:not-allowed;opacity:0.5;background-image:none;}.lvc-button .lvc-icon-loading{margin-right:0.8vmin;display:inline-block;width:1.4vmin;height:1.4vmin;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:lvc-rotate 1s linear infinite;}@keyframes lvc-rotate{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}");const e={name:"lvcButton",props:{type:{type:String,default:"default"},plain:{type:Boolean,default:!1},round:{type:Boolean,default:!1},circle:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},icon:{type:String,default:""}},methods:{handleClick(e){this.disabled||this.loading||this.$emit("click",e)}},template:'\n <button\n class="lvc-button"\n :disabled="disabled || loading"\n :class="[\n \'lvc-button--\' + type,\n {\n \'is-plain\': plain,\n \'is-round\': round,\n \'is-circle\': circle,\n \'is-disabled\': disabled || loading\n }\n ]"\n @click="handleClick"\n >\n <i v-if="loading" class="lvc-icon-loading"></i>\n <i v-if="icon && !loading" :class="icon"></i>\n <span v-if="$slots.default"><slot></slot></span>\n </button>\n '};a.component("lvc-button",e),r.lvcButton=e}(),n("lvc-switch-style",".lvc-switch{position:relative;display:inline-block;transition:0.3s;}.lvc-switch.is-disabled{opacity:0.6;}.lvc-dot{position:absolute;border-radius:50%;transition:0.3s;}"),a.component("lvc-switch",{name:"lvcSwitch",template:'\n <div\n class="lvc-switch"\n :class="{ \'is-disabled\': disabled }"\n :style="switchStyle"\n @click="toggle"\n >\n <div class="lvc-dot" :style="dotStyle"></div>\n </div>\n ',props:{value:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},width:{type:Number,default:34},height:{type:Number,default:18},activeColor:{type:String,default:"#42A3D6"},inactiveColor:{type:String,default:"#395E7C"},dotColor:{type:String,default:"#ffffff"}},computed:{dotSize(){return this.height-4},switchStyle(){return{width:this.width+"px",height:this.height+"px",borderRadius:this.height/2+"px",background:this.value?this.activeColor:this.inactiveColor,position:"relative",cursor:this.disabled?"not-allowed":"pointer",transition:"0.3s"}},dotStyle(){const e=this.value?this.width-this.height+2:2;return{width:this.dotSize+"px",height:this.dotSize+"px",background:this.dotColor,borderRadius:"50%",position:"absolute",top:"2px",left:e+"px",transition:"0.3s"}}},methods:{toggle(){this.disabled||(this.$emit("input",!this.value),this.$emit("change",!this.value))}}}),n("lvc-odometer-style",".lvc-odometer{display:inline-flex;align-items:center;height:fit-content;overflow:hidden;gap:0.2em;}"),a.component("lvc-odometer",{name:"lvc-odometer",props:{value:{type:Number,default:0},duration:{type:Number,default:1e3},maxAnimations:{type:Number,default:1/0},unit:{type:String,default:""},unitSize:{type:String,default:"inherit"},unitPosition:{type:String,default:"right"}},data:()=>({od:null}),mounted(){this.od=new Odometer({el:this.$refs.odo,value:this.value,duration:this.duration,maxAnimations:this.maxAnimations})},watch:{value(e){this.od&&this.od.update(e)}},template:'\n <div class="lvc-odometer">\n <slot name="unit-left">\n <span \n v-if="unit && unitPosition===\'left\'" \n class="odometer-unit odometer-unit-left"\n :style="{fontSize: unitSize}"\n >\n {{unit}}\n </span>\n </slot>\n\n <span \n class="odometer-value"\n ref="odo">\n </span>\n\n <slot name="unit-right">\n <span \n v-if="unit && unitPosition===\'right\'" \n class="odometer-unit"\n :style="{fontSize: unitSize}"\n >\n {{unit}}\n </span>\n </slot>\n\n </div>\n '}),n("lvc-load-more-style",'.lvc-load-more{display:flex;justify-content:center;align-items:center;padding:2vmin 0;width:100%;min-height:7.5vmin;color:#fff;font-size:1.8vmin;user-select:none;height:7.5vmin;}.lvc-load-more-spinner{position:relative;width:2.5vmin;height:2.5vmin;margin-right:1vmin;border-radius:50%;border:0.2vmin solid transparent;border-top-color:#12bbed;border-bottom-color:#12bbed;animation:lvc-lm-spin 1s linear infinite;}.lvc-load-more-spinner::after{content:"";position:absolute;top:0.3vmin;left:0.3vmin;right:0.3vmin;bottom:0.3vmin;border-radius:50%;border:0.2vmin solid transparent;border-left-color:#7dd3fc;border-right-color:#7dd3fc;animation:lvc-lm-spin-reverse 0.8s linear infinite;}.lvc-load-more-text{color:#fff;opacity:0.8;letter-spacing:0.1vmin;}.lvc-load-more-disabled{color:#fff;}@keyframes lvc-lm-spin{0%{transform:rotate(0deg);}100%{transform:rotate(360deg);}}@keyframes lvc-lm-spin-reverse{0%{transform:rotate(0deg);}100%{transform:rotate(-360deg);}}'),a.component("lvc-load-more",{props:{loading:{type:Boolean,default:!1},finished:{type:Boolean,default:!1},distance:{type:String,default:"0px"},container:{type:String,default:""},loadingText:{type:String,default:"正在加载更多..."},finishedText:{type:String,default:"没有更多数据了"}},data:()=>({observer:null}),mounted(){this.initObserver()},beforeDestroy(){this.observer&&(this.observer.disconnect(),this.observer=null)},methods:{initObserver(){const e={root:this.container?document.querySelector(this.container):null,rootMargin:`0px 0px ${this.distance} 0px`,threshold:0};this.observer=new IntersectionObserver(e=>{e[0].isIntersecting&&this.handleIntersect()},e),this.observer.observe(this.$el)},handleIntersect(){this.loading||this.finished||this.$emit("load")}},watch:{loading(e){e||this.finished||this.$nextTick(()=>{this.observer&&this.$el&&(this.observer.unobserve(this.$el),this.observer.observe(this.$el))})}},template:'\n <div class="lvc-load-more">\n \x3c!-- 正在加载状态 --\x3e\n <template v-if="loading">\n <div class="lvc-load-more-spinner"></div>\n <span class="lvc-load-more-text">{{ loadingText }}</span>\n </template>\n \n \x3c!-- 加载完毕状态 --\x3e\n <template v-else-if="finished">\n <span class="lvc-load-more-text lvc-load-more-disabled">{{ finishedText }}</span>\n </template>\n\n \x3c!-- 默认什么都不显示,作为触发底线即可 --\x3e\n <template v-else>\n \x3c!-- 空标签,仅作探测器占位 --\x3e\n </template>\n </div>\n '}),function(){n("lvc-select-style",".lvc-select{position:relative;display:inline-block;font-size:1.9391vmin;color:#fff;user-select:none;height:100%;width:100%;z-index:10;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.lvc-select-wrapper{background:#0d2339;border:1px solid #1e4469;border-radius:0.831vmin;padding:1.108vmin 1.662vmin;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:1.108vmin;transition:all 0.3s;height:100%;box-sizing:border-box;}.lvc-select-wrapper:hover,.lvc-select-wrapper.is-active{border-color:#12bbed;box-shadow:0 0 1.385vmin rgba(18,187,237,0.3);}.lvc-select-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff;font-size:1.8006vmin;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.lvc-select-placeholder{color:#DFFBFF;opacity:0.5;}.lvc-select-suffix{display:flex;align-items:center;justify-content:center;width:2vmin;position:relative;}.lvc-icon-arrow{color:#12bbed;font-size:1.385vmin;transition:transform 0.3s,opacity 0.2s;}.lvc-icon-clear{position:absolute;color:#4a637a;font-size:1.6vmin;transition:color 0.2s;opacity:0;z-index:2;}.lvc-icon-clear:hover{color:#12bbed;}.lvc-select-wrapper:hover .is-clearable .lvc-icon-clear{opacity:1;}.lvc-select-wrapper:hover .is-clearable .lvc-icon-arrow{opacity:0;}.lvc-select-dropdown{position:fixed;top:0;left:0;width:100%;background:#0b1a2a;border:1px solid #12bbed;box-shadow:0 1.385vmin 4.1551vmin rgba(0,0,0,0.7);border-radius:0.831vmin;z-index:10000;overflow:hidden;opacity:0;transition:opacity 0.25s cubic-bezier(0.23,1,0.32,1);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform-style:preserve-3d;}.lvc-select-list{list-style:none;padding:0.5vmin 0;margin:0;max-height:25vmin;overflow-y:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.lvc-select-list::-webkit-scrollbar{width:0.554vmin;}.lvc-select-list::-webkit-scrollbar-thumb{background:#1e4469;border-radius:0.277vmin;}.lvc-select-list::-webkit-scrollbar-thumb:hover{background:#12bbed;}.lvc-select-item{padding:1.108vmin 1.662vmin;cursor:pointer;font-size:1.662vmin;color:rgba(223,251,255,0.7);transition:all 0.2s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.lvc-select-item:hover{background:rgba(18,187,237,0.1);color:#fff;}.lvc-select-item.is-selected{background:#0B4868;color:#fff;font-weight:bold;}.lvc-select-item.is-disabled{color:#3d5061;cursor:not-allowed;background:transparent !important;}.lvc-select-fade-enter-active,.lvc-select-fade-leave-active{transition:opacity 0.25s cubic-bezier(0.23,1,0.32,1),transform 0.25s cubic-bezier(0.23,1,0.32,1);}.lvc-select-fade-enter,.lvc-select-fade-leave-to{opacity:0;transform:translateY(-1vmin);}");let e=[],t=0;const i={name:"lvcSelect",props:{value:{type:[String,Number],default:""},options:{type:Array,default:()=>[]},placeholder:{type:String,default:"请选择"},clearable:{type:Boolean,default:!0}},template:'\n <div class="lvc-select" ref="selectContainer">\n <div class="lvc-select-wrapper" :class="{ \'is-active\': isOpen }" @click="toggleDropdown">\n <span class="lvc-select-label" :class="{ \'lvc-select-placeholder\': !selectedLabel }">\n {{ selectedLabel || placeholder }}\n </span>\n <div class="lvc-select-suffix" :class="{ \'is-clearable\': clearable && value !== \'\' && value !== null }">\n <span v-if="clearable" class="lvc-icon-clear" @click.stop="handleClear">✕</span>\n <span class="lvc-icon-arrow" :style="{ transform: isOpen ? \'rotate(180deg)\' : \'none\' }">{{"▼"}}</span>\n </div>\n </div>\n </div>\n',data:()=>({isOpen:!1,dropdownElement:null,overlayElement:null,selectId:"lvc-select-"+ ++t}),computed:{selectedLabel(){const e=this.options.find(e=>e.value===this.value);return e?e.label:""}},methods:{toggleDropdown(){this.isOpen?this.closeDropdown():(this.closeOtherSelects(),this.openDropdown())},openDropdown(){this.isOpen=!0,e.push(this),this.$nextTick(()=>{this.createDropdown()})},closeDropdown(){this.isOpen=!1,e=e.filter(e=>e.selectId!==this.selectId),this.removeDropdown()},closeOtherSelects(){e.forEach(e=>{e.selectId!==this.selectId&&e.closeDropdown()})},createDropdown(){this.removeDropdown(),this.dropdownElement=document.createElement("div"),this.dropdownElement.className="lvc-select-dropdown";const e=document.createElement("ul");e.className="lvc-select-list",this.options.forEach(t=>{const n=document.createElement("li");n.className=`lvc-select-item ${t.value===this.value?"is-selected":""} ${t.disabled?"is-disabled":""}`,n.textContent=t.label,n.addEventListener("click",e=>{e.stopPropagation(),this.selectOption(t)}),e.appendChild(n)}),this.dropdownElement.appendChild(e),document.body.appendChild(this.dropdownElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",document.body.appendChild(this.overlayElement),this.updateDropdownPosition(),this.addEventListeners(),setTimeout(()=>{this.dropdownElement&&(this.dropdownElement.style.opacity="1",this.dropdownElement.style.transform="translateY(0)")},10)},updateDropdownPosition(){const e=this.$el.querySelector(".lvc-select-wrapper");if(e&&this.dropdownElement){const t=e.getBoundingClientRect();this.dropdownElement.style.width=`${t.width}px`,this.dropdownElement.offsetHeight;const n=this.dropdownElement.getBoundingClientRect();let i=t.bottom+8,s=t.left;const l=window.innerHeight,o=window.innerWidth;i+n.height>l&&(i=t.top-n.height-8,i<0&&(i=t.bottom+8,this.dropdownElement.style.maxHeight=l-i-10+"px")),s+n.width>o&&(s=o-n.width-10,s<0&&(s=10,this.dropdownElement.style.width=o-20+"px")),this.dropdownElement.style.position="fixed",this.dropdownElement.style.top=`${Math.round(i)}px`,this.dropdownElement.style.left=`${Math.round(s)}px`}},addEventListeners(){this.handleScroll=this.updateDropdownPosition.bind(this),this.handleResize=this.updateDropdownPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removeDropdown(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.dropdownElement&&this.dropdownElement.parentNode&&(document.body.removeChild(this.dropdownElement),this.dropdownElement=null)},selectOption(e){e.disabled||(this.$emit("input",e),this.$emit("change",e),this.closeDropdown())},handleClear(){this.$emit("input",""),this.$emit("change",""),this.$emit("clear"),this.closeDropdown()},clickOutside(e){const t=this.$refs.selectContainer;!t||t.contains(e.target)||this.dropdownElement&&this.dropdownElement.contains(e.target)||this.closeDropdown()},bindGlobalClickEvents(){if(window.top&&window.top!==window)try{const e=()=>this.closeDropdown();this._topHandler=e,window.top.document.addEventListener("click",e)}catch(e){}if(window.parent&&window.parent!==window)try{const e=()=>this.closeDropdown();this._parentHandler=e,window.parent.document.addEventListener("click",e)}catch(e){}},unbindGlobalClickEvents(){if(window.top&&window.top!==window&&this._topHandler)try{window.top.document.removeEventListener("click",this._topHandler)}catch(e){}if(window.parent&&window.parent!==window&&this._parentHandler)try{window.parent.document.removeEventListener("click",this._parentHandler)}catch(e){}}},mounted(){document.addEventListener("click",this.clickOutside),this.bindGlobalClickEvents()},beforeDestroy(){document.removeEventListener("click",this.clickOutside),this.unbindGlobalClickEvents(),this.closeDropdown()}};a.component("lvc-select",i),r.lvcSelect=i}(),function(){n("lvc-table-style",'.lvc-table-container{position:relative;width:100%;height:100%;display:flex;flex-direction:column;background:rgba(13,35,57,0.4);border:1px solid #1e4469;border-radius:0.831vmin;overflow:hidden;color:#fff;font-size:1.462vmin;}.lvc-table-header-wrapper{background:rgba(30,68,105,0.6);border-bottom:2px solid #12bbed;flex-shrink:0;}.lvc-table-body-wrapper{flex:1;overflow-y:auto;position:relative;}.lvc-table-body-wrapper::-webkit-scrollbar{width:0.554vmin;}.lvc-table-body-wrapper::-webkit-scrollbar-thumb{background:#1e4469;border-radius:0.277vmin;}.lvc-table{width:100%;border-collapse:collapse;table-layout:fixed;}.lvc-table th,.lvc-table td{padding:2vmin 1.6vmin;border-bottom:1px solid rgba(30,68,105,0.3);position:relative;height:4.5vmin;box-sizing:border-box;text-align:left;}.lvc-table-column-center{text-align:center !important;}.lvc-table-column-right{text-align:right !important;}.lvc-table-column-left{text-align:left !important;}.lvc-checkbox{position:relative;cursor:pointer;display:inline-block;vertical-align:middle;width:1.8vmin;height:1.8vmin;border:1px solid #12bbed;border-radius:0.3vmin;background:rgba(18,187,237,0.1);transition:background 0.2s;box-sizing:border-box;}.lvc-checkbox.checked{background:#12bbed;}.lvc-checkbox.checked::after{content:"";position:absolute;left:0.5vmin;top:0.1vmin;width:0.5vmin;height:0.9vmin;border:solid #0d2339;border-width:0 0.2vmin 0.2vmin 0;transform:rotate(45deg);}.lvc-sort-box{display:inline-flex;flex-direction:column;align-items:center;margin-left:0.5vmin;vertical-align:middle;cursor:pointer;}.lvc-sort-caret{width:0;height:0;border:0.5vmin solid transparent;}.lvc-sort-up{border-bottom-color:#4e6a86;margin-bottom:0.2vmin;}.lvc-sort-down{border-top-color:#4e6a86;}.sorting-asc .lvc-sort-up{border-bottom-color:#12bbed;}.sorting-desc .lvc-sort-down{border-top-color:#12bbed;}.lvc-table th.is-sortable{cursor:pointer;user-select:none;}.lvc-table th.is-sortable:hover{background:rgba(18,187,237,0.1);}.lvc-table-body-wrapper tr:hover{background:rgba(18,187,237,0.05);}.lvc-table-body-wrapper tr.is-selected{background:rgba(18,187,237,0.15);}.lvc-table-empty{padding:5vmin 0;text-align:center;color:rgba(223,251,255,0.5);}');const e={name:"lvcTable",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},stripe:{type:Boolean,default:!0},selection:{type:Boolean,default:!1}},data:()=>({selectedRows:[],sortProp:"",sortOrder:""}),computed:{processedData(){let e=[...this.data];return this.sortProp&&this.sortOrder&&e.sort((e,t)=>{const n=e[this.sortProp],i=t[this.sortProp];if(n===i)return 0;const s=n>i?1:-1;return"asc"===this.sortOrder?s:-s}),e},isAllSelected(){return this.data.length>0&&this.selectedRows.length===this.data.length}},methods:{toggleRowSelection(e){const t=this.selectedRows.findIndex(t=>t===e);t>-1?this.selectedRows.splice(t,1):this.selectedRows.push(e),this.$emit("selection-change",[...this.selectedRows])},toggleAllSelection(){this.isAllSelected?this.selectedRows=[]:this.selectedRows=[...this.data],this.$emit("selection-change",[...this.selectedRows])},handleSort(e){e.sortable&&(this.sortProp!==e.prop?(this.sortProp=e.prop,this.sortOrder="asc"):"asc"===this.sortOrder?this.sortOrder="desc":"desc"===this.sortOrder&&(this.sortOrder="",this.sortProp=""),this.$emit("sort-change",{prop:this.sortProp,order:this.sortOrder}))}},template:'\n <div class="lvc-table-container">\n <div class="lvc-table-header-wrapper">\n <table class="lvc-table">\n <colgroup>\n <col v-if="selection" width="50">\n <col v-for="col in columns" :key="col.prop" :width="col.width || \'\'">\n </colgroup>\n <thead>\n <tr>\n <th v-if="selection" style="text-align: center;">\n <div class="lvc-checkbox" :class="{checked: isAllSelected}" @click="toggleAllSelection"></div>\n </th>\n <th v-for="col in columns" \n :key="col.prop" \n :class="[\n col.align ? \'lvc-table-column-\' + col.align : \'\',\n { \'is-sortable\': col.sortable },\n sortProp === col.prop ? \'sorting-\' + sortOrder : \'\'\n ]"\n @click="handleSort(col)">\n <slot v-if="$scopedSlots[\'header-\' + col.prop.toLowerCase()]" :name="\'header-\' + col.prop.toLowerCase()" :column="col"></slot>\n <template v-else>{{ col.label }}</template>\n <span v-if="col.sortable" class="lvc-sort-box">\n <i class="lvc-sort-caret lvc-sort-up"></i>\n <i class="lvc-sort-caret lvc-sort-down"></i>\n </span>\n </th>\n </tr>\n </thead>\n </table>\n </div>\n\n <div class="lvc-table-body-wrapper">\n <table class="lvc-table" :class="{ \'lvc-table-stripe\': stripe }">\n <colgroup>\n <col v-if="selection" width="50">\n <col v-for="col in columns" :key="col.prop" :width="col.width || \'\'">\n </colgroup>\n <tbody>\n <tr v-for="(row, rowIndex) in processedData" \n :key="rowIndex"\n :class="{ \'is-selected\': selectedRows.includes(row) }">\n <td v-if="selection" style="text-align: center;">\n <div class="lvc-checkbox" :class="{checked: selectedRows.includes(row)}" @click="toggleRowSelection(row)"></div>\n </td>\n <td v-for="col in columns" \n :key="col.prop" \n :class="col.align ? \'lvc-table-column-\' + col.align : \'\'">\n <slot v-if="$scopedSlots[col.prop.toLowerCase()]" :name="col.prop.toLowerCase()" :row="row" :index="rowIndex"></slot>\n <template v-else>{{ row[col.prop] }}</template>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-if="!data || data.length === 0" class="lvc-table-empty">暂无数据</div>\n </div>\n </div>\n '};a.component("lvc-table",e),r.lvcTable=e}(),function(){n("lvc-date-style",'.lvc-date-picker{position:relative;display:inline-block;font-size:1.9391vmin;color:#fff;user-select:none;height:100%;}input:focus{outline:none;border:none;box-shadow:none;}.lvc-input-wrapper{background:#0d2339;border:1px solid #1e4469;border-radius:0.831vmin;padding:1.108vmin 1.662vmin;cursor:pointer;display:flex;align-items:center;gap:1.108vmin;min-width:33.241vmin;transition:all 0.3s;height:100%;}.lvc-input-wrapper:hover,.lvc-input-wrapper.is-active{border-color:#12bbed;box-shadow:0 0 1.385vmin rgba(18,187,237,0.3);}.lvc-inner-input{background:transparent;border:none;color:#fff;outline:none;width:100%;text-align:center;cursor:pointer;font-size:1.8006vmin;}.lvc-input-wrapper > input::placeholder{color:#DFFBFF;opacity:.5;}.lvc-input-wrapper > input::-moz-placeholder{color:#DFFBFF;opacity:.5;}.lvc-input-wrapper > input:-ms-input-placeholder{color:#DFFBFF;opacity:.5;}.lvc-separator{color:#4a637a;font-size:1.662vmin;}.lvc-icon-arrow{color:#12bbed;font-size:1.385vmin;transition:transform 0.3s;}.lvc-picker-panel{position:absolute;top:6.6482vmin;left:0;background:#0b1a2a;border:1px solid #12bbed;box-shadow:0 1.385vmin 4.1551vmin rgba(0,0,0,0.7);border-radius:1.108vmin;padding:2.0776vmin;z-index:9999;}.lvc-time-bar{display:flex;gap:1.385vmin;margin-bottom:1.108vmin;}.lvc-time-slot{flex:1;position:relative;}.lvc-time-btn{background:rgba(18,187,237,0.05);border:1px solid #1e4469;border-radius:0.554vmin;padding:0.277vmin 0.831vmin;display:flex;flex-direction:column;align-items:center;cursor:pointer;}.lvc-time-btn.is-active{border-color:#12bbed;background:rgba(18,187,237,0.15);}.lvc-time-val{font-family:monospace;font-size:2.2161vmin;color:#12bbed;font-weight:bold;}.lvc-label{font-size:1.385vmin;color:#5d758c;}.lvc-time-dropdown{position:absolute;top:7.2022vmin;left:50%;transform:translateX(-50%);background:#0d2339;border:1px solid #12bbed;border-radius:0.554vmin;padding:1.108vmin;display:flex;gap:0.554vmin;z-index:10001;box-shadow:0 0.6925vmin 2.7701vmin rgba(0,0,0,0.8);}.lvc-scroll-col{width:6.2327vmin;height:22.1607vmin;overflow-y:auto;background:#081625;scrollbar-width:none;}.lvc-scroll-col::-webkit-scrollbar{display:none;}.lvc-scroll-col ul{list-style:none;padding:0;margin:0;text-align:center;}.lvc-scroll-col li{padding:0.831vmin 0;cursor:pointer;color:#8cabc4;font-size:1.8006vmin;}.lvc-scroll-col li:hover{color:#fff;background:rgba(18,187,237,0.1);}.lvc-scroll-col li.is-selected{color:#fff;background:#12bbed;border-radius:0.554vmin;}.lvc-time-divider{align-self:center;color:#12bbed;font-weight:bold;}.lvc-calendars-wrap{display:flex;gap:2.7701vmin;}.lvc-calendar-box{width:30.4709vmin;}.lvc-cal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.662vmin;color:#12bbed;}.lvc-nav-btn{cursor:pointer;padding:0 1.108vmin;font-size:2.2161vmin;}.lvc-cal-week{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;color:#4a637a;font-size:1.662vmin;margin-bottom:1.108vmin;}.lvc-cal-days{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;}.lvc-day{height:4.1551vmin;line-height:4.1551vmin;font-size:1.662vmin;cursor:pointer;border-radius:0.554vmin;margin:1px 0;position:relative;}.lvc-day:not(.is-empty):hover{background:rgba(18,187,237,0.2);}.lvc-day.is-active{background:#12bbed !important;color:#fff;font-weight:bold;}.lvc-day.is-in-range{background:rgba(18,187,237,0.1);color:#12bbed;border-radius:0;}.lvc-day.is-in-hover-range{background:rgba(18,187,237,0.2);color:#fff;border-radius:0;}.lvc-day.is-today::after{content:"";position:absolute;bottom:0.4155vmin;left:50%;width:0.554vmin;height:0.554vmin;background:#12bbed;border-radius:50%;transform:translateX(-50%);}.lvc-panel-footer{border-top:1px solid rgba(255,255,255,0.05);margin-top:0.554vmin;padding-top:1.662vmin;display:flex;justify-content:space-between;align-items:center;}.lvc-action-link{font-size:1.662vmin;color:#5d758c;cursor:pointer;}.lvc-action-link:hover{color:#12bbed;}.lvc-right-actions{display:flex;gap:1.385vmin;}.lvc-action-btn{font-size:1.662vmin;cursor:pointer;padding:0.554vmin 1.662vmin;border-radius:0.554vmin;}.lvc-action-btn.is-outline{border:1px solid #1e4469;color:#8cabc4;}.lvc-action-btn.is-primary{background:#12bbed;color:#fff;}.lvc-fade-enter-active,.lvc-fade-leave-active{transition:opacity 0.25s cubic-bezier(0.23,1,0.32,1),transform 0.25s cubic-bezier(0.23,1,0.32,1);}.lvc-fade-enter,.lvc-fade-leave-to{opacity:0;transform:translateY(1.662vmin) scale(0.98);}.lvc-time-fade-enter-active,.lvc-time-fade-leave-active{transition:opacity 0.2s ease,transform 0.2s ease;}.lvc-time-fade-enter,.lvc-time-fade-leave-to{opacity:0;transform:translate(-50%,1.385vmin);}');let e=[],t=0;const i={name:"lvcDatePicker",props:{value:{type:[String,Array],default:""},type:{type:String,default:"date"},rangeSeparator:{type:String,default:"至"},singlePanel:{type:Boolean,default:!1}},template:'\n <div class="lvc-date-picker" ref="pickerContainer">\n <div class="lvc-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="showDoubleInput">\n <input class="lvc-inner-input" readonly :value="displayValues[0]" placeholder="开始时间" />\n <span class="lvc-separator">{{ rangeSeparator }}</span>\n <input class="lvc-inner-input" readonly :value="displayValues[1]" placeholder="结束时间" />\n </template>\n <template v-else>\n <input class="lvc-inner-input" readonly :value="value" placeholder="请选择日期时间" />\n </template>\n <span class="lvc-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date;return{isPanelOpen:!1,activeTimePop:null,timeState:{start:{h:"00",m:"00"},end:{h:"00",m:"00"}},selectingRangePart:"start",calendars:[{year:e.getFullYear(),month:e.getMonth()},{year:e.getFullYear(),month:e.getMonth()+1>11?0:e.getMonth()+1}],panelElement:null,datePickerId:"lvc-date-picker-"+ ++t,hoverDate:null}},computed:{isRangeMode(){return this.type.includes("range")},showDoubleInput(){return this.type.includes("range")||"datetimestartorend"===this.type},supportTime(){return this.type.includes("time")},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]},visibleCalendars(){return(!this.singlePanel||"daterange"!==this.type&&"datetimerange"!==this.type)&&this.isRangeMode?this.calendars:[this.calendars[0]]}},methods:{formatPad:e=>String(e).padStart(2,"0"),handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherDatePickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},closePanel(){this.isPanelOpen=!1,this.selectingRangePart="start",e=e.filter(e=>e.datePickerId!==this.datePickerId),this.removePanel()},closeOtherDatePickers(){e.forEach(e=>{e.datePickerId!==this.datePickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-picker-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.385vmin 4.1551vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1.108vmin",this.panelElement.style.padding="2.0776vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation(),this.activeTimePop=null}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",e=>{}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){const e=this.showDoubleInput?["start","end"]:["start"],t=this.visibleCalendars;let n="";return this.supportTime&&(n=`\n <div class="lvc-time-bar">\n ${e.map(e=>`\n <div class="lvc-time-slot" data-mode="${e}">\n <div class="lvc-time-btn ${this.activeTimePop===e?"is-active":""}">\n <span class="lvc-label">${"start"===e?this.showDoubleInput?"起始":"时间":"结束"}</span>\n <span class="lvc-time-val">${this.timeState[e].h}:${this.timeState[e].m}</span>\n </div>\n ${this.activeTimePop===e?this.generateTimeDropdownHTML(e):""}\n </div>\n `).join("")}\n </div>\n `),n+`\n <div class="lvc-calendars-wrap">\n ${t.map((e,t)=>`\n <div class="lvc-calendar-box" data-idx="${t}">\n <div class="lvc-cal-head">\n <span class="lvc-nav-btn" data-direction="-1">❮</span>\n <strong>${e.year}年 ${e.month+1}月</strong>\n <span class="lvc-nav-btn" data-direction="1">❯</span>\n </div>\n <div class="lvc-cal-week">\n ${["日","一","二","三","四","五","六"].map(e=>`<div>${e}</div>`).join("")}\n </div>\n <div class="lvc-cal-days">\n ${Array.from({length:this.getMonthOffset(e)},(e,t)=>'<div class="lvc-day is-empty"></div>').join("")}\n ${Array.from({length:this.getDaysCount(e)},(t,n)=>{const i=n+1,s=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(i)}`,l=this.getDayStateClass(e,i);return`<div class="lvc-day ${Object.entries(l).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-date="${s}">${i}</div>`}).join("")}\n </div>\n </div>\n `).join("")}\n </div>\n \n <div class="lvc-panel-footer">\n <span class="lvc-action-link" data-action="clear">清空</span>\n <div class="lvc-right-actions">\n <span class="lvc-action-btn is-outline" data-action="setToNow">此刻</span>\n <span class="lvc-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},generateTimeDropdownHTML(e){return`\n <div class="lvc-time-dropdown">\n <div class="lvc-scroll-col" data-part="h">\n <ul>\n ${Array.from({length:24},(t,n)=>{const i=this.formatPad(n);return`<li class="${i===this.timeState[e].h?"is-selected":""}" data-value="${i}">${i}</li>`}).join("")}\n </ul>\n </div>\n <div class="lvc-time-divider">:</div>\n <div class="lvc-scroll-col" data-part="m">\n <ul>\n ${Array.from({length:60},(t,n)=>{const i=this.formatPad(n);return`<li class="${i===this.timeState[e].m?"is-selected":""}" data-value="${i}">${i}</li>`}).join("")}\n </ul>\n </div>\n </div>\n `},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-time-slot").forEach(e=>{const t=e.dataset.mode,n=e.querySelector(".lvc-time-btn");n&&n.addEventListener("click",e=>{e.stopPropagation(),this.handleToggleTimePop(t)})}),this.panelElement.querySelectorAll(".lvc-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction),n=e.closest(".lvc-calendar-box");if(n){const i=parseInt(n.dataset.idx);e.addEventListener("click",e=>{e.stopPropagation(),this.handleMonthNav(i,t)})}}),this.panelElement.querySelectorAll(".lvc-day:not(.is-empty)").forEach(e=>{const t=e.dataset.date;if(t){const[n,i,s]=t.split("-").map(Number),l={year:n,month:i-1};e.addEventListener("click",e=>{e.stopPropagation(),this.handleDateSelection(l,s)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.value[0]&&(this.hoverDate=t,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverDate&&(this.hoverDate=null,this.clearHoverRangeStyle())}))}}),this.panelElement.querySelectorAll(".lvc-action-link, .lvc-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"setToNow":this.handleSetToNow();break;case"confirm":this.handleConfirm()}})}),this.panelElement.querySelectorAll(".lvc-time-dropdown").forEach(e=>{e.addEventListener("click",e=>{e.stopPropagation()}),e.querySelectorAll(".lvc-scroll-col").forEach(e=>{const t=e.dataset.part,n=e.closest(".lvc-time-slot");if(n){const i=n.dataset.mode;e.querySelectorAll("li").forEach(e=>{e.addEventListener("click",n=>{n.stopPropagation();const s=e.dataset.value;this.handleSelectTime(i,t,s)})})}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left;const s=window.innerHeight,l=window.innerWidth,o=this.panelElement.getBoundingClientRect();n+o.height>s&&(n=t.top-o.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px")),i+o.width>l&&(i=l-o.width-.1731,i<0&&(i=.1731,this.panelElement.style.width=l-.3463+"px")),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},handleToggleTimePop(e){this.activeTimePop===e?this.activeTimePop=null:this.activeTimePop=e,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},autoScrollTime(e){},handleSelectTime(e,t,n){this.timeState[e][t]=n,this.emitInternalChange(),"m"===t?(this.activeTimePop=null,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})):this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleMonthNav(e,t){const n=this.calendars[e],i=new Date(n.year,n.month+t,1);if(n.year=i.getFullYear(),n.month=i.getMonth(),this.isRangeMode){const t=0===e?1:0,i=0===e?1:-1,s=new Date(n.year,n.month+i,1);this.calendars[t].year=s.getFullYear(),this.calendars[t].month=s.getMonth()}this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},getMonthOffset:e=>new Date(e.year,e.month,1).getDay(),getDaysCount:e=>new Date(e.year,e.month+1,0).getDate(),handleDateSelection(e,t){const n=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(t)}`;if(this.hoverDate=null,"datetimestartorend"===this.type){const e=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,t=this.supportTime?`${n} ${this.timeState.end.h}:${this.timeState.end.m}`:n;this.$emit("input",[e,t]),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}else if(this.isRangeMode){let e=Array.isArray(this.value)?[...this.value]:["",""];const t=!!e[0],i=!!e[1];if(t&&i)e[0]=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,e[1]="",this.selectingRangePart="end";else if("start"===this.selectingRangePart)e[0]=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n,e[1]&&e[0]>e[1]&&(e[1]=""),this.selectingRangePart="end";else{if(e[1]=this.supportTime?`${n} ${this.timeState.end.h}:${this.timeState.end.m}`:n,e[1]<e[0]){const t=e[0];e[0]=e[1],e[1]=t}this.selectingRangePart="start"}this.$emit("input",e),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}else{const e=this.supportTime?`${n} ${this.timeState.start.h}:${this.timeState.start.m}`:n;this.$emit("input",e),this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})}},getDayStateClass(e,t){const n=`${e.year}-${this.formatPad(e.month+1)}-${this.formatPad(t)}`,i=new Date;let s={"is-today":n===`${i.getFullYear()}-${this.formatPad(i.getMonth()+1)}-${this.formatPad(i.getDate())}`};if(!this.value)return s;if("datetimestartorend"===this.type){const e=Array.isArray(this.value)&&this.value[0]?this.value[0].slice(0,10):"";return{...s,"is-active":e===n}}if(this.isRangeMode){const e=(this.value[0]||"").slice(0,10),t=(this.value[1]||"").slice(0,10),i={...s,"is-active":e&&n===e||t&&n===t,"is-in-range":e&&t&&n>e&&n<t};if("end"===this.selectingRangePart&&e&&this.hoverDate){const t=this.hoverDate;n>(e<t?e:t)&&n<(e<t?t:e)&&(i["is-in-hover-range"]=!0)}return i}return{...s,"is-active":"string"==typeof this.value&&this.value.slice(0,10)===n}},updateHoverRangeStyle(){if(!this.panelElement||!this.hoverDate||!this.value[0])return;const e=(this.value[0]||"").slice(0,10),t=this.hoverDate,n=e<t?e:t,i=e<t?t:e;this.panelElement.querySelectorAll(".lvc-day:not(.is-empty)").forEach(e=>{const t=e.dataset.date;t&&t>n&&t<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-day.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},syncInternalStateFromValue(){if(this.showDoubleInput){const e=Array.isArray(this.value)?this.value:["",""];this.timeState.start=this.splitTime(e[0]),this.timeState.end=this.splitTime(e[1])}else this.timeState.start=this.splitTime(this.value)},splitTime(e){if(e&&e.includes(" ")){const t=e.split(" ")[1].split(":");return{h:t[0]||"00",m:t[1]||"00"}}return{h:"00",m:"00"}},emitInternalChange(){if(this.value)if(this.showDoubleInput){let e=Array.isArray(this.value)?[...this.value]:["",""];e[0]&&(e[0]=e[0].slice(0,10)+` ${this.timeState.start.h}:${this.timeState.start.m}`),e[1]&&(e[1]=e[1].slice(0,10)+` ${this.timeState.end.h}:${this.timeState.end.m}`),this.$emit("input",e)}else{let e=this.value.slice(0,10)+` ${this.timeState.start.h}:${this.timeState.start.m}`;this.$emit("input",e)}},handleClear(){this.$emit("input",this.showDoubleInput?["",""]:""),this.activeTimePop=null,this.selectingRangePart="start",this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleSetToNow(){const e=new Date,t=`${e.getFullYear()}-${this.formatPad(e.getMonth()+1)}-${this.formatPad(e.getDate())}`,n=this.formatPad(e.getHours()),i=this.formatPad(e.getMinutes()),s=this.supportTime?`${t} ${n}:${i}`:t;if("datetimestartorend"===this.type)this.timeState.start={h:n,m:i},this.timeState.end={h:n,m:i},this.$emit("input",[s,s]);else if(this.isRangeMode){let e=Array.isArray(this.value)?[...this.value]:["",""];const t=this.selectingRangePart;if(this.timeState[t]={h:n,m:i},"start"===t)e[0]||e[1]?s<e[1]?(e[0]=s,this.timeState.start={h:n,m:i}):s>e[1]?(e[1]=s,this.timeState.end={h:n,m:i}):e[1]&&e[0]>e[1]&&(e[1]=""):(e[0]=s,this.timeState.start={h:n,m:i});else if(s>e[0])e[1]=s,this.timeState.end={h:n,m:i};else if(s<e[0]){const t=e[0];e[1]=t,e[0]=s,this.timeState.start={h:n,m:i},this.timeState.end={h:"00",m:"00"}}else e[0]&&e[1]<e[0]&&(e[0]=s,this.timeState.start={h:n,m:i});this.$emit("input",e)}else this.timeState.start={h:n,m:i},this.$emit("input",s);this.activeTimePop=null,this.isPanelOpen&&this.$nextTick(()=>{this.updatePanelContent()})},handleConfirm(){this.closePanel(),this.$emit("confirm",this.value)},handleListScroll(e,t,n){},clickOutside(e){const t=this.$refs.pickerContainer;if(t)return t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)?void 0:(this.closePanel(),void(this.activeTimePop=null))}},mounted(){document.addEventListener("click",this.clickOutside)},beforeDestroy(){document.removeEventListener("click",this.clickOutside),this.closePanel()}};a.component("lvc-date-picker",i),r.lvcDatePicker=i}(),n("lvc-time-style",".lvc-time-picker{position:relative;display:inline-block;font-size:1.4vmin;color:#fff;user-select:none;width:100%;height:100%;}.lvc-time-input-wrapper{background:#0d2339;border:1px solid #297077;border-radius:0.831vmin;padding:0 1.108vmin;cursor:pointer;display:flex;align-items:center;justify-content:space-between;transition:all 0.3s;height:100%;width:100%;}.lvc-time-input-wrapper:hover,.lvc-time-input-wrapper.is-active{border-color:#12bbed;}.lvc-time-value{color:#e0f2fe;}.lvc-time-icon{color:#7dd3fc;font-size:1.2vmin;transition:transform 0.3s;}.lvc-time-input-wrapper.is-active .lvc-time-icon{transform:rotate(180deg);}.lvc-time-panel{position:fixed;background:#0d253f;border:1px solid #1a3a5a;border-radius:0.5vmin;box-shadow:0 0.5vmin 1.5vmin rgba(0,0,0,0.5);z-index:999999;display:flex;flex-direction:column;width:20vmin;transition:top 0.1s,left 0.1s;}.lvc-time-spinner{display:flex;height:25vmin;padding:1vmin 0;}.lvc-time-column{flex:1;overflow-y:auto;scrollbar-width:none;text-align:center;scroll-behavior:smooth;}.lvc-time-column::-webkit-scrollbar{display:none;}.lvc-time-item{padding:1vmin 0;cursor:pointer;color:#7dd3fc;transition:all 0.2s;font-size:1.3vmin;}.lvc-time-item:hover{background:rgba(18,187,237,0.1);}.lvc-time-item.is-selected{color:#fff;background:#12bbed;font-weight:bold;}.lvc-time-item.is-disabled{color:#475569;cursor:not-allowed;background:transparent;}.lvc-time-footer{border-top:1px solid #1a3a5a;padding:0.8vmin;display:flex;justify-content:flex-end;gap:0.8vmin;}.lvc-btn{padding:0.5vmin 1.5vmin;border-radius:0.3vmin;cursor:pointer;font-size:1.2vmin;border:none;outline:none;transition:opacity 0.2s;}.lvc-btn:active{opacity:0.8;}.lvc-btn-cancel{background:transparent;color:#7dd3fc;}.lvc-btn-confirm{background:#12bbed;color:#fff;}"),a.component("lvc-time-picker",{props:{value:{type:String,default:"00:00"},disabled:{type:Boolean,default:!1}},data:()=>({isPanelOpen:!1,tempHour:"00",tempMinute:"00",overlayElement:null}),computed:{hours(){const e=[];for(let t=0;t<=24;t++)e.push(String(t).padStart(2,"0"));return e},minutes(){const e=[];for(let t=0;t<60;t++)e.push(String(t).padStart(2,"0"));return e}},watch:{value:{immediate:!0,handler(e){const t=e||"00:00",[n,i]=t.split(":");this.tempHour=n||"00",this.tempMinute=i||"00"}}},methods:{togglePanel(){this.isPanelOpen=!this.isPanelOpen,this.isPanelOpen?(this.createOverlay(),this.$nextTick(()=>{this.updatePosition(),this.scrollToSelected()})):this.removeOverlay()},closePanel(){this.isPanelOpen=!1,this.removeOverlay()},createOverlay(){this.overlayElement||(this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:999998;",document.body.appendChild(this.overlayElement))},removeOverlay(){this.overlayElement&&this.overlayElement.parentNode&&(this.overlayElement.parentNode.removeChild(this.overlayElement),this.overlayElement=null)},selectHour(e){this.tempHour=e,"24"===e&&(this.tempMinute="00")},selectMinute(e){"24"!==this.tempHour&&(this.tempMinute=e)},handleConfirm(){const e=`${this.tempHour}:${this.tempMinute}`;this.$emit("input",e),this.$emit("change",e),this.closePanel()},scrollToSelected(){const e=this.$refs.panel.querySelectorAll(".hour-column .lvc-time-item"),t=this.$refs.panel.querySelectorAll(".minute-column .lvc-time-item"),n=Array.from(e).find(e=>e.dataset.val===this.tempHour),i=Array.from(t).find(e=>e.dataset.val===this.tempMinute);n&&n.scrollIntoView({block:"center",behavior:"auto"}),i&&i.scrollIntoView({block:"center",behavior:"auto"})},updatePosition(){if(!this.isPanelOpen||!this.$refs.panel||!this.$refs.inputWrapper)return;const e=this.$refs.inputWrapper.getBoundingClientRect(),t=this.$refs.panel,n=t.offsetHeight||.25*window.innerHeight,i=window.innerHeight-e.bottom,s=e.top;t.style.top=i<n&&s>i?e.top-n-8+"px":`${e.bottom+8}px`,t.style.left=`${e.left}px`},handleOutsideClick(e){const t=this.$refs.inputWrapper&&this.$refs.inputWrapper.contains(e.target),n=this.$refs.panel&&this.$refs.panel.contains(e.target);t||n||this.closePanel()},handleScroll(){this.isPanelOpen&&this.updatePosition()}},mounted(){this.$refs.panel&&document.body.appendChild(this.$refs.panel),document.addEventListener("click",this.handleOutsideClick),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.updatePosition)},beforeDestroy(){this.$refs.panel&&this.$refs.panel.parentNode&&this.$refs.panel.parentNode.removeChild(this.$refs.panel),document.removeEventListener("click",this.handleOutsideClick),window.removeEventListener("scroll",this.handleScroll,!0),window.removeEventListener("resize",this.updatePosition)},template:'\n <div class="lvc-time-picker">\n \x3c!-- 输入框显示区 --\x3e\n <div ref="inputWrapper" class="lvc-time-input-wrapper" :class="{\'is-active\': isPanelOpen && !disabled}" @click.stop="togglePanel">\n <span class="lvc-time-value">{{ value }}</span>\n <span class="lvc-time-icon">▼</span>\n </div>\n\n \x3c!-- 下拉面板:v-show 保证 DOM 存在,方便挂载到 Body --\x3e\n <div ref="panel" class="lvc-time-panel" v-show="isPanelOpen && !disabled" @click.stop>\n <div class="lvc-time-spinner">\n \x3c!-- 小时列 --\x3e\n <div class="lvc-time-column hour-column">\n <div \n v-for="h in hours" \n :key="\'h\'+h" \n :data-val="h"\n class="lvc-time-item" \n :class="{\'is-selected\': tempHour === h}"\n @click="selectHour(h)"\n >{{ h }}</div>\n </div>\n \x3c!-- 分钟列 --\x3e\n <div class="lvc-time-column minute-column">\n <div \n v-for="m in minutes" \n :key="\'m\'+m" \n :data-val="m"\n class="lvc-time-item" \n :class="{\n \'is-selected\': tempMinute === m, \n \'is-disabled\': tempHour === \'24\' && m !== \'00\'\n }"\n @click="selectMinute(m)"\n >{{ m }}</div>\n </div>\n </div>\n <div class="lvc-time-footer">\n <button class="lvc-btn lvc-btn-cancel" @click="closePanel">取消</button>\n <button class="lvc-btn lvc-btn-confirm" @click="handleConfirm">确定</button>\n </div>\n </div>\n </div>\n '}),function(){n("lvc-year-picker-style",'.lvc-year-picker{position:relative;display:inline-block;font-size:1.8vmin;color:#fff;user-select:none;height:100%;}.lvc-year-input-wrapper{background:#0d2339;border:1px solid #1e4469;border-radius:0.8vmin;padding:0.6vmin 1vmin;cursor:pointer;display:flex;align-items:center;gap:0.8vmin;min-width:10vmin;transition:all 0.3s;height:100%;}.lvc-year-separator{color:#5d758c;font-size:1.385vmin;flex-shrink:0;}.lvc-year-input-wrapper:hover,.lvc-year-input-wrapper.is-active{border-color:#12bbed;box-shadow:0 0 1.2vmin rgba(18,187,237,0.3);}.lvc-year-inner-input{background:transparent;border:none;color:#fff;outline:none;width:100%;text-align:center;cursor:pointer;font-size:1.3vmin;}.lvc-year-icon-arrow{color:#12bbed;font-size:1.385vmin;transition:transform 0.3s;}.lvc-year-panel{position:absolute;top:5vmin;left:50%;transform:translateX(-50%);background:#0b1a2a;border:1px solid #12bbed;box-shadow:0 1.2vmin 3.5vmin rgba(0,0,0,0.7);border-radius:1vmin;padding:1.5vmin;z-index:9999;min-width:24vmin;}.lvc-year-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1vmin;color:#12bbed;font-size:1.6vmin;}.lvc-year-nav-btn{cursor:pointer;padding:0.3vmin 0.8vmin;font-size:1.4vmin;color:#12bbed;transition:color 0.2s;}.lvc-year-nav-btn:hover{color:#fff;}.lvc-year-grid{display:grid;grid-template-columns:repeat(4,1fr);}.lvc-year-cell{position:relative;height:4.5vmin;width:6.5vmin;line-height:4.5vmin;text-align:center;font-size:1.662vmin;cursor:pointer;border-radius:0.5vmin;color:#8ab4d4;transition:all 0.2s;}.lvc-year-cell:hover{background:rgba(18,187,237,0.2);color:#fff;}.lvc-year-cell.is-active{background:#12bbed;color:#fff;font-weight:bold;}.lvc-year-cell.is-in-range{background:rgba(18,187,237,0.15);color:#12bbed;border-radius:0;}.lvc-year-cell.is-in-hover-range{background:rgba(18,187,237,0.25);color:#fff;border-radius:0;}.lvc-year-cell.is-current::after{content:"";position:absolute;bottom:0.5vmin;left:50%;width:0.6vmin;height:0.4vmin;background:#12bbed;border-radius:50%;transform:translateX(-50%);}.lvc-year-panel-footer{border-top:1px solid rgba(255,255,255,0.05);margin-top:1vmin;padding-top:1vmin;display:flex;justify-content:space-between;align-items:center;gap:1vmin;}.lvc-year-right-actions{display:flex;gap:1vmin;}.lvc-year-action-btn{font-size:1.662vmin;cursor:pointer;padding:0.554vmin 1.662vmin;border-radius:0.5vmin;transition:all 0.2s;}.lvc-year-action-btn.is-outline{border:1px solid #1e4469;color:#8ab4d4;}.lvc-year-action-btn.is-outline:hover{border-color:#12bbed;color:#12bbed;}.lvc-year-action-btn.is-primary{background:#12bbed;color:#fff;}.lvc-year-action-btn.is-primary:hover{background:#0ea8d4;}.lvc-year-fade-enter-active,.lvc-year-fade-leave-active{transition:opacity 0.25s cubic-bezier(0.23,1,0.32,1),transform 0.25s cubic-bezier(0.23,1,0.32,1);}.lvc-year-fade-enter,.lvc-year-fade-leave-to{opacity:0;transform:translateY(1.662vmin) scale(0.98);}');let e=[],t=0;const i={name:"lvcYearPicker",props:{value:{type:[String,Array],default:""},yearRange:{type:Number,default:5},type:{type:String,default:"year"},rangeSeparator:{type:String,default:"至"}},template:'\n <div class="lvc-year-picker" ref="pickerContainer">\n <div class="lvc-year-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="isRangeMode">\n <input class="lvc-year-inner-input" readonly :value="displayValues[0]" placeholder="开始年份" />\n <span class="lvc-year-separator">{{ rangeSeparator }}</span>\n <input class="lvc-year-inner-input" readonly :value="displayValues[1]" placeholder="结束年份" />\n </template>\n <template v-else>\n <input class="lvc-year-inner-input" readonly :value="displayValue" placeholder="请选择年份" />\n </template>\n <span class="lvc-year-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date,n="yearrange"===this.type;let i;if(this.value)if(n){const t=Array.isArray(this.value)?this.value:["",""];i=t[0]?parseInt(t[0]):e.getFullYear()}else i=parseInt(this.value);else i=e.getFullYear();return{isPanelOpen:!1,currentYear:i,currentYearNow:e.getFullYear(),tempYear:i,rangeStart:i-this.yearRange,tempStartYear:i,tempEndYear:i,selectingRangePart:"start",hoverYear:null,panelElement:null,overlayElement:null,yearPickerId:"lvc-year-picker-"+ ++t}},computed:{isRangeMode(){return"yearrange"===this.type},displayValue(){return this.value||""},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]},yearList(){const e=[];for(let t=0;t<2*this.yearRange+1;t++)e.push(this.rangeStart+t);return e},displayRange(){return`${this.rangeStart} - ${this.rangeStart+2*this.yearRange}`}},mounted(){this._onDocClick=e=>{this.clickOutside(e)},document.addEventListener("click",this._onDocClick)},beforeDestroy(){document.removeEventListener("click",this._onDocClick),this.closePanel()},watch:{value(e){if(this.isRangeMode){const t=Array.isArray(e)?e:["",""];t[0]&&(this.tempStartYear=parseInt(t[0])),t[1]&&(this.tempEndYear=parseInt(t[1]))}else e&&(this.tempYear=parseInt(e))}},methods:{handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherYearPickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},syncInternalStateFromValue(){if(this.isRangeMode){const e=Array.isArray(this.value)?this.value:["",""];e[0]?this.tempStartYear=parseInt(e[0]):this.tempStartYear=(new Date).getFullYear(),e[1]?this.tempEndYear=parseInt(e[1]):this.tempEndYear=this.tempStartYear,this.currentYear=this.tempStartYear,this.rangeStart=this.currentYear-this.yearRange,this.selectingRangePart="start"}else{const e=this.value?parseInt(this.value):(new Date).getFullYear();this.tempYear=e,this.currentYear=this.tempYear,this.rangeStart=this.currentYear-this.yearRange}},closePanel(){this.isPanelOpen=!1,e=e.filter(e=>e.yearPickerId!==this.yearPickerId),this.removePanel()},closeOtherYearPickers(){e.forEach(e=>{e.yearPickerId!==this.yearPickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-year-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateX(-50%) translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1vmin",this.panelElement.style.padding="1.5vmin",this.panelElement.style.minWidth="24vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation()}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",()=>{this.closePanel()}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateX(-50%) translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){return`\n <div class="lvc-year-panel-header">\n <span class="lvc-year-nav-btn" data-direction="-1">◀</span>\n <span>${this.displayRange}</span>\n <span class="lvc-year-nav-btn" data-direction="1">▶</span>\n </div>\n <div class="lvc-year-grid">\n ${this.yearList.map(e=>{const t=this.getYearCellClasses(e);return`<span class="${Object.entries(t).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-year="${e}">${e}</span>`}).join("")}\n </div>\n <div class="lvc-year-panel-footer">\n <span class="lvc-year-action-btn is-outline" data-action="clear">清空</span>\n <div class="lvc-year-right-actions">\n <span class="lvc-year-action-btn is-outline" data-action="cancel">取消</span>\n <span class="lvc-year-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},getYearCellClasses(e){let t={"lvc-year-cell":!0,"is-current":e===this.currentYearNow};if(this.isRangeMode){const n=null!==this.tempStartYear,i=null!==this.tempEndYear;t["is-active"]=n&&e===this.tempStartYear||i&&e===this.tempEndYear,t["is-in-range"]=n&&i&&e>this.tempStartYear&&e<this.tempEndYear}else t["is-active"]=this.tempYear===e;return t},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-year-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction);e.addEventListener("click",e=>{e.stopPropagation(),-1===t?this.prevRange():this.nextRange()})}),this.panelElement.querySelectorAll(".lvc-year-cell").forEach(e=>{const t=parseInt(e.dataset.year);e.addEventListener("click",e=>{e.stopPropagation(),this.selectYear(t)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.tempStartYear&&(this.hoverYear=t,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverYear&&(this.hoverYear=null,this.clearHoverRangeStyle())}))}),this.panelElement.querySelectorAll(".lvc-year-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"cancel":this.handleCancel();break;case"confirm":this.handleConfirm()}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-year-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left+t.width/2;const s=window.innerHeight,l=window.innerWidth,o=this.panelElement.getBoundingClientRect();n+o.height>s&&(n=t.top-o.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px"));const a=o.width/2;i-a<0?i=a+.1731:i+a>l&&(i=l-a-.1731),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},updateHoverRangeStyle(){if(!this.panelElement||null===this.hoverYear||null===this.tempStartYear)return;const e=this.tempStartYear,t=this.hoverYear,n=Math.min(e,t),i=Math.max(e,t);this.panelElement.querySelectorAll(".lvc-year-cell").forEach(e=>{const t=parseInt(e.dataset.year);t>n&&t<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-year-cell.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},prevRange(){this.rangeStart-=2*this.yearRange+1,this.updatePanelContent()},nextRange(){this.rangeStart+=2*this.yearRange+1,this.updatePanelContent()},selectYear(e){if(this.hoverYear=null,this.isRangeMode){const t=null!==this.tempStartYear,n=null!==this.tempEndYear;"start"===this.selectingRangePart||t&&n?(this.tempStartYear=e,this.tempEndYear=null,this.selectingRangePart="end"):(e<this.tempStartYear?(this.tempEndYear=this.tempStartYear,this.tempStartYear=e):this.tempEndYear=e,this.selectingRangePart="start"),this.tempStartYear&&this.tempEndYear?this.$emit("input",[String(this.tempStartYear),String(this.tempEndYear)]):this.tempStartYear&&this.$emit("input",[String(this.tempStartYear),""])}else{this.tempYear=e;const t=String(this.tempYear);this.$emit("input",t)}this.updatePanelContent()},handleClear(){this.isRangeMode?(this.$emit("input",["",""]),this.tempStartYear=null,this.tempEndYear=null,this.selectingRangePart="start"):(this.$emit("input",""),this.tempYear=null),this.isPanelOpen&&this.updatePanelContent()},handleCancel(){this.closePanel()},handleConfirm(){if(this.isRangeMode){if(this.tempStartYear&&this.tempEndYear){const e=String(this.tempStartYear),t=String(this.tempEndYear);this.$emit("input",[e,t]),this.$emit("confirm",[e,t]),this.$emit("change",[e,t])}}else{const e=String(this.tempYear);this.$emit("input",e),this.$emit("confirm",e),this.$emit("change",e)}this.closePanel()},clickOutside(e){const t=this.$refs.pickerContainer;t&&(t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)||this.closePanel())}}};a.component("lvc-year-picker",i),r.lvcYearPicker=i}(),function(){n("lvc-month-picker-style",'.lvc-month-picker{position:relative;display:inline-block;font-size:1.8vmin;color:#fff;user-select:none;height:100%;}.lvc-month-input-wrapper{background:#0d2339;border:1px solid #1e4469;border-radius:0.8vmin;padding:0.6vmin 1vmin;cursor:pointer;display:flex;align-items:center;gap:0.8vmin;min-width:14vmin;transition:all 0.3s;height:100%;}.lvc-month-separator{color:#5d758c;font-size:1.385vmin;flex-shrink:0;}.lvc-month-input-wrapper:hover,.lvc-month-input-wrapper.is-active{border-color:#12bbed;box-shadow:0 0 1.2vmin rgba(18,187,237,0.3);}.lvc-month-inner-input{background:transparent;border:none;color:#fff;outline:none;width:100%;text-align:center;cursor:pointer;font-size:1.3vmin;}.lvc-month-icon-arrow{color:#12bbed;font-size:1.385vmin;transition:transform 0.3s;}.lvc-month-panel{position:absolute;top:5vmin;left:50%;transform:translateX(-50%);background:#0b1a2a;border:1px solid #12bbed;box-shadow:0 1.2vmin 3.5vmin rgba(0,0,0,0.7);border-radius:1vmin;padding:1.5vmin;z-index:9999;min-width:28vmin;}.lvc-month-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1vmin;color:#12bbed;font-size:1.6vmin;}.lvc-month-nav-btn{cursor:pointer;padding:0.3vmin 0.8vmin;font-size:1.4vmin;color:#12bbed;transition:color 0.2s;}.lvc-month-nav-btn:hover{color:#fff;}.lvc-month-grid{display:grid;grid-template-columns:repeat(4,1fr);}.lvc-month-cell{position:relative;height:4.5vmin;line-height:4.5vmin;text-align:center;font-size:1.662vmin;cursor:pointer;border-radius:0.5vmin;color:#8ab4d4;transition:all 0.2s;}.lvc-month-cell:hover{background:rgba(18,187,237,0.2);color:#fff;}.lvc-month-cell.is-active{background:#12bbed;color:#fff;font-weight:bold;}.lvc-month-cell.is-in-range{background:rgba(18,187,237,0.15);color:#12bbed;border-radius:0;}.lvc-month-cell.is-in-hover-range{background:rgba(18,187,237,0.25);color:#fff;border-radius:0;}.lvc-month-cell.is-range-end{border-top-right-radius:0.5vmin;border-bottom-right-radius:0.5vmin;}.lvc-month-cell.is-range-start{border-top-left-radius:0.5vmin;border-bottom-left-radius:0.5vmin;}.lvc-month-cell.is-current::after{content:"";position:absolute;bottom:0.5vmin;left:50%;width:0.6vmin;height:0.6vmin;background:#12bbed;border-radius:50%;transform:translateX(-50%);}.lvc-month-panel-footer{border-top:1px solid rgba(255,255,255,0.05);margin-top:1vmin;padding-top:1vmin;display:flex;justify-content:space-between;align-items:center;gap:1vmin;}.lvc-month-right-actions{display:flex;gap:1vmin;}.lvc-month-action-btn{font-size:1.662vmin;cursor:pointer;padding:0.554vmin 1.662vmin;border-radius:0.5vmin;transition:all 0.2s;}.lvc-month-action-btn.is-outline{border:1px solid #1e4469;color:#8ab4d4;}.lvc-month-action-btn.is-outline:hover{border-color:#12bbed;color:#12bbed;}.lvc-month-action-btn.is-primary{background:#12bbed;color:#fff;}.lvc-month-action-btn.is-primary:hover{background:#0ea8d4;}.lvc-month-fade-enter-active,.lvc-month-fade-leave-active{transition:opacity 0.25s cubic-bezier(0.23,1,0.32,1),transform 0.25s cubic-bezier(0.23,1,0.32,1);}.lvc-month-fade-enter,.lvc-month-fade-leave-to{opacity:0;transform:translateY(1.662vmin) scale(0.98);}');let e=[],t=0;const i={name:"lvcMonthPicker",props:{value:{type:[String,Array],default:""},type:{type:String,default:"month"},rangeSeparator:{type:String,default:"至"},singlePlaceholder:{type:String,default:"请选择月份"},startPlaceholder:{type:String,default:"开始月份"},endPlaceholder:{type:String,default:"结束月份"}},template:'\n <div class="lvc-month-picker" ref="pickerContainer">\n <div class="lvc-month-input-wrapper" :class="{ \'is-active\': isPanelOpen }" @click="handleTogglePanel">\n <template v-if="isRangeMode">\n <input class="lvc-month-inner-input" readonly :value="displayValues[0]" :placeholder="startPlaceholder" />\n <span class="lvc-month-separator">{{ rangeSeparator }}</span>\n <input class="lvc-month-inner-input" readonly :value="displayValues[1]" :placeholder="endPlaceholder" />\n </template>\n <template v-else>\n <input class="lvc-month-inner-input" readonly :value="displayValue" :placeholder="singlePlaceholder" />\n </template>\n <span class="lvc-month-icon-arrow" :style="{ transform: isPanelOpen ? \'rotate(180deg)\' : \'none\' }">▼</span>\n </div>\n </div>\n',data(){const e=new Date,n="monthrange"===this.type;let i,s;if(this.value)if(n){const t=Array.isArray(this.value)?this.value:["",""];if(t[0]){const e=new Date(t[0]);i=e.getFullYear(),s=e.getMonth()+1}else i=e.getFullYear(),s=e.getMonth()+1}else{const e=new Date(this.value);i=e.getFullYear(),s=e.getMonth()+1}else i=e.getFullYear(),s=e.getMonth()+1;return{isPanelOpen:!1,currentYear:i,currentYearNow:e.getFullYear(),currentMonth:e.getMonth()+1,selectedYear:i,selectedMonth:s,tempYear:i,tempMonth:s,tempStartYear:i,tempStartMonth:s,tempEndYear:i,tempEndMonth:s,selectingRangePart:"start",hoverMonth:null,panelElement:null,overlayElement:null,monthPickerId:"lvc-month-picker-"+ ++t}},watch:{value(e){if(this.isRangeMode){const t=Array.isArray(e)?e:["",""];if(t[0]){const e=new Date(t[0]);this.tempStartYear=e.getFullYear(),this.tempStartMonth=e.getMonth()+1}if(t[1]){const e=new Date(t[1]);this.tempEndYear=e.getFullYear(),this.tempEndMonth=e.getMonth()+1}}else if(e){const t=new Date(e),n=t.getFullYear(),i=t.getMonth()+1;this.tempYear=n,this.tempMonth=i,this.selectedYear=n,this.selectedMonth=i}}},computed:{isRangeMode(){return"monthrange"===this.type},displayValue(){return this.value||""},displayValues(){return Array.isArray(this.value)?[this.value[0]||"",this.value[1]||""]:["",""]}},mounted(){this._onDocClick=e=>{this.clickOutside(e)},document.addEventListener("click",this._onDocClick)},beforeDestroy(){document.removeEventListener("click",this._onDocClick),this.closePanel()},methods:{_parseValue(e){if(!e){const e=new Date;return{year:e.getFullYear(),month:e.getMonth()+1}}const t=e.split("-");return{year:parseInt(t[0]),month:parseInt(t[1])}},handleTogglePanel(){this.isPanelOpen?this.closePanel():(this.closeOtherMonthPickers(),this.openPanel())},openPanel(){this.isPanelOpen=!0,e.push(this),this.syncInternalStateFromValue(),this.$nextTick(()=>{this.createPanel()})},syncInternalStateFromValue(){if(this.isRangeMode){const e=Array.isArray(this.value)?this.value:["",""];if(e[0]){const t=new Date(e[0]);this.tempStartYear=t.getFullYear(),this.tempStartMonth=t.getMonth()+1,this.currentYear=this.tempStartYear}else{const e=new Date;this.tempStartYear=e.getFullYear(),this.tempStartMonth=e.getMonth()+1,this.currentYear=this.tempStartYear}if(e[1]){const t=new Date(e[1]);this.tempEndYear=t.getFullYear(),this.tempEndMonth=t.getMonth()+1}else this.tempEndYear=this.tempStartYear,this.tempEndMonth=this.tempStartMonth;this.selectingRangePart="start"}else{const e=this._parseValue(this.value);this.tempYear=e.year,this.tempMonth=e.month,this.currentYear=this.tempYear,this.selectedYear=this.tempYear,this.selectedMonth=this.tempMonth}},closePanel(){this.isPanelOpen=!1,e=e.filter(e=>e.monthPickerId!==this.monthPickerId),this.removePanel()},closeOtherMonthPickers(){e.forEach(e=>{e.monthPickerId!==this.monthPickerId&&e.closePanel()})},createPanel(){if(this.panelElement&&document.body.contains(this.panelElement))return this.updatePanelContent(),void this.updatePanelPosition();this.removePanel(),this.panelElement=document.createElement("div"),this.panelElement.className="lvc-month-panel",this.panelElement.style.position="fixed",this.panelElement.style.zIndex="9999",this.panelElement.style.opacity="0",this.panelElement.style.transform="translateX(-50%) translateY(1.662vmin) scale(0.98)",this.panelElement.style.transition="opacity 0.25s cubic-bezier(0.23, 1, 0.32, 1), transform 0.25s cubic-bezier(0.23, 1, 0.32, 1)",this.panelElement.style.background="#0b1a2a",this.panelElement.style.border="1px solid #12bbed",this.panelElement.style.boxShadow="0 1.2vmin 3.5vmin rgba(0, 0, 0, 0.7)",this.panelElement.style.borderRadius="1vmin",this.panelElement.style.padding="1.5vmin",this.panelElement.style.minWidth="28vmin",this.panelElement.addEventListener("click",e=>{e.stopPropagation()}),this.panelElement.innerHTML=this.generatePanelContent(),document.body.appendChild(this.panelElement),this.overlayElement=document.createElement("div"),this.overlayElement.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;z-index:9998;",this.overlayElement.addEventListener("click",()=>{this.closePanel()}),document.body.appendChild(this.overlayElement),this.updatePanelPosition(),this.addEventListeners(),setTimeout(()=>{this.panelElement.style.opacity="1",this.panelElement.style.transform="translateX(-50%) translateY(0) scale(1)"},10),this.bindPanelEvents()},updatePanelContent(){this.panelElement&&(this.panelElement.innerHTML=this.generatePanelContent(),this.bindPanelEvents())},generatePanelContent(){return`\n <div class="lvc-month-panel-header">\n <span class="lvc-month-nav-btn" data-direction="-1">◀</span>\n <span>${this.currentYear}年</span>\n <span class="lvc-month-nav-btn" data-direction="1">▶</span>\n </div>\n <div class="lvc-month-grid">\n ${Array.from({length:12},(e,t)=>{const n=t+1,i=this.getMonthCellClasses(n);return`<span class="${Object.entries(i).filter(([e,t])=>t).map(([e,t])=>e).join(" ")}" data-month="${n}">${n}月</span>`}).join("")}\n </div>\n <div class="lvc-month-panel-footer">\n <span class="lvc-month-action-btn is-outline" data-action="clear">清空</span>\n <div class="lvc-month-right-actions">\n <span class="lvc-month-action-btn is-outline" data-action="cancel">取消</span>\n <span class="lvc-month-action-btn is-primary" data-action="confirm">确定</span>\n </div>\n </div>\n `},getMonthCellClasses(e){let t={"lvc-month-cell":!0,"is-current":e===this.currentMonth&&this.currentYear===this.currentYearNow};if(this.isRangeMode){const n=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,i=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`,s=`${this.currentYear}-${String(e).padStart(2,"0")}`,l=null!==this.tempStartYear,o=null!==this.tempEndYear;t["is-active"]=l&&s===n||o&&s===i,t["is-in-range"]=l&&o&&s>n&&s<i,t["is-range-start"]=l&&s===n,t["is-range-end"]=o&&s===i}else t["is-active"]=this.tempMonth===e&&this.currentYear===this.tempYear;return t},bindPanelEvents(){this.panelElement&&(this.panelElement.querySelectorAll(".lvc-month-nav-btn").forEach(e=>{const t=parseInt(e.dataset.direction);e.addEventListener("click",e=>{e.stopPropagation(),-1===t?this.prevYear():this.nextYear()})}),this.panelElement.querySelectorAll(".lvc-month-cell").forEach(e=>{const t=parseInt(e.dataset.month);e.addEventListener("click",e=>{e.stopPropagation(),this.selectMonth(t)}),this.isRangeMode&&(e.addEventListener("mouseenter",e=>{"end"===this.selectingRangePart&&this.tempStartYear&&(this.hoverMonth=`${this.currentYear}-${String(t).padStart(2,"0")}`,this.updateHoverRangeStyle())}),e.addEventListener("mouseleave",e=>{this.hoverMonth&&(this.hoverMonth=null,this.clearHoverRangeStyle())}))}),this.panelElement.querySelectorAll(".lvc-month-action-btn").forEach(e=>{const t=e.dataset.action;e.addEventListener("click",e=>{switch(e.stopPropagation(),t){case"clear":this.handleClear();break;case"cancel":this.handleCancel();break;case"confirm":this.handleConfirm()}})}))},updatePanelPosition(){const e=this.$el.querySelector(".lvc-month-input-wrapper");if(e&&this.panelElement){const t=e.getBoundingClientRect();let n=t.bottom+.1385,i=t.left+t.width/2;const s=window.innerHeight,l=window.innerWidth,o=this.panelElement.getBoundingClientRect();n+o.height>s&&(n=t.top-o.height-.1385,n<0&&(n=t.bottom+.1385,this.panelElement.style.maxHeight=s-n-.1731+"px"));const a=o.width/2;i-a<0?i=a+.1731:i+a>l&&(i=l-a-.1731),this.panelElement.style.top=`${n}px`,this.panelElement.style.left=`${i}px`}},updateHoverRangeStyle(){if(!this.panelElement||!this.hoverMonth||!this.tempStartYear)return;const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=this.hoverMonth,n=e<t?e:t,i=e<t?t:e;this.panelElement.querySelectorAll(".lvc-month-cell").forEach(e=>{const t=parseInt(e.dataset.month),s=`${this.currentYear}-${String(t).padStart(2,"0")}`;s>n&&s<i?e.classList.add("is-in-hover-range"):e.classList.remove("is-in-hover-range")})},clearHoverRangeStyle(){this.panelElement&&this.panelElement.querySelectorAll(".lvc-month-cell.is-in-hover-range").forEach(e=>e.classList.remove("is-in-hover-range"))},addEventListeners(){this.handleScroll=this.updatePanelPosition.bind(this),this.handleResize=this.updatePanelPosition.bind(this),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleResize)},removeEventListeners(){this.handleScroll&&window.removeEventListener("scroll",this.handleScroll,!0),this.handleResize&&window.removeEventListener("resize",this.handleResize)},removePanel(){this.removeEventListeners(),this.overlayElement&&this.overlayElement.parentNode&&(document.body.removeChild(this.overlayElement),this.overlayElement=null),this.panelElement&&this.panelElement.parentNode&&(document.body.removeChild(this.panelElement),this.panelElement=null)},prevYear(){this.currentYear--,this.updatePanelContent()},nextYear(){this.currentYear++,this.updatePanelContent()},selectMonth(e){if(this.hoverMonth=null,this.isRangeMode){const t=`${this.currentYear}-${String(e).padStart(2,"0")}`,n=this.tempStartYear?`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`:"",i=!!this.tempStartYear,s=!!this.tempEndYear;if("start"===this.selectingRangePart||i&&s?(this.tempStartYear=this.currentYear,this.tempStartMonth=e,this.tempEndYear=null,this.tempEndMonth=null,this.selectingRangePart="end"):(t<n?(this.tempEndYear=this.tempStartYear,this.tempEndMonth=this.tempStartMonth,this.tempStartYear=this.currentYear,this.tempStartMonth=e):(this.tempEndYear=this.currentYear,this.tempEndMonth=e),this.selectingRangePart="start"),this.tempStartYear&&this.tempEndYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`;this.$emit("input",[e,t])}else if(this.tempStartYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`;this.$emit("input",[e,""])}}else{this.tempMonth=e,this.tempYear=this.currentYear;const t=String(this.tempMonth).padStart(2,"0"),n=`${this.tempYear}-${t}`;this.$emit("input",n)}this.updatePanelContent()},handleClear(){this.isRangeMode?(this.$emit("input",["",""]),this.tempStartYear=null,this.tempStartMonth=null,this.tempEndYear=null,this.tempEndMonth=null,this.selectingRangePart="start"):(this.$emit("input",""),this.tempYear=null,this.tempMonth=null),this.isPanelOpen&&this.updatePanelContent()},handleCancel(){this.closePanel()},handleConfirm(){if(this.isRangeMode){if(this.tempStartYear&&this.tempEndYear){const e=`${this.tempStartYear}-${String(this.tempStartMonth).padStart(2,"0")}`,t=`${this.tempEndYear}-${String(this.tempEndMonth).padStart(2,"0")}`;this.$emit("input",[e,t]),this.$emit("confirm",[e,t])}}else{const e=String(this.tempMonth).padStart(2,"0"),t=`${this.tempYear}-${e}`;this.$emit("input",t),this.$emit("confirm",t)}this.closePanel()},clickOutside(e){const t=this.$refs.pickerContainer;t&&(t.contains(e.target)||this.panelElement&&this.panelElement.contains(e.target)||this.closePanel())}}};a.component("lvc-month-picker",i),r.lvcMonthPicker=i}(),function(){const e=document.createElement("style");function t(e,n){if(-1!==e.indexOf(n.id))return!0;if(!n.children||0===n.children.length)return!1;for(let i=0;i<n.children.length;i++)if(t(e,n.children[i]))return!0;return!1}e.id="lvc-tree-style",e.textContent=[".lvc-tree { user-select: none; overflow-y: auto; }",".lvc-tree::-webkit-scrollbar { width: 0.4vmin; }",".lvc-tree::-webkit-scrollbar-track { background: rgba(10, 22, 40, 0.3); }",".lvc-tree::-webkit-scrollbar-thumb { background: #1e3a5f; border-radius: 0.2vmin; }",".lvc-tree::-webkit-scrollbar-thumb:hover { background: #22a6b3; }",".lvc-tree-node { }",".lvc-tree-node-content { display: flex; align-items: stretch; }",".lvc-tree-node-left { display: inline-flex; align-items: center; flex-shrink: 0; }",".lvc-tree-node-right { display: flex; align-items: center; flex: 1; padding: 0.6vmin 0.8vmin; cursor: pointer; border-radius: 0.4vmin; transition: background 0.2s; font-size: 1.2vmin; color: #cfefff; min-width: 0; }",".lvc-tree-node-right:hover { background: rgba(34, 166, 179, 0.15); }",".lvc-tree-node-right.selected { background: rgba(34, 166, 179, 0.25); color: #22a6b3; }",".lvc-tree-node-arrow { width: 2vmin; font-size: 1.2vmin; color: #8ab4d4; transition: transform 0.2s; display: inline-block; text-align: center; flex-shrink: 0; }",".lvc-tree-node-arrow.expanded { transform: rotate(90deg); }",".lvc-tree-node-arrow-placeholder { width: 1.5vmin; display: inline-block; flex-shrink: 0; }",".lvc-tree-node-icon { width: 1.5vmin; height: 1.5vmin; margin-right: 0.8vmin; display: inline-flex; align-items: center; justify-content: center; font-size: 1.2vmin; flex-shrink: 0; }",'.lvc-tree-node-icon.folder::before { content: "\\1F4C1"; }','.lvc-tree-node-icon.meter::before { content: "\\1F4CA"; }','.lvc-tree-node-icon.data::before { content: "\\1F4C8"; }','.lvc-tree-node-icon.device::before { content: "\\2699\\FE0F"; }','.lvc-tree-node-icon.default::before { content: "\\1F4C4"; }',".lvc-tree-node-label { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }",".lvc-tree-node-children { padding-left: 1.5vmin; }",".lvc-tree-checkbox { display: inline-flex; align-items: center; margin-right: 0.6vmin;margin-left: 0.6vmin; flex-shrink: 0; cursor: pointer; }",".lvc-tree-checkbox input { display: none; }",".lvc-tree-checkbox .checkbox-box { width: 1.4vmin; height: 1.4vmin; border: 0.15vmin solid #4a7899; border-radius: 0.2vmin; display: inline-flex; align-items: center; justify-content: center; transition: all 0.2s; background: transparent; position: relative; }",".lvc-tree-checkbox:hover .checkbox-box { border-color: #22a6b3; }",".lvc-tree-checkbox.checked .checkbox-box { background: #22a6b3; border-color: #22a6b3; }",'.lvc-tree-checkbox.checked .checkbox-box::after { content: ""; width: 0.4vmin; height: 0.7vmin; border: 0.15vmin solid #fff; border-top: none; border-left: none; transform: rotate(45deg) translate(-0.05vmin, -0.1vmin); }',".lvc-tree-checkbox.indeterminate .checkbox-box { background: #22a6b3; border-color: #22a6b3; }",'.lvc-tree-checkbox.indeterminate .checkbox-box::after { content: ""; width: 0.7vmin; height: 0.15vmin; background: #fff; border-radius: 0.1vmin; }'].join("\n"),document.getElementById("lvc-tree-style")||document.head.appendChild(e);const n={name:"LvcTree",components:{"lvc-tree-node":{name:"LvcTreeNode",props:{node:{type:Object,required:!0},selectedId:{type:[String,Number],default:null},defaultExpandAll:{type:Boolean,default:!1},showCheckbox:{type:Boolean,default:!1},checkedKeys:{type:Array,default:()=>[]},filterText:{type:String,default:""},filterNodeMethod:{type:Function,default:null},autoExpandOnFilter:{type:Boolean,default:!0},isRoot:{type:Boolean,default:!1}},data(){return{expanded:void 0!==this.node.expanded?this.node.expanded:this.defaultExpandAll}},watch:{filterText:{handler(e){this.autoExpandOnFilter&&e&&this.hasChildren?this._nodeMatchesFilter(this.node)&&(this.expanded=!0):this.expanded=this.isRoot},immediate:!1}},template:['<div class="lvc-tree-node" v-show="isVisible">',' <div class="lvc-tree-node-content">',' <span class="lvc-tree-node-left">',' <span v-if="hasChildren" class="lvc-tree-node-arrow" :class="{ expanded: expanded }" @click.stop="handleToggle">▶</span>',' <span v-else class="lvc-tree-node-arrow-placeholder"></span>',' <span v-if="showCheckbox" class="lvc-tree-checkbox" :class="checkboxClass" @click.stop.prevent="handleCheck">',' <span class="checkbox-box"></span>'," </span>"," </span>",' <span class="lvc-tree-node-right" :class="{ selected: node.id === selectedId }" @click="handleClick">',' <span v-if="nodeIcon" class="lvc-tree-node-icon" :class="nodeIcon"></span>',' <span class="lvc-tree-node-label" :title="node.label">{{ node.label }}</span>'," </span>"," </div>",' <div v-if="expanded && hasChildren" class="lvc-tree-node-children">',' <lvc-tree-node v-for="child in node.children" :key="child.id" :node="child" :selected-id="selectedId" :default-expand-all="defaultExpandAll" :show-checkbox="showCheckbox" :checked-keys="checkedKeys" :filter-text="filterText" :filter-node-method="filterNodeMethod" :auto-expand-on-filter="autoExpandOnFilter" @select="$emit(\'select\', $event)" @toggle="$emit(\'toggle\', $event)" @check-change="$emit(\'check-change\', $event)"></lvc-tree-node>'," </div>","</div>"].join("\n"),computed:{hasChildren(){return this.node.children&&this.node.children.length>0},nodeIcon(){return this.node.icon||""},isChecked(){return-1!==this.checkedKeys.indexOf(this.node.id)},childCheckedCount(){if(!this.hasChildren)return 0;let e=0;for(let n=0;n<this.node.children.length;n++){const i=this.node.children[n];(-1!==this.checkedKeys.indexOf(i.id)||t(this.checkedKeys,i))&&e++}return e},isIndeterminate(){if(!this.hasChildren)return!1;const e=this.childCheckedCount;return e>0&&e<this.node.children.length},checkboxClass(){return this.isChecked?"checked":this.isIndeterminate?"indeterminate":""},isVisible(){return!this.filterText||!this.filterNodeMethod||!!this.filterNodeMethod(this.filterText,this.node)||!!this.hasChildren&&this._hasVisibleChild(this.node.children)}},methods:{handleClick(){try{this.showCheckbox?this.handleCheck():this.$emit("select",this.node)}catch(e){console.error("[LvcTree] click event error:",e)}},handleToggle(){try{this.expanded=!this.expanded,this.$emit("toggle",{node:this.node,expanded:this.expanded})}catch(e){console.error("[LvcTree] toggle event error:",e)}},handleCheck(){try{let e;e=!this.isIndeterminate&&!this.isChecked;const t=this._collectVisibleDescendantIds(this.node),n=!(this.filterText&&this.filterNodeMethod)||this.filterNodeMethod(this.filterText,this.node)?[this.node.id,...t]:t;this.$emit("check-change",{node:this.node,checked:e,indeterminate:!1,affectedIds:n})}catch(e){console.error("[LvcTree] check event error:",e)}},_collectDescendantIds(e){const t=[];if(e.children&&e.children.length>0)for(let n=0;n<e.children.length;n++){const i=e.children[n];t.push(i.id),t.push(...this._collectDescendantIds(i))}return t},_collectVisibleDescendantIds(e){const t=[];if(!e.children||0===e.children.length)return t;for(let n=0;n<e.children.length;n++){const i=e.children[n];this._isNodeVisible(i)&&((!(this.filterText&&this.filterNodeMethod)||this.filterNodeMethod(this.filterText,i))&&t.push(i.id),t.push(...this._collectVisibleDescendantIds(i)))}return t},_isNodeVisible(e){if(!this.filterText||!this.filterNodeMethod)return!0;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._isNodeVisible(e.children[t]))return!0;return!1},_hasVisibleChild(e){if(!e||0===e.length)return!1;for(let t=0;t<e.length;t++){const n=e[t];if(this.filterNodeMethod(this.filterText,n))return!0;if(n.children&&n.children.length>0&&this._hasVisibleChild(n.children))return!0}return!1},_nodeMatchesFilter(e){if(!this.filterText||!this.filterNodeMethod)return!1;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._nodeMatchesFilter(e.children[t]))return!0;return!1}}}},props:{data:{type:Array,default:()=>[]},selectedId:{type:[String,Number],default:null},defaultExpandAll:{type:Boolean,default:!1},showCheckbox:{type:Boolean,default:!1},defaultCheckedKeys:{type:Array,default:()=>[]},maxCheck:{type:Number,default:0},filterNodeMethod:{type:Function,default:null},autoExpandOnFilter:{type:Boolean,default:!0}},data(){return{checkedKeys:this.defaultCheckedKeys.slice(),filterText:""}},watch:{defaultCheckedKeys:{handler(e){this.checkedKeys=e.slice()},deep:!0},filterText(e){this.$emit("filter-change",e)}},template:['<div class="lvc-tree">',' <lvc-tree-node v-for="node in data" :key="node.id" :node="node" :selected-id="selectedId" :default-expand-all="defaultExpandAll" :show-checkbox="showCheckbox" :checked-keys="checkedKeys" :filter-text="filterText" :filter-node-method="filterNodeMethod" :auto-expand-on-filter="autoExpandOnFilter" :is-root="true" @select="$emit(\'select\', $event)" @toggle="$emit(\'toggle\', $event)" @check-change="onCheckChange"></lvc-tree-node>',' <div v-if="!data || data.length === 0" class="lvc-tree-empty" style="text-align:center;color:#8ab4d4;padding:2vmin 0;font-size:1.2vmin;">暂无数据</div>',"</div>"].join("\n"),methods:{filter(e){this.checkedKeys.length>0&&(this.checkedKeys=[],this.$emit("check-change",{node:null,checked:!1,indeterminate:!1,checkedKeys:[],checkedNodes:[]})),this.filterText=e},onCheckChange(e){try{const t=e.node.id,n=e.checked,i=e.affectedIds||[];if(n)for(let e=0;e<i.length;e++)-1===this.checkedKeys.indexOf(i[e])&&this.checkedKeys.push(i[e]);else for(let e=i.length-1;e>=0;e--){const t=this.checkedKeys.indexOf(i[e]);-1!==t&&this.checkedKeys.splice(t,1)}this._updateAncestors(this.data,t);const s=this._countCheckedLeaves(this.data);if(this.maxCheck>0&&s>this.maxCheck){const e=this._collectLimitedKeys(this.maxCheck);this.checkedKeys=e,this._updateAllAncestors(),this.$emit("max-check-exceeded",{max:this.maxCheck,actual:s})}const l=this._collectCheckedNodesWithAncestors(this.data);this.$emit("check-change",{node:e.node,checked:n,indeterminate:!1,checkedKeys:this.checkedKeys.slice(),checkedNodes:l})}catch(e){console.error("[LvcTree] check-change handler error:",e)}},_updateAncestors(e,t){const n=this._getParentChain(this.data,t);for(let e=0;e<n.length;e++){const t=n[e];let i=!0;for(let e=0;e<t.children.length;e++){const n=t.children[e];if(!this._isNodeFullyChecked(n)){i=!1;break}}if(i&&t.children.length>0)-1===this.checkedKeys.indexOf(t.id)&&this.checkedKeys.push(t.id);else{const e=this.checkedKeys.indexOf(t.id);-1!==e&&this.checkedKeys.splice(e,1)}}},_getParentChain(e,t,n){n=n||[];for(let i=0;i<e.length;i++){const s=e[i];if(s.children&&s.children.length>0){for(let e=0;e<s.children.length;e++)if(s.children[e].id===t)return n.unshift(s),this._getParentChain(this.data,s.id,n),n;const e=this._getParentChain(s.children,t,n);if(e.length>0)return e}}return n},_isNodeFullyChecked(e){if(-1===this.checkedKeys.indexOf(e.id))return!1;if(!e.children||0===e.children.length)return!0;for(let t=0;t<e.children.length;t++)if(!this._isNodeFullyChecked(e.children[t]))return!1;return!0},_isDescendant(e,t){if(!e.children||0===e.children.length)return!1;for(let n=0;n<e.children.length;n++){const i=e.children[n];if(i.id===t)return!0;if(this._isDescendant(i,t))return!0}return!1},getCheckedKeys(){return this.checkedKeys.slice()},setCheckedKeys(e){this.checkedKeys=e.slice()},getHalfCheckedKeys(){const e=[];return this._collectHalfChecked(this.data,e),e},_collectHalfChecked(e,t){for(let n=0;n<e.length;n++){const i=e[n];if(i.children&&i.children.length>0){let e=0;for(let t=0;t<i.children.length;t++)-1!==this.checkedKeys.indexOf(i.children[t].id)&&e++;e>0&&e<i.children.length&&t.push(i.id),this._collectHalfChecked(i.children,t)}}},_isNodeVisible(e){if(!this.filterText||!this.filterNodeMethod)return!0;if(this.filterNodeMethod(this.filterText,e))return!0;if(e.children&&e.children.length>0)for(let t=0;t<e.children.length;t++)if(this._isNodeVisible(e.children[t]))return!0;return!1},_countCheckedLeaves(e){e=e||this.data;let t=0;for(let n=0;n<e.length;n++){const i=e[n];this._isNodeVisible(i)&&(i.children&&i.children.length>0?t+=this._countCheckedLeaves(i.children):-1!==this.checkedKeys.indexOf(i.id)&&t++)}return t},_collectLimitedKeys(e){const t=new Set;let n=0;const i=(s,l)=>{for(let o=0;o<s.length;o++){const a=s[o];if(n>=e)return;if(this._isNodeVisible(a))if(a.children&&a.children.length>0)if(-1!==this.checkedKeys.indexOf(a.id))i(a.children,l.concat(a.id));else for(let t=0;t<a.children.length;t++){if(n>=e)return;const s=a.children[t];(-1!==this.checkedKeys.indexOf(s.id)||this._hasCheckedDescendant(s))&&i([s],l.concat(a.id))}else if(-1!==this.checkedKeys.indexOf(a.id)){n++;for(let e=0;e<l.length;e++)t.add(l[e]);t.add(a.id)}}};return i(this.data,[]),Array.from(t)},_hasCheckedDescendant(e){if(!e.children||0===e.children.length)return!1;for(let t=0;t<e.children.length;t++){const n=e.children[t];if(-1!==this.checkedKeys.indexOf(n.id)||this._hasCheckedDescendant(n))return!0}return!1},_updateAllAncestors(){const e=t=>{for(let n=0;n<t.length;n++){const i=t[n];if(i.children&&i.children.length>0){e(i.children);let t=!0;for(let e=0;e<i.children.length;e++)if(!this._isNodeFullyChecked(i.children[e])){t=!1;break}if(t&&i.children.length>0)-1===this.checkedKeys.indexOf(i.id)&&this.checkedKeys.push(i.id);else{const e=this.checkedKeys.indexOf(i.id);-1!==e&&this.checkedKeys.splice(e,1)}}}};e(this.data)},_collectCheckedNodesWithAncestors(e){const n=[];for(let i=0;i<e.length;i++){const s=e[i];if(-1!==this.checkedKeys.indexOf(s.id))n.push(this._deepCopyNode(s));else if(s.children&&s.children.length>0&&t(this.checkedKeys,s)){const e=this._collectCheckedNodesWithAncestors(s.children);if(e.length>0){const t=Object.assign({},s);t.children=e,n.push(t)}}}return n},_deepCopyNode(e){const t=Object.assign({},e);return e.children&&e.children.length>0?t.children=e.children.map(e=>this._deepCopyNode(e)):t.children=[],t}}};void 0!==a&&(r.LvcTree=n,a.component("lvc-tree",n))}(),function(){n("lvc-dialog-style",":root{--lvc-primary:#12bbed;--lvc-bg-dark:#0b1a2a;--lvc-bg-input:#0d2339;--lvc-border:#1e4469;--lvc-text:#fff;--lvc-text-dim:#8cabc4;}.lvc-dialog-mask{position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.7);display:flex;align-items:center;justify-content:center;z-index:10000;backdrop-filter:blur(4px);}.lvc-dialog-box{background:var(--lvc-bg-dark);border:1px solid var(--lvc-primary);border-radius:1.108vmin;box-shadow:0 1.385vmin 5.54vmin rgba(0,0,0,0.8);display:flex;flex-direction:column;overflow:hidden;min-width:44.32vmin;max-width:90vw;color:var(--lvc-text);font-size:1.9391vmin;}.lvc-dialog-header{padding:2.216vmin 2.77vmin;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(18,187,237,0.1);}.lvc-dialog-title{font-weight:bold;color:var(--lvc-primary);letter-spacing:0.138vmin;}.lvc-dialog-close{cursor:pointer;color:var(--lvc-text-dim);font-size:2.493vmin;transition:all 0.3s;line-height:1;}.lvc-dialog-close:hover{color:var(--lvc-primary);transform:rotate(90deg);}.lvc-dialog-body{padding:2.77vmin;min-height:11.08vmin;max-height:70vh;overflow-y:auto;line-height:1.6;}.lvc-dialog-footer{padding:1.662vmin 2.77vmin;display:flex;justify-content:flex-end;gap:1.662vmin;background:rgba(18,187,237,0.03);}.lvc-dialog-btn{padding:0.831vmin 2.216vmin;font-size:1.662vmin;border-radius:0.554vmin;cursor:pointer;transition:all 0.3s;border:1px solid var(--lvc-border);background:transparent;color:var(--lvc-text-dim);}.lvc-dialog-btn:hover{border-color:var(--lvc-primary);color:var(--lvc-text);box-shadow:0 0 1.108vmin rgba(18,187,237,0.2);}.lvc-dialog-btn-primary{background:var(--lvc-primary);border-color:var(--lvc-primary);color:#fff;}.lvc-dialog-btn-primary:hover{background:#15d2ff;box-shadow:0 0 1.662vmin rgba(18,187,237,0.4);}.lvc-dialog-fade-enter-active,.lvc-dialog-fade-leave-active{transition:opacity 0.3s;}.lvc-dialog-fade-enter,.lvc-dialog-fade-leave-to{opacity:0;}.lvc-dialog-zoom-enter-active,.lvc-dialog-zoom-leave-active{transition:transform 0.3s cubic-bezier(0.34,1.56,0.64,1);}.lvc-dialog-zoom-enter,.lvc-dialog-zoom-leave-to{transform:scale(0.9) translateY(-2.77vmin);}");const e={name:"lvcDialog",props:{visible:{type:Boolean,default:!1},title:{type:String,default:"提示"},content:{type:String,default:""},width:{type:String,default:"44.32vmin"},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},showCancel:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},showFooter:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0}},template:'\n <transition name="lvc-dialog-fade">\n <div v-if="visible" class="lvc-dialog-mask" @click.self="handleMaskClick">\n <transition name="lvc-dialog-zoom">\n <div v-if="visible" class="lvc-dialog-box" :style="{ width: width }">\n <div class="lvc-dialog-header">\n <span class="lvc-dialog-title">{{ title }}</span>\n <span v-if="showClose" class="lvc-dialog-close" @click="close">×</span>\n </div>\n <div class="lvc-dialog-body">\n <slot>{{ content }}</slot>\n </div>\n <div class="lvc-dialog-footer" v-if="showFooter">\n <button v-if="showCancel" class="lvc-dialog-btn" @click="handleCancel">{{ cancelText }}</button>\n <button class="lvc-dialog-btn lvc-dialog-btn-primary" @click="handleConfirm">{{ confirmText }}</button>\n </div>\n </div>\n </transition>\n </div>\n </transition>\n',methods:{close(){this.$emit("update:visible",!1),this.$emit("close")},handleCancel(){this.$emit("cancel"),this.close()},handleConfirm(){this.$emit("confirm")},handleMaskClick(){this.closeOnClickModal&&this.close()}}};a.component("lvc-dialog",e),window.lvcDialog={show(e={}){const t=document.createElement("div");return document.body.appendChild(t),new(s())({el:t,data:()=>({visible:!1,...e}),template:'\n <lvc-dialog \n :visible.sync="visible"\n v-bind="$data"\n @confirm="onConfirmAction"\n @cancel="onCancelAction"\n @close="destroy">\n </lvc-dialog>\n ',methods:{async onConfirmAction(){e.onConfirm&&!1===await e.onConfirm()||(this.visible=!1)},onCancelAction(){e.onCancel&&e.onCancel()},destroy(){setTimeout(()=>{this.$destroy(),this.$el.parentNode&&this.$el.parentNode.removeChild(this.$el)},500)}},mounted(){this.visible=!0}})}},r.lvcDialog=e}(),"undefined"!=typeof window&&window.Vue&&d(window.Vue);var h="undefined"!=typeof window?window:{};e.install=d,e.CanvasTopologyUtils=class{constructor(e,t,n=1280){this.canvas=document.getElementById(e),this.container=document.querySelector(t),this.ctx=this.canvas.getContext("2d"),this.baseWidth=n,this.scale=1,this.imgCache={},this.dpr=window.devicePixelRatio||1,this.init()}init(){const e=this.container.clientWidth,t=this.container.clientHeight;this.scale=Math.max(.5,e/this.baseWidth),this.canvas.width=e*this.dpr,this.canvas.height=t*this.dpr,this.canvas.style.width=e+"px",this.canvas.style.height=t+"px",this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(this.dpr,this.dpr)}s(e){return e*this.scale}clear(){this.ctx.clearRect(0,0,this.canvas.width/this.dpr,this.canvas.height/this.dpr)}_buildPath(e){const t=this.ctx;if(e&&0!==e.length){t.beginPath(),t.moveTo(this.s(e[0][0]),this.s(e[0][1]));for(let n=1;n<e.length;n++){const i=e[n];2===i.length?t.lineTo(this.s(i[0]),this.s(i[1])):4===i.length?t.quadraticCurveTo(this.s(i[0]),this.s(i[1]),this.s(i[2]),this.s(i[3])):6===i.length&&t.bezierCurveTo(this.s(i[0]),this.s(i[1]),this.s(i[2]),this.s(i[3]),this.s(i[4]),this.s(i[5]))}}}drawDashLine(e,t={}){const{color:n="rgba(255,255,255,0.2)",width:i=2,dash:s=[4,4]}=t,l=this.ctx;l.save(),this._buildPath(e),l.setLineDash(s.map(e=>this.s(e))),l.lineWidth=this.s(i),l.strokeStyle=n,l.stroke(),l.restore()}drawFlowLine(e,t={}){const{color:n="#00e5ff",width:i=2,dash:s=[10,20],offset:l=0,shadowBlur:o=8,shadowColor:a="#00e5ff"}=t,r=this.ctx;r.save(),this._buildPath(e),r.setLineDash(s.map(e=>this.s(e))),r.lineDashOffset=-this.s(l),r.lineWidth=this.s(i),r.strokeStyle=n,r.shadowBlur=this.s(o),r.shadowColor=a,r.stroke(),r.restore()}drawImage(e,t,n,i,s,l=!0){this.imgCache[e]||(this.imgCache[e]=new Image,this.imgCache[e].src=e);const o=this.imgCache[e];if(o.complete){const e=this.s(i),a=this.s(s),r=l?this.s(t)-e/2:this.s(t),c=l?this.s(n)-a/2:this.s(n);this.ctx.drawImage(o,r,c,e,a)}}drawText(e,t,n,i={}){const{fontSize:s=12,color:l="#fff",align:o="center",baseline:a="top",fontWeight:r="normal"}=i,c=this.ctx;c.save(),c.font=`${r} ${Math.round(this.s(s))}px "PingFang SC", "Microsoft YaHei", Arial`,c.fillStyle=l,c.textAlign=o,c.textBaseline=a,c.fillText(e,this.s(t),this.s(n)),c.restore()}drawNodeImgText(e){const{url:t,x:n,y:i,w:s,h:l,text:o,fontSize:a=12,textColor:r="#fff",gap:c=5}=e;if(this.drawImage(t,n,i,s,l,!0),o){const e=i+l/2+c;this.drawText(o,n,e,{fontSize:a,color:r})}}drawCircle(e,t,n,i={}){const{fillStyle:s,strokeStyle:l,lineWidth:o=2,shadowBlur:a=0,shadowColor:r="transparent"}=i,c=this.ctx;c.save(),c.beginPath(),c.arc(this.s(e),this.s(t),this.s(n),0,2*Math.PI),a>0&&(c.shadowBlur=this.s(a),c.shadowColor=r),s&&(c.fillStyle=s,c.fill()),l&&(c.lineWidth=this.s(o),c.strokeStyle=l,c.stroke()),c.restore()}drawPolygon(e,t={}){const{fillStyle:n,strokeStyle:i,lineWidth:s=2}=t;if(!e||e.length<2)return;const l=this.ctx;l.save(),l.beginPath(),l.moveTo(this.s(e[0][0]),this.s(e[0][1]));for(let t=1;t<e.length;t++)l.lineTo(this.s(e[t][0]),this.s(e[t][1]));l.closePath(),n&&(l.fillStyle=n,l.fill()),i&&(l.lineWidth=this.s(s),l.strokeStyle=i,l.stroke()),l.restore()}drawNode(e,t,n,i,s,l=!1,o=15,a=12){const r=this.ctx,c=this.s(e),d=this.s(t),h=this.s(n),p=this.s(o);r.save(),r.shadowBlur=this.s(15),r.shadowColor=i,r.beginPath(),r.arc(c,d,h,0,2*Math.PI),r.fillStyle="#26455C",r.fill(),r.strokeStyle=i,r.lineWidth=this.s(2),r.stroke(),r.shadowBlur=0,r.beginPath(),r.arc(c,d,.6*h,0,2*Math.PI),r.fillStyle=i,r.fill(),r.textAlign="center",r.textBaseline="middle",r.textAlign="center",r.textBaseline="middle";const m=l?this.s(a):this.s(a+2);if(r.font=`${m}px sans-serif`,l&&s.includes("\n")){const e=s.split("\n");r.fillStyle="#fff",r.fillText(e[0],c,d+h+p),r.fillStyle=i,r.font=`bold ${m+1}px sans-serif`,r.fillText(e[1],c,d+h+2*p)}else r.fillStyle="#fff",r.fillText(s,c,d-h-p);r.restore()}drawFlowCurve(e,t,n){const i=this.ctx,s=Math.atan2(t.y-e.y,t.x-e.x),l=this.s(e.x+Math.cos(s)*e.r),o=this.s(e.y+Math.sin(s)*e.r),a=this.s(t.x-Math.cos(s)*t.r),r=this.s(t.y-Math.sin(s)*t.r),c={x:(l+a)/2,y:(o+r)/2-this.s(10)};i.save(),i.beginPath(),i.moveTo(l,o),i.quadraticCurveTo(c.x,c.y,a,r),i.strokeStyle="#26455C",i.lineWidth=this.s(2),i.stroke(),i.setLineDash([this.s(8),this.s(8)]),i.lineDashOffset=-this.s(n),i.strokeStyle="rgba(0, 243, 255, 1)",i.stroke(),i.restore()}},e.px2EchartsUrils=c,e.createFetch=function(e={}){const t={baseURL:"",headers:{"Content-Type":"application/json"},timeout:1e4,retries:1,retryDelay:500,cache:0,credentials:"same-origin",responseType:"json",mock:!1,concurrency:1/0,dedupe:!0,debounce:200,getToken:()=>localStorage.getItem("emstoken"),refreshToken:async()=>{const e=await fetch("/auth/refresh",{method:"POST",credentials:"same-origin"});if(!e.ok)throw new Error("refresh failed");const t=await e.json();return localStorage.setItem("emstoken",t.token),t.token},onRefreshFail:()=>{localStorage.removeItem("emstoken"),window.location="/login"},onError:e=>{console.error("API ERROR:",e)},showLog:!1,...e},n=new Map,i=new Map,s=new Map;let l=0;const o=[];let a=0;const r=new Set,c={request:{handlers:[]},response:{handlers:[]}},d=new Set;function h(e){r.forEach(t=>{try{t(e)}catch(e){console.error(e)}})}function p(e){return r.add(e),()=>r.delete(e)}function m(e,t,n,i){let s=`${e.toUpperCase()} ${t}`;return n&&(s+="?"+new URLSearchParams(n).toString()),i&&"string"!=typeof i?s+=" body:"+JSON.stringify(i):i&&(s+=" body:"+i),s}function v(e={}){const{method:r="GET",url:d="",params:p=null,body:v=null,headers:u={},debounce:f=t.debounce}=e,g=function(e,t){return e?/^https?:\/\//.test(t)?t:e.replace(/\/+$/,"")+"/"+String(t).replace(/^\/+/,""):t}(t.baseURL,d),b={...e,method:r.toUpperCase(),url:g,headers:{...t.headers||{},...u||{}}};let y=Promise.resolve(b);return c.request.handlers.forEach(({fulfilled:e,rejected:t})=>{y=y.then(t=>e?e(t):t,t)}),y=y.then(e=>{const r=t.getToken?.();r&&!e.headers.Authorization&&(e.headers.Authorization="Bearer "+r);const c=()=>{return s=()=>async function(e){const{url:s,method:l="GET",params:o,body:a,headers:r={},timeout:c=t.timeout,retries:d=t.retries,retryDelay:h=t.retryDelay,cache:p=t.cache,responseType:v=t.responseType,mock:u=t.mock,dedupe:f=t.dedupe}=e;if(u)return"function"==typeof u?await u(e):u;let g=s;if(o){const e=new URLSearchParams(o).toString();g+=(g.includes("?")?"&":"?")+e}const b=m(l,g,null,a);if(f&&n.has(b))return n.get(b);if("GET"===l&&p>0&&i.has(b)){const e=i.get(b);if(Date.now()<e.expiry)return e.data;i.delete(b)}const y=new AbortController,w=y.signal;let k;c>0&&(k=setTimeout(()=>y.abort(),c));let x=0;const E=async()=>{x++;try{const n={method:l,headers:r,credentials:t.credentials,signal:w};null!=a&&(a instanceof FormData||a instanceof Blob?n.body=a:"object"==typeof a&&r["Content-Type"]?.includes("application/json")?n.body=JSON.stringify(a):n.body=a);const s=await fetch(g,n);if(!s.ok){const t=new Error(`HTTP ${s.status}`);throw t.status=s.status,t.config=e,t}let o;return o="json"===v?await s.json():"text"===v?await s.text():"blob"===v?await s.blob():await s.text(),"GET"===l&&p>0&&i.set(b,{data:o,expiry:Date.now()+p}),o}catch(e){if(x<=d)return await new Promise(e=>setTimeout(e,h*x)),E();throw e}finally{k&&clearTimeout(k)}},S=E();return f&&n.set(b,S),S.finally(()=>n.delete(b)),S}(e),new Promise((e,n)=>{const i=()=>{l++,a++,h(a),s().then(e).catch(n).finally(()=>{l--,a=Math.max(0,a-1),h(a),o.length>0&&l<t.concurrency&&o.shift()()})};l<t.concurrency?i():o.push(i)});var s};if(f>0){const t=m(e.method,e.url,e.params,e.body);return s.has(t)&&clearTimeout(s.get(t)),new Promise((e,n)=>{const i=setTimeout(()=>{s.delete(t),c().then(e).catch(n)},f);s.set(t,i)})}return c()}),y.catch(e=>(t.onError?.(e),Promise.reject(e)))}function u(e,t={}){return v({method:"GET",url:e,...t})}function f(e,t,n={}){return v({method:"POST",url:e,body:t,...n})}return{request:v,get:u,post:f,put:function(e,t,n={}){return v({method:"PUT",url:e,body:t,...n})},delete:function(e,t={}){return v({method:"DELETE",url:e,...t})},poll:function(e,t={},n={}){const{method:i="GET",interval:s=5e3,immediate:l=!0,jitter:o=1e3,backoff:a=!0,maxInterval:r=6e4,requestOptions:c={},callback:h=null,errorCallback:p=null,stateful:m=!1,state:v=null}=n;let g=null,b=!1,y=!1,w=!1,k=s;const x=new Map;function E(e,t){x.has(e)&&x.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`Event handler error for ${e}:`,t)}})}const S=async()=>{if(!(b||y||w)){w=!0;try{let n;m&&v&&(v.loading=!0),n="POST"===i?await f(e,t,c):await u(e,{params:t,...c}),k=s,m&&v&&(v.data=n,v.error=null,v.loading=!1),h&&"function"==typeof h&&h(n),E("data",n)}catch(e){m&&v&&(v.error=e,v.loading=!1),p&&"function"==typeof p&&p(e),E("error",e),a&&(k=Math.min(2*k,r))}finally{if(w=!1,!b&&!y){const e=k+(o?Math.random()*o:0);g=setTimeout(S,e)}}}},P=()=>{b=!1,y=!1,l?S():g=setTimeout(S,s)},C={start:P,pause:()=>{y=!0,clearTimeout(g)},resume:()=>{y&&(y=!1,S())},stop:()=>{b=!0,y=!1,clearTimeout(g),d.delete(C),x.clear()},on:function(e,t){return x.has(e)||x.set(e,[]),x.get(e).push(t),()=>{const n=x.get(e),i=n.indexOf(t);i>-1&&n.splice(i,1)}},emit:E,get data(){return v?.data??null},get loading(){return v?.loading??!1},get error(){return v?.error??null}};return d.add(C),P(),C},stopAllPoll:function(){d.forEach(e=>e.stop()),d.clear()},createCancelToken:function(){const e=new AbortController;return{signal:e.signal,cancel:()=>e.abort()}},onLoading:function(e){return p(e)},subscribeLoading:p,interceptors:c,setToken:function(e){null==e?localStorage.removeItem("emstoken"):localStorage.setItem("emstoken",e)},_internal:{pending:n,cacheMap:i}}},e.createRouter=function(e={}){return{vm:null,routes:e.routes||{},default:e.default||"",beforeHooks:[],current:"",parent:e.parent||"",level:e.level||1,isResolving:!1,errorPage:e.errorPage||(1===e.level?"./#/404":"../../#/404"),loginPage:e.loginPage||(1===e.level?"./#/login":"../../#/login"),init(e){this.vm=e;const n=t();void 0===n.__isGoLogin__&&(n.__isGoLogin__=!1),this.beforeEach((e,t,i)=>{const s=localStorage.getItem("tianshui-token");if(e.meta?.requiresAuth)if(s)i();else{if(n.__isGoLogin__)return void i(!1);n.__isGoLogin__=!0,i(!1),n.alert("该页面需要登录,请前往登录页"),n.location.replace("./#/login")}else i()}),this._listener=()=>this.resolve();const i=n;i.addEventListener("hashchange",this._listener),window.addEventListener("beforeunload",()=>{i.removeEventListener("hashchange",this._listener)}),this.resolve()},getRouteConfig(e){const t=this.routes[e];return t?"string"==typeof t?{path:t,meta:{}}:{path:t.path,meta:t.meta||{}}:null},resolve(){if(this.isResolving)return;this.isResolving=!0;const e=t(),n=(e.location.hash||"").replace(/^#\/?/,"").split("/").filter(Boolean);if(this.parent&&n[0]!==this.parent)return void(this.isResolving=!1);let i=n[this.level-1];if(!i&&this.default){i=this.default,n[this.level-1]=i;const t="/"+n.join("/");if(e.location.hash.replace(/^#\/?/,"")!==t.replace(/^\//,""))return e.location.hash=t,void(this.isResolving=!1)}const s=this.getRouteConfig(i);if(!s){if(i){if("login"===i||"login.html"===i)return console.warn(`[Router] login: 层级 ${this.level} 路由 ${i}`),e.location.replace(this.loginPage),void(this.isResolving=!1);console.warn(`[Router] 404: 层级 ${this.level} 找不到路由 ${i}`),e.location.replace(this.errorPage)}return void(this.isResolving=!1)}if(this.current===i)return void(this.isResolving=!1);const l=this.current;this.runBeforeHooks({name:i,meta:s.meta},l,t=>{this.isResolving=!1,!1!==t?"string"!=typeof t?(this.current=i,this.vm&&(this.vm.navPath=s.path,this.vm.activeMenu=i)):this.push(t):l?this.push(l):e.__isGoLogin__||e.location.replace(this.loginPage)})},push(e){const n=t();let i=(n.location.hash||"").replace(/^#\/?/,"").split("/").filter(Boolean);i[this.level-1]=e,i=i.slice(0,this.level),n.location.hash="/"+i.join("/")},beforeEach(e){this.beforeHooks.push(e)},runBeforeHooks(e,t,n){let i=0;const s=l=>{!1!==l&&"string"!=typeof l?i>=this.beforeHooks.length?n():(0,this.beforeHooks[i++])(e,t,s):n(l)};s()}}},e.SocketClient=class{constructor(e,t={}){this.url=e,this.options={heartbeatInterval:3e4,reconnectInterval:5e3,maxReconnectAttempts:5,pingMessage:"ping",...t},this.socket=null,this.reconnectAttempts=0,this.isManualClose=!1,this.messageQueue=[],this.listeners=new Map,this.heartbeatTimer=null,this.serverTimeoutTimer=null,this.connect()}connect(){if(!this.socket||this.socket.readyState!==WebSocket.OPEN&&this.socket.readyState!==WebSocket.CONNECTING)try{this.socket=new WebSocket(this.url),this.initEvents()}catch(e){console.error("WebSocket 建立失败:",e),this.reconnect()}}initEvents(){this.socket.onopen=e=>{console.log("WebSocket 连接成功"),this.reconnectAttempts=0,this.isManualClose=!1,this.startHeartbeat(),this.flushQueue(),this.emit("open",e)},this.socket.onmessage=e=>{this.resetHeartbeat();let t=e.data;try{t=JSON.parse(e.data)}catch(e){}const n=t.topic||t.type;n&&this.emit(n,t),this.emit("message",t)},this.socket.onclose=e=>{this.stopHeartbeat(),this.emit("close",e),this.isManualClose||this.reconnect()},this.socket.onerror=e=>{console.error("WebSocket 异常"),this.emit("error",e)}}send(e){const t="object"==typeof e?JSON.stringify(e):e;this.socket&&this.socket.readyState===WebSocket.OPEN?this.socket.send(t):(console.warn("WebSocket 未连接,消息已进入队列"),this.messageQueue.push(t))}flushQueue(){for(;this.messageQueue.length>0&&this.socket.readyState===WebSocket.OPEN;){const e=this.messageQueue.shift();this.socket.send(e)}}reconnect(){if(-1!==this.options.maxReconnectAttempts&&this.reconnectAttempts>=this.options.maxReconnectAttempts)return void console.error("WebSocket 重连次数达到上限");this.reconnectAttempts++,console.log(`WebSocket 正在尝试第 ${this.reconnectAttempts} 次重连...`);let e=this.options.reconnectInterval*Math.pow(1.5,this.reconnectAttempts-1);e=Math.min(e,6e4),setTimeout(()=>{this.connect()},e)}startHeartbeat(){this.heartbeatTimer=setInterval(()=>{this.send(this.options.pingMessage),this.serverTimeoutTimer=setTimeout(()=>{console.warn("WebSocket 心跳超时,主动断开重连"),this.socket.close()},this.options.heartbeatInterval/2)},this.options.heartbeatInterval)}resetHeartbeat(){clearTimeout(this.serverTimeoutTimer)}stopHeartbeat(){clearInterval(this.heartbeatTimer),clearTimeout(this.serverTimeoutTimer)}close(){this.isManualClose=!0,this.stopHeartbeat(),this.socket&&this.socket.close()}on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){if(!this.listeners.has(e))return;if(!t)return void this.listeners.delete(e);const n=this.listeners.get(e),i=n.indexOf(t);-1!==i&&n.splice(i,1),0===n.length&&this.listeners.delete(e)}emit(e,t){const n=this.listeners.get(e);n&&n.forEach(e=>e(t))}},e.Bus=h.$Bus,e.LvcLoading=h.LvcLoading,e.LvcMessage=h.LvcMessage,e.lvcDialog=h.lvcDialog,e.lvcButton=r.lvcButton,e.lvcSelect=r.lvcSelect,e.lvcTable=r.lvcTable,e.lvcDatePicker=r.lvcDatePicker,e.lvcYearPicker=r.lvcYearPicker,e.lvcMonthPicker=r.lvcMonthPicker,e.lvcDialogComponent=r.lvcDialog,e.LvcTree=r.LvcTree,Object.defineProperty(e,"__esModule",{value:!0})});
|