diff --git a/docs/release-notes-v0.5.0.md b/docs/release-notes-v0.5.0.md new file mode 100644 index 0000000..91f9ed4 --- /dev/null +++ b/docs/release-notes-v0.5.0.md @@ -0,0 +1,25 @@ +# v0.5.0 发布记录 + +发布日期:2026-10-16 + +## 计划模式增强:长期计划 + +- 长期计划(目标)跨越多天:设置起止日期后自动**物化为每一天的任务**,落实到每天打卡与计时 +- 目标进度条:已完成天数 / 总天数一目了然;编辑目标自动级联更新未完成的每日任务 +- 每日任务带「长期」徽标,可与当日临时计划混排;删除目标时二次确认 +- 数据模型新增 goal 表(v6),goal ↔ plan 外键随多端同步(引擎级冒烟验证外键水合正确) + +## 界面原则:内容优先 + +- 记账页:移除内联新增表单,改为「记一笔」按钮弹窗填写,月度汇总与账目表前置 +- 当日详情:移除内联快速记录表单,改为「添加记录」按钮弹窗填写,记录列表前置 +- 工作详情导出从设置页移至详情页,并支持 **Markdown 格式**(当日 / 当周 / 当月 / 自定义时间段,含考勤与逐条记录) + +## 上一版(v0.4.0)要点回顾 + +计划模式(时间段+打卡+计时时钟)、工作与记账分类自定义、工作详情范围导出 CSV + +## 升级说明 + +- 服务器:cd /opt/daywork && git pull && cd server && docker compose up -d --build +- 客户端覆盖安装;本地库自动升级至 v6 diff --git a/intern-log/dist/assets/index-NiysaoXd.js b/intern-log/dist/assets/index-CJCBehez.js similarity index 69% rename from intern-log/dist/assets/index-NiysaoXd.js rename to intern-log/dist/assets/index-CJCBehez.js index 2cd3110..d9ebf8b 100644 --- a/intern-log/dist/assets/index-NiysaoXd.js +++ b/intern-log/dist/assets/index-CJCBehez.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./web-Eue2aiSv.js","./index-IuJhwbTi.js","./index-MT694d7P.css"])))=>i.map(i=>d[i]); -import{r as s,_ as i}from"./index-IuJhwbTi.js";var t;(function(e){e.Documents="DOCUMENTS",e.Data="DATA",e.Library="LIBRARY",e.Cache="CACHE",e.External="EXTERNAL",e.ExternalStorage="EXTERNAL_STORAGE"})(t||(t={}));var a;(function(e){e.UTF8="utf8",e.ASCII="ascii",e.UTF16="utf16"})(a||(a={}));const E=s("Filesystem",{web:()=>i(()=>import("./web-Eue2aiSv.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(e=>new e.FilesystemWeb)});export{t as Directory,a as Encoding,E as Filesystem}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./web-e9jKyg3_.js","./index-DLDMtYxl.js","./index-ieoBMDLY.css"])))=>i.map(i=>d[i]); +import{r as s,_ as i}from"./index-DLDMtYxl.js";var t;(function(e){e.Documents="DOCUMENTS",e.Data="DATA",e.Library="LIBRARY",e.Cache="CACHE",e.External="EXTERNAL",e.ExternalStorage="EXTERNAL_STORAGE"})(t||(t={}));var a;(function(e){e.UTF8="utf8",e.ASCII="ascii",e.UTF16="utf16"})(a||(a={}));const E=s("Filesystem",{web:()=>i(()=>import("./web-e9jKyg3_.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(e=>new e.FilesystemWeb)});export{t as Directory,a as Encoding,E as Filesystem}; diff --git a/intern-log/dist/assets/index-DLDMtYxl.js b/intern-log/dist/assets/index-DLDMtYxl.js new file mode 100644 index 0000000..67a63e6 --- /dev/null +++ b/intern-log/dist/assets/index-DLDMtYxl.js @@ -0,0 +1,27 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const c of i.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&r(c)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/** +* @vue/shared v3.5.44 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Wi(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const pt={},Ms=[],Pn=()=>{},qu=()=>!1,ca=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),da=e=>e.startsWith("onUpdate:"),Pt=Object.assign,Gi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},af=Object.prototype.hasOwnProperty,dt=(e,t)=>af.call(e,t),qe=Array.isArray,as=e=>Wr(e)==="[object Map]",Ls=e=>Wr(e)==="[object Set]",Xl=e=>Wr(e)==="[object Date]",Ye=e=>typeof e=="function",Ct=e=>typeof e=="string",On=e=>typeof e=="symbol",ft=e=>e!==null&&typeof e=="object",Hu=e=>(ft(e)||Ye(e))&&Ye(e.then)&&Ye(e.catch),zu=Object.prototype.toString,Wr=e=>zu.call(e),lf=e=>Wr(e).slice(8,-1),Wu=e=>Wr(e)==="[object Object]",Yi=e=>Ct(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Sr=Wi(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),fa=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},uf=/-\w/g,yn=fa(e=>e.replace(uf,t=>t.slice(1).toUpperCase())),cf=/\B([A-Z])/g,vs=fa(e=>e.replace(cf,"-$1").toLowerCase()),Gu=fa(e=>e.charAt(0).toUpperCase()+e.slice(1)),ri=fa(e=>e?`on${Gu(e)}`:""),An=(e,t)=>!Object.is(e,t),Mo=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},pa=e=>{const t=parseFloat(e);return isNaN(t)?e:t},df=e=>{const t=Ct(e)?Number(e):NaN;return isNaN(t)?e:t};let Ql;const va=()=>Ql||(Ql=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Un(e){if(qe(e)){const t={};for(let n=0;nn.startsWith("/*")?"":n).split(ff).forEach(n=>{if(n){const r=n.split(pf);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Ze(e){let t="";if(Ct(e))t=e;else if(qe(e))for(let n=0;nls(n,t))}const Xu=e=>!!(e&&e.__v_isRef===!0),W=e=>Ct(e)?e:e==null?"":qe(e)||ft(e)&&(e.toString===zu||!Ye(e.toString))?Xu(e)?W(e.value):JSON.stringify(e,Qu,2):String(e),Qu=(e,t)=>Xu(t)?Qu(e,t.value):as(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],i)=>(n[oi(r,i)+" =>"]=o,n),{})}:Ls(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>oi(n))}:On(t)?oi(t):ft(t)&&!qe(t)&&!Wu(t)?String(t):t,oi=(e,t="")=>{var n;return On(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.44 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Nt;class _f{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Nt&&(Nt.active?(this.parent=Nt,this.index=(Nt.scopes||(Nt.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const r=this.scopes.slice();for(t=0,n=r.length;t0&&--this._on===0){if(Nt===this)Nt=this.prevScope;else{let t=Nt;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(Tr){let t=Tr;for(Tr=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Er;){let t=Er;for(Er=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function nc(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function sc(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),Qi(r),xf(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function _i(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(rc(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function rc(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===jr)||(e.globalVersion=jr,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!_i(e))))return;e.flags|=2;const t=e.dep,n=ht,r=gn;ht=e,gn=!0;try{nc(e);const o=e.fn(e._value);(t.version===0||An(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{ht=n,gn=r,sc(e),e.flags&=-3}}function Qi(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Qi(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function xf(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let gn=!0;const oc=[];function Mn(){oc.push(gn),gn=!1}function In(){const e=oc.pop();gn=e===void 0?!0:e}function tu(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ht;ht=void 0;try{t()}finally{ht=n}}}let jr=0;class Cf{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Zi{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ht||!gn||ht===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ht)n=this.activeLink=new Cf(ht,this),ht.deps?(n.prevDep=ht.depsTail,ht.depsTail.nextDep=n,ht.depsTail=n):ht.deps=ht.depsTail=n,ac(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=ht.depsTail,n.nextDep=void 0,ht.depsTail.nextDep=n,ht.depsTail=n,ht.deps===n&&(ht.deps=r)}return n}trigger(t){this.version++,jr++,this.notify(t)}notify(t){Ji();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Xi()}}}function ac(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)ac(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ki=new WeakMap,js=Symbol(""),xi=Symbol(""),Dr=Symbol("");function Ht(e,t,n){if(gn&&ht){let r=ki.get(e);r||ki.set(e,r=new Map);let o=r.get(n);o||(r.set(n,o=new Zi),o.map=r,o.key=n),o.track()}}function Vn(e,t,n,r,o,i){const c=ki.get(e);if(!c){jr++;return}const f=v=>{v&&v.trigger()};if(Ji(),t==="clear")c.forEach(f);else{const v=qe(e),b=v&&Yi(n);if(v&&n==="length"){const g=Number(r);c.forEach((_,T)=>{(T==="length"||T===Dr||!On(T)&&T>=g)&&f(_)})}else switch((n!==void 0||c.has(void 0))&&f(c.get(n)),b&&f(c.get(Dr)),t){case"add":v?b&&f(c.get("length")):(f(c.get(js)),as(e)&&f(c.get(xi)));break;case"delete":v||(f(c.get(js)),as(e)&&f(c.get(xi)));break;case"set":as(e)&&f(c.get(js));break}}Xi()}function Gs(e){const t=ut(e);return t===e||(Ht(t,"iterate",Dr),dn(e))?t:jn(e)?is(e)?t.map(n=>us(fn(n))):t.map(us):t.map(fn)}function ma(e){return Ht(e=ut(e),"iterate",Dr),e}function Sn(e,t){return jn(e)?us(is(e)?fn(t):t):fn(t)}const $f={__proto__:null,[Symbol.iterator](){return ii(this,Symbol.iterator,e=>Sn(this,e))},concat(...e){return Gs(this).concat(...e.map(t=>qe(t)?Gs(t):t))},entries(){return ii(this,"entries",e=>(e[1]=Sn(this,e[1]),e))},every(e,t){return Kn(this,"every",e,t,void 0,arguments)},filter(e,t){return Kn(this,"filter",e,t,n=>n.map(r=>Sn(this,r)),arguments)},find(e,t){return Kn(this,"find",e,t,n=>Sn(this,n),arguments)},findIndex(e,t){return Kn(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Kn(this,"findLast",e,t,n=>Sn(this,n),arguments)},findLastIndex(e,t){return Kn(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Kn(this,"forEach",e,t,void 0,arguments)},includes(...e){return li(this,"includes",e)},indexOf(...e){return li(this,"indexOf",e)},join(e){return Gs(this).join(e)},lastIndexOf(...e){return li(this,"lastIndexOf",e)},map(e,t){return Kn(this,"map",e,t,void 0,arguments)},pop(){return wr(this,"pop")},push(...e){return wr(this,"push",e)},reduce(e,...t){return su(this,"reduce",e,t)},reduceRight(e,...t){return su(this,"reduceRight",e,t)},shift(){return wr(this,"shift")},some(e,t){return Kn(this,"some",e,t,void 0,arguments)},splice(...e){return wr(this,"splice",e)},toReversed(){return Gs(this).toReversed()},toSorted(e){return Gs(this).toSorted(e)},toSpliced(...e){return Gs(this).toSpliced(...e)},unshift(...e){return wr(this,"unshift",e)},values(){return ii(this,"values",e=>Sn(this,e))}};function ii(e,t,n){const r=ma(e),o=r[t],i=o.call(r);if(r!==e&&!dn(e)){if(i[Symbol.toStringTag]==="Array Iterator"){const c=Object.create(Object.getPrototypeOf(i));return c.next=()=>nu(i.next(),n),o!==ic[t]&&Object.defineProperties(c,{return:{get(){const f=i.return;return typeof f=="function"?f.bind(i):f}},throw:{get(){const f=i.throw;return typeof f=="function"?f.bind(i):f}}}),c}i._next=i.next,i.next=()=>nu(i._next(),n)}return i}function nu(e,t){return e.done||(e.value=t(e.value)),e}const ic=Array.prototype;function Kn(e,t,n,r,o,i){const c=ma(e),f=c!==e&&!dn(e),v=c[t];if(v!==ic[t]){const _=v.apply(e,i);return f?fn(_):_}let b=n;c!==e&&(f?b=function(_,T){return n.call(this,Sn(e,_),T,e)}:n.length>2&&(b=function(_,T){return n.call(this,_,T,e)}));const g=v.call(c,b,r);return f&&o?o(g):g}function su(e,t,n,r){const o=ma(e),i=o!==e&&!dn(e);let c=n,f=!1;o!==e&&(i?(f=r.length===0,c=function(b,g,_){return f&&(f=!1,b=Sn(e,b)),n.call(this,b,Sn(e,g),_,e)}):n.length>3&&(c=function(b,g,_){return n.call(this,b,g,_,e)}));const v=o[t](c,...r);return f?Sn(e,v):v}function li(e,t,n){const r=ut(e);Ht(r,"iterate",Dr);const o=r[t](...n);return(o===-1||o===!1)&&sl(n[0])?(n[0]=ut(n[0]),r[t](...n)):o}function wr(e,t,n=[]){Mn(),Ji();const r=ut(e)[t].apply(e,n);return Xi(),In(),r}const Sf=Wi("__proto__,__v_isRef,__isVue"),lc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(On));function Ef(e){On(e)||(e=String(e));const t=ut(this);return Ht(t,"has",e),t.hasOwnProperty(e)}class uc{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(o?i?Rf:pc:i?fc:dc).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const c=qe(t);if(!o){let v;if(c&&(v=$f[n]))return v;if(n==="hasOwnProperty")return Ef}const f=Reflect.get(t,n,Gt(t)?t:r);if((On(n)?lc.has(n):Sf(n))||(o||Ht(t,"get",n),i))return f;if(Gt(f)){const v=c&&Yi(n)?f:f.value;return o&&ft(v)?$i(v):v}return ft(f)?o?$i(f):tl(f):f}}class cc extends uc{constructor(t=!1){super(!1,t)}set(t,n,r,o){let i=t[n];const c=qe(t)&&Yi(n);if(!this._isShallow){const b=jn(i);if(!dn(r)&&!jn(r)&&(i=ut(i),r=ut(r)),!c&&Gt(i)&&!Gt(r))return b||(i.value=r),!0}const f=c?Number(n)e,$o=e=>Reflect.getPrototypeOf(e);function Mf(e,t,n){return function(...r){const o=this.__v_raw,i=ut(o),c=as(i),f=e==="entries"||e===Symbol.iterator&&c,v=e==="keys"&&c,b=o[e](...r),g=n?Ci:t?us:fn;return!t&&Ht(i,"iterate",v?xi:js),Pt(Object.create(b),{next(){const{value:_,done:T}=b.next();return T?{value:_,done:T}:{value:f?[g(_[0]),g(_[1])]:g(_),done:T}}})}}function So(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function If(e,t){const n={get(o){const i=this.__v_raw,c=ut(i),f=ut(o);e||(An(o,f)&&Ht(c,"get",o),Ht(c,"get",f));const{has:v}=$o(c),b=t?Ci:e?us:fn;if(v.call(c,o))return b(i.get(o));if(v.call(c,f))return b(i.get(f));i!==c&&i.get(o)},get size(){const o=this.__v_raw;return!e&&Ht(ut(o),"iterate",js),o.size},has(o){const i=this.__v_raw,c=ut(i),f=ut(o);return e||(An(o,f)&&Ht(c,"has",o),Ht(c,"has",f)),o===f?i.has(o):i.has(o)||i.has(f)},forEach(o,i){const c=this,f=c.__v_raw,v=ut(f),b=t?Ci:e?us:fn;return!e&&Ht(v,"iterate",js),f.forEach((g,_)=>o.call(i,b(g),b(_),c))}};return Pt(n,e?{add:So("add"),set:So("set"),delete:So("delete"),clear:So("clear")}:{add(o){const i=ut(this),c=$o(i),f=ut(o),v=!t&&!dn(o)&&!jn(o)?f:o;return c.has.call(i,v)||An(o,v)&&c.has.call(i,o)||An(f,v)&&c.has.call(i,f)||(i.add(v),Vn(i,"add",v,v)),this},set(o,i){!t&&!dn(i)&&!jn(i)&&(i=ut(i));const c=ut(this),{has:f,get:v}=$o(c);let b=f.call(c,o);b||(o=ut(o),b=f.call(c,o));const g=v.call(c,o);return c.set(o,i),b?An(i,g)&&Vn(c,"set",o,i):Vn(c,"add",o,i),this},delete(o){const i=ut(this),{has:c,get:f}=$o(i);let v=c.call(i,o);v||(o=ut(o),v=c.call(i,o)),f&&f.call(i,o);const b=i.delete(o);return v&&Vn(i,"delete",o,void 0),b},clear(){const o=ut(this),i=o.size!==0,c=o.clear();return i&&Vn(o,"clear",void 0,void 0),c}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=Mf(o,e,t)}),n}function el(e,t){const n=If(e,t);return(r,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_isShallow"?t:o==="__v_raw"?r:Reflect.get(dt(n,o)&&o in r?n:r,o,i)}const jf={get:el(!1,!1)},Df={get:el(!1,!0)},Lf={get:el(!0,!1)};const dc=new WeakMap,fc=new WeakMap,pc=new WeakMap,Rf=new WeakMap;function Kf(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function tl(e){return jn(e)?e:nl(e,!1,Af,jf,dc)}function Nf(e){return nl(e,!1,Of,Df,fc)}function $i(e){return nl(e,!0,Pf,Lf,pc)}function nl(e,t,n,r,o){if(!ft(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const i=o.get(e);if(i)return i;const c=Kf(lf(e));if(c===0)return e;const f=new Proxy(e,c===2?r:n);return o.set(e,f),f}function is(e){return jn(e)?is(e.__v_raw):!!(e&&e.__v_isReactive)}function jn(e){return!!(e&&e.__v_isReadonly)}function dn(e){return!!(e&&e.__v_isShallow)}function sl(e){return e?!!e.__v_raw:!1}function ut(e){const t=e&&e.__v_raw;return t?ut(t):e}function Ff(e){return!dt(e,"__v_skip")&&Object.isExtensible(e)&&Yu(e,"__v_skip",!0),e}const fn=e=>ft(e)?tl(e):e,us=e=>ft(e)?$i(e):e;function Gt(e){return e?e.__v_isRef===!0:!1}function O(e){return Vf(e,!1)}function Vf(e,t){return Gt(e)?e:new Bf(e,t)}class Bf{constructor(t,n){this.dep=new Zi,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ut(t),this._value=n?t:fn(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||dn(t)||jn(t);t=r?t:ut(t),An(t,n)&&(this._rawValue=t,this._value=r?t:fn(t),this.dep.trigger())}}function un(e){return Gt(e)?e.value:e}const Uf={get:(e,t,n)=>t==="__v_raw"?e:un(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Gt(o)&&!Gt(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function vc(e){return is(e)?e:new Proxy(e,Uf)}class qf{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Zi(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=jr-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&ht!==this)return tc(this,!0),!0}get value(){const t=this.dep.track();return rc(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Hf(e,t,n=!1){let r,o;return Ye(e)?r=e:(r=e.get,o=e.set),new qf(r,o,n)}const Eo={},Bo=new WeakMap;let Es;function zf(e,t=!1,n=Es){if(n){let r=Bo.get(n);r||Bo.set(n,r=[]),r.push(e)}}function Wf(e,t,n=pt){const{immediate:r,deep:o,once:i,scheduler:c,augmentJob:f,call:v}=n,b=S=>o?S:dn(S)||o===!1||o===0?Bn(S,1):Bn(S);let g,_,T,x,j=!1,J=!1;if(Gt(e)?(_=()=>e.value,j=dn(e)):is(e)?(_=()=>b(e),j=!0):qe(e)?(J=!0,j=e.some(S=>is(S)||dn(S)),_=()=>e.map(S=>{if(Gt(S))return S.value;if(is(S))return b(S);if(Ye(S))return v?v(S,2):S()})):Ye(e)?t?_=v?()=>v(e,2):e:_=()=>{if(T){Mn();try{T()}finally{In()}}const S=Es;Es=g;try{return v?v(e,3,[x]):e(x)}finally{Es=S}}:_=Pn,t&&o){const S=_,H=o===!0?1/0:o;_=()=>Bn(S(),H)}const oe=kf(),ue=()=>{g.stop(),oe&&oe.active&&Gi(oe.effects,g)};if(i&&t){const S=t;t=(...H)=>{try{return S(...H)}finally{ue()}}}let ce=J?new Array(e.length).fill(Eo):Eo;const q=S=>{if(!(!(g.flags&1)||!g.dirty&&!S))if(t){const H=g.run();if(S||o||j||(J?H.some((Q,G)=>An(Q,ce[G])):An(H,ce))){const Q=Es;Mn();try{T&&T(),Es=g;const G=[H,ce===Eo?void 0:J&&ce[0]===Eo?[]:ce,x];ce=H,v?v(t,3,G):t(...G)}finally{Es=Q,In()}}}else g.run()};return f&&f(q),g=new Zu(_),g.scheduler=c?()=>c(q,!1):q,x=S=>zf(S,!1,g),T=g.onStop=()=>{const S=Bo.get(g);if(S){if(v)v(S,4);else for(const H of S)H();Bo.delete(g)}},t?r?q(!0):ce=g.run():c?c(q.bind(null,!0),!0):g.run(),ue.pause=g.pause.bind(g),ue.resume=g.resume.bind(g),ue.stop=ue,ue}function Bn(e,t=1/0,n){if(t<=0||!ft(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Gt(e))Bn(e.value,t,n);else if(qe(e))for(let r=0;r{Bn(r,t,n)});else if(Wu(e)){for(const r in e)Bn(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Bn(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.44 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Gr(e,t,n,r){try{return r?e(...r):e()}catch(o){ha(o,t,n)}}function pn(e,t,n,r){if(Ye(e)){const o=Gr(e,t,n,r);return o&&Hu(o)&&o.catch(i=>{ha(i,t,n)}),o}if(qe(e)){const o=[];for(let i=0;i>>1,o=Zt[r],i=Lr(o);i=Lr(n)?Zt.push(e):Zt.splice(Yf(t),0,e),e.flags|=1,hc()}}function hc(){Uo||(Uo=mc.then(bc))}function Jf(e){if(!qe(e))rs&&e.id===-1?rs.splice(Ys+1,0,e):e.flags&1||(En.push(e),e.flags|=1);else for(let t=0;t=t))continue;Zt.splice(r,1),r=e?r-1:hn,o.flags&4&&(o.flags&=-2),o(),o.flags&4||(o.flags&=-2)}}}function gc(e,t,n=0){if(En.length){let r=En,o=0;if(t){r=[];for(let c=0;cLr(c)-Lr(f));if(En.length=o,rs){for(let c=0;ce.id==null?e.flags&2?-1:1/0:e.id;function bc(e){try{for(hn=0;hn{r._d&&Go(-1);const i=qo(t),c=Ds.length;let f;try{f=e(...o)}finally{for(let v=Ds.length;v>c;v--)Gc();qo(i),r._d&&Go(1)}return f};return r._n=!0,r._c=!0,r._d=!0,r}function Me(e,t){if(cn===null)return e;const n=ka(cn),r=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&Ye(t)?t.call(r&&r.proxy):t}}const Zf=Symbol.for("v-scx"),ep=()=>Io(Zf);function yt(e,t,n){return _c(e,t,n)}function _c(e,t,n=pt){const{immediate:r,deep:o,flush:i,once:c}=n,f=Pt({},n),v=t&&r||!t&&i!=="post";let b;if(Br){if(i==="sync"){const x=ep();b=x.__watcherHandles||(x.__watcherHandles=[])}else if(!v){const x=()=>{};return x.stop=Pn,x.resume=Pn,x.pause=Pn,x}}const g=en;f.call=(x,j,J)=>pn(x,g,j,J);let _=!1;i==="post"?f.scheduler=x=>{x.i=g,Qt(x,g&&g.suspense)}:i!=="sync"&&(_=!0,f.scheduler=(x,j)=>{j?x():rl(x)}),f.augmentJob=x=>{t&&(x.flags|=4),_&&(x.flags|=2,g&&(x.id=g.uid,x.i=g))};const T=Wf(e,t,f);return Br&&(b?b.push(T):v&&T()),T}function tp(e,t,n){const r=this.proxy,o=Ct(e)?e.includes(".")?kc(r,e):()=>r[e]:e.bind(r,r);let i;Ye(t)?i=t:(i=t.handler,n=t);const c=Yr(this),f=_c(o,i.bind(r),n);return c(),f}function kc(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;oe.__isTeleport,As=e=>e&&(e.disabled||e.disabled===""),np=e=>e&&(e.defer||e.defer===""),ru=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ou=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Si=(e,t)=>{const n=e&&e.to;return Ct(n)?t?t(n):null:n},sp={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,i,c,f,v,b){const{mc:g,pc:_,pbc:T,o:{insert:x,querySelector:j,createText:J,createComment:oe,parentNode:ue}}=b,ce=As(t.props);let{dynamicChildren:q}=t;const S=(G,re,M)=>{G.shapeFlag&16&&g(G.children,re,M,o,i,c,f,v)},H=(G=t)=>{const re=As(G.props),M=G.target=Si(G.props,j),E=Ei(M,G,J,x);M&&(c!=="svg"&&ru(M)?c="svg":c!=="mathml"&&ou(M)&&(c="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),re||(S(G,M,E),xr(G,!1)))},Q=G=>{const re=()=>{if(ns.get(G)===re){if(ns.delete(G),As(G.props)){const M=ue(G.el)||n;S(G,M,G.anchor),xr(G,!0)}H(G)}};ns.set(G,re),Qt(re,i)};if(e==null){const G=t.el=J(""),re=t.anchor=J("");if(x(G,n,r),x(re,n,r),np(t.props)||i&&i.pendingBranch){Q(t);return}ce&&(S(t,n,re),xr(t,!0)),H()}else{t.el=e.el;const G=t.anchor=e.anchor,re=ns.get(e);if(re){re.flags|=8,ns.delete(e),Q(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,E=t.targetAnchor=e.targetAnchor,I=As(e.props),ne=I?n:M,Ie=I?G:E;if(c==="svg"||ru(M)?c="svg":(c==="mathml"||ou(M))&&(c="mathml"),q?(T(e.dynamicChildren,q,ne,o,i,c,f),ll(e,t,!0)):v||_(e,t,ne,Ie,o,i,c,f,!1),ce)I?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):To(t,n,G,b,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const Ae=Si(t.props,j);Ae&&(t.target=Ae,To(t,Ae,null,b,0))}else I&&To(t,M,E,b,1);xr(t,ce)}},remove(e,t,n,{um:r,o:{remove:o}},i){const{shapeFlag:c,children:f,anchor:v,targetStart:b,targetAnchor:g,target:_,props:T}=e,x=As(T),j=i||!x,J=ns.get(e);if(J&&(J.flags|=8,ns.delete(e)),_&&(o(b),o(g)),i&&o(v),!J&&(x||_)&&c&16)for(let oe=0;oe{e.isMounted=!0}),Oc(()=>{e.isUnmounting=!0}),e}const an=[Function,Array],$c={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:an,onEnter:an,onAfterEnter:an,onEnterCancelled:an,onBeforeLeave:an,onLeave:an,onAfterLeave:an,onLeaveCancelled:an,onBeforeAppear:an,onAppear:an,onAfterAppear:an,onAppearCancelled:an},op={name:"BaseTransition",props:$c,setup(e,{slots:t}){const n=ul(),r=Cc();return()=>{const o=t.default&&ol(t.default(),!0),i=o&&o.length?Sc(o):n.subTree?ge():void 0;if(!i)return;const c=ut(e),{mode:f}=c;if(r.isLeaving)return ci(i);const v=Ho(i);if(!v)return ci(i);let b=Rr(v,c,r,n,_=>b=_);v.type!==Wt&&cs(v,b);let g=n.subTree&&Ho(n.subTree);if(g&&g.type!==Wt&&!Ps(g,v)&&Kr(n.subTree)){let _=Rr(g,c,r,n);if(cs(g,_),f==="out-in"&&v.type!==Wt)return r.isLeaving=!0,_.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete _.afterLeave,g=void 0},ci(i);f==="in-out"&&v.type!==Wt?_.delayLeave=(T,x,j)=>{const J=Ec(r,g);J[String(g.key)]=g,T[ln]=()=>{x(),T[ln]=void 0,delete b.delayedLeave,g=void 0},b.delayedLeave=()=>{j(),delete b.delayedLeave,g=void 0}}:g=void 0}else g&&(g=void 0);return i}}};function Sc(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Wt){t=n;break}}return t}const ap=op;function Ec(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Rr(e,t,n,r,o){const{appear:i,mode:c,persisted:f=!1,onBeforeEnter:v,onEnter:b,onAfterEnter:g,onEnterCancelled:_,onBeforeLeave:T,onLeave:x,onAfterLeave:j,onLeaveCancelled:J,onBeforeAppear:oe,onAppear:ue,onAfterAppear:ce,onAppearCancelled:q}=t,S=String(e.key),H=Ec(n,e),Q=(M,E)=>{M&&pn(M,r,9,E)},G=(M,E)=>{const I=E[1];Q(M,E),qe(M)?M.every(ne=>ne.length<=1)&&I():M.length<=1&&I()},re={mode:c,persisted:f,beforeEnter(M){let E=v;if(!n.isMounted)if(i)E=oe||v;else return;M[ln]&&M[ln](!0);const I=H[S];if(I&&Ps(e,I)){let ne=I.el[ln];if(!ne){const Ie=Kr(I);ne=Ie&&Ie.el[ln]}ne&&ne()}Q(E,[M])},enter(M){if(H[S]===e)return;let E=b,I=g,ne=_;if(!n.isMounted)if(i)E=ue||b,I=ce||g,ne=q||_;else return;let Ie=!1;M[_r]=ye=>{Ie||(Ie=!0,ye?Q(ne,[M]):Q(I,[M]),re.delayedLeave&&re.delayedLeave(),M[_r]=void 0)};const Ae=M[_r].bind(null,!1);E?G(E,[M,Ae]):Ae()},leave(M,E){const I=String(e.key);if(M[_r]&&M[_r](!0),n.isUnmounting)return E();Q(T,[M]);let ne=!1;M[ln]=Ae=>{ne||(ne=!0,E(),Ae?Q(J,[M]):Q(j,[M]),M[ln]=void 0,H[I]===e&&delete H[I])};const Ie=M[ln].bind(null,!1);H[I]=e,x?G(x,[M,Ie]):Ie()},clone(M){const E=Rr(M,t,n,r,o);return o&&o(E),E}};return re}function ci(e){if(ga(e))return e=ds(e),e.children=null,e}function Ho(e){if(!ga(e))return ya(e.type)&&e.children?Sc(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Ye(n.default))return n.default()}}function cs(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;cs(ya(n.type)&&Ho(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===je&&qe(e.children)){const n=Lc(e.children,!1);n&&cs(n,t)}}function ol(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let i=0;iAr(J,t&&(qe(t)?t[oe]:t),n,r,o));return}if(Pr(r)&&!o){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Ar(e,t,n,r.component.subTree);return}const i=r.shapeFlag&4?ka(r.component):r.el,c=o?null:i,{i:f,r:v}=e,b=t&&t.r,g=f.refs===pt?f.refs={}:f.refs,_=f.setupState,T=ut(_),x=_===pt?qu:J=>au(g,J)?!1:dt(T,J),j=(J,oe)=>!(oe&&au(g,oe));if(b!=null&&b!==v){if(iu(t),Ct(b))g[b]=null,x(b)&&(_[b]=null);else if(Gt(b)){const J=t;j(b,J.k)&&(b.value=null),J.k&&(g[J.k]=null)}}if(Ye(v))Gr(v,f,12,[c,g]);else{const J=Ct(v),oe=Gt(v);if(J||oe){const ue=()=>{if(e.f){const ce=J?x(v)?_[v]:g[v]:j()||!e.k?v.value:g[e.k];if(o)qe(ce)&&Gi(ce,i);else if(qe(ce))ce.includes(i)||ce.push(i);else if(J)g[v]=[i],x(v)&&(_[v]=g[v]);else{const q=[i];j(v,e.k)&&(v.value=q),e.k&&(g[e.k]=q)}}else J?(g[v]=c,x(v)&&(_[v]=c)):oe&&(j(v,e.k)&&(v.value=c),e.k&&(g[e.k]=c))};if(c){const ce=()=>{ue(),zo.delete(e)};ce.id=-1,zo.set(e,ce),Qt(ce,n)}else iu(e),ue()}}}function iu(e){const t=zo.get(e);t&&(t.flags|=8,zo.delete(e))}va().requestIdleCallback;va().cancelIdleCallback;const Pr=e=>!!e.type.__asyncLoader,ga=e=>e.type.__isKeepAlive;function ip(e,t){Ac(e,"a",t)}function lp(e,t){Ac(e,"da",t)}function Ac(e,t,n=en){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ba(t,r,n),n){let o=n.parent;for(;o&&o.parent;)ga(o.parent.vnode)&&up(r,t,n,o),o=o.parent}}function up(e,t,n,r){const o=ba(t,e,r,!0);Wn(()=>{Gi(r[t],o)},n)}function ba(e,t,n=en,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...c)=>{Mn();const f=Yr(n),v=pn(t,n,e,c);return f(),In(),v});return r?o.unshift(i):o.push(i),i}}const zn=e=>(t,n=en)=>{(!Br||e==="sp")&&ba(e,(...r)=>t(...r),n)},cp=zn("bm"),vn=zn("m"),dp=zn("bu"),Pc=zn("u"),Oc=zn("bum"),Wn=zn("um"),fp=zn("sp"),pp=zn("rtg"),vp=zn("rtc");function mp(e,t=en){ba("ec",e,t)}const hp=Symbol.for("v-ndc");function et(e,t,n,r){let o;const i=n,c=qe(e);if(c||Ct(e)){const f=c&&is(e);let v=!1,b=!1;f&&(v=!dn(e),b=jn(e),e=ma(e)),o=new Array(e.length);for(let g=0,_=e.length;g<_;g++)o[g]=t(v?b?us(fn(e[g])):fn(e[g]):e[g],g,void 0,i)}else if(typeof e=="number")if(!Number.isInteger(e)||e<0)o=[];else{o=new Array(e);for(let f=0;ft(f,v,void 0,i));else{const f=Object.keys(e);o=new Array(f.length);for(let v=0,b=f.length;ve?Qc(e)?ka(e):Ti(e.parent):null,Or=Pt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ti(e.parent),$root:e=>Ti(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ic(e),$forceUpdate:e=>e.f||(e.f=()=>{rl(e.update)}),$nextTick:e=>e.n||(e.n=ir.bind(e.proxy)),$watch:e=>tp.bind(e)}),di=(e,t)=>e!==pt&&!e.__isScriptSetup&&dt(e,t),yp={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:i,accessCache:c,type:f,appContext:v}=e;if(t[0]!=="$"){const T=c[t];if(T!==void 0)switch(T){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(di(r,t))return c[t]=1,r[t];if(o!==pt&&dt(o,t))return c[t]=2,o[t];if(dt(i,t))return c[t]=3,i[t];if(n!==pt&&dt(n,t))return c[t]=4,n[t];Ai&&(c[t]=0)}}const b=Or[t];let g,_;if(b)return t==="$attrs"&&Ht(e.attrs,"get",""),b(e);if((g=f.__cssModules)&&(g=g[t]))return g;if(n!==pt&&dt(n,t))return c[t]=4,n[t];if(_=v.config.globalProperties,dt(_,t))return _[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return di(o,t)?(o[t]=n,!0):r!==pt&&dt(r,t)?(r[t]=n,!0):dt(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,props:i,type:c}},f){let v;return!!(n[f]||e!==pt&&f[0]!=="$"&&dt(e,f)||di(t,f)||dt(i,f)||dt(r,f)||dt(Or,f)||dt(o.config.globalProperties,f)||(v=c.__cssModules)&&v[f])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:dt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function lu(e){return qe(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Ai=!0;function gp(e){const t=Ic(e),n=e.proxy,r=e.ctx;Ai=!1,t.beforeCreate&&uu(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:c,watch:f,provide:v,inject:b,created:g,beforeMount:_,mounted:T,beforeUpdate:x,updated:j,activated:J,deactivated:oe,beforeDestroy:ue,beforeUnmount:ce,destroyed:q,unmounted:S,render:H,renderTracked:Q,renderTriggered:G,errorCaptured:re,serverPrefetch:M,expose:E,inheritAttrs:I,components:ne,directives:Ie,filters:Ae}=t;if(b&&bp(b,r,null),c)for(const Ue in c){const de=c[Ue];Ye(de)&&(r[Ue]=de.bind(n))}if(o){const Ue=o.call(n,n);ft(Ue)&&(e.data=tl(Ue))}if(Ai=!0,i)for(const Ue in i){const de=i[Ue],ke=Ye(de)?de.bind(n,n):Ye(de.get)?de.get.bind(n,n):Pn,Ee=!Ye(de)&&Ye(de.set)?de.set.bind(n):Pn,Le=rt({get:ke,set:Ee});Object.defineProperty(r,Ue,{enumerable:!0,configurable:!0,get:()=>Le.value,set:$e=>Le.value=$e})}if(f)for(const Ue in f)Mc(f[Ue],r,n,Ue);if(v){const Ue=Ye(v)?v.call(n):v;Reflect.ownKeys(Ue).forEach(de=>{Qf(de,Ue[de])})}g&&uu(g,e,"c");function Pe(Ue,de){qe(de)?de.forEach(ke=>Ue(ke.bind(n))):de&&Ue(de.bind(n))}if(Pe(cp,_),Pe(vn,T),Pe(dp,x),Pe(Pc,j),Pe(ip,J),Pe(lp,oe),Pe(mp,re),Pe(vp,Q),Pe(pp,G),Pe(Oc,ce),Pe(Wn,S),Pe(fp,M),qe(E))if(E.length){const Ue=e.exposed||(e.exposed={});E.forEach(de=>{Object.defineProperty(Ue,de,{get:()=>n[de],set:ke=>n[de]=ke,enumerable:!0})})}else e.exposed||(e.exposed={});H&&e.render===Pn&&(e.render=H),I!=null&&(e.inheritAttrs=I),ne&&(e.components=ne),Ie&&(e.directives=Ie),M&&Tc(e)}function bp(e,t,n=Pn){qe(e)&&(e=Pi(e));for(const r in e){const o=e[r];let i;ft(o)?"default"in o?i=Io(o.from||r,o.default,!0):i=Io(o.from||r):i=Io(o),Gt(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:c=>i.value=c}):t[r]=i}}function uu(e,t,n){pn(qe(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Mc(e,t,n,r){let o=r.includes(".")?kc(n,r):()=>n[r];if(Ct(e)){const i=t[e];Ye(i)&&yt(o,i)}else if(Ye(e))yt(o,e.bind(n));else if(ft(e))if(qe(e))e.forEach(i=>Mc(i,t,n,r));else{const i=Ye(e.handler)?e.handler.bind(n):t[e.handler];Ye(i)&&yt(o,i,e)}}function Ic(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:c}}=e.appContext,f=i.get(t);let v;return f?v=f:!o.length&&!n&&!r?v=t:(v={},o.length&&o.forEach(b=>Wo(v,b,c,!0)),Wo(v,t,c)),ft(t)&&i.set(t,v),v}function Wo(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&Wo(e,i,n,!0),o&&o.forEach(c=>Wo(e,c,n,!0));for(const c in t)if(!(r&&c==="expose")){const f=wp[c]||n&&n[c];e[c]=f?f(e[c],t[c]):t[c]}return e}const wp={data:cu,props:du,emits:du,methods:Cr,computed:Cr,beforeCreate:Xt,created:Xt,beforeMount:Xt,mounted:Xt,beforeUpdate:Xt,updated:Xt,beforeDestroy:Xt,beforeUnmount:Xt,destroyed:Xt,unmounted:Xt,activated:Xt,deactivated:Xt,errorCaptured:Xt,serverPrefetch:Xt,components:Cr,directives:Cr,watch:kp,provide:cu,inject:_p};function cu(e,t){return t?e?function(){return Pt(Ye(e)?e.call(this,this):e,Ye(t)?t.call(this,this):t)}:t:e}function _p(e,t){return Cr(Pi(e),Pi(t))}function Pi(e){if(qe(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${yn(t)}Modifiers`]||e[`${vs(t)}Modifiers`];function Sp(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||pt;let o=n;const i=t.startsWith("update:"),c=i&&$p(r,t.slice(7));c&&(c.trim&&(o=n.map(g=>Ct(g)?g.trim():g)),c.number&&(o=o.map(pa)));let f,v=r[f=ri(t)]||r[f=ri(yn(t))];!v&&i&&(v=r[f=ri(vs(t))]),v&&pn(v,e,6,o);const b=r[f+"Once"];if(b){if(!e.emitted)e.emitted={};else if(e.emitted[f])return;e.emitted[f]=!0,pn(b,e,6,o)}}const Ep=new WeakMap;function Dc(e,t,n=!1){const r=n?Ep:t.emitsCache,o=r.get(e);if(o!==void 0)return o;const i=e.emits;let c={},f=!1;if(!Ye(e)){const v=b=>{const g=Dc(b,t,!0);g&&(f=!0,Pt(c,g))};!n&&t.mixins.length&&t.mixins.forEach(v),e.extends&&v(e.extends),e.mixins&&e.mixins.forEach(v)}return!i&&!f?(ft(e)&&r.set(e,null),null):(qe(i)?i.forEach(v=>c[v]=null):Pt(c,i),ft(e)&&r.set(e,c),c)}function wa(e,t){return!e||!ca(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),dt(e,t[0].toLowerCase()+t.slice(1))||dt(e,vs(t))||dt(e,t))}function fu(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[i],slots:c,attrs:f,emit:v,render:b,renderCache:g,props:_,data:T,setupState:x,ctx:j,inheritAttrs:J}=e,oe=qo(e);let ue,ce;try{if(n.shapeFlag&4){const S=o||r,H=S;ue=Tn(b.call(H,S,g,_,x,T,j)),ce=f}else{const S=t;ue=Tn(S.length>1?S(_,{attrs:f,slots:c,emit:v}):S(_,null)),ce=t.props?f:Tp(f)}}catch(S){Ds.length=0,ha(S,e,1),ue=Ce(Wt)}let q=ue;if(ce&&J!==!1){const S=Object.keys(ce),{shapeFlag:H}=q;S.length&&H&7&&(i&&S.some(da)&&(ce=Ap(ce,i)),q=ds(q,ce,!1,!0))}if(n.dirs&&(q=ds(q,null,!1,!0),q.dirs=q.dirs?q.dirs.concat(n.dirs):n.dirs),n.transition){const S=ya(q.type)&&Ho(q)||q;cs(S,n.transition)}return ue=q,qo(oe),ue}function Lc(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||ca(n))&&((t||(t={}))[n]=e[n]);return t},Ap=(e,t)=>{const n={};for(const r in e)(!da(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Pp(e,t,n){const{props:r,children:o,component:i}=e,{props:c,children:f,patchFlag:v}=t,b=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&v>=0){if(v&1024)return!0;if(v&16)return r?pu(r,c,b):!!c;if(v&8){const g=t.dynamicProps;for(let _=0;_Object.create(Kc),Fc=e=>Object.getPrototypeOf(e)===Kc;function Mp(e,t,n,r=!1){const o={},i=Nc();e.propsDefaults=Object.create(null),Vc(e,t,o,i);for(const c in e.propsOptions[0])c in o||(o[c]=void 0);n?e.props=r?o:Nf(o):e.type.props?e.props=o:e.props=i,e.attrs=i}function Ip(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:c}}=e,f=ut(o),[v]=e.propsOptions;let b=!1;if((r||c>0)&&!(c&16)){if(c&8){const g=e.vnode.dynamicProps;for(let _=0;_{v=!0;const[T,x]=Bc(_,t,!0);Pt(c,T),x&&f.push(...x)};!n&&t.mixins.length&&t.mixins.forEach(g),e.extends&&g(e.extends),e.mixins&&e.mixins.forEach(g)}if(!i&&!v)return ft(e)&&r.set(e,Ms),Ms;if(qe(i))for(let g=0;ge==="_"||e==="_ctx"||e==="$stable",il=e=>qe(e)?e.map(Tn):[Tn(e)],Dp=(e,t,n)=>{if(t._n)return t;const r=ms((...o)=>il(t(...o)),n);return r._c=!1,r},Uc=(e,t,n)=>{const r=e._ctx;for(const o in e){if(al(o))continue;const i=e[o];if(Ye(i))t[o]=Dp(o,i,r);else if(i!=null){const c=il(i);t[o]=()=>c}}},qc=(e,t)=>{const n=il(t);e.slots.default=()=>n},Hc=(e,t,n)=>{for(const r in t)(n||!al(r))&&(e[r]=t[r])},Lp=(e,t,n)=>{const r=e.slots=Nc();if(e.vnode.shapeFlag&32){const o=t._;o?(Hc(r,t,n),n&&Yu(r,"_",o,!0)):Uc(t,r)}else t&&qc(e,t)},Rp=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,c=pt;if(r.shapeFlag&32){const f=t._;f?n&&f===1?i=!1:Hc(o,t,n):(i=!t.$stable,Uc(t,o)),c=t}else t&&(qc(e,t),c={default:1});if(i)for(const f in o)!al(f)&&c[f]==null&&delete o[f]},Qt=Bp;function Kp(e){return Np(e)}function Np(e,t){const n=va();n.__VUE__=!0;const{insert:r,remove:o,patchProp:i,createElement:c,createText:f,createComment:v,setText:b,setElementText:g,parentNode:_,nextSibling:T,setScopeId:x=Pn,insertStaticContent:j}=e,J=(h,y,C,R=null,F=null,le=null,ee=void 0,P=null,Z=!!y.dynamicChildren)=>{if(h===y)return;h&&!Ps(h,y)&&(R=bt(h),$e(h,F,le,!0),h=null),y.patchFlag===-2&&(Z=!1,y.dynamicChildren=null),y.dynamicChildren&&h&&h.dynamicChildren&&h.dynamicChildren.hasOnce&&(y.dynamicChildren===Ms&&(y.dynamicChildren=[]),y.dynamicChildren.hasOnce=!0);const{type:te,ref:Se,shapeFlag:we}=y;switch(te){case _a:oe(h,y,C,R);break;case Wt:ue(h,y,C,R);break;case jo:h==null&&ce(y,C,R,ee);break;case je:ne(h,y,C,R,F,le,ee,P,Z);break;default:we&1?H(h,y,C,R,F,le,ee,P,Z):we&6?Ie(h,y,C,R,F,le,ee,P,Z):(we&64||we&128)&&te.process(h,y,C,R,F,le,ee,P,Z,It)}Se!=null&&F?Ar(Se,h&&h.ref,le,y||h,!y):Se==null&&h&&h.ref!=null&&Ar(h.ref,null,le,h,!0)},oe=(h,y,C,R)=>{if(h==null)r(y.el=f(y.children),C,R);else{const F=y.el=h.el;y.children!==h.children&&b(F,y.children)}},ue=(h,y,C,R)=>{h==null?r(y.el=v(y.children||""),C,R):y.el=h.el},ce=(h,y,C,R)=>{[h.el,h.anchor]=j(h.children,y,C,R,h.el,h.anchor)},q=({el:h,anchor:y},C,R)=>{let F;for(;h&&h!==y;)F=T(h),r(h,C,R),h=F;r(y,C,R)},S=({el:h,anchor:y})=>{let C;for(;h&&h!==y;)C=T(h),o(h),h=C;o(y)},H=(h,y,C,R,F,le,ee,P,Z)=>{if(y.type==="svg"?ee="svg":y.type==="math"&&(ee="mathml"),h==null)Q(y,C,R,F,le,ee,P,Z);else{const te=h.el&&h.el._isVueCE?h.el:null;try{te&&te._beginPatch(),M(h,y,F,le,ee,P,Z)}finally{te&&te._endPatch()}}},Q=(h,y,C,R,F,le,ee,P)=>{let Z,te;const{props:Se,shapeFlag:we,transition:Re,dirs:Te}=h;if(Z=h.el=c(h.type,le,Se&&Se.is,Se),we&8?g(Z,h.children):we&16&&re(h.children,Z,null,R,F,fi(h,le),ee,P),Te&&Cs(h,null,R,"created"),G(Z,h,h.scopeId,ee,R),Se){for(const Qe in Se)Qe!=="value"&&!Sr(Qe)&&i(Z,Qe,null,Se[Qe],le,R);"value"in Se&&i(Z,"value",null,Se.value,le),(te=Se.onVnodeBeforeMount)&&xn(te,R,h)}Te&&Cs(h,null,R,"beforeMount");const Xe=Fp(F,Re);Xe&&Re.beforeEnter(Z),r(Z,y,C),((te=Se&&Se.onVnodeMounted)||Xe||Te)&&Qt(()=>{try{te&&xn(te,R,h),Xe&&Re.enter(Z),Te&&Cs(h,null,R,"mounted")}finally{}},F)},G=(h,y,C,R,F)=>{if(C&&x(h,C),R)for(let le=0;le{for(let te=Z;te{const P=y.el=h.el;let{patchFlag:Z,dynamicChildren:te,dirs:Se}=y;Z|=h.patchFlag&16;const we=h.props||pt,Re=y.props||pt;let Te;if(C&&$s(C,!1),(Te=Re.onVnodeBeforeUpdate)&&xn(Te,C,y,h),Se&&Cs(y,h,C,"beforeUpdate"),C&&$s(C,!0),te&&(!h.dynamicChildren||h.dynamicChildren.length!==te.length)&&(Z=0,ee=!1,te=null),(we.innerHTML&&Re.innerHTML==null||we.textContent&&Re.textContent==null)&&g(P,""),te?E(h.dynamicChildren,te,P,C,R,fi(y,F),le):ee||de(h,y,P,null,C,R,fi(y,F),le,!1),Z>0){if(Z&16)I(P,we,Re,C,F);else if(Z&2&&we.class!==Re.class&&i(P,"class",null,Re.class,F),Z&4&&i(P,"style",we.style,Re.style,F),Z&8){const Xe=y.dynamicProps;for(let Qe=0;Qe{Te&&xn(Te,C,y,h),Se&&Cs(y,h,C,"updated")},R)},E=(h,y,C,R,F,le,ee)=>{for(let P=0;P{if(y!==C){if(y!==pt)for(const le in y)!Sr(le)&&!(le in C)&&i(h,le,y[le],null,F,R);for(const le in C){if(Sr(le))continue;const ee=C[le],P=y[le];ee!==P&&le!=="value"&&i(h,le,P,ee,F,R)}"value"in C&&i(h,"value",y.value,C.value,F)}},ne=(h,y,C,R,F,le,ee,P,Z)=>{const te=y.el=h?h.el:f(""),Se=y.anchor=h?h.anchor:f("");let{patchFlag:we,dynamicChildren:Re,slotScopeIds:Te}=y;Te&&(P=P?P.concat(Te):Te),h==null?(r(te,C,R),r(Se,C,R),re(y.children||[],C,Se,F,le,ee,P,Z)):we>0&&we&64&&Re&&h.dynamicChildren&&h.dynamicChildren.length===Re.length?(E(h.dynamicChildren,Re,C,F,le,ee,P),(y.key!=null||F&&y===F.subTree)&&ll(h,y,!0)):de(h,y,C,Se,F,le,ee,P,Z)},Ie=(h,y,C,R,F,le,ee,P,Z)=>{y.slotScopeIds=P,h==null?y.shapeFlag&512?F.ctx.activate(y,C,R,ee,Z):Ae(y,C,R,F,le,ee,Z):ye(h,y,Z)},Ae=(h,y,C,R,F,le,ee)=>{const P=h.component=Yp(h,R,F);if(ga(h)&&(P.ctx.renderer=It),Jp(P,!1,ee),P.asyncDep){if(F&&F.registerDep(P,Pe,ee,le),!h.el){const Z=P.subTree=Ce(Wt);ue(null,Z,y,C),h.placeholder=Z.el}}else Pe(P,h,y,C,F,le,ee)},ye=(h,y,C)=>{const R=y.component=h.component;if(Pp(h,y,C))if(R.asyncDep&&!R.asyncResolved){y.el=h.el,y.placeholder=h.placeholder,Ue(R,y,C);return}else R.next=y,R.update();else y.el=h.el,y.placeholder=h.placeholder,R.vnode=y},Pe=(h,y,C,R,F,le,ee)=>{const P=()=>{if(h.isMounted){let{next:we,bu:Re,u:Te,parent:Xe,vnode:Qe}=h;{const Yt=zc(h);if(Yt){we&&(we.el=Qe.el,Ue(h,we,ee)),Yt.asyncDep.then(()=>{Qt(()=>{h.isUnmounted||te()},F)});return}}let tt=we,_t;$s(h,!1),we?(we.el=Qe.el,Ue(h,we,ee)):we=Qe,Re&&Mo(Re),(_t=we.props&&we.props.onVnodeBeforeUpdate)&&xn(_t,Xe,we,Qe),$s(h,!0);const $t=fu(h),tn=h.subTree;h.subTree=$t,J(tn,$t,_(tn.el),bt(tn),h,F,le),we.el=$t.el,tt===null&&Op(h,$t.el),Te&&Qt(Te,F),(_t=we.props&&we.props.onVnodeUpdated)&&Qt(()=>xn(_t,Xe,we,Qe),F)}else{let we;const{el:Re,props:Te}=y,{bm:Xe,m:Qe,parent:tt,root:_t,type:$t}=h,tn=Pr(y);$s(h,!1),Xe&&Mo(Xe),!tn&&(we=Te&&Te.onVnodeBeforeMount)&&xn(we,tt,y),$s(h,!0);{_t.ce&&_t.ce._hasShadowRoot()&&_t.ce._injectChildStyle($t,h.parent?h.parent.type:void 0);const Yt=h.subTree=fu(h);J(null,Yt,C,R,h,F,le),y.el=Yt.el}if(Qe&&Qt(Qe,F),!tn&&(we=Te&&Te.onVnodeMounted)){const Yt=y;Qt(()=>xn(we,tt,Yt),F)}(y.shapeFlag&256||tt&&Pr(tt.vnode)&&tt.vnode.shapeFlag&256)&&h.a&&Qt(h.a,F),h.isMounted=!0,y=C=R=null}};h.scope.on();const Z=h.effect=new Zu(P);h.scope.off();const te=h.update=Z.run.bind(Z),Se=h.job=Z.runIfDirty.bind(Z);Se.i=h,Se.id=h.uid,Z.scheduler=()=>rl(Se),$s(h,!0),te()},Ue=(h,y,C)=>{y.component=h;const R=h.vnode.props;h.vnode=y,h.next=null,Ip(h,y.props,R,C),Rp(h,y.children,C),Mn(),yc(h),In()},de=(h,y,C,R,F,le,ee,P,Z=!1)=>{const te=h&&h.children,Se=h?h.shapeFlag:0,we=y.children,{patchFlag:Re,shapeFlag:Te}=y;if(Re>0){if(Re&128){Ee(te,we,C,R,F,le,ee,P,Z);return}else if(Re&256){ke(te,we,C,R,F,le,ee,P,Z);return}}Te&8?(Se&16&>(te,F,le),we!==te&&g(C,we)):Se&16?Te&16?Ee(te,we,C,R,F,le,ee,P,Z):gt(te,F,le,!0):(Se&8&&g(C,""),Te&16&&re(we,C,R,F,le,ee,P,Z))},ke=(h,y,C,R,F,le,ee,P,Z)=>{h=h||Ms,y=y||Ms;const te=h.length,Se=y.length,we=Math.min(te,Se);let Re;for(Re=0;ReSe?gt(h,F,le,!0,!1,we):re(y,C,R,F,le,ee,P,Z,we)},Ee=(h,y,C,R,F,le,ee,P,Z)=>{let te=0;const Se=y.length;let we=h.length-1,Re=Se-1;for(;te<=we&&te<=Re;){const Te=h[te],Xe=y[te]=Z?Fn(y[te]):Tn(y[te]);if(Ps(Te,Xe))J(Te,Xe,C,null,F,le,ee,P,Z);else break;te++}for(;te<=we&&te<=Re;){const Te=h[we],Xe=y[Re]=Z?Fn(y[Re]):Tn(y[Re]);if(Ps(Te,Xe))J(Te,Xe,C,null,F,le,ee,P,Z);else break;we--,Re--}if(te>we){if(te<=Re){const Te=Re+1,Xe=TeRe)for(;te<=we;)$e(h[te],F,le,!0),te++;else{const Te=te,Xe=te,Qe=new Map;for(te=Xe;te<=Re;te++){const Kt=y[te]=Z?Fn(y[te]):Tn(y[te]);Kt.key!=null&&Qe.set(Kt.key,te)}let tt,_t=0;const $t=Re-Xe+1;let tn=!1,Yt=0;const nn=new Array($t);for(te=0;te<$t;te++)nn[te]=0;for(te=Te;te<=we;te++){const Kt=h[te];if(_t>=$t){$e(Kt,F,le,!0);continue}let Ot;if(Kt.key!=null)Ot=Qe.get(Kt.key);else for(tt=Xe;tt<=Re;tt++)if(nn[tt-Xe]===0&&Ps(Kt,y[tt])){Ot=tt;break}Ot===void 0?$e(Kt,F,le,!0):(nn[Ot-Xe]=te+1,Ot>=Yt?Yt=Ot:tn=!0,J(Kt,y[Ot],C,null,F,le,ee,P,Z),_t++)}const hs=tn?Vp(nn):Ms;for(tt=hs.length-1,te=$t-1;te>=0;te--){const Kt=Xe+te,Ot=y[Kt],Be=y[Kt+1],Gn=Kt+1{const{el:le,type:ee,transition:P,children:Z,shapeFlag:te}=h;if(te&6){Le(h.component.subTree,y,C,R);return}if(te&128){h.suspense.move(y,C,R);return}if(te&64){ee.move(h,y,C,It);return}if(ee===je){r(le,y,C);for(let we=0;weP.enter(le),F));else{const{leave:we,delayLeave:Re,afterLeave:Te}=P,Xe=()=>{h.ctx.isUnmounted?o(le):r(le,y,C)},Qe=()=>{const tt=le._isLeaving||!!le[ln];le._isLeaving&&le[ln](!0),P.persisted&&!tt?Xe():we(le,()=>{Xe(),Te&&Te()})};Re?Re(le,Xe,Qe):Qe()}else r(le,y,C)},$e=(h,y,C,R=!1,F=!1)=>{const{type:le,props:ee,ref:P,children:Z,dynamicChildren:te,shapeFlag:Se,patchFlag:we,dirs:Re,cacheIndex:Te,memo:Xe}=h;if((we===-2||te&&te.hasOnce)&&(F=!1),P!=null&&(Mn(),Ar(P,null,C,h,!0),In()),Te!=null&&(!h.ctx||h.ctx===y)&&(y.renderCache[Te]=void 0),Se&256){y.ctx.deactivate(h);return}const Qe=Se&1&&Re,tt=!Pr(h);let _t;if(tt&&(_t=ee&&ee.onVnodeBeforeUnmount)&&xn(_t,y,h),Se&6)ct(h.component,C,R);else{if(Se&128){h.suspense.unmount(C,R);return}Qe&&Cs(h,null,y,"beforeUnmount"),Se&64?h.type.remove(h,y,C,It,R):te&&!te.hasOnce&&(le!==je||we>0&&we&64)?gt(te,y,C,!1,!0):(le===je&&we&384||!F&&Se&16)&>(Z,y,C),R&&pe(h)}const $t=Xe!=null&&Te==null;(tt&&(_t=ee&&ee.onVnodeUnmounted)||Qe||$t)&&Qt(()=>{_t&&xn(_t,y,h),Qe&&Cs(h,null,y,"unmounted"),$t&&(h.el=null)},C)},pe=h=>{const{type:y,el:C,anchor:R,transition:F}=h,le=y===je;if(le&&!F){De(C,R);return}if(y===jo){S(h),F&&!F.persisted&&F.afterLeave&&F.afterLeave();return}const ee=le?Kr(h):h,P=()=>{le?_(C)&&De(C,R):o(C),F&&!F.persisted&&F.afterLeave&&F.afterLeave()};if(ee&&ee.shapeFlag&1&&F&&!F.persisted){const{leave:Z,delayLeave:te}=F,Se=ee.el,we=()=>Z(Se,P);te?te(Se,P,we):we()}else P()},De=(h,y)=>{let C;for(;h!==y;)C=T(h),o(h),h=C;o(y)},ct=(h,y,C)=>{const{bum:R,scope:F,job:le,subTree:ee,um:P,m:Z,a:te}=h;mu(Z),mu(te),R&&Mo(R),F.stop(),le?(le.flags|=8,$e(ee,h,y,C)):h.vnode.el&&ee&&(ee.transition=h.vnode.transition,$e(ee,h,y,C)),P&&Qt(P,y),Qt(()=>{h.isUnmounted=!0},y)},gt=(h,y,C,R=!1,F=!1,le=0)=>{for(let ee=le;ee{if(h.shapeFlag&6)return bt(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();const y=T(h.anchor||h.el),C=y&&y[xc];return C?T(C):y},wt=(h,y,C)=>{const R=h&&y._vnode?void 0:h&&h.component?h.component.uid:Gp();Xf(()=>{h==null?y._vnode&&$e(y._vnode,null,null,!0):J(y._vnode||null,h,y,null,null,null,C),y._vnode=h},R)},It={p:J,um:$e,m:Le,r:pe,mt:Ae,mc:re,pc:de,pbc:E,n:bt,o:e};return{render:wt,hydrate:void 0,createApp:Cp(wt)}}function fi({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function $s({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Fp(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ll(e,t,n=!1){const r=e.children,o=t.children;if(qe(r)&&qe(o))for(let i=0;i>1,e[n[f]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,c=n[i-1];i-- >0;)n[i]=c,c=t[c];return n}function zc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:zc(t)}function mu(e){if(e)for(let t=0;te.__isSuspense;function Bp(e,t){t&&t.pendingBranch?qe(e)?t.effects.push(...e):t.effects.push(e):Jf(e)}const je=Symbol.for("v-fgt"),_a=Symbol.for("v-txt"),Wt=Symbol.for("v-cmt"),jo=Symbol.for("v-stc"),Ds=[];let on=null;function $(e=!1){Ds.push(on=e?null:[])}function Gc(){Ds.pop(),on=Ds[Ds.length-1]||null}let Nr=1;function Go(e,t=!1){Nr+=e,e<0&&on&&t&&(on.hasOnce=!0)}function Yc(e){return e.dynamicChildren=Nr>0?on||Ms:null,Gc(),Nr>0&&on&&on.push(e),e}function A(e,t,n,r,o,i){return Yc(l(e,t,n,r,o,i,!0))}function St(e,t,n,r,o){return Yc(Ce(e,t,n,r,o,!0))}function Fr(e){return e?e.__v_isVNode===!0:!1}function Ps(e,t){return e.type===t.type&&e.key===t.key}const Jc=({key:e})=>e??null,Do=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Ct(e)||Gt(e)||Ye(e)?{i:cn,r:e,k:t,f:!!n}:e:null);function l(e,t=null,n=null,r=0,o=null,i=e===je?0:1,c=!1,f=!1){const v={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Jc(t),ref:t&&Do(t),scopeId:wc,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:cn};return f?(Yo(v,n),i&128&&e.normalize(v)):n&&(v.shapeFlag|=Ct(n)?8:16),Nr>0&&!c&&on&&(v.patchFlag>0||i&6)&&v.patchFlag!==32&&on.push(v),v}const Ce=Up;function Up(e,t=null,n=null,r=0,o=null,i=!1){if((!e||e===hp)&&(e=Wt),Fr(e)){const f=ds(e,t,!0);return n&&Yo(f,n),Nr>0&&!i&&on&&(f.shapeFlag&6?on[on.indexOf(e)]=f:on.push(f)),f.patchFlag=-2,f}if(ev(e)&&(e=e.__vccOpts),t){t=qp(t);let{class:f,style:v}=t;f&&!Ct(f)&&(t.class=Ze(f)),ft(v)&&(sl(v)&&!qe(v)&&(v=Pt({},v)),t.style=Un(v))}const c=Ct(e)?1:Wc(e)?128:ya(e)?64:ft(e)?4:Ye(e)?2:0;return l(e,t,n,r,o,c,i,!0)}function qp(e){return e?sl(e)||Fc(e)?Pt({},e):e:null}function ds(e,t,n=!1,r=!1){const{props:o,ref:i,patchFlag:c,children:f,transition:v}=e,b=t?zp(o||{},t):o,g={__v_isVNode:!0,__v_skip:!0,type:e.type,props:b,key:b&&Jc(b),ref:t&&t.ref?n&&i?qe(i)?i.concat(Do(t)):[i,Do(t)]:Do(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:f,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==je?c===-1?16:c|16:c,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:v,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ds(e.ssContent),ssFallback:e.ssFallback&&ds(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return v&&r&&cs(g,v.clone(g)),g}function vt(e=" ",t=0){return Ce(_a,null,e,t)}function Hp(e,t){const n=Ce(jo,null,e);return n.staticCount=t,n}function ge(e="",t=!1){return t?($(),St(Wt,null,e)):Ce(Wt,null,e)}function Tn(e){return e==null||typeof e=="boolean"?Ce(Wt):qe(e)?Ce(je,null,e.slice()):Fr(e)?Fn(e):Ce(_a,null,String(e))}function Fn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ds(e)}function Yo(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(qe(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Yo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!Fc(t)?t._ctx=cn:o===3&&cn&&(cn.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(Ye(t)){if(r&65){Yo(e,{default:t});return}t={default:t,_ctx:cn},n=32}else t=String(t),r&64?(n=16,t=[vt(t)]):n=8;e.children=t,e.shapeFlag|=n}function zp(...e){const t={};for(let n=0;nen||cn;let Jo,Vr;{const e=va(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),i=>{o.length>1?o.forEach(c=>c(i)):o[0](i)}};Jo=t("__VUE_INSTANCE_SETTERS__",n=>en=n),Vr=t("__VUE_SSR_SETTERS__",n=>Br=n)}const Yr=e=>{const t=en;return Jo(e),e.scope.on(),()=>{e.scope.off(),Jo(t)}},hu=()=>{en&&en.scope.off(),Jo(null)};function Qc(e){return e.vnode.shapeFlag&4}let Br=!1;function Jp(e,t=!1,n=!1){t&&Vr(t);const{props:r,children:o}=e.vnode,i=Qc(e);Mp(e,r,i,t),Lp(e,o,n||t);const c=i?Xp(e,t):void 0;return t&&Vr(!1),c}function Xp(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,yp);const{setup:r}=n;if(r){Mn();const o=e.setupContext=r.length>1?Zp(e):null,i=Yr(e),c=Gr(r,e,0,[e.props,o]),f=Hu(c);if(In(),i(),(f||e.sp)&&!Pr(e)&&Tc(e),f){if(c.then(hu,hu),t)return c.then(v=>{Vr(!0);try{yu(e,v,t)}finally{Vr(!1)}}).catch(v=>{ha(v,e,0)});e.asyncDep=c}else yu(e,c)}else Zc(e)}function yu(e,t,n){Ye(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ft(t)&&(e.setupState=vc(t)),Zc(e)}function Zc(e,t,n){const r=e.type;e.render||(e.render=r.render||Pn);{const o=Yr(e);Mn();try{gp(e)}finally{In(),o()}}}const Qp={get(e,t){return Ht(e,"get",""),e[t]}};function Zp(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Qp),slots:e.slots,emit:e.emit,expose:t}}function ka(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(vc(Ff(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Or)return Or[n](e)},has(t,n){return n in t||n in Or}})):e.proxy}function ev(e){return Ye(e)&&"__vccOpts"in e}const rt=(e,t)=>Hf(e,t,Br);function tv(e,t,n){try{Go(-1);const r=arguments.length;return r===2?ft(t)&&!qe(t)?Fr(t)?Ce(e,null,[t]):Ce(e,t):Ce(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Fr(n)&&(n=[n]),Ce(e,t,n))}finally{Go(1)}}const nv="3.5.44";/** +* @vue/runtime-dom v3.5.44 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ii;const gu=typeof window<"u"&&window.trustedTypes;if(gu)try{Ii=gu.createPolicy("vue",{createHTML:e=>e})}catch{}const ed=Ii?e=>Ii.createHTML(e):e=>e,sv="http://www.w3.org/2000/svg",rv="http://www.w3.org/1998/Math/MathML",Nn=typeof document<"u"?document:null,bu=Nn&&Nn.createElement("template"),ov={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Nn.createElementNS(sv,e):t==="mathml"?Nn.createElementNS(rv,e):n?Nn.createElement(e,{is:n}):Nn.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Nn.createTextNode(e),createComment:e=>Nn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Nn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const c=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{bu.innerHTML=ed(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const f=bu.content;if(r==="svg"||r==="mathml"){const v=f.firstChild;for(;v.firstChild;)f.appendChild(v.firstChild);f.removeChild(v)}t.insertBefore(f,n)}return[c?c.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ts="transition",kr="animation",nr=Symbol("_vtc"),td={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},nd=Pt({},$c,td),av=e=>(e.displayName="Transition",e.props=nd,e),lr=av((e,{slots:t})=>tv(ap,sd(e),t)),Ss=(e,t=[])=>{qe(e)?e.forEach(n=>n(...t)):e&&e(...t)},wu=e=>e?qe(e)?e.some(t=>t.length>1):e.length>1:!1;function sd(e){const t={};for(const ne in e)ne in td||(t[ne]=e[ne]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:c=`${n}-enter-active`,enterToClass:f=`${n}-enter-to`,appearFromClass:v=i,appearActiveClass:b=c,appearToClass:g=f,leaveFromClass:_=`${n}-leave-from`,leaveActiveClass:T=`${n}-leave-active`,leaveToClass:x=`${n}-leave-to`}=e,j=iv(o),J=j&&j[0],oe=j&&j[1],{onBeforeEnter:ue,onEnter:ce,onEnterCancelled:q,onLeave:S,onLeaveCancelled:H,onBeforeAppear:Q=ue,onAppear:G=ce,onAppearCancelled:re=q}=t,M=(ne,Ie,Ae,ye)=>{ne._enterCancelled=ye,ss(ne,Ie?g:f),ss(ne,Ie?b:c),Ae&&Ae()},E=(ne,Ie)=>{ne._isLeaving=!1,ss(ne,_),ss(ne,x),ss(ne,T),Ie&&Ie()},I=ne=>(Ie,Ae)=>{const ye=ne?G:ce,Pe=()=>M(Ie,ne,Ae);Ss(ye,[Ie,Pe]),_u(()=>{ss(Ie,ne?v:i),Cn(Ie,ne?g:f),wu(ye)||ku(Ie,r,J,Pe)})};return Pt(t,{onBeforeEnter(ne){Ss(ue,[ne]),Cn(ne,i),Cn(ne,c)},onBeforeAppear(ne){Ss(Q,[ne]),Cn(ne,v),Cn(ne,b)},onEnter:I(!1),onAppear:I(!0),onLeave(ne,Ie){ne._isLeaving=!0;const Ae=()=>E(ne,Ie);Cn(ne,_),ne._enterCancelled?(Cn(ne,T),ji(ne)):(ji(ne),Cn(ne,T)),_u(()=>{ne._isLeaving&&(ss(ne,_),Cn(ne,x),wu(S)||ku(ne,r,oe,Ae))}),Ss(S,[ne,Ae])},onEnterCancelled(ne){M(ne,!1,void 0,!0),Ss(q,[ne])},onAppearCancelled(ne){M(ne,!0,void 0,!0),Ss(re,[ne])},onLeaveCancelled(ne){E(ne),Ss(H,[ne])}})}function iv(e){if(e==null)return null;if(ft(e))return[pi(e.enter),pi(e.leave)];{const t=pi(e);return[t,t]}}function pi(e){return df(e)}function Cn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[nr]||(e[nr]=new Set)).add(t)}function ss(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[nr];n&&(n.delete(t),n.size||(e[nr]=void 0))}function _u(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let lv=0;function ku(e,t,n,r){const o=e._endId=++lv,i=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:c,timeout:f,propCount:v}=rd(e,t);if(!c)return r();const b=c+"end";let g=0;const _=()=>{e.removeEventListener(b,T),i()},T=x=>{x.target===e&&++g>=v&&_()};setTimeout(()=>{g(n[j]||"").split(", "),o=r(`${ts}Delay`),i=r(`${ts}Duration`),c=xu(o,i),f=r(`${kr}Delay`),v=r(`${kr}Duration`),b=xu(f,v);let g=null,_=0,T=0;t===ts?c>0&&(g=ts,_=c,T=i.length):t===kr?b>0&&(g=kr,_=b,T=v.length):(_=Math.max(c,b),g=_>0?c>b?ts:kr:null,T=g?g===ts?i.length:v.length:0);const x=g===ts&&/\b(?:transform|all)(?:,|$)/.test(r(`${ts}Property`).toString());return{type:g,timeout:_,propCount:T,hasTransform:x}}function xu(e,t){for(;e.lengthCu(n)+Cu(e[r])))}function Cu(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ji(e){return(e?e.ownerDocument:document).body.offsetHeight}function uv(e,t,n){const r=e[nr];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const $u=Symbol("_vod"),od=Symbol("_vsh"),cv=Symbol(""),dv=/(?:^|;)\s*display\s*:/;function fv(e,t,n){const r=e.style,o=Ct(n);let i=!1;if(n&&!o){if(t)if(Ct(t))for(const c of t.split(";")){const f=c.slice(0,c.indexOf(":")).trim();n[f]==null&&$r(r,f,"")}else for(const c in t)n[c]==null&&$r(r,c,"");for(const c in n){c==="display"&&(i=!0);const f=n[c];f!=null?vv(e,c,!Ct(t)&&t?t[c]:void 0,f)||$r(r,c,f):$r(r,c,"")}}else if(o){if(t!==n){const c=r[cv];c&&(n+=";"+c),r.cssText=n,i=dv.test(n)}}else t&&e.removeAttribute("style");$u in e&&((!o||t!==n)&&(e[$u]=i?r.display:""),e[od]&&(r.display="none"))}const Ao=/\s*!important$/;function $r(e,t,n){if(qe(n))n.forEach(r=>$r(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))Ao.test(n)?e.setProperty(t,n.replace(Ao,""),"important"):e.setProperty(t,n);else{const r=pv(e,t);Ao.test(n)?e.setProperty(vs(r),n.replace(Ao,""),"important"):e[r]=n}}const Su=["Webkit","Moz","ms"],vi={};function pv(e,t){const n=vi[t];if(n)return n;let r=yn(t);if(r!=="filter"&&r in e)return vi[t]=r;r=Gu(r);for(let o=0;omi||(wv.then(()=>mi=0),mi=Date.now());function kv(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;const o=n.value;if(qe(o)){const i=r.stopImmediatePropagation;r.stopImmediatePropagation=()=>{i.call(r),r._stopped=!0};const c=o.slice(),f=[r];for(let v=0;ve.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,xv=(e,t,n,r,o,i)=>{const c=o==="svg";t==="class"?uv(e,r,c):t==="style"?fv(e,n,r):ca(t)?da(t)||hv(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Cv(e,t,r,c))?(Au(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Tu(e,t,r,c,i,t!=="value")):e._isVueCE&&($v(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ct(r)))?Au(e,yn(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Tu(e,t,r,c))};function Cv(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ou(t)&&Ye(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ou(t)&&Ct(n)?!1:t in e}function $v(e,t){const n=e._def.props;if(!n)return!1;const r=yn(t);return Array.isArray(n)?n.some(o=>yn(o)===r):Object.keys(n).some(o=>yn(o)===r)}const ad=new WeakMap,id=new WeakMap,Xo=Symbol("_moveCb"),Mu=Symbol("_enterCb"),Di=new WeakMap,Sv=e=>(delete e.props.mode,e),Ev=Sv({name:"TransitionGroup",props:Pt({},nd,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ul(),r=Cc();let o,i,c,f;const v=()=>(f===void 0&&(f=o.length>0&&Dv(o[0].el,n.vnode.el,Iu(e))),f);return Pc(()=>{if(Di.delete(n),!v()){o=[],c=void 0;return}const b=Iu(e);o.forEach(Av);const g=c&&jv(c,n.vnode.el);c=void 0,o.forEach(T=>Pv(T,g));const _=o.filter(Ov);ji(n.vnode.el),_.forEach(T=>{const x=T.el,j=x.style;Cn(x,b),j.transform=j.webkitTransform=j.transitionDuration="";const J=x[Xo]=oe=>{oe&&oe.target!==x||(!oe||oe.propertyName.endsWith("transform"))&&(x.removeEventListener("transitionend",J),x[Xo]=null,ss(x,b))};x.addEventListener("transitionend",J)}),o=[]}),()=>{const b=ut(e),g=sd(b);let _=b.tag||je;if(o=[],f=void 0,i)for(let T=0;Tr.willMove()&&r.item.contains(t));return n&&xa(n.item,n)}function Dv(e,t,n){const r=e.cloneNode(),o=e[nr];o&&o.forEach(f=>{f.split(/\s+/).forEach(v=>v&&r.classList.remove(v))}),n.split(/\s+/).forEach(f=>f&&r.classList.add(f)),r.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(r);const{hasTransform:c}=rd(r);return i.removeChild(r),c}const Qo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return qe(t)?n=>Mo(t,n):t};function Lv(e){e.target.composing=!0}function ju(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Is=Symbol("_assign"),Po=Symbol("_initialValue");function hi(e,t,n){return t&&(e=e.trim()),n&&(e=pa(e)),e}const Ne={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e.parentNode&&(e.type==="text"?e[Po]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Po]=e.defaultValue.replace(/\r\n?/g,` +`))),e[Is]=Qo(o);const i=r||o.props&&o.props.type==="number";Os(e,t?"change":"input",c=>{c.target.composing||e[Is](hi(e.value,n,i))}),(n||i)&&Os(e,"change",()=>{e.value=hi(e.value,n,i)}),t||(Os(e,"compositionstart",Lv),Os(e,"compositionend",ju),Os(e,"change",ju))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){const o=t??"",i=e[Po];delete e[Po],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[Is](hi(e.value,n,r)):e.value=o},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:i}},c){if(e[Is]=Qo(c),e.composing)return;const f=(i||e.type==="number")&&!/^0\d/.test(e.value)?pa(e.value):e.value,v=t??"";if(f===v)return;const b=e.getRootNode();(b instanceof Document||b instanceof ShadowRoot)&&b.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===v)||(e.value=v)}},fs={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,Os(e,"change",()=>{const o=Array.prototype.filter.call(e.options,v=>v.selected).map(v=>n?pa(Zo(v)):Zo(v)),i=e.multiple,c=i?Ls(e._modelValue)?new Set(o):o:o[0],f=e._pendingValue=[i,i?qe(c)?o.slice():o:c];try{e[Is](c)}finally{ir(()=>{e._pendingValue===f&&(e._pendingValue=void 0)})}}),e[Is]=Qo(r)},mounted(e,{value:t}){Du(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[Is]=Qo(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Rv(t,n[1],n[0]))&&Du(e,t)}};function Rv(e,t,n){if(!n||qe(e))return ls(e,t);if(Ls(e)){if(e.size!==t.length)return!1;for(const r of t)if(!e.has(r))return!1;return!0}return!1}function Du(e,t){const n=e.multiple,r=qe(t);if(!(n&&!r&&!Ls(t))){for(let o=0,i=e.options.length;oString(b)===String(f)):c.selected=wf(t,f)>-1}else c.selected=t.has(f);else if(ls(Zo(c),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Zo(e){return"_value"in e?e._value:e.value}const Kv=["ctrl","shift","alt","meta"],Nv={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Kv.some(n=>e[`${n}Key`]&&!t.includes(n))},zt=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...i)=>{for(let c=0;c{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const i=vs(o.key);if(t.some(c=>c===i||Fv[c]===i))return e(o)})},Vv=Pt({patchProp:xv},ov);let Lu;function Bv(){return Lu||(Lu=Kp(Vv))}const Uv=(...e)=>{const t=Bv().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Hv(r);if(!o)return;const i=t._component;!Ye(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const c=n(o,!1,qv(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),c},t};function qv(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Hv(e){return Ct(e)?document.querySelector(e):e}function Et(e){return''+e+""}const zv={calendar:Et(''),clock:Et(''),"check-circle":Et(''),edit:Et(''),tag:Et(''),star:Et(''),close:Et(''),flag:Et(''),chart:Et(''),export:Et(''),"chevron-left":Et(''),"chevron-right":Et(''),"chevron-down":Et(''),plus:Et(''),search:Et(''),settings:Et(''),memo:Et(''),lock:Et(''),wallet:Et(''),more:Et(''),shield:Et(''),plan:Et('')},Wv=["innerHTML"],He=Rt({__name:"Icon",props:{name:{},size:{default:16}},setup(e){const t=e,n=rt(()=>zv[t.name]||"");return(r,o)=>($(),A("span",{class:"icon",style:Un({width:e.size+"px",height:e.size+"px"}),innerHTML:n.value},null,12,Wv))}}),Gv=["aria-label"],Yv={class:"dialog-title"},Jv={class:"dialog-msg"},Xv={class:"dialog-btns"},Qv=Rt({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{default:"确认"},cancelText:{default:"取消"},danger:{type:Boolean,default:!1}},emits:["cancel","confirm"],setup(e,{emit:t}){const n=e,r=t;function o(i){n.open&&i.key==="Escape"&&r("cancel")}return yt(()=>n.open,i=>{i?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),Wn(()=>window.removeEventListener("keydown",o)),(i,c)=>($(),St(Hn,{to:"body"},[Ce(lr,{name:"modal"},{default:ms(()=>[e.open?($(),A("div",{key:0,class:"mask",onClick:c[2]||(c[2]=zt(f=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",Yv,W(e.title),1),l("div",Jv,W(e.message),1),l("div",Xv,[l("button",{class:"btn btn-sm",onClick:c[0]||(c[0]=f=>r("cancel"))},W(e.cancelText),1),l("button",{class:Ze(["btn btn-sm",e.danger?"btn-danger-solid":"btn-primary"]),onClick:c[1]||(c[1]=f=>r("confirm"))},W(e.confirmText),3)])],8,Gv)])):ge("",!0)]),_:1})]))}}),Vt=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},Dn=Vt(Qv,[["__scopeId","data-v-f27041d4"]]);var Ru=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Zv(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ld={exports:{}};(function(e,t){((n,r)=>{e.exports=r()})(Ru,function(){var n=function(s,a){return(n=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(u,d){u.__proto__=d}:function(u,d){for(var p in d)Object.prototype.hasOwnProperty.call(d,p)&&(u[p]=d[p])}))(s,a)},r=function(){return(r=Object.assign||function(s){for(var a,u=1,d=arguments.length;u"u"||i.Promise||(i.Promise=Promise);var b=Object.getPrototypeOf,g={}.hasOwnProperty;function _(s,a){return g.call(s,a)}function T(s,a){typeof a=="function"&&(a=a(b(s))),(typeof Reflect>"u"?c:Reflect.ownKeys)(a).forEach(function(u){j(s,u,a[u])})}var x=Object.defineProperty;function j(s,a,u,d){x(s,a,v(u&&_(u,"get")&&typeof u.get=="function"?{get:u.get,set:u.set,configurable:!0}:{value:u,configurable:!0,writable:!0},d))}function J(s){return{from:function(a){return s.prototype=Object.create(a.prototype),j(s.prototype,"constructor",s),{extend:T.bind(null,s.prototype)}}}}var oe=Object.getOwnPropertyDescriptor,ue=[].slice;function ce(s,a,u){return ue.call(s,a,u)}function q(s,a){return a(s)}function S(s){if(!s)throw new Error("Assertion Failed")}function H(s){i.setImmediate?setImmediate(s):setTimeout(s,0)}function Q(s,a){if(typeof a=="string"&&_(s,a))return s[a];if(!a)return s;if(typeof a!="string"){for(var u=[],d=0,p=a.length;d"u"?[]:(Qe=Promise.resolve(),typeof crypto<"u"&&crypto.subtle?[Xe=crypto.subtle.digest("SHA-512",new Uint8Array([0])),b(Xe),Qe]:[Qe,b(Qe),Qe]),Qe=Xe[0],zs=Xe[1],zs=zs&&zs.then,tt=Qe&&Qe.constructor,_t=!!Xe[2],$t=function(s,a){Gn.push([s,a]),Yt&&(queueMicrotask(Ld),Yt=!1)},tn=!0,Yt=!0,nn=[],hs=[],Kt=C,Ot={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:y,pgp:!1,env:{},finalize:y},Be=Ot,Gn=[],ys=0,Zr=[];function Oe(s){if(typeof this!="object")throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var a=this._PSD=Be;if(typeof s!="function"){if(s!==Re)throw new TypeError("Not a function");this._state=arguments[1],this._value=arguments[2],this._state===!1&&Ta(this,this._value)}else this._state=null,this._value=null,++a.ref,function u(d,p){try{p(function(m){if(d._state===null){if(m===d)throw new TypeError("A promise cannot be resolved with itself.");var w=d._lib&&Fs();m&&typeof m.then=="function"?u(d,function(k,L){m instanceof Oe?m._then(k,L):m.then(k,L)}):(d._state=!0,d._value=m,bl(d)),w&&Vs()}},Ta.bind(null,d))}catch(m){Ta(d,m)}}(this,s)}var Ea={get:function(){var s=Be,a=so;function u(d,p){var m=this,w=!s.global&&(s!==Be||a!==so),k=w&&!Jn(),L=new Oe(function(Y,N){Aa(m,new gl(_l(d,s,w,k),_l(p,s,w,k),Y,N,s))});return this._consoleTask&&(L._consoleTask=this._consoleTask),L}return u.prototype=Re,u},set:function(s){j(this,"then",s&&s.prototype===Re?Ea:{get:function(){return s},set:Ea.set})}};function gl(s,a,u,d,p){this.onFulfilled=typeof s=="function"?s:null,this.onRejected=typeof a=="function"?a:null,this.resolve=u,this.reject=d,this.psd=p}function Ta(s,a){var u,d;hs.push(a),s._state===null&&(u=s._lib&&Fs(),a=Kt(a),s._state=!1,s._value=a,d=s,nn.some(function(p){return p._value===d._value})||nn.push(d),bl(s),u)&&Vs()}function bl(s){var a=s._listeners;s._listeners=[];for(var u=0,d=a.length;u{for(var w=nn.length;w;)if(nn[--w]._value===m._value)return nn.splice(w,1)})(a),u.resolve(d)}catch(m){u.reject(m)}finally{--ys==0&&Pa(),--u.psd.ref||u.psd.finalize()}}function Ld(){gs(Ot,function(){Fs()&&Vs()})}function Fs(){var s=tn;return Yt=tn=!1,s}function Vs(){var s,a,u;do for(;0.",kl="String expected.",oo="__dbnames",Ma="readonly",Ia="readwrite";function ws(s,a){return s?a?function(){return s.apply(this,arguments)&&a.apply(this,arguments)}:s:a}var xl={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function ao(s){return typeof s!="string"||/\./.test(s)?function(a){return a}:function(a){return a[s]===void 0&&s in a&&delete(a=Ie(a))[s],a}}function Cl(){throw fe.Type("Entity instances must never be new:ed. Instances are generated by the framework bypassing the constructor.")}function st(s,a){try{var u=$l(s),d=$l(a);if(u!==d)return u==="Array"?1:d==="Array"?-1:u==="binary"?1:d==="binary"?-1:u==="string"?1:d==="string"?-1:u==="Date"?1:d!=="Date"?NaN:-1;switch(u){case"number":case"Date":case"string":return a{var k=N,L=w;if(typeof L!="function"&&L!==null)throw new TypeError("Class extends value "+String(L)+" is not a constructor or null");function Y(){this.constructor=k}function N(){return w!==null&&w.apply(this,arguments)||this}return n(k,L),k.prototype=L===null?Object.create(L):(Y.prototype=L.prototype,new Y),Object.defineProperty(N.prototype,"db",{get:function(){return a},enumerable:!1,configurable:!0}),N.prototype.table=function(){return u},N})(s)),new Set),p=s.prototype;p;p=b(p))Object.getOwnPropertyNames(p).forEach(function(w){return d.add(w)});function m(w){if(!w)return w;var k,L=Object.create(s.prototype);for(k in w)if(!d.has(k))try{L[k]=w[k]}catch{}return L}return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=m,this.hook("reading",m),s},mt.prototype.defineClass=function(){return this.mapToClass(function(s){v(this,s)})},mt.prototype.add=function(s,a){var u=this,d=this.schema.primKey,p=d.auto,m=d.keyPath,w=s;return m&&p&&(w=ao(m)(s)),this._trans("readwrite",function(k){return u.core.mutate({trans:k,type:"add",keys:a!=null?[a]:null,values:[w]})}).then(function(k){return k.numFailures?Oe.reject(k.failures[0]):k.lastResult}).then(function(k){if(m)try{G(s,m,k)}catch{}return k})},mt.prototype.upsert=function(s,a){var u=this,d=this.schema.primKey.keyPath;return this._trans("readwrite",function(p){return u.core.get({trans:p,key:s}).then(function(m){var w=m??{};return Tl(w,a),d&&G(w,d,s),u.core.mutate({trans:p,type:"put",values:[w],keys:[s],upsert:!0,updates:{keys:[s],changeSpecs:[a]}}).then(function(k){return k.numFailures?Oe.reject(k.failures[0]):!!m})})})},mt.prototype.update=function(s,a){return typeof s!="object"||f(s)?this.where(":id").equals(s).modify(a):(s=Q(s,this.schema.primKey.keyPath))===void 0?Tt(new fe.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(s).modify(a)},mt.prototype.put=function(s,a){var u=this,d=this.schema.primKey,p=d.auto,m=d.keyPath,w=s;return m&&p&&(w=ao(m)(s)),this._trans("readwrite",function(k){return u.core.mutate({trans:k,type:"put",values:[w],keys:a!=null?[a]:null})}).then(function(k){return k.numFailures?Oe.reject(k.failures[0]):k.lastResult}).then(function(k){if(m)try{G(s,m,k)}catch{}return k})},mt.prototype.delete=function(s){var a=this;return this._trans("readwrite",function(u){return a.core.mutate({trans:u,type:"delete",keys:[s]}).then(function(d){return io(a,[s],d)}).then(function(d){return d.numFailures?Oe.reject(d.failures[0]):void 0})})},mt.prototype.clear=function(){var s=this;return this._trans("readwrite",function(a){return s.core.mutate({trans:a,type:"deleteRange",range:xl}).then(function(u){return io(s,null,u)})}).then(function(a){return a.numFailures?Oe.reject(a.failures[0]):void 0})},mt.prototype.bulkGet=function(s){var a=this;return this._trans("readonly",function(u){return a.core.getMany({keys:s,trans:u}).then(function(d){return d.map(function(p){return a.hook.reading.fire(p)})})})},mt.prototype.bulkAdd=function(s,a,u){var d=this,p=Array.isArray(a)?a:void 0,m=(u=u||(p?void 0:a))?u.allKeys:void 0;return this._trans("readwrite",function(w){var k=d.schema.primKey,Y=k.auto,k=k.keyPath;if(k&&p)throw new fe.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(p&&p.length!==s.length)throw new fe.InvalidArgument("Arguments objects and keys must have the same length");var L=s.length,Y=k&&Y?s.map(ao(k)):s;return d.core.mutate({trans:w,type:"add",keys:p,values:Y,wantResults:m}).then(function(N){var D=N.numFailures,K=N.failures;if(D===0)return m?N.results:N.lastResult;throw new bt("".concat(d.name,".bulkAdd(): ").concat(D," of ").concat(L," operations failed"),K)})})},mt.prototype.bulkPut=function(s,a,u){var d=this,p=Array.isArray(a)?a:void 0,m=(u=u||(p?void 0:a))?u.allKeys:void 0;return this._trans("readwrite",function(w){var k=d.schema.primKey,Y=k.auto,k=k.keyPath;if(k&&p)throw new fe.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(p&&p.length!==s.length)throw new fe.InvalidArgument("Arguments objects and keys must have the same length");var L=s.length,Y=k&&Y?s.map(ao(k)):s;return d.core.mutate({trans:w,type:"put",keys:p,values:Y,wantResults:m}).then(function(N){var D=N.numFailures,K=N.failures;if(D===0)return m?N.results:N.lastResult;throw new bt("".concat(d.name,".bulkPut(): ").concat(D," of ").concat(L," operations failed"),K)})})},mt.prototype.bulkUpdate=function(s){var a=this,u=this.core,d=s.map(function(w){return w.key}),p=s.map(function(w){return w.changes}),m=[];return this._trans("readwrite",function(w){return u.getMany({trans:w,keys:d,cache:"clone"}).then(function(k){var L=[],Y=[],N=(s.forEach(function(D,K){var z=D.key,B=D.changes,V=k[K];if(V){for(var U=0,se=Object.keys(B);UX+ie&&U(X+Y)})})}var se=Us(u)&&u.limit===1/0&&(typeof s!="function"||B)&&{index:u.index,range:u.range};return U(0).then(function(){if(0{for(var We=Math.min(be.length,Fe.length),Je=-1,nt=0;nt=K})).length===0?Oe.resolve():(U.forEach(function(X){V.push(function(){var ie,ve,he,xe=se,be=X._cfg.dbschema,Ke=(yo(D,xe,B),yo(D,be,B),se=D._dbSchema=be,Va(xe,be)),_e=(Ke.add.forEach(function(Fe){Ba(B,Fe[0],Fe[1].primKey,Fe[1].indexes)}),Ke.change.forEach(function(Fe){if(Fe.recreate)throw new fe.Upgrade("Not yet support for changing primary key");var me=B.objectStore(Fe.name);Fe.add.forEach(function(ze){return mo(me,ze)}),Fe.change.forEach(function(ze){me.deleteIndex(ze.name),mo(me,ze)}),Fe.del.forEach(function(ze){return me.deleteIndex(ze)})}),X._cfg.contentUpgrade);if(_e&&X._cfg.version>K)return po(D,B),z._memoizedTables={},ie=re(be),Ke.del.forEach(function(Fe){ie[Fe]=xe[Fe]}),Fa(D,[D.Transaction.prototype]),vo(D,[D.Transaction.prototype],c(ie),ie),z.schema=ie,(ve=Le(_e))&&Bs(),be=Oe.follow(function(){var Fe;(he=_e(z))&&ve&&(Fe=Jn.bind(null,null),he.then(Fe,Fe))}),he&&typeof he.then=="function"?Oe.resolve(he):be.then(function(){return he})}),V.push(function(ie){var ve,he,xe=X._cfg.dbschema;ve=xe,he=ie,[].slice.call(he.db.objectStoreNames).forEach(function(be){return ve[be]==null&&he.db.deleteObjectStore(be)}),Fa(D,[D.Transaction.prototype]),vo(D,[D.Transaction.prototype],D._storeNames,D._dbSchema),z.schema=D._dbSchema}),V.push(function(ie){D.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(D.idbdb.version/10)===X._cfg.version?(D.idbdb.deleteObjectStore("$meta"),delete D._dbSchema.$meta,D._storeNames=D._storeNames.filter(function(ve){return ve!=="$meta"})):ie.objectStore("$meta").put(X._cfg.version,"version"))})}),function X(){return V.length?Oe.resolve(V.shift()(z.idbtrans)).then(X):Oe.resolve()}().then(function(){Rl(se,B)}))}).catch(w);var L,Y;c(p).forEach(function(N){Ba(u,N,p[N].primKey,p[N].indexes)}),po(s,u),Oe.follow(function(){return s.on.populate.fire(m)}).catch(w)})}function Yd(s,a){Rl(s._dbSchema,a),a.db.version%10!=0||a.objectStoreNames.contains("$meta")||a.db.createObjectStore("$meta").add(Math.ceil(a.db.version/10-1),"version");var u=ho(0,s.idbdb,a);yo(s,s._dbSchema,a);for(var d=0,p=Va(u,s._dbSchema).change;d{if(w.change.length||w.recreate)return console.warn("Unable to patch indexes of table ".concat(w.name," because it has changes on the type of index or primary key.")),{value:void 0};var k=a.objectStore(w.name);w.add.forEach(function(L){Se&&console.debug("Dexie upgrade patch: Creating missing index ".concat(w.name,".").concat(L.src)),mo(k,L)})})(p[d]);if(typeof m=="object")return m.value}}function Va(s,a){var u,d={del:[],add:[],change:[]};for(u in s)a[u]||d.del.push(u);for(u in a){var p=s[u],m=a[u];if(p){var w={name:u,def:m,recreate:!1,del:[],add:[],change:[]};if(""+(p.primKey.keyPath||"")!=""+(m.primKey.keyPath||"")||p.primKey.auto!==m.primKey.auto)w.recreate=!0,d.change.push(w);else{var k=p.idxByName,L=m.idxByName,Y=void 0;for(Y in k)L[Y]||w.del.push(Y);for(Y in L){var N=k[Y],D=L[Y];N?N.src!==D.src&&w.change.push(D):w.add.push(D)}(0{var s,a,u;return typeof FinalizationRegistry<"u"&&typeof WeakRef<"u"?(s=new Set,a=new FinalizationRegistry(function(d){s.delete(d)}),{toArray:function(){return Array.from(s).map(function(d){return d.deref()}).filter(function(d){return d!==void 0})},add:function(d){var p=new WeakRef(d._novip);s.add(p),a.register(d._novip,p,p),s.size>d._options.maxConnections&&(p=s.values().next().value,s.delete(p),a.unregister(p))},remove:function(d){if(d)for(var p=s.values(),m=p.next();!m.done;){var w=m.value;if(w.deref()===d._novip)return s.delete(w),void a.unregister(w);m=p.next()}}}):(u=[],{toArray:function(){return u},add:function(d){u.push(d._novip)},remove:function(d){d&&(d=u.indexOf(d._novip))!==-1&&u.splice(d,1)}})})();function Ua(s,a){var u=s._dbNamesDB;return u||(u=s._dbNamesDB=new Rn(oo,{addons:[],indexedDB:s,IDBKeyRange:a})).version(1).stores({dbnames:"name"}),u.table("dbnames")}function qa(s){return s&&typeof s.databases=="function"}function Ha(s){return Yn(function(){return Be.letThrough=!0,s()})}function za(s){return!("from"in s)}var Bt=function(s,a){var u;if(!this)return u=new Bt,s&&"d"in s&&v(u,s),u;v(this,arguments.length?{d:1,from:s,to:1Math.pow(2,62)?0:U.oldVersion,D=se<1,s.idbdb=V.result,m&&Yd(s,N),Gd(s,se/10,N,z))},z),V.onsuccess=kt(function(){N=null;var U,se,X,ie,ve,he,xe=s.idbdb=V.result,be=ce(xe.objectStoreNames);if(0"u"?Oe.resolve():!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(K){function z(){return indexedDB.databases().finally(K)}L=setInterval(z,100),z()}).finally(function(){return clearInterval(L)}):Promise.resolve()).then(k)]).then(function(){return w(),a.onReadyBeingFired=[],Oe.resolve(Ha(function(){return s.on.ready.fire(s.vip)})).then(function K(){var z;if(0a.limit?d.length=a.limit:s.length===a.limit&&d.length{if(u===void 0)return d!==void 0?-1:0;if(d===void 0)return 1;if((u=st(u,d))===0){if(p&&m)return 0;if(p)return 1;if(m)return-1}return u})(s.lower,a.lower,s.lowerOpen,a.lowerOpen)<=0&&0<=((u,d,p,m)=>{if(u===void 0)return d!==void 0?1:0;if(d===void 0)return-1;if((u=st(u,d))===0){if(p&&m)return 0;if(p)return-1;if(m)return 1}return u})(s.upper,a.upper,s.upperOpen,a.upperOpen)}function sf(s,a,u,d){s.subscribers.add(u),d.addEventListener("abort",function(){var p,m;s.subscribers.delete(u),s.subscribers.size===0&&(p=s,m=a,setTimeout(function(){p.subscribers.size===0&&de(m,p)},3e3))})}var rf={stack:"dbcore",level:0,name:"Cache",create:function(s){var a=s.schema.name;return r(r({},s),{transaction:function(u,d,p){var m,w,k=s.transaction(u,d,p);return d==="readwrite"&&(p=(m=new AbortController).signal,k.addEventListener("abort",(w=function(L){return function(){if(m.abort(),d==="readwrite"){for(var Y=new Set,N=0,D=u;N{var se=_s["idb://".concat(z,"/").concat(B)];if(!se)return[];if(!(z=se.queries[V]))return[null,!1,se,null];var X=z[(U.query?U.query.index.name:null)||""];if(!X)return[null,!1,se,null];switch(V){case"query":var ie=(ve=U.direction)!=null?ve:"next",ve=X.find(function(he){var xe;return he.req.limit===U.limit&&he.req.values===U.values&&((xe=he.req.direction)!=null?xe:"next")===ie&&Gl(he.req.query.range,U.query.range)});return ve?[ve,!0,se,X]:[X.find(function(he){var xe;return("limit"in he.req?he.req.limit:1/0)>=U.limit&&((xe=he.req.direction)!=null?xe:"next")===ie&&(!U.values||he.req.values)&&nf(he.req.query.range,U.query.range)}),!1,se,X];case"count":return ve=X.find(function(he){return Gl(he.req.query.range,U.query.range)}),[ve,!!ve,se,X]}})(a,u,"query",m),K=D[0],Y=D[2],N=D[3],K&&D[1]?K.obsSet=m.obsSet:(D=d.query(m).then(function(z){var B=z.result;if(K&&(K.res=B),w){for(var V=0,U=B.length;V{var ve=Fs();try{m&&Bs();var he=Yn(s,ie);return he=m?he.finally(Jn):he}finally{ve&&Vs()}})(se={subscr:U,signal:w.signal,requery:K,querier:s,trans:null}),D||(Zn.storagemutated.subscribe(B),D=!0),Promise.resolve(X).then(function(ie){u=!0,a=ie,k||se.signal.aborted||(z()||(Y=U,z())?K():(L={},Oa(function(){return!k&&p.next&&p.next(ie)})))},function(ie){u=!1,["DatabaseClosedError","AbortError"].includes(ie==null?void 0:ie.name)||k||Oa(function(){k||p.error&&p.error(ie)})}))};return setTimeout(K,0),N});return d.hasValue=function(){return u},d.getValue=function(){return a},d}var ks=Rn;function ni(s){var a=es;try{es=!0,Zn.storagemutated.fire(s),Ja(s,!0)}finally{es=a}}T(ks,r(r({},$e),{delete:function(s){return new ks(s,{addons:[]}).delete()},exists:function(s){return new ks(s,{addons:[]}).open().then(function(a){return a.close(),!0}).catch("NoSuchDatabaseError",function(){return!1})},getDatabaseNames:function(s){try{return a=ks.dependencies,u=a.indexedDB,a=a.IDBKeyRange,(qa(u)?Promise.resolve(u.databases()).then(function(d){return d.map(function(p){return p.name}).filter(function(p){return p!==oo})}):Ua(u,a).toCollection().primaryKeys()).then(s)}catch{return Tt(new fe.MissingAPI)}var a,u},defineClass:function(){return function(s){v(this,s)}},ignoreTransaction:function(s){return Be.trans?gs(Be.transless||Ot,s):s()},vip:Ha,async:function(s){return function(){try{var a=Xa(s.apply(this,arguments));return a&&typeof a.then=="function"?a:Oe.resolve(a)}catch(u){return Tt(u)}}},spawn:function(s,a,u){try{var d=Xa(s.apply(u,a||[]));return d&&typeof d.then=="function"?d:Oe.resolve(d)}catch(p){return Tt(p)}},currentTransaction:{get:function(){return Be.trans||null}},waitFor:function(s,a){return s=Oe.resolve(typeof s=="function"?ks.ignoreTransaction(s):s).timeout(a||6e4),Be.trans?Be.trans.waitFor(s):s},Promise:Oe,debug:{get:function(){return Se},set:function(s){we(s)}},derive:J,extend:v,props:T,override:q,Events:fr,on:Zn,liveQuery:Yl,extendObservabilitySet:bo,getByKeyPath:Q,setByKeyPath:G,delByKeyPath:function(s,a){typeof a=="string"?G(s,a,void 0):"length"in a&&[].map.call(a,function(u){G(s,u,void 0)})},shallowClone:re,deepClone:Ie,getObjectDiff:Qa,cmp:st,asap:H,minKey:-1/0,addons:[],connections:{get:yr.toArray},errnames:wt,dependencies:xo,cache:_s,semVer:"4.4.6",version:"4.4.6".split(".").map(function(s){return parseInt(s)}).reduce(function(s,a,u){return s+a/Math.pow(10,2*u)})})),ks.maxKey=mr(ks.dependencies.IDBKeyRange),typeof dispatchEvent<"u"&&typeof addEventListener<"u"&&(Zn(fo,function(s){es||(s=new CustomEvent(La,{detail:s}),es=!0,dispatchEvent(s),es=!1)}),addEventListener(La,function(s){s=s.detail,es||ni(s)}));var Ws,es=!1,Jl=function(){};return typeof BroadcastChannel<"u"&&((Jl=function(){(Ws=new BroadcastChannel(La)).onmessage=function(s){return s.data&&ni(s.data)}})(),typeof Ws.unref=="function"&&Ws.unref(),Zn(fo,function(s){es||Ws.postMessage(s)})),typeof addEventListener<"u"&&(addEventListener("pagehide",function(s){if(!Rn.disableBfCache&&s.persisted){Se&&console.debug("Dexie: handling persisted pagehide"),Ws!=null&&Ws.close();for(var a=0,u=yr.toArray();a{const r={dev:"项目实操",test:"项目实操",bugfix:"售后服务",learning:"产品学习",meeting:"打杂",doc:"打杂",other:"打杂"};await n.table("log_item").toCollection().modify(o=>{o.category&&r[o.category]&&(o.category=r[o.category])})}),this.version(6).stores({plan:"++id, date, status, goal_id",goal:"++id, start_date"})}}let ae;function sm(e){ae=e}function cl(){ae&&ae.close(),ae=void 0}const rm=6,Nu=["公司","客户现场","出差","居家办公"],om={dev:"项目实操",test:"项目实操",bugfix:"售后服务",learning:"产品学习",meeting:"打杂",doc:"打杂",other:"打杂"};function ta(e){return om[e]||e}function Mr(e){return e<10?"0"+e:String(e)}function qn(e){return e.getFullYear()+"-"+Mr(e.getMonth()+1)+"-"+Mr(e.getDate())}function ot(){return qn(new Date)}function at(){const e=new Date;return qn(e)+"T"+Mr(e.getHours())+":"+Mr(e.getMinutes())+":"+Mr(e.getSeconds())}function bn(e){if(!e)return"--:--";const t=e.indexOf("T");return t>=0?e.slice(t+1,t+6):e.slice(0,5)}function Ks(e){const t=e.split("-").map(Number);return new Date(t[0],t[1]-1,t[2])}function Ft(e,t){const n=Ks(e);return n.setDate(n.getDate()+t),qn(n)}function na(e,t){const n=Ks(e),r=n.getDate();n.setDate(1),n.setMonth(n.getMonth()+t);const o=new Date(n.getFullYear(),n.getMonth()+1,0).getDate();return n.setDate(Math.min(r,o)),qn(n)}function Qs(e){const t=Ks(e),n=(t.getDay()+6)%7;return t.setDate(t.getDate()-n),qn(t)}function am(e){const t=Ks(e).getDay();return t===0||t===6}function im(e,t){return Math.round((new Date(t).getTime()-new Date(e).getTime())/6e4)}function ud(e){const t=Ks(e),n=["周日","周一","周二","周三","周四","周五","周六"];return t.getFullYear()+" 年 "+(t.getMonth()+1)+" 月 "+t.getDate()+" 日 "+n[t.getDay()]}const lm=15e4;function Ri(e){const t=new Uint8Array(e);let n="";for(let r=0;r({}));if(!o.ok){const c=i&&i.error||"服务返回 "+o.status;throw e==="register"&&o.status===409?new Error("云端已有同名账号且密码一致,直接登录即可"):new Error(String(c))}if(!i.userId||!i.username)throw new Error("登录响应异常");return{userId:String(i.userId),username:String(i.username)}}async function vl(e,t,n){const r=await Em(n,e,t);ia(r.userId);const o={userId:r.userId,username:r.username};return $m(o),md(r.username,t),o}async function Tm(e,t){const n=(e||"").trim();if(!n||!t)throw new Error("请输入用户名与密码");return vl(n,t,"login")}async function Am(e,t,n){const r=(e||"").trim();if(r.length<2||r.length>20)throw new Error("用户名需 2 到 20 个字符");if(t.length<6)throw new Error("登录密码至少 6 位");return vl(r,t,"register")}async function Pm(){const e=wn();if(!e)return null;try{return await vl(e.username,e.password,"login")}catch{return null}}async function Om(){oa(),cl(),aa=null,vd()}function Mm(){oa(),cl(),aa=null,vd(),Sm()}async function Im(e,t){if(!qr())throw new Error("未登录");if(t.length<6)throw new Error("新密码至少 6 位");const r=wn();if(!r||r.password!==e)throw new Error("旧密码不正确");const o=await Ns();let i;try{i=await fetch(o+"/api/auth/password",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+hd()},body:JSON.stringify({oldPassword:e,newPassword:t})})}catch{throw new Error("无法连接同步服务器")}if(!i.ok){const c=await i.json().catch(()=>({}));throw new Error(c&&c.error||"修改失败 "+i.status)}md(r.username,t)}async function jm(){if(!qr())throw new Error("未登录");const t=await Ns();let n;try{n=await fetch(t+"/api/auth/delete",{method:"POST",headers:{Authorization:"Bearer "+hd()}})}catch{throw new Error("无法连接同步服务器")}if(!n.ok){const r=await n.json().catch(()=>({}));throw new Error(r&&r.error||"删除失败 "+n.status)}Mm()}function hd(){return $a()}const Fi=O(null),Vi=O(null),ur=O(0);function os(){ur.value++}const Zs=O(""),Hr=["project","work_log","log_item","attendance","weekly_note","setting","memo","credential","goal","transaction","plan"],Js=new Set(["sync_cursor","sync_last_time","sync_token","last_project","last_category"]);function Lo(e){return JSON.stringify(e)}async function Dm(e){return ae.table(e).toArray()}function Ro(e,t){return e==="setting"?t.key:t.id}async function Lm(){for(const e of Hr){const t=ae.table(e),n=await t.toArray();for(const r of n){if(e==="setting"&&Js.has(r.key))continue;const o={};r.uuid||(o.uuid=Rm()),!r.updated_at&&r.created_at&&(o.updated_at=r.created_at),Object.keys(o).length&&await t.update(Ro(e,r),o)}}}function Rm(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"u"+Date.now().toString(36)+Math.random().toString(36).slice(2,10)}async function Km(){return wn()!=null}async function Nm(){try{return localStorage.getItem("dsh_last_sync")||""}catch{return""}}async function Fm(e){try{localStorage.setItem("dsh_last_sync",e)}catch{}}async function yd(e,t){const n=await fetch(e+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t.username.trim(),password:t.password})});if(!n.ok)throw new Error("云端账号或密码不正确");const r=await n.json();if(!r||!r.token)throw new Error("云端登录异常");return String(r.token)}async function Vm(e,t){let n=$a();return n||(n=await yd(e,t),Ur(n),n)}async function gd(){const e=wn();if(!e)throw new Error("未登录");const t=await Ns(),n=await fetch(t+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.password})});if(!n.ok)throw new Error("云端账号校验失败:"+n.status)}async function Bi(){const e=wn();if(!e)throw new Error("未登录,无法同步");return kd({baseUrl:await Ns(),username:e.username,password:e.password})}async function bd(){try{await Bi()}catch(e){Zs.value=e instanceof Error?e.message:String(e);try{await Bi()}catch{}throw e}}function wd(e,t,n){const r={};for(const o of Object.keys(t))o!=="id"&&(r[o]=t[o]);if(e==="log_item"){delete r.work_log_id,delete r.project_id;const o=t.work_log_id?n.workLog.get(t.work_log_id):null;o&&o.uuid&&(r.wuuid=o.uuid);const i=t.project_id?n.project.get(t.project_id):null;i&&i.uuid&&(r.puuid=i.uuid)}if(e==="plan"){delete r.goal_id;const o=t.goal_id?n.goal.get(t.goal_id):null;o&&o.uuid&&(r.guuid=o.uuid)}return r}async function _d(){const e=await ae.work_log.toArray(),t=await ae.project.toArray(),n=await ae.goal.toArray();return{workLog:new Map(e.map(r=>[r.id,r])),project:new Map(t.map(r=>[r.id,r])),goal:new Map(n.map(r=>[r.id,r]))}}let Ir=!1,Ko=!1,Ui=!1,er=null,$n=null,qi="",Hi=!1,No=null;async function tr(){if(Ir){Ko=!0;return}try{if(!await Km())return;await kd(await Bm()),Zs.value=""}catch(e){Zs.value=e instanceof Error?e.message:String(e)}}async function Bm(){const e=wn();if(!e)throw new Error("未登录,无法同步");return{baseUrl:await Ns(),username:e.username,password:e.password}}function Um(){if(Hi)return;Hi=!0,No=tm(async()=>{const t={};for(const n of Hr)t[n]=await ae.table(n).count();return t}).subscribe({next:()=>{Ui||Ir||(er&&globalThis.clearTimeout(er),er=globalThis.setTimeout(()=>{tr()},3e3))},error:()=>{}})}function qm(){No&&(No.unsubscribe(),No=null),$n&&($n.close(),$n=null,qi=""),er&&(globalThis.clearTimeout(er),er=null),Hi=!1}function Hm(e,t){const n=e+"|"+t;if(!($n&&qi===n)){$n&&($n.close(),$n=null);try{$n=new EventSource(e+"/api/events?token="+encodeURIComponent(t)),qi=n,$n.onmessage=()=>{tr()}}catch{$n=null}}}async function kd(e){if(Ir)return Ko=!0,{pushed:0,pulled:0,removed:0,errors:0,at:""};Ir=!0,Ui=!0;try{const t=await zm(e);return Ko&&(Ko=!1,globalThis.setTimeout(()=>{tr()},800)),t}finally{Ir=!1,Ui=!1}}async function zm(e){const t=e.baseUrl.trim().replace(/\/+$/,"");if(!t)throw new Error("请先配置同步服务地址");await Lm();const n=await _d(),r=await ae.sync_mirror.toArray(),o=new Map;for(const oe of r)o.set(oe.table+"|"+oe.uuid,oe);const i={},c=[];let f=0;for(const oe of Hr){let ue=await Dm(oe);oe==="setting"&&(ue=ue.filter(q=>!Js.has(q.key)));const ce=new Map;for(const q of ue)ce.set(q.uuid,q);for(const[q,S]of ce){const H=wd(oe,S,n),Q=Lo(H),G=o.get(oe+"|"+q);(!G||G.hash!==Q)&&(i[oe]=i[oe]||[],i[oe].push(H),f++)}for(const[q,S]of o)q.startsWith(oe+"|")&&!ce.has(S.uuid)&&c.push({table:oe,uuid:S.uuid,deleted_at:at()});i[oe]=i[oe]||[]}c.push(...Xm());const v=await Vm(t,e),b=oe=>fetch(t+"/api/sync",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+oe},body:JSON.stringify({device:"client",tables:i,tombstones:c})});let g=await b(v);if(g.status===401){Ur("");const oe=await yd(t,e);Ur(oe),g=await b(oe)}if(!g.ok)throw new Error("同步服务返回 "+g.status);const _=await g.json(),T=_.tables||{},x=_.tombstones||[],j=await Ym(T,x);Hm(t,$a()||v);const J=at();return await Fm(J),(j.changed>0||j.removed>0||f>0)&&os(),{pushed:f,pulled:j.changed,removed:j.removed,errors:0,at:J}}function xd(){var t;return"dsh_idmap_"+(((t=wn())==null?void 0:t.username)||"anon")}function Wm(){try{const e=localStorage.getItem(xd());if(e)return JSON.parse(e)}catch{}return{}}function Gm(e){try{localStorage.setItem(xd(),JSON.stringify(e))}catch{}}async function Ym(e,t){const n=Wm(),r=new Set(t.map(x=>x.table+"|"+x.uuid)),o=new Map;for(const x of await ae.sync_mirror.toArray())o.set(x.table+"|"+x.uuid,x);const i=new Set(Array.from(o.keys()).map(x=>x.split("|")[1]));let c=0,f=0;const v={},b={},g={};for(const x of Hr){const j=ae.table(x),J=await j.toArray(),oe=new Map(J.map(E=>[Ro(x,E),E])),ue=new Map(J.filter(E=>E.uuid).map(E=>[E.uuid,E])),ce=(e[x]||[]).filter(E=>!r.has(x+"|"+E.uuid)),q=ce.filter(E=>!(x==="setting"&&Js.has(E.key))),S=ce.filter(E=>x==="setting"&&Js.has(E.key));for(const E of S)Jm(x,E.uuid);const H=x==="setting"?[]:J.filter(E=>E.uuid&&!i.has(E.uuid)&&!r.has(x+"|"+E.uuid)),Q={v:Math.max(0,...J.map(E=>Number(E.id)||0))};q.length;const G=[];for(const E of q){const I={...E};if(x==="log_item"){const Ae=I.wuuid?v[I.wuuid]:void 0;if(!Ae)continue;I.work_log_id=Ae,delete I.wuuid,I.project_id=I.puuid?b[I.puuid]??null:null,delete I.puuid}if(x==="plan")if(I.guuid){const Ae=g[I.guuid];I.goal_id=Ae??null,delete I.guuid}else I.goal_id=null;let ne=Ro(x,E);if(x==="setting")ne=E.key;else{const Ae=n[x]&&n[x][E.uuid],ye=ue.get(E.uuid);ye&&ye.id!=null?ne=ye.id:typeof Ae=="number"?ne=Ae:ne=++Q.v}const Ie={...I,id:ne};x==="setting"&&Js.has(Ie.key)||(G.push(Ie),x==="work_log"&&(v[E.uuid]=ne),x==="project"&&(b[E.uuid]=ne),x==="goal"&&(g[E.uuid]=ne))}const re=G.concat(H);for(const E of re){const I=oe.get(Ro(x,E));(!I||Lo(I)!==Lo(E))&&c++}f+=J.filter(E=>E.uuid&&!G.some(I=>I.uuid===E.uuid)&&!r.has(x+"|"+E.uuid)).length,await j.clear(),re.length&&await j.bulkPut(re);const M={};for(const E of re)E.uuid&&(M[E.uuid]=E.id);n[x]=M}Gm(n);const _=await _d(),T=[];for(const x of Hr){const j=await ae.table(x).toArray();for(const J of j)x==="setting"&&Js.has(J.key)||J.uuid&&T.push({table:x,uuid:J.uuid,hash:Lo(wd(x,J,_))})}return await ae.sync_mirror.clear(),T.length&&await ae.sync_mirror.bulkAdd(T.map(x=>({...x}))),await ae.tombstone.clear(),{changed:c,removed:f+la.length}}const la=[];function Jm(e,t){la.some(n=>n.table===e&&n.uuid===t)||la.push({table:e,uuid:t,deleted_at:at()})}function Xm(){return la.splice(0)}const Qm=new Set(["sync_cursor","sync_last_time","sync_token","last_project","last_category"]);async function it(){await bd()}async function xt(e,t){const n=await ae.setting.get(e);return n?n.value:t}async function jt(e,t){await ae.setting.put({key:e,value:t}),Qm.has(e)||await it()}async function ps(){const e=await Promise.all([xt("work_start","09:00"),xt("work_end","18:00"),xt("grace_minutes","10"),xt("lunch_minutes","60"),xt("remind_weekly","friday")]);return{work_start:e[0],work_end:e[1],grace_minutes:Number(e[2])||0,lunch_minutes:Number(e[3])||0,remind_weekly:e[4]}}async function Zm(){return xt("last_location","")}async function eh(e,t){const n=t.trim();await jt("last_location",n),n&&await ua(n);let r=!1;const o=await _n(e);o&&o.id?(o.location||"")!==n&&(await ae.attendance.update(o.id,{location:n||null}),r=!0):n&&(await ae.attendance.add({date:e,clock_in_at:null,clock_out_at:null,kind:"normal",note:null,location:n,created_at:at()}),r=!0),r&&await it()}async function ml(){const e=await xt("location_presets","");if(!e)return Nu.slice();try{const t=JSON.parse(e);if(Array.isArray(t))return t.filter(n=>typeof n=="string"&&n.trim()).map(n=>n.trim())}catch{}return Nu.slice()}async function Cd(e){const t=Array.from(new Set(e.map(n=>n.trim()).filter(Boolean)));await jt("location_presets",JSON.stringify(t))}async function ua(e){const t=e.trim();if(!t)return;const n=await ml();n.includes(t)||await Cd([...n,t])}async function rr(e=!1){const t=await ae.project.orderBy("name").toArray();return e?t:t.filter(n=>n.archived!==1)}async function th(e){await ae.project.add({name:e.trim(),archived:0,created_at:at()}),await it()}async function nh(e,t){await ae.project.update(e,{name:t.trim()}),await it()}async function sh(e,t){await ae.project.update(e,{archived:t?1:0}),await it()}async function _n(e){return ae.attendance.where("date").equals(e).first()}async function $d(e,t){const n=((t===void 0?await xt("last_location",""):t)||"").trim();let r=!1;const o=await _n(e);if(o&&o.id){if(!o.clock_in_at){const i={clock_in_at:at()};n&&(i.location=n),await ae.attendance.update(o.id,i),r=!0}n&&(await xt("last_location","")!==n&&await jt("last_location",n),await ua(n)),r&&await it();return}await ae.attendance.add({date:e,clock_in_at:at(),clock_out_at:null,kind:"normal",note:null,location:n||null,created_at:at()}),n&&(await jt("last_location",n),await ua(n)),await it()}async function rh(e){const t=await _n(e);t&&t.id&&t.clock_in_at&&!t.clock_out_at&&(await ae.attendance.update(t.id,{clock_out_at:at()}),await it())}async function oh(){const e=new Date,t=qn(e);let n="";if(e.getHours()<4){const r=await _n(Ft(t,-1));r&&r.id&&r.clock_in_at&&!r.clock_out_at&&(await ae.attendance.update(r.id,{clock_out_at:at()}),n=r.date)}if(!n){const r=await _n(t);r&&r.id&&r.clock_in_at&&!r.clock_out_at&&(await ae.attendance.update(r.id,{clock_out_at:at()}),n=r.date)}if(!n)throw new Error("没有进行中的打卡");return await it(),n}async function ah(e,t,n,r,o){(o||"").trim()&&await ua(o);const i=await _n(e),c={date:e,clock_in_at:t,clock_out_at:n,kind:"makeup",note:r||null,location:(o||"").trim()||null,created_at:at()};i&&i.id?await ae.attendance.update(i.id,c):await ae.attendance.add(c),await it()}async function ih(e,t,n){const r=(n||"").trim();if(!r)return;const o=await _n(e);o&&o.id&&(await ae.attendance.update(o.id,{[t]:e+"T"+r+":00"}),await it())}async function Jr(e,t){return ae.attendance.where("date").between(e,t,!0,!0).toArray()}async function lh(e,t){const n=await _n(e);if(t){const r={date:e,kind:"leave",clock_in_at:null,clock_out_at:null,created_at:at()};n&&n.id?await ae.attendance.update(n.id,r):await ae.attendance.add({...r,note:null,location:null})}else n&&n.id&&await ae.attendance.update(n.id,{kind:"normal"});await it()}async function uh(e){const t=await ae.work_log.where("date").equals(e).first();return t||{id:await ae.work_log.add({date:e,created_at:at()}),date:e,created_at:at()}}async function ch(e){return ae.work_log.where("date").equals(e).first()}async function dh(e){const t=await ch(e);return!t||!t.id?[]:(await ae.log_item.where("work_log_id").equals(t.id).toArray()).sort((r,o)=>o.id-r.id)}async function fh(e,t){const n=await ae.work_log.where("date").equals(e).first();let r;n&&n.id?r=n:r=await uh(e),await ae.table("log_item").add({work_log_id:r.id,content:t.content,project_id:t.project_id,category:t.category,minutes:t.minutes,is_milestone:0,needs_followup:0,takeaway:t.takeaway,remark:t.remark,sort_order:0,created_at:at()});const o=t.project_id?String(t.project_id):"";await xt("last_project","")!==o&&await jt("last_project",o),await xt("last_category","")!==t.category&&await jt("last_category",t.category),await it()}async function gi(e,t){await ae.table("log_item").update(e,t),await it()}async function ph(e){await ae.table("log_item").delete(e),await it()}async function Xr(e,t){const n=await ae.work_log.where("date").between(e,t,!0,!0).toArray();if(!n.length)return[];const r=new Map(n.map(i=>[i.id,i.date]));return(await ae.table("log_item").where("work_log_id").anyOf(n.map(i=>i.id)).toArray()).map(i=>({...i,date:r.get(i.work_log_id)||""})).sort((i,c)=>i.date===c.date?i.id-c.id:i.daten.start_time!!n.timer_started_at).toArray();for(const n of t)n.id!==e&&await yl(n.id);await ae.plan.update(e,{timer_started_at:at(),updated_at:at()}),await it()}async function yl(e){const t=await ae.plan.get(e);if(!t||!t.timer_started_at)return;const n=Math.max(0,Math.round((Date.now()-new Date(t.timer_started_at).getTime())/6e4));await ae.plan.update(e,{actual_minutes:(t.actual_minutes||0)+n,timer_started_at:null,updated_at:at()}),await it()}const kh=366;function xh(e,t){const n=[];let r=e,o=0;for(;r<=t&&oo.status==="done").length,total:r.length})}return t}async function $h(){return(await ae.goal.toArray()).sort((t,n)=>t.start_datet.updated_at[c.id,c.date]));return(await ae.table("log_item").toArray()).filter(c=>((c.content||"")+" "+(c.takeaway||"")+" "+(c.remark||"")).toLowerCase().includes(n)).sort((c,f)=>f.id-c.id).slice(0,t).map(c=>({...c,date:o.get(c.work_log_id)||""}))}async function jh(e,t=4){const n=e.trim().toLowerCase();return n?(await ae.memo.toArray()).filter(o=>((o.title||"")+" "+(o.content||"")).toLowerCase().includes(n)).sort((o,i)=>o.updated_at{await Promise.all([ae.project.clear(),ae.work_log.clear(),r.clear(),ae.attendance.clear(),ae.weekly_note.clear(),ae.setting.clear(),ae.memo.clear(),ae.credential.clear(),o.clear(),c.clear(),i.clear()]),n.project&&n.project.length&&await ae.project.bulkAdd(n.project),n.work_log&&n.work_log.length&&await ae.work_log.bulkAdd(n.work_log),n.log_item&&n.log_item.length&&await r.bulkAdd(n.log_item),n.attendance&&n.attendance.length&&await ae.attendance.bulkAdd(n.attendance),n.weekly_note&&n.weekly_note.length&&await ae.weekly_note.bulkAdd(n.weekly_note),n.setting&&n.setting.length&&await ae.setting.bulkAdd(n.setting),n.memo&&n.memo.length&&await ae.memo.bulkAdd(n.memo),n.credential&&n.credential.length&&await ae.credential.bulkAdd(n.credential),n.transaction&&n.transaction.length&&await o.bulkAdd(n.transaction),n.goal&&n.goal.length&&await c.bulkAdd(n.goal),n.plan&&n.plan.length&&await i.bulkAdd(n.plan)}),await it()}const Bh=["制度学习","产品学习","打杂","项目实操","售后服务"],Uh=["餐饮","交通","住房","通讯","学习","娱乐","其他"],qh=["工资","报销","其他"],Sd="log_categories",Ed="ledger_expense_categories",Td="ledger_income_categories";function Ad(e,t){if(!e)return t.slice();try{const n=JSON.parse(e);if(Array.isArray(n)){const r=n.filter(o=>typeof o=="string"&&o.trim()).map(o=>o.trim());if(r.length)return Array.from(new Set(r))}}catch{}return t.slice()}async function Qr(){return Ad(await xt(Sd,""),Bh)}async function bi(e){await jt(Sd,JSON.stringify(e))}async function zr(e){return Ad(await xt(e==="expense"?Ed:Td,""),e==="expense"?Uh:qh)}async function Ts(e,t){await jt(e==="expense"?Ed:Td,JSON.stringify(t))}const Hh={class:"dialog",role:"dialog","aria-label":"编辑工作记录"},zh={class:"dialog-head"},Wh={key:0,class:"muted dialog-sub"},Gh={class:"dialog-body"},Yh={class:"form-grid"},Jh={class:"field span2"},Xh={key:0,class:"form-error"},Qh={class:"field"},Zh=["value"],ey={class:"field"},ty=["value"],ny={class:"field"},sy={class:"field"},ry={class:"field span2"},oy={class:"field"},ay={class:"field"},iy={class:"dialog-btns"},ly=Rt({__name:"EditLogDialog",props:{open:{type:Boolean},item:{},projects:{},date:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=O([]);Qr().then(ce=>{n.value=ce});const r=e,o=t,i=O(""),c=O(null),f=O("dev"),v=O(null),b=O(""),g=O(""),_=O(0),T=O(0),x=O(""),j=O(null),J=rt(()=>{var S;const ce=r.projects.filter(H=>H.archived!==1),q=(S=r.item)==null?void 0:S.project_id;if(q&&!ce.some(H=>H.id===q)){const H=r.projects.find(G=>G.id===q),Q=ce.slice();return H&&Q.unshift({...H,name:H.name+"(已归档)"}),Q}return ce});function oe(ce){r.open&&ce.key==="Escape"&&o("cancel")}yt(()=>r.open,async ce=>{var q;if(ce){const S=r.item;i.value=(S==null?void 0:S.content)??"",c.value=(S==null?void 0:S.project_id)??null,f.value=(S==null?void 0:S.category)??"dev",v.value=(S==null?void 0:S.minutes)??null,b.value=(S==null?void 0:S.takeaway)??"",g.value=(S==null?void 0:S.remark)??"",_.value=(S==null?void 0:S.is_milestone)??0,T.value=(S==null?void 0:S.needs_followup)??0,x.value="",window.addEventListener("keydown",oe),await ir(),(q=j.value)==null||q.focus()}else window.removeEventListener("keydown",oe)}),Wn(()=>window.removeEventListener("keydown",oe)),yt(i,()=>{x.value&&(x.value="")});function ue(){const ce=i.value.trim();if(!ce){x.value="请填写工作内容";return}if(!r.item||!r.item.id){o("save",{id:0,content:ce,project_id:c.value,category:f.value,minutes:v.value&&v.value>0?v.value:null,takeaway:b.value.trim()||null,remark:g.value.trim()||null,is_milestone:_.value,needs_followup:T.value});return}o("save",{id:r.item.id,content:ce,project_id:c.value,category:f.value,minutes:v.value&&v.value>0?v.value:null,takeaway:b.value.trim()||null,remark:g.value.trim()||null,is_milestone:_.value?1:0,needs_followup:T.value?1:0})}return(ce,q)=>($(),St(Hn,{to:"body"},[Ce(lr,{name:"modal"},{default:ms(()=>[e.open?($(),A("div",{key:0,class:"mask",onClick:q[10]||(q[10]=zt(S=>o("cancel"),["self"]))},[l("div",Hh,[l("div",zh,[l("div",null,[q[11]||(q[11]=l("div",{class:"dialog-title"},"编辑工作记录",-1)),e.date?($(),A("div",Wh,W(e.date),1)):ge("",!0)]),l("button",{class:"icon-btn",title:"关闭",onClick:q[0]||(q[0]=S=>o("cancel"))},[Ce(He,{name:"close",size:16})])]),l("div",Gh,[l("div",Yh,[l("div",Jh,[q[12]||(q[12]=l("label",null,"工作内容(必填)",-1)),Me(l("input",{ref_key:"contentInput",ref:j,class:Ze(["input",{invalid:x.value}]),"onUpdate:modelValue":q[1]||(q[1]=S=>i.value=S),onKeydown:Mt(ue,["enter"])},null,34),[[Ne,i.value]]),x.value?($(),A("div",Xh,W(x.value),1)):ge("",!0)]),l("div",Qh,[q[14]||(q[14]=l("label",null,"所属项目",-1)),Me(l("select",{class:"select","onUpdate:modelValue":q[2]||(q[2]=S=>c.value=S)},[q[13]||(q[13]=l("option",{value:null},"无项目",-1)),($(!0),A(je,null,et(J.value,S=>($(),A("option",{key:S.id,value:S.id},W(S.name),9,Zh))),128))],512),[[fs,c.value]])]),l("div",ey,[q[15]||(q[15]=l("label",null,"工作分类",-1)),Me(l("select",{class:"select","onUpdate:modelValue":q[3]||(q[3]=S=>f.value=S)},[($(!0),A(je,null,et(n.value,S=>($(),A("option",{key:S,value:S},W(S),9,ty))),128))],512),[[fs,f.value]])]),l("div",ny,[q[16]||(q[16]=l("label",null,"耗时(分钟)",-1)),Me(l("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":q[4]||(q[4]=S=>v.value=S),placeholder:"选填"},null,512),[[Ne,v.value,void 0,{number:!0}]])]),l("div",sy,[q[17]||(q[17]=l("label",null,"主要收获",-1)),Me(l("input",{class:"input","onUpdate:modelValue":q[5]||(q[5]=S=>b.value=S),placeholder:"一句话:学到了什么"},null,512),[[Ne,b.value]])]),l("div",ry,[q[18]||(q[18]=l("label",null,"备注",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":q[6]||(q[6]=S=>g.value=S),placeholder:"背景、链接、未决事项(选填)"},null,512),[[Ne,g.value]])]),l("div",oy,[q[19]||(q[19]=l("label",null,"成果标记",-1)),l("button",{class:Ze(["toggle-btn",{on:_.value===1}]),onClick:q[7]||(q[7]=S=>_.value=_.value===1?0:1)},W(_.value===1?"已标记为成果":"未标记"),3)]),l("div",ay,[q[20]||(q[20]=l("label",null,"待跟进",-1)),l("button",{class:Ze(["toggle-btn",{onwarn:T.value===1}]),onClick:q[8]||(q[8]=S=>T.value=T.value===1?0:1)},W(T.value===1?"需要跟进":"无需跟进"),3)])])]),l("div",iy,[l("button",{class:"btn btn-sm",onClick:q[9]||(q[9]=S=>o("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:ue},"保存修改")])])])):ge("",!0)]),_:1})]))}}),uy=Vt(ly,[["__scopeId","data-v-bd00bec4"]]);function Oo(e){const t=e.split(":");return Number(t[0])*60+Number(t[1])}function cr(e,t,n,r){if(e&&e.kind==="leave")return{status:"leave",label:"请假",makeup:!1,workedMinutes:null};if(am(t))return{status:"rest",label:"休息日",makeup:!1,workedMinutes:null};if(!e||!e.clock_in_at)return r?{status:"none",label:"未打卡",makeup:!1,workedMinutes:null}:{status:"absent",label:"缺勤",makeup:!!(e&&e.kind==="makeup"),workedMinutes:null};const o=e.kind==="makeup";if(!e.clock_out_at)return{status:"incomplete",label:r?"进行中":"未完成",makeup:o,workedMinutes:null};const i=Oo(bn(e.clock_in_at)),c=Oo(bn(e.clock_out_at)),f=Oo(n.work_start),v=Oo(n.work_end);let b="normal";!o&&i>f+n.grace_minutes?b="late":!o&&c{Fo.value=Fo.value.filter(n=>n.id!==t)},2e3)}function dy(){return Fo}const fy={class:"day-panel"},py={class:"dp-head"},vy={class:"dp-date"},my={class:"card sec"},hy={class:"att-grid"},yy={class:"att-cell"},gy={key:0,class:"edit-row"},by={key:1,class:"att-val"},wy={class:"att-cell"},_y={key:0,class:"edit-row"},ky={key:1,class:"att-val"},xy={class:"att-cell"},Cy=["list"],$y=["id"],Sy=["value"],Ey={class:"att-cell"},Ty={class:"att-val status-val"},Ay={key:0,class:"tag"},Py={key:1,class:"muted"},Oy={key:0,class:"att-note muted"},My={class:"att-actions"},Iy=["disabled"],jy=["disabled"],Dy=["disabled"],Ly=["disabled"],Ry={key:0,class:"card sec makeup"},Ky={class:"form-grid"},Ny={class:"field"},Fy={class:"field"},Vy={class:"field span2"},By=["list"],Uy={class:"field span2"},qy={key:0,class:"form-error"},Hy={class:"form-footer"},zy={class:"list-sec"},Wy={class:"sec-head"},Gy={class:"sec-title"},Yy={key:0,class:"empty muted"},Jy={class:"item-main"},Xy={class:"tag"},Qy=["onClick"],Zy={key:0,class:"muted item-meta"},eg={key:1,class:"muted num item-meta"},tg=["onClick"],ng=["onClick"],sg=["onClick"],rg=["onClick"],og={key:0,class:"item-sub"},ag={key:0,class:"muted2"},ig={key:1,class:"muted"},lg={key:1,class:"dp-foot muted num"},ug=Rt({__name:"DayPanel",props:{date:{}},setup(e){const t=O([]);Qr().then(fe=>{t.value=fe});const n=e,r=O(!0),o=O(null),i=O(void 0),c=O([]),f=O([]),v=O(""),b=O([]),g=rt(()=>"loc-list-"+n.date),_=rt(()=>n.date===ot());async function T(){r.value=!0,o.value=await ps(),i.value=await _n(n.date),c.value=await dh(n.date),f.value=await rr(!0),b.value=await ml(),v.value=i.value&&i.value.location||await Zm(),r.value=!1}vn(T),yt(()=>n.date,T),yt(ur,()=>{T()});function x(fe){if(!fe)return"";const h=f.value.find(y=>y.id===fe);return h?h.name:"已删除项目"}const j=rt(()=>o.value?cr(i.value,n.date,o.value,_.value):null),J=rt(()=>c.value.reduce((fe,h)=>fe+(h.minutes||0),0)),oe=O(!1);async function ue(){oe.value||(oe.value=!0,await $d(n.date,v.value),await T(),os(),Ve("上班打卡成功"),oe.value=!1)}async function ce(){oe.value||(oe.value=!0,await rh(n.date),await T(),os(),Ve("下班打卡成功"),oe.value=!1)}async function q(){await eh(n.date,v.value),os(),Ve("地点已更新")}const S=O(!1),H=rt(()=>{var fe;return((fe=i.value)==null?void 0:fe.kind)==="leave"});function Q(){if(i.value&&i.value.clock_in_at){S.value=!0;return}G(!0)}async function G(fe){S.value=!1,await lh(n.date,fe),await T(),os(),Ve(fe?"已标记为休假":"已取消休假")}const re=O(null),M=O(""),E=O(null);yt(re,async fe=>{var h;fe&&(await ir(),(h=E.value)==null||h.focus())});function I(fe){var y,C;const h=fe==="in"?(y=i.value)==null?void 0:y.clock_in_at:(C=i.value)==null?void 0:C.clock_out_at;re.value=fe,M.value=h?bn(h):fe==="in"?"09:00":"18:00"}function ne(){re.value=null}async function Ie(){const fe=re.value;fe&&(re.value=null,M.value&&(await ih(n.date,fe==="in"?"clock_in_at":"clock_out_at",M.value),await T(),os(),Ve("打卡时间已修改")))}const Ae=O(!1),ye=O("09:00"),Pe=O("18:00"),Ue=O(""),de=O(""),ke=O("");function Ee(){de.value=v.value,ke.value="",Ae.value=!Ae.value}async function Le(){if(!ye.value||!Pe.value){ke.value="请填写上班与下班时间";return}await ah(n.date,n.date+"T"+ye.value+":00",n.date+"T"+Pe.value+":00",Ue.value.trim(),de.value),Ae.value=!1,Ue.value="",ke.value="",await T(),os(),Ve("补卡已保存")}const $e=O(null);function pe(fe){$e.value=fe}function De(){$e.value=null}async function ct(fe){fe.id?(await gi(fe.id,{content:fe.content,project_id:fe.project_id,category:fe.category,minutes:fe.minutes,takeaway:fe.takeaway,remark:fe.remark,is_milestone:fe.is_milestone,needs_followup:fe.needs_followup}),Ve("记录已更新")):(await fh(n.date,{content:fe.content,project_id:fe.project_id,category:fe.category,minutes:fe.minutes,takeaway:fe.takeaway,remark:fe.remark}),Ve("记录已添加")),$e.value=null,await T()}async function gt(fe){await gi(fe.id,{is_milestone:fe.is_milestone?0:1}),await T()}async function bt(fe){await gi(fe.id,{needs_followup:fe.needs_followup?0:1}),await T()}const wt=O(null);async function It(){wt.value&&wt.value.id&&await ph(wt.value.id),wt.value=null,await T(),Ve("记录已删除")}return(fe,h)=>($(),A("div",fy,[l("div",py,[l("div",vy,W(un(ud)(e.date)),1)]),l("div",my,[h[19]||(h[19]=l("div",{class:"sec-title"},"出勤信息",-1)),l("div",hy,[l("div",yy,[h[15]||(h[15]=l("label",null,"上班时间",-1)),re.value==="in"?($(),A("div",gy,[Me(l("input",{ref_key:"timeInput",ref:E,type:"time",class:"input time-input","onUpdate:modelValue":h[0]||(h[0]=y=>M.value=y),onKeydown:[Mt(Ie,["enter"]),Mt(ne,["esc"])]},null,544),[[Ne,M.value]]),l("button",{class:"btn btn-primary btn-sm",onClick:Ie},"确认"),l("button",{class:"btn btn-sm",onClick:ne},"取消")])):($(),A("div",by,[l("span",{class:Ze(["num",{"val-empty":!(i.value&&i.value.clock_in_at)}])},W(i.value&&i.value.clock_in_at?un(bn)(i.value.clock_in_at):"未打卡"),3),i.value&&i.value.id?($(),A("button",{key:0,class:"icon-btn",title:"修改上班时间",onClick:h[1]||(h[1]=y=>I("in"))},[Ce(He,{name:"edit",size:13})])):ge("",!0)]))]),l("div",wy,[h[16]||(h[16]=l("label",null,"下班时间",-1)),re.value==="out"?($(),A("div",_y,[Me(l("input",{ref_key:"timeInput",ref:E,type:"time",class:"input time-input","onUpdate:modelValue":h[2]||(h[2]=y=>M.value=y),onKeydown:[Mt(Ie,["enter"]),Mt(ne,["esc"])]},null,544),[[Ne,M.value]]),l("button",{class:"btn btn-primary btn-sm",onClick:Ie},"确认"),l("button",{class:"btn btn-sm",onClick:ne},"取消")])):($(),A("div",ky,[l("span",{class:Ze(["num",{"val-empty":!(i.value&&i.value.clock_out_at)}])},W(i.value&&i.value.clock_out_at?un(bn)(i.value.clock_out_at):"未打卡"),3),i.value&&i.value.id?($(),A("button",{key:0,class:"icon-btn",title:"修改下班时间",onClick:h[3]||(h[3]=y=>I("out"))},[Ce(He,{name:"edit",size:13})])):ge("",!0)]))]),l("div",xy,[h[17]||(h[17]=l("label",null,"上班地点",-1)),Me(l("input",{class:"input","onUpdate:modelValue":h[4]||(h[4]=y=>v.value=y),list:g.value,placeholder:"可直接输入",title:"上班地点,可自由输入",onChange:q},null,40,Cy),[[Ne,v.value]]),l("datalist",{id:g.value},[($(!0),A(je,null,et(b.value,y=>($(),A("option",{key:y,value:y},null,8,Sy))),128))],8,$y)]),l("div",Ey,[h[18]||(h[18]=l("label",null,"考勤状态",-1)),l("div",Ty,[j.value?($(),A(je,{key:0},[l("span",{class:Ze(["dot",j.value.status])},null,2),l("span",null,W(j.value.label),1),i.value&&i.value.kind==="makeup"?($(),A("span",Ay,"补卡")):ge("",!0)],64)):($(),A("span",Py,"--"))])])]),i.value&&i.value.note?($(),A("div",Oy,"补卡说明:"+W(i.value.note),1)):ge("",!0),l("div",My,[_.value&&(!i.value||!i.value.clock_in_at)?($(),A("button",{key:0,class:"btn btn-primary btn-sm",disabled:oe.value,onClick:ue},"上班打卡",8,Iy)):_.value&&i.value&&i.value.clock_in_at&&!i.value.clock_out_at?($(),A("button",{key:1,class:"btn btn-primary btn-sm",disabled:oe.value,onClick:ce},"下班打卡",8,jy)):ge("",!0),!_.value&&(!i.value||!i.value.clock_in_at)?($(),A("button",{key:2,class:"btn btn-sm",onClick:Ee},"补卡")):ge("",!0),H.value?($(),A("button",{key:4,class:"btn btn-sm",disabled:oe.value,onClick:h[5]||(h[5]=y=>G(!1))},"取消休假",8,Ly)):($(),A("button",{key:3,class:"btn btn-sm",disabled:oe.value,onClick:Q},"标记休假",8,Dy))])]),Ae.value?($(),A("div",Ry,[h[24]||(h[24]=l("div",{class:"sec-title"},"补卡登记",-1)),l("div",Ky,[l("div",Ny,[h[20]||(h[20]=l("label",null,"上班时间",-1)),Me(l("input",{type:"time",class:"input","onUpdate:modelValue":h[6]||(h[6]=y=>ye.value=y)},null,512),[[Ne,ye.value]])]),l("div",Fy,[h[21]||(h[21]=l("label",null,"下班时间",-1)),Me(l("input",{type:"time",class:"input","onUpdate:modelValue":h[7]||(h[7]=y=>Pe.value=y)},null,512),[[Ne,Pe.value]])]),l("div",Vy,[h[22]||(h[22]=l("label",null,"上班地点",-1)),Me(l("input",{class:"input",list:g.value,"onUpdate:modelValue":h[8]||(h[8]=y=>de.value=y),placeholder:"可直接输入"},null,8,By),[[Ne,de.value]])]),l("div",Uy,[h[23]||(h[23]=l("label",null,"补卡原因",-1)),Me(l("input",{class:"input","onUpdate:modelValue":h[9]||(h[9]=y=>Ue.value=y),placeholder:"如:外出拜访客户忘记打卡"},null,512),[[Ne,Ue.value]])])]),ke.value?($(),A("div",qy,W(ke.value),1)):ge("",!0),l("div",Hy,[l("button",{class:"btn btn-sm",onClick:h[10]||(h[10]=y=>Ae.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:Le},"保存补卡")])])):ge("",!0),l("div",zy,[l("div",Wy,[l("span",Gy,"工作记录("+W(c.value.length)+")",1),l("button",{class:"btn btn-primary btn-sm",onClick:De},[Ce(He,{name:"plus",size:14}),h[25]||(h[25]=vt(" 添加记录",-1))])]),!c.value.length&&!r.value?($(),A("div",Yy,"暂无记录")):ge("",!0),($(!0),A(je,null,et(c.value,y=>($(),A("div",{key:y.id,class:"item"},[l("div",Jy,[l("span",Xy,W(un(ta)(y.category)),1),l("span",{class:"item-content",title:"点击编辑",onClick:C=>pe(y)},W(y.content),9,Qy),y.project_id?($(),A("span",Zy,W(x(y.project_id)),1)):ge("",!0),y.minutes?($(),A("span",eg,W(y.minutes)+" 分钟",1)):ge("",!0),h[26]||(h[26]=l("span",{class:"flex1"},null,-1)),l("button",{class:"icon-btn",title:"编辑完整信息",onClick:C=>pe(y)},[Ce(He,{name:"edit",size:14})],8,tg),l("button",{class:Ze(["icon-btn",{active:y.is_milestone===1}]),title:"成果标记",onClick:C=>gt(y)},[Ce(He,{name:"star",size:14})],10,ng),l("button",{class:Ze(["icon-btn",{"active-warn":y.needs_followup===1}]),title:"待跟进",onClick:C=>bt(y)},[Ce(He,{name:"flag",size:14})],10,sg),l("button",{class:"icon-btn",title:"删除",onClick:C=>wt.value=y},[Ce(He,{name:"close",size:14})],8,rg)]),y.takeaway||y.remark?($(),A("div",og,[y.takeaway?($(),A("div",ag,"收获:"+W(y.takeaway),1)):ge("",!0),y.remark?($(),A("div",ig,"备注:"+W(y.remark),1)):ge("",!0)])):ge("",!0)]))),128)),c.value.length?($(),A("div",lg,[vt(" 共 "+W(c.value.length)+" 条事项 ",1),J.value?($(),A(je,{key:0},[vt(" · "+W((J.value/60).toFixed(1))+" 小时",1)],64)):ge("",!0)])):ge("",!0)]),Ce(Dn,{open:!!wt.value,title:"删除确认",message:wt.value?"将删除工作记录「"+wt.value.content+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:h[11]||(h[11]=y=>wt.value=null),onConfirm:It},null,8,["open","message"]),Ce(Dn,{open:S.value,title:"标记休假确认",message:"该日已有打卡记录,标记休假将清空上下班时间。是否继续?","confirm-text":"标记休假",danger:"",onCancel:h[12]||(h[12]=y=>S.value=!1),onConfirm:h[13]||(h[13]=y=>G(!0))},null,8,["open"]),Ce(uy,{open:!!$e.value,item:$e.value,projects:f.value,date:e.date,onCancel:h[14]||(h[14]=y=>$e.value=null),onSave:ct},null,8,["open","item","projects","date"])]))}}),Pd=Vt(ug,[["__scopeId","data-v-4b7234c4"]]),cg={class:"cal-page"},dg={class:"cal-toolbar"},fg={class:"cal-title num"},pg={class:"cal-head"},vg={class:"cal-grid"},mg=["title","onClick"],hg={class:"cal-marks"},yg={key:0,class:"drawer"},gg={class:"drawer-head"},bg={class:"drawer-body"},wg=Rt({__name:"CalendarView",setup(e){const t=O(ot()),n=rt(()=>Number(t.value.slice(0,4))),r=rt(()=>Number(t.value.slice(5,7))-1),o=rt(()=>n.value+" 年 "+(r.value+1)+" 月"),i=["一","二","三","四","五","六","日"],c=rt(()=>{const S=(new Date(n.value,r.value,1).getDay()+6)%7,H=new Date(n.value,r.value+1,0).getDate(),Q=[];for(let G=0;G[I.date,I])),re=H[2],M=new Map;for(const I of c.value){if(!I.inMonth)continue;const ne=cr(G.get(I.date),I.date,Q,I.date===v),Ie=re.filter(Ae=>Ae.date===I.date);M.set(I.date,{status:ne.status,label:ne.label,location:((E=G.get(I.date))==null?void 0:E.location)||"",hasLog:Ie.length>0,hasMilestone:Ie.some(Ae=>Ae.is_milestone===1)})}f.value=M}yt([n,r],b,{immediate:!0}),yt(ur,()=>{b()});function g(q){var S;return((S=f.value.get(q))==null?void 0:S.status)??""}function _(q){const S=f.value.get(q);return S?q+" · "+S.label+(S.location?" · "+S.location:""):q}function T(q){var S;return!!((S=f.value.get(q))!=null&&S.hasLog)}function x(q){var S;return!!((S=f.value.get(q))!=null&&S.hasMilestone)}function j(){t.value=na(t.value,-1)}function J(){t.value=na(t.value,1)}function oe(){t.value=ot()}const ue=O(null);function ce(q,S){S&&(ue.value=q)}return yt(Fi,q=>{q&&(t.value=q,ue.value=q,Fi.value=null)},{immediate:!0}),(q,S)=>($(),A("div",cg,[l("div",dg,[l("button",{class:"icon-btn",onClick:j},[Ce(He,{name:"chevron-left",size:16})]),l("span",fg,W(o.value),1),l("button",{class:"icon-btn",onClick:J},[Ce(He,{name:"chevron-right",size:16})]),l("button",{class:"btn btn-sm",onClick:oe},"回到今天")]),l("div",pg,[($(),A(je,null,et(i,H=>l("span",{key:H,class:"cal-week muted"},W(H),1)),64))]),l("div",vg,[($(!0),A(je,null,et(c.value,(H,Q)=>($(),A("button",{key:Q,class:Ze(["cal-cell",{blank:!H.inMonth,weekend:H.weekend,selected:ue.value===H.date}]),title:H.inMonth?_(H.date):void 0,onClick:G=>ce(H.date,H.inMonth)},[H.inMonth?($(),A(je,{key:0},[l("span",{class:Ze(["daynum num",{today:H.date===un(v)}])},W(Number(H.date.slice(8,10))),3),l("span",hg,[g(H.date)?($(),A("span",{key:0,class:Ze(["dot",g(H.date)])},null,2)):ge("",!0),T(H.date)?($(),St(He,{key:1,name:"check-circle",size:12,class:"mark-log"})):ge("",!0),x(H.date)?($(),St(He,{key:2,name:"star",size:12,class:"mark-star"})):ge("",!0)])],64)):ge("",!0)],10,mg))),128))]),Ce(lr,{name:"drawer"},{default:ms(()=>[ue.value?($(),A("aside",yg,[l("div",gg,[S[1]||(S[1]=l("span",{class:"drawer-title"},"当日详情",-1)),l("button",{class:"icon-btn",onClick:S[0]||(S[0]=H=>ue.value=null)},[Ce(He,{name:"close",size:16})])]),l("div",bg,[Ce(Pd,{date:ue.value},null,8,["date"])])])):ge("",!0)]),_:1})]))}}),_g=Vt(wg,[["__scopeId","data-v-2404dfbe"]]),kg="modulepreload",xg=function(e,t){return new URL(e,t).href},Fu={},Od=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const c=document.getElementsByTagName("link"),f=document.querySelector("meta[property=csp-nonce]"),v=(f==null?void 0:f.nonce)||(f==null?void 0:f.getAttribute("nonce"));o=Promise.allSettled(n.map(b=>{if(b=xg(b,r),b in Fu)return;Fu[b]=!0;const g=b.endsWith(".css"),_=g?'[rel="stylesheet"]':"";if(!!r)for(let j=c.length-1;j>=0;j--){const J=c[j];if(J.href===b&&(!g||J.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${b}"]${_}`))return;const x=document.createElement("link");if(x.rel=g?"stylesheet":kg,g||(x.as="script"),x.crossOrigin="",x.href=b,v&&x.setAttribute("nonce",v),document.head.appendChild(x),g)return new Promise((j,J)=>{x.addEventListener("load",j),x.addEventListener("error",()=>J(new Error(`Unable to preload CSS for ${b}`)))})}))}function i(c){const f=new Event("vite:preloadError",{cancelable:!0});if(f.payload=c,window.dispatchEvent(f),!f.defaultPrevented)throw c}return o.then(c=>{for(const f of c||[])f.status==="rejected"&&i(f.reason);return t().catch(i)})};/*! Capacitor: https://capacitorjs.com/ - MIT License */const Cg=e=>{const t=new Map;t.set("web",{name:"web"});const n=e.CapacitorPlatforms||{currentPlatform:{name:"web"},platforms:t},r=(i,c)=>{n.platforms.set(i,c)},o=i=>{n.platforms.has(i)&&(n.currentPlatform=n.platforms.get(i))};return n.addPlatform=r,n.setPlatform=o,n},$g=e=>e.CapacitorPlatforms=Cg(e),Md=$g(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});Md.addPlatform;Md.setPlatform;var or;(function(e){e.Unimplemented="UNIMPLEMENTED",e.Unavailable="UNAVAILABLE"})(or||(or={}));class wi extends Error{constructor(t,n,r){super(t),this.message=t,this.code=n,this.data=r}}const Sg=e=>{var t,n;return e!=null&&e.androidBridge?"android":!((n=(t=e==null?void 0:e.webkit)===null||t===void 0?void 0:t.messageHandlers)===null||n===void 0)&&n.bridge?"ios":"web"},Eg=e=>{var t,n,r,o,i;const c=e.CapacitorCustomPlatform||null,f=e.Capacitor||{},v=f.Plugins=f.Plugins||{},b=e.CapacitorPlatforms,g=()=>c!==null?c.name:Sg(e),_=((t=b==null?void 0:b.currentPlatform)===null||t===void 0?void 0:t.getPlatform)||g,T=()=>_()!=="web",x=((n=b==null?void 0:b.currentPlatform)===null||n===void 0?void 0:n.isNativePlatform)||T,j=G=>{const re=S.get(G);return!!(re!=null&&re.platforms.has(_())||ue(G))},J=((r=b==null?void 0:b.currentPlatform)===null||r===void 0?void 0:r.isPluginAvailable)||j,oe=G=>{var re;return(re=f.PluginHeaders)===null||re===void 0?void 0:re.find(M=>M.name===G)},ue=((o=b==null?void 0:b.currentPlatform)===null||o===void 0?void 0:o.getPluginHeader)||oe,ce=G=>e.console.error(G),q=(G,re,M)=>Promise.reject(`${M} does not have an implementation of "${re}".`),S=new Map,H=(G,re={})=>{const M=S.get(G);if(M)return console.warn(`Capacitor plugin "${G}" already registered. Cannot register plugins twice.`),M.proxy;const E=_(),I=ue(G);let ne;const Ie=async()=>(!ne&&E in re?ne=typeof re[E]=="function"?ne=await re[E]():ne=re[E]:c!==null&&!ne&&"web"in re&&(ne=typeof re.web=="function"?ne=await re.web():ne=re.web),ne),Ae=(Ee,Le)=>{var $e,pe;if(I){const De=I==null?void 0:I.methods.find(ct=>Le===ct.name);if(De)return De.rtype==="promise"?ct=>f.nativePromise(G,Le.toString(),ct):(ct,gt)=>f.nativeCallback(G,Le.toString(),ct,gt);if(Ee)return($e=Ee[Le])===null||$e===void 0?void 0:$e.bind(Ee)}else{if(Ee)return(pe=Ee[Le])===null||pe===void 0?void 0:pe.bind(Ee);throw new wi(`"${G}" plugin is not implemented on ${E}`,or.Unimplemented)}},ye=Ee=>{let Le;const $e=(...pe)=>{const De=Ie().then(ct=>{const gt=Ae(ct,Ee);if(gt){const bt=gt(...pe);return Le=bt==null?void 0:bt.remove,bt}else throw new wi(`"${G}.${Ee}()" is not implemented on ${E}`,or.Unimplemented)});return Ee==="addListener"&&(De.remove=async()=>Le()),De};return $e.toString=()=>`${Ee.toString()}() { [capacitor code] }`,Object.defineProperty($e,"name",{value:Ee,writable:!1,configurable:!1}),$e},Pe=ye("addListener"),Ue=ye("removeListener"),de=(Ee,Le)=>{const $e=Pe({eventName:Ee},Le),pe=async()=>{const ct=await $e;Ue({eventName:Ee,callbackId:ct},Le)},De=new Promise(ct=>$e.then(()=>ct({remove:pe})));return De.remove=async()=>{console.warn("Using addListener() without 'await' is deprecated."),await pe()},De},ke=new Proxy({},{get(Ee,Le){switch(Le){case"$$typeof":return;case"toJSON":return()=>({});case"addListener":return I?de:Pe;case"removeListener":return Ue;default:return ye(Le)}}});return v[G]=ke,S.set(G,{name:G,proxy:ke,platforms:new Set([...Object.keys(re),...I?[E]:[]])}),ke},Q=((i=b==null?void 0:b.currentPlatform)===null||i===void 0?void 0:i.registerPlugin)||H;return f.convertFileSrc||(f.convertFileSrc=G=>G),f.getPlatform=_,f.handleError=ce,f.isNativePlatform=x,f.isPluginAvailable=J,f.pluginMethodNoop=q,f.registerPlugin=Q,f.Exception=wi,f.DEBUG=!!f.DEBUG,f.isLoggingEnabled=!!f.isLoggingEnabled,f.platform=f.getPlatform(),f.isNative=f.isNativePlatform(),f},Tg=e=>e.Capacitor=Eg(e),ar=Tg(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Id=ar.registerPlugin;ar.Plugins;class jd{constructor(t){this.listeners={},this.retainedEventArguments={},this.windowListeners={},t&&(console.warn(`Capacitor WebPlugin "${t.name}" config object was deprecated in v3 and will be removed in v4.`),this.config=t)}addListener(t,n){let r=!1;this.listeners[t]||(this.listeners[t]=[],r=!0),this.listeners[t].push(n);const i=this.windowListeners[t];i&&!i.registered&&this.addWindowListener(i),r&&this.sendRetainedArgumentsForEvent(t);const c=async()=>this.removeListener(t,n);return Promise.resolve({remove:c})}async removeAllListeners(){this.listeners={};for(const t in this.windowListeners)this.removeWindowListener(this.windowListeners[t]);this.windowListeners={}}notifyListeners(t,n,r){const o=this.listeners[t];if(!o){if(r){let i=this.retainedEventArguments[t];i||(i=[]),i.push(n),this.retainedEventArguments[t]=i}return}o.forEach(i=>i(n))}hasListeners(t){return!!this.listeners[t].length}registerWindowListener(t,n){this.windowListeners[n]={registered:!1,windowEventName:t,pluginEventName:n,handler:r=>{this.notifyListeners(n,r)}}}unimplemented(t="not implemented"){return new ar.Exception(t,or.Unimplemented)}unavailable(t="not available"){return new ar.Exception(t,or.Unavailable)}async removeListener(t,n){const r=this.listeners[t];if(!r)return;const o=r.indexOf(n);this.listeners[t].splice(o,1),this.listeners[t].length||this.removeWindowListener(this.windowListeners[t])}addWindowListener(t){window.addEventListener(t.windowEventName,t.handler),t.registered=!0}removeWindowListener(t){t&&(window.removeEventListener(t.windowEventName,t.handler),t.registered=!1)}sendRetainedArgumentsForEvent(t){const n=this.retainedEventArguments[t];n&&(delete this.retainedEventArguments[t],n.forEach(r=>{this.notifyListeners(t,r)}))}}const Vu=e=>encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape),Bu=e=>e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent);class Ag extends jd{async getCookies(){const t=document.cookie,n={};return t.split(";").forEach(r=>{if(r.length<=0)return;let[o,i]=r.replace(/=/,"CAP_COOKIE").split("CAP_COOKIE");o=Bu(o).trim(),i=Bu(i).trim(),n[o]=i}),n}async setCookie(t){try{const n=Vu(t.key),r=Vu(t.value),o=`; expires=${(t.expires||"").replace("expires=","")}`,i=(t.path||"/").replace("path=",""),c=t.url!=null&&t.url.length>0?`domain=${t.url}`:"";document.cookie=`${n}=${r||""}${o}; path=${i}; ${c};`}catch(n){return Promise.reject(n)}}async deleteCookie(t){try{document.cookie=`${t.key}=; Max-Age=0`}catch(n){return Promise.reject(n)}}async clearCookies(){try{const t=document.cookie.split(";")||[];for(const n of t)document.cookie=n.replace(/^ +/,"").replace(/=.*/,`=;expires=${new Date().toUTCString()};path=/`)}catch(t){return Promise.reject(t)}}async clearAllCookies(){try{await this.clearCookies()}catch(t){return Promise.reject(t)}}}Id("CapacitorCookies",{web:()=>new Ag});const Pg=async e=>new Promise((t,n)=>{const r=new FileReader;r.onload=()=>{const o=r.result;t(o.indexOf(",")>=0?o.split(",")[1]:o)},r.onerror=o=>n(o),r.readAsDataURL(e)}),Og=(e={})=>{const t=Object.keys(e);return Object.keys(e).map(o=>o.toLocaleLowerCase()).reduce((o,i,c)=>(o[i]=e[t[c]],o),{})},Mg=(e,t=!0)=>e?Object.entries(e).reduce((r,o)=>{const[i,c]=o;let f,v;return Array.isArray(c)?(v="",c.forEach(b=>{f=t?encodeURIComponent(b):b,v+=`${i}=${f}&`}),v.slice(0,-1)):(f=t?encodeURIComponent(c):c,v=`${i}=${f}`),`${r}&${v}`},"").substr(1):null,Ig=(e,t={})=>{const n=Object.assign({method:e.method||"GET",headers:e.headers},t),o=Og(e.headers)["content-type"]||"";if(typeof e.data=="string")n.body=e.data;else if(o.includes("application/x-www-form-urlencoded")){const i=new URLSearchParams;for(const[c,f]of Object.entries(e.data||{}))i.set(c,f);n.body=i.toString()}else if(o.includes("multipart/form-data")||e.data instanceof FormData){const i=new FormData;if(e.data instanceof FormData)e.data.forEach((f,v)=>{i.append(v,f)});else for(const f of Object.keys(e.data))i.append(f,e.data[f]);n.body=i;const c=new Headers(n.headers);c.delete("content-type"),n.headers=c}else(o.includes("application/json")||typeof e.data=="object")&&(n.body=JSON.stringify(e.data));return n};class jg extends jd{async request(t){const n=Ig(t,t.webFetchExtra),r=Mg(t.params,t.shouldEncodeUrlParams),o=r?`${t.url}?${r}`:t.url,i=await fetch(o,n),c=i.headers.get("content-type")||"";let{responseType:f="text"}=i.ok?t:{};c.includes("application/json")&&(f="json");let v,b;switch(f){case"arraybuffer":case"blob":b=await i.blob(),v=await Pg(b);break;case"json":v=await i.json();break;case"document":case"text":default:v=await i.text()}const g={};return i.headers.forEach((_,T)=>{g[T]=_}),{data:v,headers:g,status:i.status,url:i.url}}async get(t){return this.request(Object.assign(Object.assign({},t),{method:"GET"}))}async post(t){return this.request(Object.assign(Object.assign({},t),{method:"POST"}))}async put(t){return this.request(Object.assign(Object.assign({},t),{method:"PUT"}))}async patch(t){return this.request(Object.assign(Object.assign({},t),{method:"PATCH"}))}async delete(t){return this.request(Object.assign(Object.assign({},t),{method:"DELETE"}))}}Id("CapacitorHttp",{web:()=>new jg});async function Sa(e,t){const n=window;if(n.electronAPI&&n.electronAPI.saveFile){const c=await n.electronAPI.saveFile(e,t);return c&&c.saved?c.path:""}if(ar.isNativePlatform()){const{Filesystem:c,Directory:f,Encoding:v}=await Od(async()=>{const{Filesystem:b,Directory:g,Encoding:_}=await import("./index-CJCBehez.js");return{Filesystem:b,Directory:g,Encoding:_}},[],import.meta.url);try{return(await c.writeFile({path:e,data:t,directory:f.Documents,encoding:v.UTF8,recursive:!0})).uri}catch{return(await c.writeFile({path:e,data:t,directory:f.Cache,encoding:v.UTF8,recursive:!0})).uri}}const r=new Blob([t],{type:"text/plain;charset=utf-8"}),o=URL.createObjectURL(r),i=document.createElement("a");return i.href=o,i.download=e,i.click(),window.setTimeout(()=>URL.revokeObjectURL(o),1e4),""}const Dg=Object.freeze(Object.defineProperty({__proto__:null,downloadText:Sa},Symbol.toStringTag,{value:"Module"})),Lg={class:"detail-page"},Rg={class:"detail-toolbar"},Kg=["value"],Ng=["disabled"],Fg={class:"export-row"},Vg={class:"seg"},Bg=["disabled"],Ug=Rt({__name:"TodayView",setup(e){const t=O(ot()),n=rt(()=>t.value===ot());function r(){t.value=Ft(t.value,-1)}function o(){t.value=Ft(t.value,1)}function i(){t.value=ot()}const c=O("day"),f=O(ot()),v=O(ot()),b=O(!1);function g(){if(c.value==="day")return{start:f.value,end:f.value,label:f.value};if(c.value==="week"){const x=Qs(f.value);return{start:x,end:Ft(x,6),label:x+"_"+Ft(x,6)}}if(c.value==="month"){const x=f.value.slice(0,4),j=f.value.slice(5,7),J=new Date(Number(x),Number(j),0).getDate();return{start:x+"-"+j+"-01",end:x+"-"+j+"-"+J,label:x+"-"+j}}return{start:f.value,end:v.value,label:f.value+"_"+v.value}}async function _(){if(!b.value){b.value=!0;try{const{start:x,end:j,label:J}=g(),[oe,ue,ce,q]=await Promise.all([ps(),Jr(x,j),Xr(x,j),rr(!0)]),S=new Map(q.map(M=>[M.id,M.name])),H=["# 工作详情 "+J,""],Q=["周日","周一","周二","周三","周四","周五","周六"];let G=x,re=0;for(;G<=j&&re<400;){const M=ce.filter(I=>I.date===G),E=ue.find(I=>I.date===G);if(E||M.length){if(H.push("## "+G+" "+Q[new Date(G+"T00:00:00").getDay()],""),E&&(E.clock_in_at||E.kind==="makeup")){const I=cr(E,G,oe,G===ot()),ne=[bn(E.clock_in_at),"–",bn(E.clock_out_at),"·",I.label];E.location&&ne.push("· 地点:"+E.location),H.push("考勤:"+ne.join(" "),"")}for(const I of M){const ne=I.project_id&&S.get(I.project_id)||"",Ie="- 【"+ta(I.category)+"】"+I.content+(I.minutes?"("+I.minutes+" 分钟)":"")+(ne?" @"+ne:"");H.push(Ie),I.takeaway&&H.push(" - 收获:"+I.takeaway),I.needs_followup===1&&I.remark?H.push(" - 待跟进:"+I.remark):I.remark&&H.push(" - 备注:"+I.remark)}H.push("")}G=Ft(G,1),re++}await Sa("工作详情_"+J+".md",H.join(` +`)),Ve("已导出 Markdown")}finally{b.value=!1}}}function T(x){const j=x.target.value;j&&(t.value=j)}return(x,j)=>($(),A("div",Lg,[l("div",Rg,[l("button",{class:"icon-btn",title:"前一天",onClick:r},[Ce(He,{name:"chevron-left",size:16})]),l("span",{class:Ze(["date-title num",{"is-today":n.value}])},W(un(ud)(t.value)),3),l("button",{class:"icon-btn",title:"后一天",onClick:o},[Ce(He,{name:"chevron-right",size:16})]),l("input",{type:"date",class:"input w-date",value:t.value,onChange:T},null,40,Kg),l("button",{class:"btn btn-sm",disabled:n.value,onClick:i},"回到今天",8,Ng)]),l("div",Fg,[j[6]||(j[6]=l("span",{class:"muted exp-label"},"导出工作详情",-1)),l("div",Vg,[l("button",{class:Ze(["seg-btn",{active:c.value==="day"}]),onClick:j[0]||(j[0]=J=>c.value="day")},"当日",2),l("button",{class:Ze(["seg-btn",{active:c.value==="week"}]),onClick:j[1]||(j[1]=J=>c.value="week")},"当周",2),l("button",{class:Ze(["seg-btn",{active:c.value==="month"}]),onClick:j[2]||(j[2]=J=>c.value="month")},"当月",2),l("button",{class:Ze(["seg-btn",{active:c.value==="custom"}]),onClick:j[3]||(j[3]=J=>c.value="custom")},"自定义",2)]),c.value!=="day"?Me(($(),A("input",{key:0,class:"input w-exp",type:"date","onUpdate:modelValue":j[4]||(j[4]=J=>f.value=J)},null,512)),[[Ne,f.value]]):ge("",!0),c.value==="custom"?Me(($(),A("input",{key:1,class:"input w-exp",type:"date","onUpdate:modelValue":j[5]||(j[5]=J=>v.value=J)},null,512)),[[Ne,v.value]]):ge("",!0),l("button",{class:"btn btn-sm",disabled:b.value,onClick:_},"导出 Markdown",8,Bg)]),Ce(Pd,{date:t.value},null,8,["date"])]))}}),qg=Vt(Ug,[["__scopeId","data-v-799fe8de"]]),Hg={class:"plan-page"},zg={class:"card sec plan-head"},Wg={class:"nav-row"},Gg={class:"date-box"},Yg={class:"date-main num"},Jg={class:"muted date-sub num"},Xg={class:"muted sum-line"},Qg={class:"goals-sec"},Zg={class:"goals-head"},eb={key:0,class:"muted goals-empty"},tb={class:"goal-main"},nb={class:"goal-line"},sb={class:"tag"},rb={class:"goal-name"},ob={class:"muted num goal-range"},ab={class:"goal-bar"},ib={class:"muted num goal-meta"},lb={class:"goal-ops"},ub=["onClick"],cb=["onClick"],db={class:"plan-list"},fb={key:0,class:"card sec empty muted"},pb={class:"pi-time num"},vb={class:"muted"},mb={class:"pi-main"},hb={class:"pi-title"},yb={class:"tag"},gb={key:0,class:"tag tag-goal"},bb={key:1,class:"state-done"},wb={key:2,class:"state-skip"},_b={key:0,class:"muted pi-note"},kb={class:"muted pi-meta num"},xb={key:0,class:"timer-live"},Cb={class:"pi-ops"},$b=["onClick"],Sb=["onClick"],Eb=["onClick"],Tb=["onClick"],Ab=["onClick"],Pb=["onClick"],Ob={class:"dialog",role:"dialog","aria-label":"计划"},Mb={class:"dialog-head"},Ib={class:"dialog-title"},jb={class:"dialog-body"},Db={class:"form-row"},Lb={class:"form-row"},Rb=["value"],Kb={class:"form-row two"},Nb={class:"form-row"},Fb={key:0,class:"form-error"},Vb={class:"dialog-btns"},Bb={class:"dialog",role:"dialog","aria-label":"长期计划"},Ub={class:"dialog-head"},qb={class:"dialog-title"},Hb={class:"dialog-body"},zb={class:"form-row"},Wb={class:"form-row"},Gb=["value"],Yb={class:"form-row two"},Jb={class:"form-row"},Xb={key:0,class:"form-error"},Qb={class:"dialog-btns"},Zb=Rt({__name:"PlanView",setup(e){const t=O([]),n=O({}),r=O(!1),o=O(null),i=O(""),c=O("学习"),f=O(ot()),v=O(Ft(ot(),6)),b=O(""),g=O(""),_=O(null);function T(){o.value=null,i.value="",c.value="学习",f.value=ot(),v.value=Ft(ot(),6),b.value="",g.value="",r.value=!0}function x(y){o.value=y,i.value=y.title,c.value=y.kind,f.value=y.start_date,v.value=y.end_date,b.value=y.note||"",g.value="",r.value=!0}async function j(){if(!i.value.trim()){g.value="请填写计划名称";return}if(v.valueoe.value===ot());async function Q(){ce.value=!0;const[y,C,R]=await Promise.all([hh(oe.value),$h(),Ch()]);ue.value=y,t.value=C;const F={};for(const le of R)F[String(le.goalId)]={done:le.done,total:le.total};n.value=F,ce.value=!1}yt(oe,Q),yt(ur,Q),vn(()=>{Q(),S=window.setInterval(()=>{q.value=Date.now()},3e4)}),Wn(()=>{S&&window.clearInterval(S)});function G(){oe.value=Ft(oe.value,-1)}function re(){oe.value=Ft(oe.value,1)}function M(){oe.value=ot()}const E=rt(()=>{const y=ue.value.length,C=ue.value.filter(ee=>ee.status==="done").length,R=ue.value.reduce((ee,P)=>ee+I(P),0),F=ue.value.reduce((ee,P)=>ee+(P.actual_minutes||0),0),le=Ie.value;if(le){const ee=ue.value.find(P=>P.id===le);ee&&F+elapsedMinutes(ee)}return{total:y,done:C,plannedMin:R,actualMin:F}});function I(y){const[C,R]=y.start_time.split(":").map(Number),[F,le]=y.end_time.split(":").map(Number);return Math.max(0,F*60+le-(C*60+R))}function ne(y){return y<60?y+" 分钟":Math.floor(y/60)+" 小时 "+y%60+" 分"}const Ie=rt(()=>{const y=ue.value.find(C=>!!C.timer_started_at);return y?y.id:null});function Ae(y){if(!y.timer_started_at)return y.actual_minutes||0;const C=Math.max(0,Math.round((q.value-new Date(y.timer_started_at).getTime())/6e4));return(y.actual_minutes||0)+C}async function ye(y){y.timer_started_at?(await yl(y.id),Ve("已停止计时:"+y.title)):(await _h(y.id),Ve("开始计时:"+y.title)),await Q()}async function Pe(y,C){await wh(y.id,C),await Q()}const Ue=O(!1),de=O(null),ke=O(""),Ee=O("学习"),Le=O("09:00"),$e=O("10:00"),pe=O(""),De=O(""),ct=["学习","健身","自律","工作","阅读","其他"];function gt(){de.value=null,ke.value="",Ee.value="学习",Le.value="09:00",$e.value="10:00",pe.value="",De.value="",Ue.value=!0}function bt(y){de.value=y.id,ke.value=y.title,Ee.value=y.kind,Le.value=y.start_time,$e.value=y.end_time,pe.value=y.note||"",De.value="",Ue.value=!0}async function wt(){if(!ke.value.trim()){De.value="请填写计划内容";return}if($e.value<=Le.value){De.value="结束时间需晚于开始时间";return}de.value?(await gh(de.value,{title:ke.value.trim(),kind:Ee.value,start_time:Le.value,end_time:$e.value,note:pe.value}),Ve("计划已更新")):(await yh({date:oe.value,start_time:Le.value,end_time:$e.value,title:ke.value,kind:Ee.value,note:pe.value}),Ve("计划已添加")),Ue.value=!1,await Q()}async function It(y){await bh(y.id),Ve("已删除"),await Q()}const fe=["周日","周一","周二","周三","周四","周五","周六"];function h(y){return fe[Ks(y).getDay()]}return(y,C)=>($(),A("div",Hg,[l("div",zg,[l("div",Wg,[l("button",{class:"icon-btn",onClick:G},[Ce(He,{name:"chevron-left",size:16})]),l("div",Gg,[l("span",Yg,W(oe.value.slice(5))+" "+W(h(oe.value)),1),l("span",Jg,W(oe.value),1)]),l("button",{class:"icon-btn",onClick:re},[Ce(He,{name:"chevron-right",size:16})]),l("button",{class:Ze(["btn btn-sm",{"btn-primary":!H.value}]),onClick:M},"今天",2),C[18]||(C[18]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-primary btn-sm",onClick:gt},[Ce(He,{name:"plus",size:14}),C[17]||(C[17]=vt(" 添加计划",-1))])]),l("div",Xg,[vt(" 共 "+W(E.value.total)+" 项 · 完成 "+W(E.value.done)+" 项 · 计划 "+W(ne(E.value.plannedMin))+" · 实际投入 "+W(ne(E.value.actualMin))+" ",1),Ie.value?($(),A(je,{key:0},[C[19]||(C[19]=vt(" · ",-1)),C[20]||(C[20]=l("span",{class:"timer-live"},"计时中",-1))],64)):ge("",!0)])]),l("div",Qg,[l("div",Zg,[C[22]||(C[22]=l("span",{class:"goals-title"},"长期计划",-1)),l("button",{class:"btn btn-sm",onClick:T},[Ce(He,{name:"plus",size:14}),C[21]||(C[21]=vt(" 新建长期计划",-1))])]),t.value.length?ge("",!0):($(),A("div",eb,"暂无长期计划。可以创建一个跨越多天的目标(如「产品文档学习」),系统会自动生成每天的打卡任务。")),($(!0),A(je,null,et(t.value,R=>($(),A("div",{key:R.id,class:"card sec goal-card"},[l("div",tb,[l("div",nb,[l("span",sb,W(R.kind),1),l("span",rb,W(R.title),1),l("span",ob,W(R.start_date.slice(5))+" ~ "+W(R.end_date.slice(5)),1)]),l("div",ab,[l("span",{class:"goal-bar-fill",style:Un({width:(n.value[String(R.id)]?Math.round(n.value[String(R.id)].done/Math.max(1,n.value[String(R.id)].total)*100):0)+"%"})},null,4)]),l("div",ib,[vt(W(n.value[String(R.id)]?n.value[String(R.id)].done+"/"+n.value[String(R.id)].total+" 天已完成":"0/"+(n.value[String(R.id)]?n.value[String(R.id)].total:0)+" 天")+" ",1),R.note?($(),A(je,{key:0},[vt(" · "+W(R.note),1)],64)):ge("",!0)])]),l("div",lb,[l("button",{class:"icon-btn",title:"编辑",onClick:F=>x(R)},[Ce(He,{name:"edit",size:14})],8,ub),l("button",{class:"icon-btn",title:"删除",onClick:F=>_.value=R},[Ce(He,{name:"close",size:14})],8,cb)])]))),128))]),l("div",db,[!ce.value&&!ue.value.length?($(),A("div",fb," 今天还没有计划,点右上角「添加计划」开始规划:学习、健身、自律…… ")):ge("",!0),($(!0),A(je,null,et(ue.value,R=>($(),A("div",{key:R.id,class:Ze(["card sec plan-item",{done:R.status==="done",skip:R.status==="skip",running:!!R.timer_started_at}])},[l("div",pb,[vt(W(R.start_time),1),l("span",vb," - "+W(R.end_time),1)]),l("div",mb,[l("div",hb,[l("span",yb,W(R.kind),1),R.goal_id?($(),A("span",gb,"长期")):ge("",!0),l("span",{class:Ze(["pi-text",{strike:R.status==="done"}])},W(R.title),3),R.status==="done"?($(),A("span",bb,"已完成")):R.status==="skip"?($(),A("span",wb,"已跳过")):ge("",!0)]),R.note?($(),A("div",_b,W(R.note),1)):ge("",!0),l("div",kb,[R.timer_started_at?($(),A("span",xb,"计时中 · 已 "+W(Ae(R))+" 分钟",1)):R.actual_minutes>0?($(),A(je,{key:1},[vt("实际投入 "+W(R.actual_minutes)+" 分钟",1)],64)):ge("",!0)])]),l("div",Cb,[R.status!=="done"?($(),A("button",{key:0,class:Ze(["btn btn-xs",{"timer-on":!!R.timer_started_at}]),onClick:F=>ye(R)},W(R.timer_started_at?"停止计时":"计时"),11,$b)):ge("",!0),R.status!=="done"?($(),A("button",{key:1,class:"btn btn-xs",onClick:F=>Pe(R,"done")},"完成",8,Sb)):ge("",!0),R.status==="todo"?($(),A("button",{key:2,class:"btn btn-xs",onClick:F=>Pe(R,"skip")},"跳过",8,Eb)):ge("",!0),R.status!=="todo"?($(),A("button",{key:3,class:"btn btn-xs",onClick:F=>Pe(R,"todo")},"恢复",8,Tb)):ge("",!0),l("button",{class:"icon-btn",title:"编辑",onClick:F=>bt(R)},[Ce(He,{name:"edit",size:14})],8,Ab),l("button",{class:"icon-btn",title:"删除",onClick:F=>It(R)},[Ce(He,{name:"close",size:14})],8,Pb)])],2))),128))]),($(),St(Hn,{to:"body"},[Ue.value?($(),A("div",{key:0,class:"fixed-mask",onClick:C[7]||(C[7]=zt(R=>Ue.value=!1,["self"]))},[l("div",Ob,[l("div",Mb,[l("span",Ib,W(de.value?"编辑计划":"添加计划"),1),l("button",{class:"icon-btn",onClick:C[0]||(C[0]=R=>Ue.value=!1)},[Ce(He,{name:"close",size:16})])]),l("div",jb,[l("div",Db,[C[23]||(C[23]=l("label",null,"计划内容(学什么、做什么)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":C[1]||(C[1]=R=>ke.value=R),placeholder:"如:产品文档第三章 / 晨跑 5 公里",onKeydown:Mt(wt,["enter"])},null,544),[[Ne,ke.value]])]),l("div",Lb,[C[24]||(C[24]=l("label",null,"类别",-1)),Me(l("select",{class:"select","onUpdate:modelValue":C[2]||(C[2]=R=>Ee.value=R)},[($(),A(je,null,et(ct,R=>l("option",{key:R,value:R},W(R),9,Rb)),64))],512),[[fs,Ee.value]])]),l("div",Kb,[l("div",null,[C[25]||(C[25]=l("label",null,"开始时间",-1)),Me(l("input",{class:"input",type:"time","onUpdate:modelValue":C[3]||(C[3]=R=>Le.value=R)},null,512),[[Ne,Le.value]])]),l("div",null,[C[26]||(C[26]=l("label",null,"结束时间",-1)),Me(l("input",{class:"input",type:"time","onUpdate:modelValue":C[4]||(C[4]=R=>$e.value=R)},null,512),[[Ne,$e.value]])])]),l("div",Nb,[C[27]||(C[27]=l("label",null,"备注(选填)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":C[5]||(C[5]=R=>pe.value=R),placeholder:"目标、资料、提醒等",onKeydown:Mt(wt,["enter"])},null,544),[[Ne,pe.value]])]),De.value?($(),A("div",Fb,W(De.value),1)):ge("",!0)]),l("div",Vb,[l("button",{class:"btn btn-sm",onClick:C[6]||(C[6]=R=>Ue.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:wt},W(de.value?"保存":"添加"),1)])])])):ge("",!0)])),($(),St(Hn,{to:"body"},[r.value?($(),A("div",{key:0,class:"fixed-mask",onClick:C[15]||(C[15]=zt(R=>r.value=!1,["self"]))},[l("div",Bb,[l("div",Ub,[l("span",qb,W(o.value?"编辑长期计划":"新建长期计划"),1),l("button",{class:"icon-btn",onClick:C[8]||(C[8]=R=>r.value=!1)},[Ce(He,{name:"close",size:16})])]),l("div",Hb,[l("div",zb,[C[28]||(C[28]=l("label",null,"计划名称(落实为每天一条任务)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":C[9]||(C[9]=R=>i.value=R),placeholder:"如:产品文档学习 / 健身月计划"},null,512),[[Ne,i.value]])]),l("div",Wb,[C[29]||(C[29]=l("label",null,"类别",-1)),Me(l("select",{class:"select","onUpdate:modelValue":C[10]||(C[10]=R=>c.value=R)},[($(),A(je,null,et(ct,R=>l("option",{key:R,value:R},W(R),9,Gb)),64))],512),[[fs,c.value]])]),l("div",Yb,[l("div",null,[C[30]||(C[30]=l("label",null,"开始日期",-1)),Me(l("input",{class:"input",type:"date","onUpdate:modelValue":C[11]||(C[11]=R=>f.value=R)},null,512),[[Ne,f.value]])]),l("div",null,[C[31]||(C[31]=l("label",null,"结束日期",-1)),Me(l("input",{class:"input",type:"date","onUpdate:modelValue":C[12]||(C[12]=R=>v.value=R)},null,512),[[Ne,v.value]])])]),l("div",Jb,[C[32]||(C[32]=l("label",null,"备注(选填)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":C[13]||(C[13]=R=>b.value=R)},null,512),[[Ne,b.value]])]),g.value?($(),A("div",Xb,W(g.value),1)):ge("",!0),C[33]||(C[33]=l("div",{class:"muted goal-hint"},"创建后区间内每一天都会生成一条任务,可在每日安排中逐日打卡与计时。",-1))]),l("div",Qb,[l("button",{class:"btn btn-sm",onClick:C[14]||(C[14]=R=>r.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:j},W(o.value?"保存":"创建"),1)])])])):ge("",!0)])),Ce(Dn,{open:!!_.value,title:"删除长期计划",message:_.value?"将删除「"+_.value.title+"」及其全部每日任务(含已完成记录),不可恢复。":"","confirm-text":"删除",danger:"",onCancel:C[16]||(C[16]=R=>_.value=null),onConfirm:J},null,8,["open","message"])]))}}),ew=Vt(Zb,[["__scopeId","data-v-c917531a"]]),tw={class:"stats"},nw={class:"cards"},sw={class:"card stat-card"},rw={class:"stat-num num"},ow={class:"card stat-card"},aw={class:"stat-num num"},iw={class:"card stat-card"},lw={class:"stat-num num"},uw={class:"card stat-card"},cw={class:"stat-num num"},dw={class:"card section"},fw={class:"heat"},pw=["title"],vw={class:"two-col"},mw={class:"card section"},hw={class:"bar-label"},yw={class:"bar-track"},gw={class:"muted num bar-num"},bw={key:0,class:"muted"},ww={class:"card section"},_w={class:"bar-label"},kw={class:"bar-track"},xw={class:"muted num bar-num"},Cw={key:0,class:"muted"},$w={class:"card section"},Sw={class:"bar-label loc-label"},Ew={class:"bar-track"},Tw={class:"muted num bar-num"},Aw={key:0,class:"muted"},Pw=Rt({__name:"StatsView",setup(e){const t=O({attendDays:0,totalHours:"0",itemCount:0,streak:0}),n=O([]),r=O([]),o=O([]),i=O([]);async function c(){const b=ot(),g="2000-01-01",_=await Promise.all([ps(),Jr(g,b),Xr(g,b),rr(!0)]),T=_[0],x=_[1],j=_[2],J=_[3],oe=x.filter(ye=>ye.clock_in_at||ye.kind==="makeup");let ue=0;for(const ye of oe){const Pe=cr(ye,ye.date,T,ye.date===b);ue+=Pe.workedMinutes??0}const ce=new Set(j.map(ye=>ye.date));let q=0,S=b;for(ce.has(S)||(S=Ft(b,-1));ce.has(S);)q++,S=Ft(S,-1);t.value={attendDays:oe.length,totalHours:(ue/60).toFixed(1),itemCount:j.length,streak:q};const H=new Map;for(const ye of oe){const Pe=ye.location||"未记录";H.set(Pe,(H.get(Pe)||0)+1)}i.value=Array.from(H.entries()).map(ye=>({name:ye[0],count:ye[1],percent:Math.round(ye[1]/(oe.length||1)*100)})).sort((ye,Pe)=>Pe.count-ye.count);const Q=j.length||1,G=await Qr(),re=new Map;for(const ye of j)re.set(ye.category,(re.get(ye.category)||0)+1);const M=new Set(G);for(const ye of re.keys())M.has(ye)||G.push(ye);r.value=G.map(ye=>{const Pe=re.get(ye)||0;return{key:ye,label:ye,count:Pe,percent:Math.round(Pe/Q*100)}}).filter(ye=>ye.count>0).sort((ye,Pe)=>Pe.count-ye.count);const E=new Map(J.map(ye=>[ye.id,ye.name])),I=new Map;for(const ye of j){const Pe=ye.project_id?E.get(ye.project_id)||"已删除项目":"无项目";I.set(Pe,(I.get(Pe)||0)+1)}o.value=Array.from(I.entries()).map(ye=>({name:ye[0],count:ye[1],percent:Math.round(ye[1]/Q*100)})).sort((ye,Pe)=>Pe.count-ye.count);const ne=new Map;for(const ye of j)ne.set(ye.date,(ne.get(ye.date)||0)+1);const Ie=Qs(b),Ae=[];for(let ye=11;ye>=0;ye--){const Pe=Ft(Ie,-7*ye),Ue=[];for(let de=0;de<7;de++){const ke=Ft(Pe,de);Ue.push({date:ke,count:ne.get(ke)||0})}Ae.push(Ue)}n.value=Ae}vn(async()=>{await c()}),yt(ur,()=>{c()});function f(b){return b===0?0:b===1?1:b<=3?2:b<=5?3:4}function v(b,g){return b+" · "+(g?g+" 条":"无记录")}return(b,g)=>($(),A("div",tw,[l("div",nw,[l("div",sw,[g[0]||(g[0]=l("div",{class:"muted"},"出勤天数",-1)),l("div",rw,W(t.value.attendDays),1)]),l("div",ow,[g[1]||(g[1]=l("div",{class:"muted"},"累计工时(小时)",-1)),l("div",aw,W(t.value.totalHours),1)]),l("div",iw,[g[2]||(g[2]=l("div",{class:"muted"},"记录条数",-1)),l("div",lw,W(t.value.itemCount),1)]),l("div",uw,[g[3]||(g[3]=l("div",{class:"muted"},"连续记录(天)",-1)),l("div",cw,W(t.value.streak),1)])]),l("div",dw,[g[4]||(g[4]=l("div",{class:"section-title"},"记录热力图(近 12 周)",-1)),l("div",fw,[($(!0),A(je,null,et(n.value,(_,T)=>($(),A("div",{key:T,class:"heat-col"},[($(!0),A(je,null,et(_,x=>($(),A("span",{key:x.date,class:Ze(["heat-cell","lv"+f(x.count)]),title:v(x.date,x.count)},null,10,pw))),128))]))),128))]),g[5]||(g[5]=Hp('
少多
',1))]),l("div",vw,[l("div",mw,[g[6]||(g[6]=l("div",{class:"section-title"},"分类分布",-1)),($(!0),A(je,null,et(r.value,_=>($(),A("div",{key:_.key,class:"bar-row"},[l("span",hw,W(_.label),1),l("span",yw,[l("span",{class:"bar-fill",style:Un({width:_.percent+"%"})},null,4)]),l("span",gw,W(_.count)+" 条 · "+W(_.percent)+"%",1)]))),128)),r.value.length?ge("",!0):($(),A("div",bw,"暂无数据"))]),l("div",ww,[g[7]||(g[7]=l("div",{class:"section-title"},"项目投入",-1)),($(!0),A(je,null,et(o.value,_=>($(),A("div",{key:_.name,class:"bar-row"},[l("span",_w,W(_.name),1),l("span",kw,[l("span",{class:"bar-fill",style:Un({width:_.percent+"%"})},null,4)]),l("span",xw,W(_.count)+" 条 · "+W(_.percent)+"%",1)]))),128)),o.value.length?ge("",!0):($(),A("div",Cw,"暂无数据"))])]),l("div",$w,[g[8]||(g[8]=l("div",{class:"section-title"},"地点分布(按出勤天)",-1)),($(!0),A(je,null,et(i.value,_=>($(),A("div",{key:_.name,class:"bar-row"},[l("span",Sw,W(_.name),1),l("span",Ew,[l("span",{class:"bar-fill",style:Un({width:_.percent+"%"})},null,4)]),l("span",Tw,W(_.count)+" 天 · "+W(_.percent)+"%",1)]))),128)),i.value.length?ge("",!0):($(),A("div",Aw,"暂无数据"))])]))}}),Ow=Vt(Pw,[["__scopeId","data-v-f8410651"]]);async function Mw(e,t,n){const r=ot(),o=await Promise.all([ps(),Jr(e,t),Xr(e,t),rr(!0),mh(e,t),Qr()]),i=o[0],c=o[1],f=o[2],v=o[3],b=o[4],g=o[5];let _=0,T=0,x=0;for(const I of c){(I.clock_in_at||I.kind==="makeup")&&_++,I.kind==="makeup"&&x++;const ne=cr(I,I.date,i,I.date===r);T+=ne.workedMinutes??0}const j=new Map;for(const I of c){if(!(I.clock_in_at||I.kind==="makeup"))continue;const ne=I.location||"未记录";j.set(ne,(j.get(ne)||0)+1)}const J=Array.from(j.entries()).map(I=>({name:I[0],count:I[1]})).sort((I,ne)=>ne.count-I.count),oe=f.length||1,ue=new Map;for(const I of f)ue.set(I.category,(ue.get(I.category)||0)+1);const ce=new Set(g);for(const I of ue.keys())ce.has(I)||g.push(I);const q=g.map(I=>{const ne=ue.get(I)||0;return{key:I,label:I,count:ne,percent:Math.round(ne/oe*100)}}).filter(I=>I.count>0).sort((I,ne)=>ne.count-I.count),S=new Map(v.map(I=>[I.id,I.name])),H=new Map;for(const I of f){const ne=I.project_id?S.get(I.project_id)||"已删除项目":"无项目";H.set(ne,(H.get(ne)||0)+1)}const Q=Array.from(H.entries()).map(I=>({name:I[0],count:I[1]})).sort((I,ne)=>ne.count-I.count),G=f.filter(I=>I.is_milestone===1).map(I=>({date:I.date,content:I.content})),re=f.filter(I=>I.needs_followup===1).map(I=>({date:I.date,content:I.content,remark:I.remark||""})),M=f.filter(I=>!!I.takeaway).map(I=>({date:I.date,text:I.takeaway})),E=b.map(I=>({weekStart:I.week_start,highlights:I.highlights||"",challenges:I.challenges||"",plan_next:I.plan_next||""}));return{range:{start:e,end:t,label:n},attendDays:_,totalHours:(T/60).toFixed(1),makeupCount:x,leaveCount:c.filter(I=>I.kind==="leave").length,itemCount:f.length,categoryStats:q,projectStats:Q,locationStats:J,milestones:G,followups:re,takeaways:M,weekNotes:E}}function Iw(e){const t=[];t.push("# 实习工作总结("+e.range.start+" ~ "+e.range.end+")"),t.push(""),t.push("## 一、考勤概况"),t.push(""),t.push("出勤 "+e.attendDays+" 天,累计工时 "+e.totalHours+" 小时,补卡 "+e.makeupCount+" 次"+(e.leaveCount?",请假 "+e.leaveCount+" 天":""));const n=e.locationStats.filter(r=>r.name!=="未记录");n.length&&t.push("其中:"+n.map(r=>r.name+" "+r.count+" 天").join(",")),t.push(""),t.push("## 二、工作内容分布"),t.push(""),t.push(e.categoryStats.length?e.categoryStats.map(r=>r.label+" "+r.percent+"%("+r.count+" 条)").join(","):"(无记录)"),t.push(""),t.push("## 三、项目投入"),t.push(""),t.push(e.projectStats.length?e.projectStats.map(r=>r.name+" "+r.count+" 条").join(","):"(无记录)"),t.push(""),t.push("## 四、主要成果"),t.push(""),e.milestones.length?e.milestones.forEach((r,o)=>t.push(o+1+". 【成果】"+r.content+"("+r.date+")")):t.push("(无)"),t.push(""),t.push("## 五、待跟进事项"),t.push(""),e.followups.length?e.followups.forEach(r=>t.push("- 【待跟进】"+r.content+(r.remark?"("+r.date+" 备注:"+r.remark+")":"("+r.date+")"))):t.push("(无)"),t.push(""),t.push("## 六、学习与成长"),t.push(""),e.takeaways.length?e.takeaways.forEach(r=>t.push("- "+r.text+"("+r.date+")")):t.push("(无)");for(const r of e.weekNotes)t.push(""),t.push("### 周记("+r.weekStart+" 起)"),t.push(""),t.push("- 本周亮点:"+(r.highlights||"(无)")),t.push("- 踩的坑:"+(r.challenges||"(无)")),t.push("- 下周计划:"+(r.plan_next||"(无)"));return t.push(""),t.join(` +`)}async function zi(e){try{await navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}}async function jw(e){const t=await Promise.all([xt("ai_base_url",""),xt("ai_api_key",""),xt("ai_model","")]),n=t[0].trim().replace(/\/+$/,""),r=t[1].trim(),o=t[2].trim();if(!n||!o)throw new Error("请先在设置页配置 AI 接口地址与模型名称");const i=n+"/chat/completions",c={"Content-Type":"application/json"};r&&(c.Authorization="Bearer "+r);const v=JSON.stringify({model:o,messages:[{role:"system",content:"你是一名严谨的中文助理。请将用户提供的工作总结 Markdown 草稿润色为通顺、专业、简洁的工作总结。要求:保留原有章节结构与全部事实数据(数字、日期、条目),不得虚构或遗漏内容,只输出 Markdown 正文。"},{role:"user",content:e}],temperature:.3});let b;try{b=await fetch(i,{method:"POST",headers:c,body:v})}catch{throw new Error("无法访问 AI 接口:请检查地址是否正确、服务端是否允许浏览器跨域访问")}if(!b.ok){let T="接口返回 "+b.status;try{const x=await b.json();x&&x.error&&x.error.message&&(T+=":"+x.error.message)}catch{}throw new Error(T)}const g=await b.json(),_=g&&g.choices&&g.choices[0]&&g.choices[0].message&&g.choices[0].message.content;if(!_)throw new Error("接口未返回内容");return String(_)}const Dw={class:"report"},Lw={class:"report-toolbar"},Rw={class:"seg"},Kw=["onClick"],Nw=["disabled"],Fw=["disabled"],Vw={key:0,class:"ai-error"},Bw={class:"report-grid"},Uw={class:"report-left"},qw={class:"card section"},Hw={class:"section-title"},zw={class:"muted note-saved"},Ww={class:"card section"},Gw={class:"report-right"},Yw={key:0,class:"card section"},Jw={class:"sum-row"},Xw={class:"num"},Qw={class:"sum-row"},Zw={class:"num"},e_={class:"sum-row"},t_={class:"num"},n_={class:"sum-row"},s_={class:"num"},r_={class:"sum-row"},o_={class:"num"},a_={class:"muted"},i_={class:"num"},l_={key:0,class:"muted sum-empty"},u_={class:"muted"},c_={key:1,class:"muted sum-empty"},d_={class:"muted"},f_={key:2,class:"muted sum-empty"},p_={class:"muted"},v_={key:3,class:"muted sum-empty"},m_=Rt({__name:"ReportView",setup(e){const t=[{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"all",label:"全部"},{key:"custom",label:"自定义"}],n=O("week"),r=O(Qs(ot())),o=O(ot()),i=O(null),c=O(""),f=O(!1),v=O(!1),b=O(null),g=O(""),_=O(Qs(ot())),T=O(""),x=O(""),j=O(""),J=O(!1);async function oe(){const re=await hl(_.value);T.value=(re==null?void 0:re.highlights)||"",x.value=(re==null?void 0:re.challenges)||"",j.value=(re==null?void 0:re.plan_next)||"",J.value=!1}async function ue(){await vh(_.value,{highlights:T.value.trim()||null,challenges:x.value.trim()||null,plan_next:j.value.trim()||null}),J.value=!0,await q()}function ce(re){const M=ot();if(re==="week"){const E=Qs(M);return{start:E,end:Ft(E,6),label:"本周"}}if(re==="month"){const E=M.slice(0,7);return{start:E+"-01",end:M,label:E+" 本月"}}return re==="all"?{start:"2000-01-01",end:M,label:"全部实习期"}:{start:r.value,end:o.value,label:r.value+" ~ "+o.value}}async function q(){f.value=!0;const re=ce(n.value),M=await Mw(re.start,re.end,re.label);i.value=M,c.value=Iw(M),f.value=!1}yt(n,q),yt([r,o],()=>{n.value==="custom"&&q()}),vn(async()=>{await oe(),await q()});async function S(){const re=ot().replace(/-/g,""),M=await Sa("实习工作总结_"+re+".md",c.value);Ve(M?"总结已导出到:"+M:"总结已导出到系统下载目录")}async function H(){await zi(c.value),Ve("总结已复制到剪贴板")}async function Q(){if(v.value)return;g.value="";const re=c.value.trim();if(!re){g.value="当前草稿为空,无法润色";return}v.value=!0;try{b.value=c.value,c.value=await jw(re),Ve("AI 润色完成")}catch(M){b.value=null,g.value=M instanceof Error?M.message:"润色失败"}v.value=!1}function G(){b.value!==null&&(c.value=b.value),b.value=null}return(re,M)=>($(),A("div",Dw,[l("div",Lw,[l("div",Rw,[($(),A(je,null,et(t,E=>l("button",{key:E.key,class:Ze(["seg-btn",{active:n.value===E.key}]),onClick:I=>n.value=E.key},W(E.label),11,Kw)),64))]),n.value==="custom"?($(),A(je,{key:0},[Me(l("input",{type:"date",class:"input w-date","onUpdate:modelValue":M[0]||(M[0]=E=>r.value=E)},null,512),[[Ne,r.value]]),M[6]||(M[6]=l("span",{class:"muted"},"至",-1)),Me(l("input",{type:"date",class:"input w-date","onUpdate:modelValue":M[1]||(M[1]=E=>o.value=E)},null,512),[[Ne,o.value]])],64)):ge("",!0),M[10]||(M[10]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-sm",disabled:v.value,onClick:Q},[Ce(He,{name:"edit",size:14}),M[7]||(M[7]=vt("AI 润色 ",-1))],8,Nw),b.value!==null?($(),A("button",{key:1,class:"btn btn-sm",onClick:G},"还原润色前")):ge("",!0),l("button",{class:"btn btn-sm",disabled:f.value,onClick:q},[Ce(He,{name:"edit",size:14}),M[8]||(M[8]=vt("重新生成 ",-1))],8,Fw),l("button",{class:"btn btn-sm",onClick:H},"复制"),l("button",{class:"btn btn-primary btn-sm",onClick:S},[Ce(He,{name:"export",size:14}),M[9]||(M[9]=vt("导出 Markdown ",-1))])]),g.value?($(),A("div",Vw,W(g.value),1)):ge("",!0),l("div",Bw,[l("div",Uw,[l("div",qw,[l("div",Hw,"本周周记("+W(_.value)+" 起)",1),M[11]||(M[11]=l("label",{class:"note-label muted"},"本周亮点",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":M[2]||(M[2]=E=>T.value=E),placeholder:"本周最有价值的一件事",onBlur:ue},null,544),[[Ne,T.value]]),M[12]||(M[12]=l("label",{class:"note-label muted"},"踩的坑",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":M[3]||(M[3]=E=>x.value=E),placeholder:"遇到的问题与教训",onBlur:ue},null,544),[[Ne,x.value]]),M[13]||(M[13]=l("label",{class:"note-label muted"},"下周计划",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":M[4]||(M[4]=E=>j.value=E),placeholder:"下周准备做什么",onBlur:ue},null,544),[[Ne,j.value]]),l("div",zw,W(J.value?"已保存":"失焦自动保存"),1)]),l("div",Ww,[M[14]||(M[14]=l("div",{class:"section-title"},"总结草稿(可编辑)",-1)),Me(l("textarea",{class:"textarea md-editor","onUpdate:modelValue":M[5]||(M[5]=E=>c.value=E),spellcheck:"false"},null,512),[[Ne,c.value]])])]),l("div",Gw,[i.value?($(),A("div",Yw,[M[20]||(M[20]=l("div",{class:"section-title"},"数据摘要",-1)),l("div",Jw,[M[15]||(M[15]=l("span",{class:"muted"},"出勤",-1)),l("span",Xw,W(i.value.attendDays)+" 天",1)]),l("div",Qw,[M[16]||(M[16]=l("span",{class:"muted"},"工时",-1)),l("span",Zw,W(i.value.totalHours)+" 小时",1)]),l("div",e_,[M[17]||(M[17]=l("span",{class:"muted"},"补卡",-1)),l("span",t_,W(i.value.makeupCount)+" 次",1)]),l("div",n_,[M[18]||(M[18]=l("span",{class:"muted"},"请假",-1)),l("span",s_,W(i.value.leaveCount)+" 天",1)]),l("div",r_,[M[19]||(M[19]=l("span",{class:"muted"},"记录",-1)),l("span",o_,W(i.value.itemCount)+" 条",1)]),M[21]||(M[21]=l("div",{class:"section-sub"},"分类分布",-1)),($(!0),A(je,null,et(i.value.categoryStats,E=>($(),A("div",{key:E.key,class:"sum-row"},[l("span",a_,W(E.label),1),l("span",i_,W(E.count)+" 条 · "+W(E.percent)+"%",1)]))),128)),i.value.categoryStats.length?ge("",!0):($(),A("div",l_,"(无)")),M[22]||(M[22]=l("div",{class:"section-sub"},"主要成果",-1)),($(!0),A(je,null,et(i.value.milestones,(E,I)=>($(),A("div",{key:"m"+I,class:"sum-item"},[vt(W(E.content),1),l("span",u_,"("+W(E.date)+")",1)]))),128)),i.value.milestones.length?ge("",!0):($(),A("div",c_,"(无)")),M[23]||(M[23]=l("div",{class:"section-sub"},"待跟进",-1)),($(!0),A(je,null,et(i.value.followups,(E,I)=>($(),A("div",{key:"f"+I,class:"sum-item"},[vt(W(E.content),1),l("span",d_,"("+W(E.date)+")",1)]))),128)),i.value.followups.length?ge("",!0):($(),A("div",f_,"(无)")),M[24]||(M[24]=l("div",{class:"section-sub"},"学习与成长",-1)),($(!0),A(je,null,et(i.value.takeaways,(E,I)=>($(),A("div",{key:"t"+I,class:"sum-item"},[vt(W(E.text),1),l("span",p_,"("+W(E.date)+")",1)]))),128)),i.value.takeaways.length?ge("",!0):($(),A("div",v_,"(无)"))])):ge("",!0)])])]))}}),h_=Vt(m_,[["__scopeId","data-v-43f9c59b"]]),y_=["aria-label"],g_={class:"dialog-head"},b_={class:"dialog-title"},w_={class:"dialog-body"},__={class:"form-grid"},k_={class:"field span2"},x_={class:"seg"},C_={class:"field"},$_={class:"field"},S_={class:"field"},E_=["value"],T_={class:"add-cat"},A_=["onKeydown"],P_={key:0,class:"field"},O_={class:"seg"},M_={class:"field span2"},I_={key:0,class:"form-error"},j_={class:"dialog-btns"},D_=Rt({__name:"TransactionDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,r=t,o=O("expense"),i=O(""),c=O(""),f=O(""),v=O(""),b=O(!1),g=O(!1),_=O(""),T=O(null);function x(S){n.open&&S.key==="Escape"&&r("cancel")}yt(()=>n.open,async S=>{var H;S?(await J(),o.value=n.initial.type==="income"?"income":"expense",i.value=n.initial.category,c.value=n.initial.amountYuan,f.value=n.initial.date,v.value=n.initial.note,b.value=n.initial.reimbursable===1,g.value=n.initial.reimbursed===1,_.value="",window.addEventListener("keydown",x),await ir(),(H=T.value)==null||H.focus()):window.removeEventListener("keydown",x)}),Wn(()=>window.removeEventListener("keydown",x)),yt(o,S=>{i.value=S==="expense"?EXPENSE_CATEGORIES[0]:INCOME_CATEGORIES[0]});const j=O([]);async function J(){j.value=await zr(o.value)}const oe=O("");async function ue(){const S=oe.value.trim();if(S){if(j.value.includes(S)){oe.value="";return}j.value.push(S),await Ts(o.value,j.value),i.value=S,oe.value=""}}function ce(){return i.value&&j.value.includes(i.value)?i.value:j.value[0]}function q(){const S=String(c.value??"").trim(),H=Number(S);if(!S||!isFinite(H)||H<=0){_.value="请填写大于 0 的金额";return}if(!f.value){_.value="请选择日期";return}const Q=o.value==="expense"&&b.value?1:0;r("save",{type:o.value,category:ce(),amount:Math.round(H*100),date:f.value,note:String(v.value??"").trim(),reimbursable:Q,reimbursed:Q&&g.value?1:0})}return(S,H)=>($(),St(Hn,{to:"body"},[Ce(lr,{name:"modal"},{default:ms(()=>[e.open?($(),A("div",{key:0,class:"mask",onClick:H[12]||(H[12]=zt(Q=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",g_,[l("span",b_,W(e.title),1),l("button",{class:"icon-btn",title:"关闭",onClick:H[0]||(H[0]=Q=>r("cancel"))},[Ce(He,{name:"close",size:16})])]),l("div",w_,[l("div",__,[l("div",k_,[H[13]||(H[13]=l("label",null,"类型",-1)),l("div",x_,[l("button",{class:Ze(["seg-btn",{active:o.value==="expense"}]),onClick:H[1]||(H[1]=Q=>o.value="expense")},"支出",2),l("button",{class:Ze(["seg-btn",{active:o.value==="income"}]),onClick:H[2]||(H[2]=Q=>o.value="income")},"收入",2)])]),l("div",C_,[H[14]||(H[14]=l("label",null,"金额(元,必填)",-1)),Me(l("input",{ref_key:"amountInput",ref:T,class:Ze(["input",{invalid:_.value}]),"onUpdate:modelValue":H[3]||(H[3]=Q=>c.value=Q),type:"number",min:"0",step:"0.01",placeholder:"0.00"},null,2),[[Ne,c.value]])]),l("div",$_,[H[15]||(H[15]=l("label",null,"日期(必填)",-1)),Me(l("input",{class:"input",type:"date","onUpdate:modelValue":H[4]||(H[4]=Q=>f.value=Q)},null,512),[[Ne,f.value]])]),l("div",S_,[H[16]||(H[16]=l("label",null,"分类(可直接新增)",-1)),Me(l("select",{class:"select","onUpdate:modelValue":H[5]||(H[5]=Q=>i.value=Q)},[($(!0),A(je,null,et(j.value,Q=>($(),A("option",{key:Q,value:Q},W(Q),9,E_))),128))],512),[[fs,i.value]]),l("div",T_,[Me(l("input",{class:"input add-cat-input","onUpdate:modelValue":H[6]||(H[6]=Q=>oe.value=Q),placeholder:"新增分类名",onKeydown:Mt(zt(ue,["prevent"]),["enter"])},null,40,A_),[[Ne,oe.value]]),l("button",{class:"btn btn-xs",type:"button",onClick:ue},"添加")])]),o.value==="expense"?($(),A("div",P_,[H[17]||(H[17]=l("label",null,"报销状态",-1)),l("div",O_,[l("button",{class:Ze(["seg-btn",{active:!b.value}]),onClick:H[7]||(H[7]=Q=>{b.value=!1,g.value=!1})},"无需报销",2),l("button",{class:Ze(["seg-btn",{active:b.value&&!g.value}]),onClick:H[8]||(H[8]=Q=>{b.value=!0,g.value=!1})},"待报销",2),l("button",{class:Ze(["seg-btn",{active:b.value&&g.value}]),onClick:H[9]||(H[9]=Q=>{b.value=!0,g.value=!0})},"已报销",2)])])):ge("",!0),l("div",M_,[H[18]||(H[18]=l("label",null,"备注",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":H[10]||(H[10]=Q=>v.value=Q),placeholder:"选填"},null,512),[[Ne,v.value]])])]),_.value?($(),A("div",I_,W(_.value),1)):ge("",!0)]),l("div",j_,[l("button",{class:"btn btn-sm",onClick:H[11]||(H[11]=Q=>r("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:q},"保存")])],8,y_)])):ge("",!0)]),_:1})]))}}),L_=Vt(D_,[["__scopeId","data-v-9f38206c"]]),R_={class:"ledger-page"},K_={class:"ledger-toolbar"},N_={class:"month-title num"},F_={class:"cards"},V_={class:"card stat-card"},B_={class:"stat-num num amt-income"},U_={class:"card stat-card"},q_={class:"stat-num num"},H_={class:"card stat-card"},z_={class:"card stat-card"},W_={class:"stat-num num amt-warn"},G_={key:0,class:"card sec"},Y_={class:"bar-label"},J_={class:"bar-track"},X_={class:"muted num bar-num"},Q_={key:1,class:"card section"},Z_={class:"form-error"},e1={class:"card table-card"},t1={class:"tx-table"},n1={class:"num","data-label":"日期"},s1={"data-label":"分类"},r1={class:"tag"},o1={class:"td-note","data-label":"备注"},a1={"data-label":"报销"},i1={key:0,class:"muted"},l1={key:1,class:"tx-done"},u1={key:2,class:"tx-pending"},c1={class:"ops-cell"},d1={class:"ops"},f1=["onClick"],p1=["onClick"],v1=["onClick"],m1={key:0},h1={class:"muted vault-note num"},y1=Rt({__name:"LedgerView",setup(e){const t=O(ot()),n=O([]),r=O(!0),o=O("");ot();const i=O(""),c=O(""),f=O(!1),v=O(null),b=O({type:"expense",category:"",amountYuan:"",date:ot(),note:"",reimbursable:0,reimbursed:0}),g=O(null),_=rt(()=>t.value.slice(0,7)+"-01"),T=rt(()=>{const de=Number(t.value.slice(0,4)),ke=Number(t.value.slice(5,7))-1,Ee=new Date(de,ke+1,0).getDate();return t.value.slice(0,7)+"-"+(Ee<10?"0"+Ee:String(Ee))}),x=rt(()=>Number(t.value.slice(0,4))+" 年 "+Number(t.value.slice(5,7))+" 月");async function j(){r.value=!0;try{n.value=await Dh(_.value,T.value),c.value=""}catch(de){c.value="账目加载失败:"+(de instanceof Error?de.stack||de.message:String(de)),Ve("账目加载失败")}r.value=!1}vn(j),yt(t,j);const J=O([]),oe=O([]);async function ue(){J.value=await zr("expense"),oe.value=await zr("income")}ue();const ce=rt(()=>n.value.slice().sort((de,ke)=>de.date===ke.date?ke.id-de.id:de.date{let de=0,ke=0,Ee=0;for(const Le of n.value)Le.type==="income"?de+=Le.amount:(ke+=Le.amount,Le.reimbursable===1&&Le.reimbursed!==1&&(Ee+=Le.amount));return{income:de,expense:ke,pending:Ee,balance:de-ke}}),S=O("all"),H=O("all"),Q=rt(()=>ce.value.filter(de=>!(S.value!=="all"&&de.type!==S.value||H.value==="pending"&&!(de.type==="expense"&&de.reimbursable===1&&de.reimbursed!==1)||H.value==="done"&&!(de.reimbursable===1&&de.reimbursed===1)))),G=rt(()=>{const de=new Map;let ke=0;for(const Le of n.value)Le.type==="expense"&&(de.set(Le.category,(de.get(Le.category)||0)+Le.amount),ke+=Le.amount);const Ee=ke||1;return Array.from(de.entries()).map(Le=>({name:Le[0],amount:Le[1],percent:Math.round(Le[1]/Ee*100)})).sort((Le,$e)=>$e.amount-Le.amount)});function re(de){return(de/100).toFixed(2)}function M(de){return(de.type==="income"?"+":"-")+re(de.amount)}function E(){t.value=na(t.value,-1)}function I(){t.value=na(t.value,1)}function ne(){t.value=ot()}yt(o,()=>{i.value&&(i.value="")});async function Ie(de){await Nh(de.id),await j(),Ve("已标记为已报销")}function Ae(de){v.value=de.id,b.value={type:de.type,category:de.category,amountYuan:re(de.amount),date:de.date,note:de.note||"",reimbursable:de.reimbursable,reimbursed:de.reimbursed},f.value=!0}function ye(){v.value=null,b.value={type:"expense",category:J.value[0]||"",amountYuan:"",date:ot(),note:"",reimbursable:0,reimbursed:0},f.value=!0}async function Pe(de){if(v.value){await Rh(v.value,de),f.value=!1,await j(),Ve("账目已更新");return}await Lh({type:de.type,category:de.category,amount:de.amount,date:de.date,note:de.note,reimbursable:de.reimbursable,reimbursed:de.reimbursed}),f.value=!1,await j(),Ve("已记一笔")}async function Ue(){g.value&&g.value.id&&await Kh(g.value.id),g.value=null,await j(),Ve("账目已删除")}return(de,ke)=>($(),A("div",R_,[l("div",K_,[l("button",{class:"icon-btn",onClick:E},[Ce(He,{name:"chevron-left",size:16})]),l("span",N_,W(x.value),1),l("button",{class:"icon-btn",onClick:I},[Ce(He,{name:"chevron-right",size:16})]),l("button",{class:"btn btn-sm",onClick:ne},"回到本月"),ke[7]||(ke[7]=l("span",{class:"flex1"},null,-1)),Me(l("select",{class:"select w-filter","onUpdate:modelValue":ke[0]||(ke[0]=Ee=>S.value=Ee)},[...ke[4]||(ke[4]=[l("option",{value:"all"},"全部类型",-1),l("option",{value:"expense"},"仅支出",-1),l("option",{value:"income"},"仅收入",-1)])],512),[[fs,S.value]]),Me(l("select",{class:"select w-filter","onUpdate:modelValue":ke[1]||(ke[1]=Ee=>H.value=Ee)},[...ke[5]||(ke[5]=[l("option",{value:"all"},"全部报销",-1),l("option",{value:"pending"},"待报销",-1),l("option",{value:"done"},"已报销",-1)])],512),[[fs,H.value]]),l("button",{class:"btn btn-primary btn-sm",onClick:ye},[Ce(He,{name:"plus",size:14}),ke[6]||(ke[6]=vt(" 记一笔",-1))])]),l("div",F_,[l("div",V_,[ke[8]||(ke[8]=l("div",{class:"muted"},"本月收入(元)",-1)),l("div",B_,W(re(q.value.income)),1)]),l("div",U_,[ke[9]||(ke[9]=l("div",{class:"muted"},"本月支出(元)",-1)),l("div",q_,W(re(q.value.expense)),1)]),l("div",H_,[ke[10]||(ke[10]=l("div",{class:"muted"},"本月结余(元)",-1)),l("div",{class:Ze(["stat-num num",{"amt-income":q.value.balance>=0,"amt-expense":q.value.balance<0}])},W(re(q.value.balance)),3)]),l("div",z_,[ke[11]||(ke[11]=l("div",{class:"muted"},"待报销(元)",-1)),l("div",W_,W(re(q.value.pending)),1)])]),G.value.length?($(),A("div",G_,[ke[12]||(ke[12]=l("div",{class:"sec-title"},"本月支出分类",-1)),($(!0),A(je,null,et(G.value,Ee=>($(),A("div",{key:Ee.name,class:"bar-row"},[l("span",Y_,W(Ee.name),1),l("span",J_,[l("span",{class:"bar-fill",style:Un({width:Ee.percent+"%"})},null,4)]),l("span",X_,W(re(Ee.amount))+" 元 · "+W(Ee.percent)+"%",1)]))),128))])):ge("",!0),c.value?($(),A("div",Q_,[l("div",Z_,W(c.value),1),ke[13]||(ke[13]=l("div",{class:"muted loc-note"},"请将上方完整错误文字发送给开发者",-1))])):ge("",!0),l("div",e1,[l("table",t1,[ke[15]||(ke[15]=l("thead",null,[l("tr",null,[l("th",null,"日期"),l("th",null,"分类"),l("th",null,"金额(元)"),l("th",null,"备注"),l("th",null,"报销"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[($(!0),A(je,null,et(Q.value,Ee=>($(),A("tr",{key:Ee.id},[l("td",n1,W(Ee.date),1),l("td",s1,[l("span",r1,W(Ee.category),1)]),l("td",{class:Ze(["num",Ee.type==="income"?"amt-income":"amt-expense"]),"data-label":"金额"},W(M(Ee)),3),l("td",o1,W(Ee.note||"--"),1),l("td",a1,[Ee.type!=="expense"||Ee.reimbursable!==1?($(),A("span",i1,"--")):Ee.reimbursed===1?($(),A("span",l1,"已报销")):($(),A("span",u1,"待报销"))]),l("td",c1,[l("div",d1,[Ee.type==="expense"&&Ee.reimbursable===1&&Ee.reimbursed!==1?($(),A("button",{key:0,class:"btn btn-xs",onClick:Le=>Ie(Ee)},"标记已报销",8,f1)):ge("",!0),l("button",{class:"btn btn-xs",onClick:Le=>Ae(Ee)},"编辑",8,p1),l("button",{class:"btn btn-xs",onClick:Le=>g.value=Ee},"删除",8,v1)])])]))),128)),!Q.value.length&&!r.value?($(),A("tr",m1,[...ke[14]||(ke[14]=[l("td",{colspan:"6",class:"empty muted"},"本月暂无账目",-1)])])):ge("",!0)])])]),l("div",h1,"本月 "+W(n.value.length)+" 条 · 当前筛选 "+W(Q.value.length)+" 条",1),Ce(L_,{open:f.value,title:v.value?"编辑账目":"记一笔",initial:b.value,onCancel:ke[2]||(ke[2]=Ee=>f.value=!1),onSave:Pe},null,8,["open","title","initial"]),Ce(Dn,{open:!!g.value,title:"删除确认",message:g.value?"将删除 "+g.value.date+" 的账目("+g.value.category+" "+re(g.value.amount)+" 元)。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:ke[3]||(ke[3]=Ee=>g.value=null),onConfirm:Ue},null,8,["open","message"])]))}}),g1=Vt(y1,[["__scopeId","data-v-e8759c3f"]]),b1={class:"memo-page"},w1={class:"card memo-list"},_1={class:"pane-head"},k1={class:"pane-title"},x1={class:"memo-scroll"},C1=["onClick"],$1={class:"memo-item-title"},S1={class:"muted memo-item-sub"},E1={class:"muted num memo-item-time"},T1={key:0,class:"muted empty"},A1={class:"card memo-editor"},P1={class:"editor-foot"},O1={class:"muted foot-info"},M1=["disabled"],I1=["disabled"],j1={key:1,class:"empty muted editor-empty"},D1=Rt({__name:"MemoView",setup(e){const t=O([]),n=O(null),r=O(!1),o=O(""),i=O(""),c=O(null),f=O(null);async function v(){if(t.value=await Ah(),n.value&&n.value.id){const Q=t.value.find(G=>G.id===n.value.id);Q&&(n.value=Q)}}vn(async()=>{await v(),t.value.length&&_(t.value[0]),window.addEventListener("keydown",b)}),Wn(()=>window.removeEventListener("keydown",b)),yt(Vi,async Q=>{if(!Q)return;t.value.length||await v();const G=t.value.find(re=>re.id===Q);Vi.value=null,G&&T(G)},{immediate:!0});function b(Q){(Q.ctrlKey||Q.metaKey)&&Q.key.toLowerCase()==="s"&&r.value&&g.value&&(Q.preventDefault(),oe())}const g=rt(()=>{if(!r.value)return!1;const Q=n.value?n.value.title:"",G=n.value?n.value.content:"";return o.value!==Q||i.value!==G});function _(Q){n.value=Q,r.value=!0,o.value=Q.title,i.value=Q.content}function T(Q){if(!(r.value&&n.value&&n.value.id===Q.id)){if(g.value){f.value={type:"select",memo:Q};return}_(Q)}}function x(){if(g.value){f.value={type:"new"};return}j()}function j(){n.value=null,r.value=!0,o.value="",i.value=""}function J(){n.value?_(n.value):j()}async function oe(){if(!o.value.trim()&&!i.value.trim()){Ve("标题与内容不能都为空");return}if(n.value&&n.value.id)await Oh(n.value.id,o.value,i.value),Ve("备忘已保存");else{const Q=await Ph(o.value,i.value);n.value=Q,o.value=Q.title,i.value=Q.content,Ve("备忘已创建")}await v()}function ue(){n.value&&n.value.id&&(c.value=n.value)}async function ce(){c.value&&c.value.id&&(await Mh(c.value.id),Ve("备忘已删除")),c.value=null,await v(),j()}function q(){const Q=f.value;f.value=null,Q&&(Q.type==="select"?_(Q.memo):j())}function S(Q){return(Q.content||"").replace(/\s+/g," ").slice(0,30)}function H(Q){return Q.replace("T"," ").slice(0,16)}return(Q,G)=>($(),A("div",b1,[l("aside",w1,[l("div",_1,[l("span",k1,"备忘录("+W(t.value.length)+")",1),l("button",{class:"btn btn-primary btn-sm",onClick:x},"新建")]),l("div",x1,[($(!0),A(je,null,et(t.value,re=>($(),A("div",{key:re.id,class:Ze(["memo-item",{active:r.value&&n.value&&n.value.id===re.id}]),onClick:M=>T(re)},[l("div",$1,W(re.title||"无标题"),1),l("div",S1,W(S(re)||"空"),1),l("div",E1,W(H(re.updated_at)),1)],10,C1))),128)),t.value.length?ge("",!0):($(),A("div",T1,"暂无备忘"))])]),l("section",A1,[r.value?($(),A(je,{key:0},[Me(l("input",{class:"input title-input","onUpdate:modelValue":G[0]||(G[0]=re=>o.value=re),placeholder:"标题"},null,512),[[Ne,o.value]]),Me(l("textarea",{class:"textarea content-textarea","onUpdate:modelValue":G[1]||(G[1]=re=>i.value=re),placeholder:"内容"},null,512),[[Ne,i.value]]),l("div",P1,[l("span",O1,[g.value?($(),A(je,{key:0},[vt("有未保存修改")],64)):n.value&&n.value.id?($(),A(je,{key:1},[vt("更新于 "+W(H(n.value.updated_at)),1)],64)):($(),A(je,{key:2},[vt("新备忘")],64))]),G[4]||(G[4]=l("span",{class:"flex1"},null,-1)),n.value&&n.value.id?($(),A("button",{key:0,class:"btn btn-sm",onClick:ue},"删除")):ge("",!0),l("button",{class:"btn btn-sm",disabled:!g.value,onClick:J},"放弃修改",8,M1),l("button",{class:"btn btn-primary btn-sm",disabled:!g.value,onClick:oe},"保存",8,I1)])],64)):($(),A("div",j1,"选择左侧备忘,或点击右上角新建"))]),Ce(Dn,{open:!!c.value,title:"删除确认",message:c.value?"将删除备忘「"+(c.value.title||"无标题")+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:G[2]||(G[2]=re=>c.value=null),onConfirm:ce},null,8,["open","message"]),Ce(Dn,{open:!!f.value,title:"未保存提示",message:"当前备忘有未保存的修改,继续操作将丢失这些修改。","confirm-text":"放弃修改并继续",onCancel:G[3]||(G[3]=re=>f.value=null),onConfirm:q},null,8,["open"])]))}}),L1=Vt(D1,[["__scopeId","data-v-74d60dba"]]),R1=["aria-label"],K1={class:"dialog-head"},N1={class:"dialog-title"},F1={class:"dialog-body"},V1={class:"form-grid"},B1={class:"field span2"},U1={class:"field span2"},q1={class:"field span2"},H1={class:"pwd-row"},z1={class:"field span2"},W1={key:0,class:"form-error"},G1={class:"dialog-btns"},Y1=Rt({__name:"CredentialDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,r=t,o=O(""),i=O(""),c=O(""),f=O(""),v=O(""),b=O(null);function g(x){n.open&&x.key==="Escape"&&r("cancel")}yt(()=>n.open,async x=>{var j;x?(o.value=n.initial.system,i.value=n.initial.account,c.value=n.initial.password,f.value=n.initial.remark,v.value="",window.addEventListener("keydown",g),await ir(),(j=b.value)==null||j.focus()):window.removeEventListener("keydown",g)}),Wn(()=>window.removeEventListener("keydown",g));function _(){const x="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",j="!@#$%^&*",J=crypto.getRandomValues(new Uint8Array(14));let oe="";for(let ue=0;ue($(),St(Hn,{to:"body"},[Ce(lr,{name:"modal"},{default:ms(()=>[e.open?($(),A("div",{key:0,class:"mask",onClick:j[6]||(j[6]=zt(J=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",K1,[l("span",N1,W(e.title),1),l("button",{class:"icon-btn",title:"关闭",onClick:j[0]||(j[0]=J=>r("cancel"))},[Ce(He,{name:"close",size:16})])]),l("div",F1,[l("div",V1,[l("div",B1,[j[7]||(j[7]=l("label",null,"系统名称(必填)",-1)),Me(l("input",{ref_key:"systemInput",ref:b,class:"input","onUpdate:modelValue":j[1]||(j[1]=J=>o.value=J),placeholder:"如:企业邮箱 / OA / VPN"},null,512),[[Ne,o.value]])]),l("div",U1,[j[8]||(j[8]=l("label",null,"账号(必填)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":j[2]||(j[2]=J=>i.value=J),placeholder:"用户名、工号或邮箱"},null,512),[[Ne,i.value]])]),l("div",q1,[j[9]||(j[9]=l("label",null,"密码(必填)",-1)),l("div",H1,[Me(l("input",{class:"input","onUpdate:modelValue":j[3]||(j[3]=J=>c.value=J),placeholder:"输入或点击生成"},null,512),[[Ne,c.value]]),l("button",{class:"btn btn-sm",onClick:_},"生成")])]),l("div",z1,[j[10]||(j[10]=l("label",null,"备注",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":j[4]||(j[4]=J=>f.value=J),placeholder:"用途、到期时间、负责人等(选填)"},null,512),[[Ne,f.value]])])]),v.value?($(),A("div",W1,W(v.value),1)):ge("",!0)]),l("div",G1,[l("button",{class:"btn btn-sm",onClick:j[5]||(j[5]=J=>r("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:T},"保存")])],8,R1)])):ge("",!0)]),_:1})]))}}),J1=Vt(Y1,[["__scopeId","data-v-f383b0a6"]]),X1={class:"vault-page"},Q1={key:0,class:"empty muted"},Z1={key:1,class:"card lock-card"},e0={class:"lock-badge"},t0={key:0,class:"form-error"},n0=["disabled"],s0={key:0,class:"form-error"},r0=["disabled"],o0={class:"vault-toolbar"},a0={class:"search-wrap"},i0={class:"card table-card"},l0={class:"cred-table"},u0={class:"td-system"},c0=["onClick"],d0={class:"pwd-cell"},f0={class:"num pwd-text"},p0=["onClick"],v0=["onClick"],m0={class:"td-remark"},h0={class:"td-ops"},y0={class:"ops"},g0=["onClick"],b0=["onClick"],w0={key:0},_0={class:"muted vault-note num"},k0={class:"dialog pwd-dialog"},x0={class:"dialog-head"},C0={class:"dialog-body"},$0={class:"vp-field"},S0={class:"vp-field"},E0={class:"vp-field"},T0={key:0,class:"form-error"},A0={class:"dialog-btns"},P0=5*60*1e3,O0=Rt({__name:"VaultView",setup(e){const t=O(null),n=O(cm()),r=O(!1),o=O(""),i=O(""),c=O(""),f=O(""),v=O(""),b=O([]),g=O(""),_=O({}),T=O(!1),x=O(null),j=O({system:"",account:"",password:"",remark:""}),J=O(null),oe=O(!1),ue=O(""),ce=O(""),q=O(""),S=O("");async function H(){b.value=await mm(),_.value={}}let Q=null;function G(){Q!==null&&window.clearTimeout(Q),Q=window.setTimeout(()=>{n.value&&(oa(),n.value=!1,b.value=[],_.value={},Ve("长时间未操作,密码库已自动锁定"))},P0)}function re(){n.value&&G()}vn(async()=>{t.value=await dd(),window.addEventListener("click",re),window.addEventListener("keydown",re),n.value&&G()}),Wn(()=>{window.removeEventListener("click",re),window.removeEventListener("keydown",re),Q!==null&&window.clearTimeout(Q)});const M=rt(()=>{const $e=g.value.trim().toLowerCase();return $e?b.value.filter(pe=>(pe.system+" "+pe.account+" "+(pe.remark||"")).toLowerCase().includes($e)):b.value});async function E(){if(!r.value){if(c.value="",!o.value){c.value="请输入主密码";return}if(o.value.length<6){c.value="主密码至少 6 位";return}if(o.value!==i.value){c.value="两次输入的主密码不一致";return}r.value=!0;try{await dm(o.value),o.value="",i.value="",n.value=!0,G(),await H(),Ve("主密码已设置,密码库已解锁")}catch($e){c.value=$e instanceof Error?$e.message:"设置失败"}r.value=!1}}async function I(){if(!r.value){if(v.value="",!f.value){v.value="请输入主密码";return}r.value=!0;try{await fm(f.value),f.value="",n.value=!0,G(),await H()}catch($e){v.value=$e instanceof Error?$e.message:"解锁失败"}r.value=!1}}function ne(){oa(),n.value=!1,b.value=[],_.value={},Q!==null&&window.clearTimeout(Q),Ve("密码库已锁定")}async function Ie($e){const pe=$e.id;if(_.value[pe]){_.value[pe]=!1;return}try{$e.passwordPlain=await yi(pe),_.value[pe]=!0}catch(De){Ve(De instanceof Error?De.message:"解密失败")}}async function Ae($e){try{const pe=await yi($e.id);await zi(pe),Ve("密码已复制")}catch(pe){Ve(pe instanceof Error?pe.message:"复制失败")}}async function ye($e){await zi($e.account),Ve("账号已复制")}function Pe(){x.value=null,j.value={system:"",account:"",password:"",remark:""},T.value=!0}async function Ue($e){try{const pe=await yi($e.id);x.value=$e.id,j.value={system:$e.system,account:$e.account,password:pe,remark:$e.remark||""},T.value=!0}catch(pe){Ve(pe instanceof Error?pe.message:"解密失败")}}async function de($e){const pe=x.value??void 0;await hm($e,pe),T.value=!1,await H(),Ve(pe?"账号已更新":"账号已添加")}async function ke(){J.value&&J.value.id&&(await ym(J.value.id),Ve("账号已删除")),J.value=null,await H()}function Ee(){ue.value="",ce.value="",q.value="",S.value="",oe.value=!0}async function Le(){S.value="";try{const $e=await gm(ue.value,ce.value);oe.value=!1,ue.value="",ce.value="",q.value="",Ve("主密码已修改,"+$e+" 条账号密码已重新加密")}catch($e){S.value=$e instanceof Error?$e.message:"修改失败"}}return($e,pe)=>($(),A("div",X1,[t.value===null?($(),A("div",Q1,"加载中")):n.value?($(),A(je,{key:2},[l("div",o0,[l("div",a0,[Ce(He,{name:"search",size:14,class:"search-icon"}),Me(l("input",{class:"input","onUpdate:modelValue":pe[3]||(pe[3]=De=>g.value=De),placeholder:"搜索系统名称、账号或备注"},null,512),[[Ne,g.value]])]),pe[16]||(pe[16]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-sm",onClick:Ee},"修改主密码"),l("button",{class:"btn btn-sm",onClick:ne},"锁定"),l("button",{class:"btn btn-primary btn-sm",onClick:Pe},"新增账号")]),l("div",i0,[l("table",l0,[pe[18]||(pe[18]=l("thead",null,[l("tr",null,[l("th",null,"系统名称"),l("th",null,"账号"),l("th",null,"密码"),l("th",null,"备注"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[($(!0),A(je,null,et(M.value,De=>($(),A("tr",{key:De.id},[l("td",u0,W(De.system),1),l("td",null,[l("span",{class:"copyable",title:"点击复制账号",onClick:ct=>ye(De)},W(De.account),9,c0)]),l("td",null,[l("div",d0,[l("span",f0,W(_.value[De.id]?De.passwordPlain:"........"),1),l("button",{class:"btn btn-xs",onClick:ct=>Ie(De)},W(_.value[De.id]?"隐藏":"显示"),9,p0),l("button",{class:"btn btn-xs",onClick:ct=>Ae(De)},"复制",8,v0)])]),l("td",m0,W(De.remark||"--"),1),l("td",h0,[l("div",y0,[l("button",{class:"btn btn-xs",onClick:ct=>Ue(De)},"编辑",8,g0),l("button",{class:"btn btn-xs",onClick:ct=>J.value=De},"删除",8,b0)])])]))),128)),M.value.length?ge("",!0):($(),A("tr",w0,[...pe[17]||(pe[17]=[l("td",{colspan:"5",class:"empty muted"},"暂无账号,点击右上角新增",-1)])]))])])]),l("div",_0,"共 "+W(b.value.length)+" 条账号记录 · 密码以 AES-256-GCM 加密,服务器仅存密文",1)],64)):($(),A("div",Z1,[l("div",e0,[Ce(He,{name:"lock",size:26})]),t.value===!1?($(),A(je,{key:0},[pe[12]||(pe[12]=l("div",{class:"lock-title"},"设置主密码",-1)),pe[13]||(pe[13]=l("div",{class:"muted lock-tip"},"主密码用于加密保存在本机的账号密码,遗忘后无法找回,请务必牢记",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[0]||(pe[0]=De=>o.value=De),placeholder:"设置主密码(至少 6 位)",onKeydown:Mt(E,["enter"])},null,544),[[Ne,o.value]]),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[1]||(pe[1]=De=>i.value=De),placeholder:"再次输入主密码",onKeydown:Mt(E,["enter"])},null,544),[[Ne,i.value]]),c.value?($(),A("div",t0,W(c.value),1)):ge("",!0),l("button",{class:"btn btn-primary lock-btn",disabled:r.value,onClick:E},"完成设置并解锁",8,n0)],64)):($(),A(je,{key:1},[pe[14]||(pe[14]=l("div",{class:"lock-title"},"密码库已锁定",-1)),pe[15]||(pe[15]=l("div",{class:"muted lock-tip"},"输入主密码解锁后查看与复制密码",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[2]||(pe[2]=De=>f.value=De),placeholder:"主密码",onKeydown:Mt(I,["enter"])},null,544),[[Ne,f.value]]),v.value?($(),A("div",s0,W(v.value),1)):ge("",!0),l("button",{class:"btn btn-primary lock-btn",disabled:r.value,onClick:I},"解锁",8,r0)],64))])),Ce(J1,{open:T.value,title:x.value?"编辑账号":"新增账号",initial:j.value,onCancel:pe[4]||(pe[4]=De=>T.value=!1),onSave:de},null,8,["open","title","initial"]),Ce(Dn,{open:!!J.value,title:"删除确认",message:J.value?"将删除系统「"+J.value.system+"」的账号记录。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:pe[5]||(pe[5]=De=>J.value=null),onConfirm:ke},null,8,["open","message"]),($(),St(Hn,{to:"body"},[Ce(lr,{name:"modal"},{default:ms(()=>[oe.value?($(),A("div",{key:0,class:"mask",onClick:pe[11]||(pe[11]=zt(De=>oe.value=!1,["self"]))},[l("div",k0,[l("div",x0,[pe[19]||(pe[19]=l("span",{class:"dialog-title"},"修改主密码",-1)),l("button",{class:"icon-btn",title:"关闭",onClick:pe[6]||(pe[6]=De=>oe.value=!1)},[Ce(He,{name:"close",size:16})])]),l("div",C0,[l("div",$0,[pe[20]||(pe[20]=l("label",null,"旧主密码",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[7]||(pe[7]=De=>ue.value=De)},null,512),[[Ne,ue.value]])]),l("div",S0,[pe[21]||(pe[21]=l("label",null,"新主密码(至少 6 位)",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[8]||(pe[8]=De=>ce.value=De)},null,512),[[Ne,ce.value]])]),l("div",E0,[pe[22]||(pe[22]=l("label",null,"确认新主密码",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[9]||(pe[9]=De=>q.value=De)},null,512),[[Ne,q.value]])]),S.value?($(),A("div",T0,W(S.value),1)):ge("",!0),pe[23]||(pe[23]=l("div",{class:"muted vp-tip"},"确认后所有账号密码将使用新主密码重新加密",-1))]),l("div",A0,[l("button",{class:"btn btn-sm",onClick:pe[10]||(pe[10]=De=>oe.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:Le},"确认修改")])])])):ge("",!0)]),_:1})]))]))}}),M0=Vt(O0,[["__scopeId","data-v-c2db283d"]]);function I0(e){return'"'+(e==null?"":String(e)).replace(/"/g,'""')+'"'}async function Uu(e,t){const r="\uFEFF"+t.map(f=>f.map(I0).join(",")).join(`\r +`);if(ar.isNativePlatform()){const{downloadText:f}=await Od(async()=>{const{downloadText:v}=await Promise.resolve().then(()=>Dg);return{downloadText:v}},void 0,import.meta.url);return f(e,r)}const o=new Blob([r],{type:"text/csv;charset=utf-8"}),i=URL.createObjectURL(o),c=document.createElement("a");return c.href=i,c.download=e,c.click(),window.setTimeout(()=>URL.revokeObjectURL(i),1e4),""}const j0={class:"settings"},D0={class:"card section"},L0={class:"muted acc-line"},R0={class:"ai-grid"},K0={class:"rule-item"},N0={class:"rule-item"},F0={class:"rule-item"},V0={key:0,class:"form-error"},B0={class:"rule-save"},U0={class:"card section"},q0={class:"rule-grid"},H0={class:"rule-item"},z0={class:"rule-item"},W0={class:"rule-item"},G0={class:"rule-item"},Y0={class:"rule-item"},J0={class:"card section"},X0={class:"proj-add"},Q0={key:0,class:"muted proj-tip"},Z0=["onKeydown"],ek=["onClick"],tk=["onClick"],nk=["onClick"],sk={key:1,class:"muted"},rk={class:"card section"},ok={class:"card section"},ak={class:"muted acc-line"},ik={class:"rule-save"},lk=["disabled"],uk={key:0,class:"muted acc-line"},ck={key:1,class:"form-error"},dk={key:2,class:"form-error"},fk={class:"card section"},pk={class:"ai-grid"},vk={class:"rule-item"},mk={class:"rule-item"},hk={class:"rule-item"},yk={class:"card section"},gk={class:"cat-block"},bk={class:"cat-head"},wk={class:"cat-chips"},_k=["onClick"],kk=["onClick"],xk={class:"cat-block"},Ck={class:"cat-head"},$k={class:"cat-chips"},Sk=["onClick"],Ek=["onClick"],Tk={class:"cat-block"},Ak={class:"cat-head"},Pk={class:"cat-chips"},Ok=["onClick"],Mk=["onClick"],Ik={class:"card section"},jk={class:"backup-row"},Dk={key:0,class:"import-error"},Lk=Rt({__name:"SettingsView",setup(e){var le;const t=O({work_start:"09:00",work_end:"18:00",grace_minutes:10,lunch_minutes:60,remind_weekly:"friday"}),n=O([]),r=O(""),o=O(""),i=O(""),c=O(""),f=O(""),v=O(""),b=O(null),g=O(""),_=O([]),T=O([]),x=O([]);async function j(){_.value=await Qr(),T.value=await zr("expense"),x.value=await zr("income")}async function J(ee){const P=window.prompt("新分类名称");if(!P||!P.trim())return;const Z=ee==="log"?_.value:ee==="expense"?T.value:x.value,te=P.trim();if(Z.includes(te)){Ve("分类已存在");return}const Se=[...Z,te];ee==="log"?(_.value=Se,await bi(Se)):ee==="expense"?(T.value=Se,await Ts("expense",Se)):(x.value=Se,await Ts("income",Se)),Ve("分类已添加")}async function oe(ee,P,Z){const te=window.prompt("修改分类名称",Z);if(!te||!te.trim()||te.trim()===Z)return;const we=(ee==="log"?_.value:ee==="expense"?T.value:x.value).map((Re,Te)=>Te===P?te.trim():Re);ee==="log"?(_.value=we,await bi(we)):ee==="expense"?(T.value=we,await Ts("expense",we)):(x.value=we,await Ts("income",we)),Ve("分类已更新(历史记录自动跟随显示)")}async function ue(ee,P){const Z=ee==="log"?_.value:ee==="expense"?T.value:x.value;if(Z.length<=1){Ve("至少保留一个分类");return}if(!window.confirm("删除分类「"+Z[P]+"」?历史记录不受影响。"))return;const te=Z.filter((Se,we)=>we!==P);ee==="log"?(_.value=te,await bi(te)):ee==="expense"?(T.value=te,await Ts("expense",te)):(x.value=te,await Ts("income",te)),Ve("分类已删除")}const ce=O(null),q=O(null),S=O(""),H=O(((le=qr())==null?void 0:le.username)||""),Q=O(""),G=O(""),re=O(""),M=O(""),E=O(!1),I="0.5.0",ne=O(""),Ie=O(""),Ae=O(""),ye=O(""),Pe=O(!1),Ue=O("");async function de(){var ee;ne.value=((ee=wn())==null?void 0:ee.username)||"",Ue.value=await Nm(),ye.value=Zs.value}yt(Zs,ee=>{ye.value=ee});async function ke(){Ae.value="";try{await gd(),Ve("云端绑定已重建")}catch(ee){Ae.value=ee instanceof Error?ee.message:"绑定失败"}}async function Ee(){if(!Pe.value){Ae.value="",ye.value=Zs.value,Pe.value=!0;try{const ee=await Bi();Ue.value=ee.at,Ie.value="推送 "+ee.pushed+" 条 · 拉取 "+ee.pulled+" 条 · 删除 "+ee.removed+" 条",ye.value="",Ve("同步完成")}catch(ee){Ae.value=ee instanceof Error?ee.message:"同步失败"}Pe.value=!1}}async function Le(){if(M.value="",G.value!==re.value){M.value="两次输入的新密码不一致";return}try{await Im(Q.value,G.value),Q.value="",G.value="",re.value="",Ve("登录密码已修改")}catch(ee){M.value=ee instanceof Error?ee.message:"修改失败"}}async function $e(){await jm(),window.location.reload()}async function pe(){t.value=await ps(),n.value=await rr(!0),i.value=(await ml()).join(` +`),c.value=await xt("ai_base_url",""),f.value=await xt("ai_api_key",""),v.value=await xt("ai_model",""),await de(),await j()}async function De(){await jt("ai_base_url",c.value.trim()),await jt("ai_api_key",f.value.trim()),await jt("ai_model",v.value.trim()),Ve("AI 配置已保存")}async function ct(){const ee=ot(),P=await Promise.all([Xr("2000-01-01",ee),rr(!0)]),Z=P[0],te=P[1],Se=new Map(te.map(Te=>[Te.id,Te.name])),we=[["日期","分类","项目","内容","耗时(分钟)","成果","待跟进","收获","备注"]];for(const Te of Z)we.push([Te.date,categoryLabel(Te.category),Te.project_id&&Se.get(Te.project_id)||"",Te.content,Te.minutes==null?"":Te.minutes,Te.is_milestone?"是":"",Te.needs_followup?"是":"",Te.takeaway||"",Te.remark||""]);const Re=await Uu("工作记录_"+ee.replace(/-/g,"")+".csv",we);Ve(Re?"CSV 已导出到:"+Re:"CSV 已导出到系统下载目录")}async function gt(){const ee=ot(),P=await Promise.all([ps(),Jr("2000-01-01",ee)]),Z=P[0],te=P[1],Se=["周日","周一","周二","周三","周四","周五","周六"],we=[["日期","星期","状态","上班时间","下班时间","地点","类型","说明"]];for(const Te of te){const Xe=cr(Te,Te.date,Z,Te.date===ee);we.push([Te.date,Se[Ks(Te.date).getDay()],Xe.label,Te.clock_in_at?bn(Te.clock_in_at):"",Te.clock_out_at?bn(Te.clock_out_at):"",Te.location||"",Te.kind==="makeup"?"补卡":Te.kind==="leave"?"休假":"正常",Te.note||""])}const Re=await Uu("考勤记录_"+ee.replace(/-/g,"")+".csv",we);Ve(Re?"CSV 已导出到:"+Re:"CSV 已导出到系统下载目录")}vn(pe);async function bt(){await jt("work_start",t.value.work_start),await jt("work_end",t.value.work_end),await jt("grace_minutes",String(t.value.grace_minutes)),await jt("lunch_minutes",String(t.value.lunch_minutes)),await jt("remind_weekly",t.value.remind_weekly),Ve("打卡规则已保存")}async function wt(){await Cd(i.value.split(` +`)),Ve("常用地点已保存")}async function It(){const ee=r.value.trim();if(ee){try{await th(ee),o.value="",r.value=""}catch{o.value="项目名已存在"}await pe()}}function fe(ee){b.value=ee.id,g.value=ee.name}async function h(ee){const P=g.value.trim();if(P)try{await nh(ee.id,P),o.value=""}catch{o.value="项目名已存在"}b.value=null,await pe()}async function y(ee){await sh(ee.id,ee.archived!==1),await pe()}async function C(){try{const ee=await Fh(),P=await Sa("实习日志备份_"+ot().replace(/-/g,"")+".json",ee);Ve(P?"备份已导出到:"+P:"备份已导出到系统下载目录")}catch(ee){Ve("导出失败:"+(ee instanceof Error?ee.message:String(ee)))}}function R(ee){const P=ee.target,Z=P.files&&P.files[0];if(S.value="",!Z)return;const te=Z.name;Z.text().then(Se=>{q.value={name:te,text:Se}}),P.value=""}async function F(){if(q.value)try{await Vh(q.value.text),q.value=null,S.value="",await pe(),Ve("数据导入完成")}catch(ee){q.value=null,S.value=ee instanceof Error?ee.message:"导入失败"}}return(ee,P)=>($(),A("div",j0,[l("div",D0,[P[25]||(P[25]=l("div",{class:"section-title"},"账号与隐私",-1)),l("div",L0,"v"+W(un(I))+" · 当前账号 "+W(H.value)+" · 登录密码仅存 PBKDF2 哈希",1),l("div",R0,[l("div",K0,[P[22]||(P[22]=l("label",null,"旧登录密码",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":P[0]||(P[0]=Z=>Q.value=Z)},null,512),[[Ne,Q.value]])]),l("div",N0,[P[23]||(P[23]=l("label",null,"新登录密码(至少 6 位)",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":P[1]||(P[1]=Z=>G.value=Z)},null,512),[[Ne,G.value]])]),l("div",F0,[P[24]||(P[24]=l("label",null,"确认新登录密码",-1)),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":P[2]||(P[2]=Z=>re.value=Z)},null,512),[[Ne,re.value]])])]),M.value?($(),A("div",V0,W(M.value),1)):ge("",!0),l("div",B0,[l("button",{class:"btn btn-primary btn-sm",onClick:Le},"修改登录密码"),l("button",{class:"btn btn-sm btn-danger",onClick:P[3]||(P[3]=Z=>E.value=!0)},"删除此用户及全部数据")])]),l("div",U0,[P[32]||(P[32]=l("div",{class:"section-title"},"打卡规则",-1)),l("div",q0,[l("div",H0,[P[26]||(P[26]=l("label",null,"上班时间",-1)),Me(l("input",{type:"time",class:"input","onUpdate:modelValue":P[4]||(P[4]=Z=>t.value.work_start=Z)},null,512),[[Ne,t.value.work_start]])]),l("div",z0,[P[27]||(P[27]=l("label",null,"下班时间",-1)),Me(l("input",{type:"time",class:"input","onUpdate:modelValue":P[5]||(P[5]=Z=>t.value.work_end=Z)},null,512),[[Ne,t.value.work_end]])]),l("div",W0,[P[28]||(P[28]=l("label",null,"迟到宽限(分钟)",-1)),Me(l("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":P[6]||(P[6]=Z=>t.value.grace_minutes=Z)},null,512),[[Ne,t.value.grace_minutes,void 0,{number:!0}]])]),l("div",G0,[P[29]||(P[29]=l("label",null,"午休扣除(分钟)",-1)),Me(l("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":P[7]||(P[7]=Z=>t.value.lunch_minutes=Z)},null,512),[[Ne,t.value.lunch_minutes,void 0,{number:!0}]])]),l("div",Y0,[P[31]||(P[31]=l("label",null,"周记提醒",-1)),Me(l("select",{class:"select","onUpdate:modelValue":P[8]||(P[8]=Z=>t.value.remind_weekly=Z)},[...P[30]||(P[30]=[l("option",{value:"friday"},"每周五提醒",-1),l("option",{value:"off"},"关闭",-1)])],512),[[fs,t.value.remind_weekly]])])]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:bt},"保存规则")])]),l("div",J0,[P[33]||(P[33]=l("div",{class:"section-title"},"项目管理",-1)),l("div",X0,[Me(l("input",{class:"input","onUpdate:modelValue":P[9]||(P[9]=Z=>r.value=Z),placeholder:"新项目名称",onKeydown:Mt(It,["enter"])},null,544),[[Ne,r.value]]),l("button",{class:"btn btn-sm",onClick:It},"添加")]),o.value?($(),A("div",Q0,W(o.value),1)):ge("",!0),($(!0),A(je,null,et(n.value,Z=>($(),A("div",{key:Z.id,class:"proj-row"},[b.value===Z.id?($(),A(je,{key:0},[Me(l("input",{class:"input","onUpdate:modelValue":P[10]||(P[10]=te=>g.value=te),onKeydown:Mt(te=>h(Z),["enter"])},null,40,Z0),[[Ne,g.value]]),l("button",{class:"btn btn-sm",onClick:te=>h(Z)},"保存",8,ek),l("button",{class:"btn btn-sm",onClick:P[11]||(P[11]=te=>b.value=null)},"取消")],64)):($(),A(je,{key:1},[l("span",{class:Ze(["proj-name",{archived:Z.archived===1}])},W(Z.name),3),l("button",{class:"icon-btn",title:"重命名",onClick:te=>fe(Z)},[Ce(He,{name:"edit",size:14})],8,tk),l("button",{class:"btn btn-sm",onClick:te=>y(Z)},W(Z.archived===1?"恢复":"归档"),9,nk)],64))]))),128)),n.value.length?ge("",!0):($(),A("div",sk,"暂无项目,先添加一个"))]),l("div",rk,[P[35]||(P[35]=l("div",{class:"section-title"},"常用地点",-1)),Me(l("textarea",{class:"textarea","onUpdate:modelValue":P[12]||(P[12]=Z=>i.value=Z),placeholder:"每行一个地点,如:公司、客户现场、出差、居家办公"},null,512),[[Ne,i.value]]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:wt},"保存地点"),P[34]||(P[34]=l("span",{class:"muted loc-note"},"打卡时可直接输入新地点,保存后自动加入列表",-1))])]),l("div",ok,[P[36]||(P[36]=l("div",{class:"section-title"},"多端数据同步",-1)),l("div",ak,"云端账号:"+W(ne.value||"未绑定")+" · 数据存于服务器,其他端变更秒级自动刷新",1),l("div",ik,[l("button",{class:"btn btn-primary btn-sm",disabled:Pe.value,onClick:Ee},W(Pe.value?"同步中":"立即同步"),9,lk),l("button",{class:"btn btn-sm",onClick:ke},"重新校验连接")]),Ie.value?($(),A("div",uk,"上次同步:"+W(Ue.value||"--")+" · "+W(Ie.value),1)):ge("",!0),Ae.value?($(),A("div",ck,W(Ae.value),1)):ge("",!0),ye.value?($(),A("div",dk,"最近自动同步失败:"+W(ye.value)+"(可点「立即同步」重试)",1)):ge("",!0)]),l("div",fk,[P[41]||(P[41]=l("div",{class:"section-title"},"AI 润色配置(可选)",-1)),l("div",pk,[l("div",vk,[P[37]||(P[37]=l("label",null,"接口地址(OpenAI 兼容,到 /v1 为止)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":P[13]||(P[13]=Z=>c.value=Z),placeholder:"https://api.example.com/v1"},null,512),[[Ne,c.value]])]),l("div",mk,[P[38]||(P[38]=l("label",null,"API Key",-1)),Me(l("input",{class:"input","onUpdate:modelValue":P[14]||(P[14]=Z=>f.value=Z),placeholder:"sk-..."},null,512),[[Ne,f.value]])]),l("div",hk,[P[39]||(P[39]=l("label",null,"模型名称",-1)),Me(l("input",{class:"input","onUpdate:modelValue":P[15]||(P[15]=Z=>v.value=Z),placeholder:"如:deepseek-chat"},null,512),[[Ne,v.value]])])]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:De},"保存 AI 配置"),P[40]||(P[40]=l("span",{class:"muted loc-note"},"配置仅保存在本机;总结页「AI 润色」需此处先配置",-1))])]),l("div",yk,[P[45]||(P[45]=l("div",{class:"section-title"},"工作分类",-1)),l("div",gk,[l("div",bk,[P[42]||(P[42]=l("span",{class:"muted"},"工作记录分类",-1)),l("button",{class:"btn btn-xs",onClick:P[16]||(P[16]=Z=>J("log"))},"添加")]),l("div",wk,[($(!0),A(je,null,et(_.value,(Z,te)=>($(),A("span",{key:Z+te,class:"cat-chip"},[vt(W(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Se=>oe("log",te,Z)},"改",8,_k),l("button",{class:"chip-btn",title:"删除",onClick:Se=>ue("log",te)},"删",8,kk)]))),128))])]),l("div",xk,[l("div",Ck,[P[43]||(P[43]=l("span",{class:"muted"},"记账支出分类",-1)),l("button",{class:"btn btn-xs",onClick:P[17]||(P[17]=Z=>J("expense"))},"添加")]),l("div",$k,[($(!0),A(je,null,et(T.value,(Z,te)=>($(),A("span",{key:Z+te,class:"cat-chip"},[vt(W(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Se=>oe("expense",te,Z)},"改",8,Sk),l("button",{class:"chip-btn",title:"删除",onClick:Se=>ue("expense",te)},"删",8,Ek)]))),128))])]),l("div",Tk,[l("div",Ak,[P[44]||(P[44]=l("span",{class:"muted"},"记账收入分类",-1)),l("button",{class:"btn btn-xs",onClick:P[18]||(P[18]=Z=>J("income"))},"添加")]),l("div",Pk,[($(!0),A(je,null,et(x.value,(Z,te)=>($(),A("span",{key:Z+te,class:"cat-chip"},[vt(W(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Se=>oe("income",te,Z)},"改",8,Ok),l("button",{class:"chip-btn",title:"删除",onClick:Se=>ue("income",te)},"删",8,Mk)]))),128))])])]),l("div",Ik,[P[46]||(P[46]=l("div",{class:"section-title"},"数据备份",-1)),l("div",jk,[l("button",{class:"btn btn-sm",onClick:C},"导出 JSON 备份"),l("button",{class:"btn btn-sm",onClick:P[19]||(P[19]=Z=>{var te;return(te=ce.value)==null?void 0:te.click()})},"导入 JSON 备份"),l("button",{class:"btn btn-sm",onClick:ct},"导出工作记录 CSV"),l("button",{class:"btn btn-sm",onClick:gt},"导出考勤 CSV"),l("input",{ref_key:"fileInput",ref:ce,type:"file",accept:"application/json,.json",style:{display:"none"},onChange:R},null,544)]),S.value?($(),A("div",Dk,W(S.value),1)):ge("",!0),P[47]||(P[47]=l("div",{class:"muted backup-note"},"数据保存在云端服务器;导出的 JSON 备份用于跨设备迁移或灾后恢复。",-1))]),Ce(Dn,{open:!!q.value,title:"导入确认",message:q.value?"将从文件「"+q.value.name+"」导入备份。现有全部数据将被覆盖,且不可恢复,请先确认已导出当前备份。":"","confirm-text":"覆盖导入",danger:"",onCancel:P[20]||(P[20]=Z=>q.value=null),onConfirm:F},null,8,["open","message"]),Ce(Dn,{open:E.value,title:"删除用户确认",message:"将永久删除云端账号「"+H.value+"」及其服务器上的全部数据:工作日志、考勤、备忘录、账号密码库都将被清除,任何设备都无法再取回,且不可恢复。请确认。","confirm-text":"永久删除",danger:"",onCancel:P[21]||(P[21]=Z=>E.value=!1),onConfirm:$e},null,8,["open","message"])]))}}),Rk=Vt(Lk,[["__scopeId","data-v-d8d0f782"]]),Kk={class:"admin-page"},Nk={class:"card sec"},Fk={class:"toolbar"},Vk={key:0,class:"form-error"},Bk={class:"card table-card admin-table-card"},Uk={class:"admin-table"},qk={class:"td-name","data-label":"用户名"},Hk={"data-label":"角色"},zk={key:0,class:"role-badge"},Wk={key:1,class:"muted"},Gk={class:"muted num","data-label":"创建时间"},Yk={class:"muted num","data-label":"数据量"},Jk={class:"td-ops"},Xk={class:"ops"},Qk=["onClick"],Zk=["disabled","onClick"],ex={key:0},tx={key:0,class:"muted load-line"},nx={class:"dialog create-dialog",role:"dialog","aria-label":"新增用户"},sx={class:"dialog-head"},rx={class:"dialog-body"},ox={class:"form-row"},ax={class:"form-row"},ix={class:"form-row"},lx={key:0,class:"form-error"},ux={class:"dialog-btns"},cx=["disabled"],dx={class:"dialog create-dialog",role:"dialog","aria-label":"重置密码"},fx={class:"dialog-head"},px={class:"dialog-title"},vx={class:"dialog-body"},mx={class:"form-row"},hx={key:0,class:"form-error"},yx={class:"dialog-btns"},gx=["disabled"],bx=Rt({__name:"UserAdminView",setup(e){const t=O([]),n=O(""),r=O(!0),o=O("");async function i(M,E){const I=await Ns();let ne=$a();if(!ne){const Ae=wn(),ye=await fetch(I+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:Ae==null?void 0:Ae.username,password:Ae==null?void 0:Ae.password})});if(ye.ok){const Pe=await ye.json();ne=String(Pe.token||""),Ur(ne)}}const Ie=await fetch(I+M,{method:E?"POST":"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+ne},body:E?JSON.stringify(E):void 0});if(Ie.status===401&&wn()){const Ae=wn(),ye=await fetch(I+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:Ae==null?void 0:Ae.username,password:Ae==null?void 0:Ae.password})});if(ye.ok){const Pe=await ye.json();ne=String(Pe.token||""),Ur(ne);const Ue=await fetch(I+M,{method:E?"POST":"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+ne},body:E?JSON.stringify(E):void 0});return{ok:Ue.ok,status:Ue.status,data:await Ue.json().catch(()=>({}))}}}return{ok:Ie.ok,status:Ie.status,data:await Ie.json().catch(()=>({}))}}async function c(){r.value=!0,o.value="";const M=await i("/api/admin/users");if(!M.ok){r.value=!1,o.value=M.data&&M.data.error||"加载失败 "+M.status;return}t.value=M.data.users||[],n.value=M.data.me||"",r.value=!1}function f(M){return M<=0?"--":M<1024?M+" B":M<1024*1024?(M/1024).toFixed(1)+" KB":(M/1024/1024).toFixed(2)+" MB"}function v(M){return(M||"").slice(0,10)}const b=O(!1),g=O(""),_=O(""),T=O(""),x=O(""),j=O(!1);function J(){b.value=!0,x.value="",g.value="",_.value="",T.value=""}async function oe(){const M=g.value.trim();if(_.value!==T.value){x.value="两次输入的密码不一致";return}if(_.value.length<6){x.value="密码至少 6 位";return}j.value=!0;const E=await i("/api/admin/users/create",{username:M,password:_.value});if(j.value=!1,!E.ok){x.value=E.data&&E.data.error||"创建失败 "+E.status;return}Ve("用户「"+M+"」已创建"),b.value=!1,await c()}const ue=O(null),ce=O(""),q=O(""),S=O(!1);function H(M){ue.value=M,ce.value="",q.value=""}async function Q(){if(!ue.value)return;if(ce.value.length<6){q.value="密码至少 6 位";return}S.value=!0;const M=await i("/api/admin/users/password",{userId:ue.value.id,newPassword:ce.value});if(S.value=!1,!M.ok){q.value=M.data&&M.data.error||"重置失败 "+M.status;return}Ve("已重置「"+ue.value.username+"」的登录密码"),ue.value=null}const G=O(null);async function re(){if(!G.value)return;const M=await i("/api/admin/users/delete",{userId:G.value.id});if(!M.ok){G.value=null,Ve(M.data&&M.data.error||"删除失败");return}Ve("已删除账号「"+G.value.username+"」及其全部云端数据"),G.value=null,await c()}return vn(c),(M,E)=>($(),A("div",Kk,[l("div",Nk,[l("div",Fk,[E[12]||(E[12]=l("div",{class:"head-wrap"},[l("div",{class:"sec-title"},"用户管理"),l("div",{class:"muted head-sub"},"云端账号统一管理 · 管理员:xionglin")],-1)),l("button",{class:"btn btn-primary btn-sm",onClick:J},[Ce(He,{name:"plus",size:14}),E[11]||(E[11]=vt(" 新增用户 ",-1))])]),o.value?($(),A("div",Vk,W(o.value),1)):ge("",!0)]),l("div",Bk,[l("table",Uk,[E[14]||(E[14]=l("thead",null,[l("tr",null,[l("th",null,"用户名"),l("th",null,"角色"),l("th",null,"创建时间"),l("th",null,"数据量"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[($(!0),A(je,null,et(t.value,I=>($(),A("tr",{key:I.id},[l("td",qk,W(I.username),1),l("td",Hk,[I.role==="admin"?($(),A("span",zk,"管理员")):($(),A("span",Wk,"普通用户"))]),l("td",Gk,W(v(I.created_at)),1),l("td",Yk,W(f(I.data_bytes)),1),l("td",Jk,[l("div",Xk,[l("button",{class:"btn btn-xs",onClick:ne=>H(I)},"重置密码",8,Qk),l("button",{class:"btn btn-xs btn-danger",disabled:I.id===n.value,onClick:ne=>G.value=I},"删除",8,Zk)])])]))),128)),!r.value&&!t.value.length?($(),A("tr",ex,[...E[13]||(E[13]=[l("td",{colspan:"5",class:"empty muted"},"加载结果为空",-1)])])):ge("",!0)])]),r.value?($(),A("div",tx,"加载中")):ge("",!0)]),E[20]||(E[20]=l("div",{class:"muted admin-note"},"重置密码立即生效;删除账号将移除其全部云端数据,不可恢复。自己的账号不能删除。",-1)),($(),St(Hn,{to:"body"},[b.value?($(),A("div",{key:0,class:"fixed-mask",onClick:E[5]||(E[5]=zt(I=>b.value=!1,["self"]))},[l("div",nx,[l("div",sx,[E[15]||(E[15]=l("span",{class:"dialog-title"},"新增用户",-1)),l("button",{class:"icon-btn",onClick:E[0]||(E[0]=I=>b.value=!1)},[Ce(He,{name:"close",size:16})])]),l("div",rx,[l("div",ox,[E[16]||(E[16]=l("label",null,"用户名(2 到 20 个字符)",-1)),Me(l("input",{class:"input","onUpdate:modelValue":E[1]||(E[1]=I=>g.value=I),placeholder:"如:xiaowang"},null,512),[[Ne,g.value]])]),l("div",ax,[E[17]||(E[17]=l("label",null,"初始登录密码(至少 6 位)",-1)),Me(l("input",{class:"input",type:"password","onUpdate:modelValue":E[2]||(E[2]=I=>_.value=I),placeholder:"转发给使用者,登录后可自行修改"},null,512),[[Ne,_.value]])]),l("div",ix,[E[18]||(E[18]=l("label",null,"确认密码",-1)),Me(l("input",{class:"input",type:"password","onUpdate:modelValue":E[3]||(E[3]=I=>T.value=I),onKeydown:Mt(oe,["enter"])},null,544),[[Ne,T.value]])]),x.value?($(),A("div",lx,W(x.value),1)):ge("",!0)]),l("div",ux,[l("button",{class:"btn btn-sm",onClick:E[4]||(E[4]=I=>b.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",disabled:j.value||!g.value.trim(),onClick:oe},W(j.value?"创建中":"创建"),9,cx)])])])):ge("",!0)])),($(),St(Hn,{to:"body"},[ue.value?($(),A("div",{key:0,class:"fixed-mask",onClick:E[9]||(E[9]=zt(I=>ue.value=null,["self"]))},[l("div",dx,[l("div",fx,[l("span",px,"重置「"+W(ue.value.username)+"」的登录密码",1),l("button",{class:"icon-btn",onClick:E[6]||(E[6]=I=>ue.value=null)},[Ce(He,{name:"close",size:16})])]),l("div",vx,[l("div",mx,[E[19]||(E[19]=l("label",null,"新登录密码(至少 6 位)",-1)),Me(l("input",{class:"input",type:"password","onUpdate:modelValue":E[7]||(E[7]=I=>ce.value=I),onKeydown:Mt(Q,["enter"])},null,544),[[Ne,ce.value]])]),q.value?($(),A("div",hx,W(q.value),1)):ge("",!0)]),l("div",yx,[l("button",{class:"btn btn-sm",onClick:E[8]||(E[8]=I=>ue.value=null)},"取消"),l("button",{class:"btn btn-primary btn-sm",disabled:S.value,onClick:Q},W(S.value?"提交中":"重置"),9,gx)])])])):ge("",!0)])),Ce(Dn,{open:!!G.value,title:"删除用户确认",message:G.value?"将永久删除云端账号「"+G.value.username+"」及其服务器上的全部数据,不可恢复。请确认。":"","confirm-text":"永久删除",danger:"",onCancel:E[10]||(E[10]=I=>G.value=null),onConfirm:re},null,8,["open","message"])]))}}),wx=Vt(bx,[["__scopeId","data-v-06be07ff"]]),_x={class:"login-page"},kx={class:"card login-card"},xx={class:"login-brand"},Cx={class:"brand-icon"},$x={class:"seg"},Sx=["placeholder"],Ex={key:1,class:"form-error"},Tx=["disabled"],Ax=Rt({__name:"LoginView",emits:["login"],setup(e,{emit:t}){const n=t,r=O("login"),o=O(""),i=O(""),c=O(""),f=O(""),v=O(!1);function b(_){r.value=_,f.value="",c.value=""}async function g(){if(!v.value){f.value="",v.value=!0;try{let _;if(r.value==="login")_=await Tm(o.value,i.value);else{if(i.value.length<6){f.value="登录密码至少 6 位",v.value=!1;return}if(i.value!==c.value){f.value="两次输入的密码不一致",v.value=!1;return}_=await Am(o.value,i.value)}n("login",_)}catch(_){f.value=_ instanceof Error?_.message:"操作失败"}v.value=!1}}return(_,T)=>($(),A("div",_x,[l("div",kx,[l("div",xx,[l("div",Cx,[Ce(He,{name:"calendar",size:22})]),T[5]||(T[5]=l("div",{class:"login-title"},"实习工作日志",-1)),T[6]||(T[6]=l("div",{class:"muted login-sub"},"打卡 · 记录 · 总结 · 备忘录 · 密码库",-1)),T[7]||(T[7]=l("div",{class:"muted login-sub"},"数据保存在云端服务器,所有设备登录同一账号即可实时同步",-1))]),l("div",$x,[l("button",{class:Ze(["seg-btn",{active:r.value==="login"}]),onClick:T[0]||(T[0]=x=>b("login"))},"登录",2),l("button",{class:Ze(["seg-btn",{active:r.value==="create"}]),onClick:T[1]||(T[1]=x=>b("create"))},"创建用户",2)]),Me(l("input",{class:"input","onUpdate:modelValue":T[2]||(T[2]=x=>o.value=x),placeholder:"用户名(2 到 20 个字符)",onKeydown:Mt(g,["enter"])},null,544),[[Ne,o.value]]),Me(l("input",{type:"password",class:"input","onUpdate:modelValue":T[3]||(T[3]=x=>i.value=x),placeholder:r.value==="login"?"登录密码":"设置登录密码(至少 6 位)",onKeydown:Mt(g,["enter"])},null,40,Sx),[[Ne,i.value]]),r.value==="create"?Me(($(),A("input",{key:0,type:"password",class:"input","onUpdate:modelValue":T[4]||(T[4]=x=>c.value=x),placeholder:"再次输入密码",onKeydown:Mt(g,["enter"])},null,544)),[[Ne,c.value]]):ge("",!0),f.value?($(),A("div",Ex,W(f.value),1)):ge("",!0),l("button",{class:"btn btn-primary login-btn",disabled:v.value,onClick:g},W(r.value==="login"?"登录":"创建并进入"),9,Tx),T[8]||(T[8]=l("div",{class:"muted login-note"}," 登录密码仅服务器保存哈希;本机保存加密的自动登录凭据,登录后无需重复输入 ",-1))])]))}}),Px=Vt(Ax,[["__scopeId","data-v-bf714afa"]]),Ox={key:1,class:"app"},Mx={class:"side"},Ix={key:0,class:"nav-sep"},jx=["data-tip","onClick"],Dx={class:"main"},Lx={class:"topbar"},Rx={class:"title"},Kx={class:"gsearch"},Nx={key:0,class:"gs-panel"},Fx={key:0,class:"gs-group muted"},Vx=["onMousedown"],Bx={class:"tag"},Ux={class:"gs-text"},qx={class:"muted num gs-date"},Hx={key:1,class:"gs-group muted"},zx=["onMousedown"],Wx={class:"gs-text"},Gx={class:"muted gs-sub"},Yx={key:1,class:"gs-empty muted"},Jx={class:"topbar-actions"},Xx={class:"user-chip num mobile-hide"},Qx=["disabled"],Zx={class:"num"},eC={class:"content"},tC={class:"content-inner"},nC={class:"tabbar"},sC=["onClick"],rC={class:"sheet-user num"},oC=["onClick"],aC={class:"sheet-name"},iC={class:"msw"},lC={class:"msw-bar"},uC={class:"msw-results"},cC={key:0,class:"gs-group muted"},dC=["onMousedown"],fC={class:"tag"},pC={class:"gs-text"},vC={class:"muted num gs-date"},mC={key:1,class:"gs-group muted"},hC=["onMousedown"],yC={class:"gs-text"},gC={class:"muted gs-sub"},bC={key:1,class:"gs-empty muted"},wC={class:"toast-wrap"},_C=Rt({__name:"App",setup(e){const t=dy(),n=O(qr());async function r(h){n.value=h,ia(h.userId),location.hash="#/calendar",H.value="calendar",await De(),await fe(),c();try{await gd(),await tr()}catch{}Ve("欢迎,"+h.username);const y=sessionStorage.getItem("dsh_migrate_toast");y&&(sessionStorage.removeItem("dsh_migrate_toast"),Ve("已迁移原有数据 "+y+" 条"))}async function o(){Pe.value=!1,Ae.value=!1,qm(),i!==null&&(window.clearInterval(i),i=null),await Om(),n.value=null,H.value="calendar",location.hash="#/calendar",Ve("已退出登录")}let i=null;function c(){Um(),i!==null&&window.clearInterval(i),i=window.setInterval(()=>{tr()},60*1e3),tr()}const f=O(null),v=O(""),b=O(!1),g=O({logs:[],memos:[]});let _=null;const T=rt(()=>!!(g.value.logs.length||g.value.memos.length));function x(){_&&window.clearTimeout(_);const h=v.value;_=window.setTimeout(async()=>{const y=h.trim();if(!y){g.value={logs:[],memos:[]};return}const C=await Promise.all([Ih(y,8),jh(y,4)]);g.value={logs:C[0],memos:C[1]}},200)}function j(){v.value="",g.value={logs:[],memos:[]},b.value=!1}function J(h){Fi.value=h.date,Q("calendar"),j()}function oe(h){Vi.value=h.id,Q("memo"),j()}function ue(){window.setTimeout(()=>{b.value=!1},150)}function ce(h){var y;(h.ctrlKey||h.metaKey)&&h.key.toLowerCase()==="k"&&(h.preventDefault(),(y=f.value)==null||y.focus())}const q=[{key:"calendar",name:"日历",icon:"calendar",group:"记录"},{key:"today",name:"详情",icon:"edit",group:"记录"},{key:"plan",name:"计划",icon:"plan",group:"记录"},{key:"ledger",name:"记账",icon:"wallet",group:"工具"},{key:"memo",name:"备忘录",icon:"memo",group:"工具"},{key:"stats",name:"统计",icon:"chart",group:"分析"},{key:"report",name:"总结",icon:"export",group:"分析"},{key:"vault",name:"密码库",icon:"lock",group:"系统"},{key:"settings",name:"设置",icon:"settings",group:"系统"},{key:"admin",name:"用户管理",icon:"shield",group:"系统"}];function S(){var y;const h=(location.hash||"").replace("#/","");return!q.some(C=>C.key===h)||h==="admin"&&(((y=qr())==null?void 0:y.username)||"")!=="xionglin"?"calendar":h}const H=O(S());window.addEventListener("hashchange",()=>{H.value=S()});function Q(h){location.hash="#/"+h}const G=rt(()=>q.find(h=>h.key===H.value)||q[0]),re=rt(()=>{var h;return(((h=n.value)==null?void 0:h.username)||"")==="xionglin"}),M=rt(()=>re.value?q:q.filter(h=>h.key!=="admin")),E=rt(()=>{const h=q.filter(y=>!ne.includes(y.key));return re.value?h:h.filter(y=>y.key!=="admin")}),I=rt(()=>E.value.some(h=>h.key===H.value));yt([re,H],()=>{H.value==="admin"&&!re.value&&Q("calendar")},{immediate:!0});const ne=["calendar","today","plan","ledger"],Ie=q.filter(h=>ne.includes(h.key)),Ae=O(!1);function ye(h){Ae.value=!1,Q(h)}const Pe=O(!1),Ue=O(null);function de(){Pe.value=!0,window.setTimeout(()=>{var h;return(h=Ue.value)==null?void 0:h.focus()},60)}function ke(h){J(h),Pe.value=!1}function Ee(h){oe(h),Pe.value=!1}const Le=O(ot()),$e=O(void 0),pe=O(!1);async function De(){if($e.value=await _n(Le.value),pe.value=!1,new Date().getHours()<4){const y=await _n(Ft(Le.value,-1));pe.value=!!(y&&y.clock_in_at&&!y.clock_out_at)}}const ct=rt(()=>{const h=$e.value;return h&&h.clock_in_at&&!h.clock_out_at?!0:pe.value&&!(h&&h.clock_in_at)}),gt=rt(()=>{const h=$e.value;return!!(h&&h.clock_in_at&&h.clock_out_at)}),bt=rt(()=>{const h=$e.value;return ct.value?"下班打卡":gt.value?"已打卡 "+bn(h==null?void 0:h.clock_in_at)+" - "+bn(h==null?void 0:h.clock_out_at):"上班打卡"});async function wt(){if(ct.value)try{await oh()}catch{}else await $d(Le.value);await De(),os()}yt(ur,()=>{n.value&&De()});const It=O(!1);async function fe(){if((await ps()).remind_weekly==="off"){It.value=!1;return}const y=new Date().getDay();if(y===5||y===6||y===0){const C=await hl(Qs(Le.value));It.value=!C||!C.highlights&&!C.challenges&&!C.plan_next}else It.value=!1}return vn(async()=>{window.addEventListener("keydown",ce),n.value&&(ia(n.value.userId),await De(),await fe(),c())}),(h,y)=>{var C,R;return n.value?($(),A("div",Ox,[l("nav",Mx,[($(!0),A(je,null,et(M.value,(F,le)=>($(),A(je,{key:F.key},[le>0&&F.group!==M.value[le-1].group?($(),A("div",Ix)):ge("",!0),l("button",{class:Ze(["nav-btn",{active:H.value===F.key}]),"data-tip":F.name,onClick:ee=>Q(F.key)},[Ce(He,{name:F.icon,size:18},null,8,["name"])],10,jx)],64))),128))]),l("div",Dx,[l("header",Lx,[l("span",Rx,W(G.value.name),1),l("button",{class:"mob-search-btn",title:"搜索",onClick:de},[Ce(He,{name:"search",size:16})]),l("div",Kx,[Ce(He,{name:"search",size:14,class:"gs-icon"}),Me(l("input",{ref_key:"gsInput",ref:f,class:"input gs-input","onUpdate:modelValue":y[0]||(y[0]=F=>v.value=F),placeholder:"搜索工作记录与备忘录(Ctrl+K)",onInput:x,onFocus:y[1]||(y[1]=F=>b.value=!0),onBlur:ue,onKeydown:Mt(j,["esc"])},null,544),[[Ne,v.value]]),b.value&&v.value.trim()?($(),A("div",Nx,[T.value?($(),A(je,{key:0},[g.value.logs.length?($(),A("div",Fx,"工作记录")):ge("",!0),($(!0),A(je,null,et(g.value.logs,F=>($(),A("div",{key:"l"+F.id,class:"gs-item",onMousedown:zt(le=>J(F),["prevent"])},[l("span",Bx,W(un(ta)(F.category)),1),l("span",Ux,W(F.content),1),l("span",qx,W(F.date),1)],40,Vx))),128)),g.value.memos.length?($(),A("div",Hx,"备忘录")):ge("",!0),($(!0),A(je,null,et(g.value.memos,F=>($(),A("div",{key:"m"+F.id,class:"gs-item",onMousedown:zt(le=>oe(F),["prevent"])},[l("span",Wx,W(F.title||"无标题"),1),l("span",Gx,W(F.content),1)],40,zx))),128))],64)):($(),A("div",Yx,"无匹配结果"))])):ge("",!0)]),y[12]||(y[12]=l("span",{class:"flex1"},null,-1)),l("div",Jx,[It.value?($(),A("button",{key:0,class:"week-tip",onClick:y[2]||(y[2]=F=>Q("report"))},[...y[11]||(y[11]=[l("span",{class:"dot",style:{background:"var(--warn)"}},null,-1),vt(" 填写本周周记 ",-1)])])):ge("",!0),l("span",Xx,W((C=n.value)==null?void 0:C.username),1),l("button",{class:"btn btn-sm mobile-hide",onClick:o},"退出"),l("button",{class:"btn btn-primary btn-sm",disabled:gt.value,onClick:wt},[Ce(He,{name:gt.value?"check-circle":"clock",size:14},null,8,["name"]),l("span",Zx,W(bt.value),1)],8,Qx)])]),l("main",eC,[l("div",tC,[H.value==="calendar"?($(),St(_g,{key:0})):H.value==="today"?($(),St(qg,{key:1})):H.value==="plan"?($(),St(ew,{key:2})):H.value==="stats"?($(),St(Ow,{key:3})):H.value==="report"?($(),St(h_,{key:4})):H.value==="ledger"?($(),St(g1,{key:5})):H.value==="memo"?($(),St(L1,{key:6})):H.value==="vault"?($(),St(M0,{key:7})):H.value==="admin"?($(),St(wx,{key:8})):($(),St(Rk,{key:9}))])]),l("nav",nC,[($(!0),A(je,null,et(un(Ie),F=>($(),A("button",{key:F.key,class:Ze(["tab-btn",{active:H.value===F.key}]),onClick:le=>Q(F.key)},[Ce(He,{name:F.icon,size:20},null,8,["name"]),l("span",null,W(F.name),1)],10,sC))),128)),l("button",{class:Ze(["tab-btn",{active:I.value}]),onClick:y[3]||(y[3]=F=>Ae.value=!0)},[Ce(He,{name:"more",size:20}),y[13]||(y[13]=l("span",null,"更多",-1))],2)]),Ae.value?($(),A("div",{key:0,class:"sheet-mask",onClick:y[6]||(y[6]=F=>Ae.value=!1)},[l("div",{class:"more-sheet",onClick:y[5]||(y[5]=zt(()=>{},["stop"]))},[l("div",rC,W((R=n.value)==null?void 0:R.username),1),($(!0),A(je,null,et(E.value,F=>($(),A("button",{key:F.key,class:"sheet-row",onClick:le=>ye(F.key)},[Ce(He,{name:F.icon,size:18},null,8,["name"]),l("span",aC,W(F.name),1),Ce(He,{name:"chevron-right",size:14,class:"sheet-go"})],8,oC))),128)),y[15]||(y[15]=l("div",{class:"sheet-divider"},null,-1)),l("button",{class:"sheet-row sheet-danger",onClick:y[4]||(y[4]=F=>{Ae.value=!1,o()})},[Ce(He,{name:"close",size:18}),y[14]||(y[14]=l("span",{class:"sheet-name"},"退出登录",-1))])])])):ge("",!0),Pe.value?($(),A("div",{key:1,class:"msw-mask",onClick:y[10]||(y[10]=zt(F=>Pe.value=!1,["self"]))},[l("div",iC,[l("div",lC,[Ce(He,{name:"search",size:16,class:"msw-icon"}),Me(l("input",{ref_key:"msInput",ref:Ue,class:"msw-input","onUpdate:modelValue":y[7]||(y[7]=F=>v.value=F),placeholder:"搜索工作记录与备忘录",onInput:x,onKeydown:y[8]||(y[8]=Mt(F=>Pe.value=!1,["esc"]))},null,544),[[Ne,v.value]]),l("button",{class:"icon-btn",onClick:y[9]||(y[9]=F=>{j(),Pe.value=!1})},[Ce(He,{name:"close",size:16})])]),l("div",uC,[T.value?($(),A(je,{key:0},[g.value.logs.length?($(),A("div",cC,"工作记录")):ge("",!0),($(!0),A(je,null,et(g.value.logs,F=>($(),A("div",{key:"l"+F.id,class:"msw-item",onMousedown:zt(le=>ke(F),["prevent"])},[l("span",fC,W(un(ta)(F.category)),1),l("span",pC,W(F.content),1),l("span",vC,W(F.date),1)],40,dC))),128)),g.value.memos.length?($(),A("div",mC,"备忘录")):ge("",!0),($(!0),A(je,null,et(g.value.memos,F=>($(),A("div",{key:"m"+F.id,class:"msw-item",onMousedown:zt(le=>Ee(F),["prevent"])},[l("span",yC,W(F.title||"无标题"),1),l("span",gC,W(F.content),1)],40,hC))),128))],64)):v.value.trim()?($(),A("div",bC,"无匹配结果")):ge("",!0)])])])):ge("",!0)]),l("div",wC,[Ce(Tv,{name:"toast"},{default:ms(()=>[($(!0),A(je,null,et(un(t),F=>($(),A("div",{key:F.id,class:"toast"},W(F.text),1))),128))]),_:1})])])):($(),St(Px,{key:0,onLogin:r}))}}}),kC=Vt(_C,[["__scopeId","data-v-c88c3788"]]);function Vo(e,t){try{let n=document.getElementById("fatal-overlay");n||(n=document.createElement("div"),n.id="fatal-overlay",n.style.cssText="position:fixed;inset:0;z-index:99999;background:#FFFFFF;color:#1D2129;padding:20px;overflow:auto;font:13px/1.7 -apple-system,PingFang SC,Microsoft YaHei,sans-serif;",n.addEventListener("click",i=>{i.target===n&&n.parentElement&&n.parentElement.removeChild(n)}),document.body.appendChild(n));const r=document.createElement("div");r.style.cssText="border:1px solid #E5484D;border-radius:8px;padding:12px;margin-bottom:12px;word-break:break-all;white-space:pre-wrap;",r.textContent=e+` +`+t;const o=document.createElement("button");o.textContent="重新加载",o.style.cssText="margin:-4px 0 12px;padding:6px 16px;border:1px solid #E5484D;border-radius:6px;background:#FFFFFF;color:#E5484D;font-size:13px;cursor:pointer;",o.addEventListener("click",()=>{try{location.reload()}catch{}}),n.appendChild(r),n.appendChild(o)}catch{}}async function xC(){const e=await Pm();e&&ia(e.userId);const t=Uv(kC);t.config.errorHandler=(n,r,o)=>{const i=n;Vo("应用内部错误(点击空白处关闭,请将以下内容发送给开发者)",i&&(i.stack||i.message)||String(n)+` +触发位置: `+o)},window.addEventListener("unhandledrejection",n=>{const r=n.reason;Vo("未处理的异步错误(点击空白处关闭)",r&&(r.stack||r.message)||String(n.reason))}),window.addEventListener("error",n=>{n.message&&n.message!=="ResizeObserver loop limit exceeded"&&Vo("运行错误(点击空白处关闭)",n.message)}),t.mount("#app"),"serviceWorker"in navigator&&location.protocol.startsWith("http")&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(()=>{})})}xC().catch(e=>{Vo("无法启动:连接同步服务器失败",e&&(e.stack||e.message)||String(e))});export{jd as W,Od as _,Ig as b,Id as r}; diff --git a/intern-log/dist/assets/index-IuJhwbTi.js b/intern-log/dist/assets/index-IuJhwbTi.js deleted file mode 100644 index 7d6184a..0000000 --- a/intern-log/dist/assets/index-IuJhwbTi.js +++ /dev/null @@ -1,26 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const c of i.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&r(c)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/** -* @vue/shared v3.5.44 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function zi(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const _t={},Os=[],An=()=>{},qu=()=>!1,la=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ua=e=>e.startsWith("onUpdate:"),It=Object.assign,Gi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},af=Object.prototype.hasOwnProperty,vt=(e,t)=>af.call(e,t),Ye=Array.isArray,os=e=>zr(e)==="[object Map]",Ds=e=>zr(e)==="[object Set]",Ql=e=>zr(e)==="[object Date]",st=e=>typeof e=="function",St=e=>typeof e=="string",On=e=>typeof e=="symbol",ht=e=>e!==null&&typeof e=="object",Hu=e=>(ht(e)||st(e))&&st(e.then)&&st(e.catch),Wu=Object.prototype.toString,zr=e=>Wu.call(e),lf=e=>zr(e).slice(8,-1),zu=e=>zr(e)==="[object Object]",Yi=e=>St(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,$r=zi(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ca=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},uf=/-\w/g,yn=ca(e=>e.replace(uf,t=>t.slice(1).toUpperCase())),cf=/\B([A-Z])/g,ps=ca(e=>e.replace(cf,"-$1").toLowerCase()),Gu=ca(e=>e.charAt(0).toUpperCase()+e.slice(1)),ni=ca(e=>e?`on${Gu(e)}`:""),Tn=(e,t)=>!Object.is(e,t),Oo=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},da=e=>{const t=parseFloat(e);return isNaN(t)?e:t},df=e=>{const t=St(e)?Number(e):NaN;return isNaN(t)?e:t};let Zl;const fa=()=>Zl||(Zl=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function as(e){if(Ye(e)){const t={};for(let n=0;nn.startsWith("/*")?"":n).split(ff).forEach(n=>{if(n){const r=n.split(pf);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function tt(e){let t="";if(St(e))t=e;else if(Ye(e))for(let n=0;nls(n,t))}const Xu=e=>!!(e&&e.__v_isRef===!0),z=e=>St(e)?e:e==null?"":Ye(e)||ht(e)&&(e.toString===Wu||!st(e.toString))?Xu(e)?z(e.value):JSON.stringify(e,Qu,2):String(e),Qu=(e,t)=>Xu(t)?Qu(e,t.value):os(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],i)=>(n[si(r,i)+" =>"]=o,n),{})}:Ds(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>si(n))}:On(t)?si(t):ht(t)&&!Ye(t)&&!zu(t)?String(t):t,si=(e,t="")=>{var n;return On(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.44 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Bt;class _f{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Bt&&(Bt.active?(this.parent=Bt,this.index=(Bt.scopes||(Bt.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const r=this.scopes.slice();for(t=0,n=r.length;t0&&--this._on===0){if(Bt===this)Bt=this.prevScope;else{let t=Bt;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(Er){let t=Er;for(Er=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Sr;){let t=Sr;for(Sr=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function nc(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function sc(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),Qi(r),xf(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function wi(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(rc(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function rc(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ir)||(e.globalVersion=Ir,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!wi(e))))return;e.flags|=2;const t=e.dep,n=xt,r=gn;xt=e,gn=!0;try{nc(e);const o=e.fn(e._value);(t.version===0||Tn(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{xt=n,gn=r,sc(e),e.flags&=-3}}function Qi(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Qi(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function xf(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let gn=!0;const oc=[];function Mn(){oc.push(gn),gn=!1}function In(){const e=oc.pop();gn=e===void 0?!0:e}function nu(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=xt;xt=void 0;try{t()}finally{xt=n}}}let Ir=0;class Cf{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Zi{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!xt||!gn||xt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==xt)n=this.activeLink=new Cf(xt,this),xt.deps?(n.prevDep=xt.depsTail,xt.depsTail.nextDep=n,xt.depsTail=n):xt.deps=xt.depsTail=n,ac(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=xt.depsTail,n.nextDep=void 0,xt.depsTail.nextDep=n,xt.depsTail=n,xt.deps===n&&(xt.deps=r)}return n}trigger(t){this.version++,Ir++,this.notify(t)}notify(t){Ji();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Xi()}}}function ac(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)ac(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const _i=new WeakMap,Is=Symbol(""),ki=Symbol(""),jr=Symbol("");function zt(e,t,n){if(gn&&xt){let r=_i.get(e);r||_i.set(e,r=new Map);let o=r.get(n);o||(r.set(n,o=new Zi),o.map=r,o.key=n),o.track()}}function Fn(e,t,n,r,o,i){const c=_i.get(e);if(!c){Ir++;return}const f=v=>{v&&v.trigger()};if(Ji(),t==="clear")c.forEach(f);else{const v=Ye(e),y=v&&Yi(n);if(v&&n==="length"){const h=Number(r);c.forEach((w,C)=>{(C==="length"||C===jr||!On(C)&&C>=h)&&f(w)})}else switch((n!==void 0||c.has(void 0))&&f(c.get(n)),y&&f(c.get(jr)),t){case"add":v?y&&f(c.get("length")):(f(c.get(Is)),os(e)&&f(c.get(ki)));break;case"delete":v||(f(c.get(Is)),os(e)&&f(c.get(ki)));break;case"set":os(e)&&f(c.get(Is));break}}Xi()}function Gs(e){const t=pt(e);return t===e||(zt(t,"iterate",jr),fn(e))?t:jn(e)?is(e)?t.map(n=>us(pn(n))):t.map(us):t.map(pn)}function pa(e){return zt(e=pt(e),"iterate",jr),e}function $n(e,t){return jn(e)?us(is(e)?pn(t):t):pn(t)}const $f={__proto__:null,[Symbol.iterator](){return oi(this,Symbol.iterator,e=>$n(this,e))},concat(...e){return Gs(this).concat(...e.map(t=>Ye(t)?Gs(t):t))},entries(){return oi(this,"entries",e=>(e[1]=$n(this,e[1]),e))},every(e,t){return Kn(this,"every",e,t,void 0,arguments)},filter(e,t){return Kn(this,"filter",e,t,n=>n.map(r=>$n(this,r)),arguments)},find(e,t){return Kn(this,"find",e,t,n=>$n(this,n),arguments)},findIndex(e,t){return Kn(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Kn(this,"findLast",e,t,n=>$n(this,n),arguments)},findLastIndex(e,t){return Kn(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Kn(this,"forEach",e,t,void 0,arguments)},includes(...e){return ai(this,"includes",e)},indexOf(...e){return ai(this,"indexOf",e)},join(e){return Gs(this).join(e)},lastIndexOf(...e){return ai(this,"lastIndexOf",e)},map(e,t){return Kn(this,"map",e,t,void 0,arguments)},pop(){return br(this,"pop")},push(...e){return br(this,"push",e)},reduce(e,...t){return ru(this,"reduce",e,t)},reduceRight(e,...t){return ru(this,"reduceRight",e,t)},shift(){return br(this,"shift")},some(e,t){return Kn(this,"some",e,t,void 0,arguments)},splice(...e){return br(this,"splice",e)},toReversed(){return Gs(this).toReversed()},toSorted(e){return Gs(this).toSorted(e)},toSpliced(...e){return Gs(this).toSpliced(...e)},unshift(...e){return br(this,"unshift",e)},values(){return oi(this,"values",e=>$n(this,e))}};function oi(e,t,n){const r=pa(e),o=r[t],i=o.call(r);if(r!==e&&!fn(e)){if(i[Symbol.toStringTag]==="Array Iterator"){const c=Object.create(Object.getPrototypeOf(i));return c.next=()=>su(i.next(),n),o!==ic[t]&&Object.defineProperties(c,{return:{get(){const f=i.return;return typeof f=="function"?f.bind(i):f}},throw:{get(){const f=i.throw;return typeof f=="function"?f.bind(i):f}}}),c}i._next=i.next,i.next=()=>su(i._next(),n)}return i}function su(e,t){return e.done||(e.value=t(e.value)),e}const ic=Array.prototype;function Kn(e,t,n,r,o,i){const c=pa(e),f=c!==e&&!fn(e),v=c[t];if(v!==ic[t]){const w=v.apply(e,i);return f?pn(w):w}let y=n;c!==e&&(f?y=function(w,C){return n.call(this,$n(e,w),C,e)}:n.length>2&&(y=function(w,C){return n.call(this,w,C,e)}));const h=v.call(c,y,r);return f&&o?o(h):h}function ru(e,t,n,r){const o=pa(e),i=o!==e&&!fn(e);let c=n,f=!1;o!==e&&(i?(f=r.length===0,c=function(y,h,w){return f&&(f=!1,y=$n(e,y)),n.call(this,y,$n(e,h),w,e)}):n.length>3&&(c=function(y,h,w){return n.call(this,y,h,w,e)}));const v=o[t](c,...r);return f?$n(e,v):v}function ai(e,t,n){const r=pt(e);zt(r,"iterate",jr);const o=r[t](...n);return(o===-1||o===!1)&&sl(n[0])?(n[0]=pt(n[0]),r[t](...n)):o}function br(e,t,n=[]){Mn(),Ji();const r=pt(e)[t].apply(e,n);return Xi(),In(),r}const Sf=zi("__proto__,__v_isRef,__isVue"),lc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(On));function Ef(e){On(e)||(e=String(e));const t=pt(this);return zt(t,"has",e),t.hasOwnProperty(e)}class uc{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(o?i?Kf:pc:i?fc:dc).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const c=Ye(t);if(!o){let v;if(c&&(v=$f[n]))return v;if(n==="hasOwnProperty")return Ef}const f=Reflect.get(t,n,Yt(t)?t:r);if((On(n)?lc.has(n):Sf(n))||(o||zt(t,"get",n),i))return f;if(Yt(f)){const v=c&&Yi(n)?f:f.value;return o&&ht(v)?Ci(v):v}return ht(f)?o?Ci(f):tl(f):f}}class cc extends uc{constructor(t=!1){super(!1,t)}set(t,n,r,o){let i=t[n];const c=Ye(t)&&Yi(n);if(!this._isShallow){const y=jn(i);if(!fn(r)&&!jn(r)&&(i=pt(i),r=pt(r)),!c&&Yt(i)&&!Yt(r))return y||(i.value=r),!0}const f=c?Number(n)e,Co=e=>Reflect.getPrototypeOf(e);function Mf(e,t,n){return function(...r){const o=this.__v_raw,i=pt(o),c=os(i),f=e==="entries"||e===Symbol.iterator&&c,v=e==="keys"&&c,y=o[e](...r),h=n?xi:t?us:pn;return!t&&zt(i,"iterate",v?ki:Is),It(Object.create(y),{next(){const{value:w,done:C}=y.next();return C?{value:w,done:C}:{value:f?[h(w[0]),h(w[1])]:h(w),done:C}}})}}function $o(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function If(e,t){const n={get(o){const i=this.__v_raw,c=pt(i),f=pt(o);e||(Tn(o,f)&&zt(c,"get",o),zt(c,"get",f));const{has:v}=Co(c),y=t?xi:e?us:pn;if(v.call(c,o))return y(i.get(o));if(v.call(c,f))return y(i.get(f));i!==c&&i.get(o)},get size(){const o=this.__v_raw;return!e&&zt(pt(o),"iterate",Is),o.size},has(o){const i=this.__v_raw,c=pt(i),f=pt(o);return e||(Tn(o,f)&&zt(c,"has",o),zt(c,"has",f)),o===f?i.has(o):i.has(o)||i.has(f)},forEach(o,i){const c=this,f=c.__v_raw,v=pt(f),y=t?xi:e?us:pn;return!e&&zt(v,"iterate",Is),f.forEach((h,w)=>o.call(i,y(h),y(w),c))}};return It(n,e?{add:$o("add"),set:$o("set"),delete:$o("delete"),clear:$o("clear")}:{add(o){const i=pt(this),c=Co(i),f=pt(o),v=!t&&!fn(o)&&!jn(o)?f:o;return c.has.call(i,v)||Tn(o,v)&&c.has.call(i,o)||Tn(f,v)&&c.has.call(i,f)||(i.add(v),Fn(i,"add",v,v)),this},set(o,i){!t&&!fn(i)&&!jn(i)&&(i=pt(i));const c=pt(this),{has:f,get:v}=Co(c);let y=f.call(c,o);y||(o=pt(o),y=f.call(c,o));const h=v.call(c,o);return c.set(o,i),y?Tn(i,h)&&Fn(c,"set",o,i):Fn(c,"add",o,i),this},delete(o){const i=pt(this),{has:c,get:f}=Co(i);let v=c.call(i,o);v||(o=pt(o),v=c.call(i,o)),f&&f.call(i,o);const y=i.delete(o);return v&&Fn(i,"delete",o,void 0),y},clear(){const o=pt(this),i=o.size!==0,c=o.clear();return i&&Fn(o,"clear",void 0,void 0),c}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=Mf(o,e,t)}),n}function el(e,t){const n=If(e,t);return(r,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_isShallow"?t:o==="__v_raw"?r:Reflect.get(vt(n,o)&&o in r?n:r,o,i)}const jf={get:el(!1,!1)},Df={get:el(!1,!0)},Lf={get:el(!0,!1)};const dc=new WeakMap,fc=new WeakMap,pc=new WeakMap,Kf=new WeakMap;function Rf(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function tl(e){return jn(e)?e:nl(e,!1,Af,jf,dc)}function Nf(e){return nl(e,!1,Of,Df,fc)}function Ci(e){return nl(e,!0,Pf,Lf,pc)}function nl(e,t,n,r,o){if(!ht(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const i=o.get(e);if(i)return i;const c=Rf(lf(e));if(c===0)return e;const f=new Proxy(e,c===2?r:n);return o.set(e,f),f}function is(e){return jn(e)?is(e.__v_raw):!!(e&&e.__v_isReactive)}function jn(e){return!!(e&&e.__v_isReadonly)}function fn(e){return!!(e&&e.__v_isShallow)}function sl(e){return e?!!e.__v_raw:!1}function pt(e){const t=e&&e.__v_raw;return t?pt(t):e}function Ff(e){return!vt(e,"__v_skip")&&Object.isExtensible(e)&&Yu(e,"__v_skip",!0),e}const pn=e=>ht(e)?tl(e):e,us=e=>ht(e)?Ci(e):e;function Yt(e){return e?e.__v_isRef===!0:!1}function P(e){return Vf(e,!1)}function Vf(e,t){return Yt(e)?e:new Bf(e,t)}class Bf{constructor(t,n){this.dep=new Zi,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:pt(t),this._value=n?t:pn(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||fn(t)||jn(t);t=r?t:pt(t),Tn(t,n)&&(this._rawValue=t,this._value=r?t:pn(t),this.dep.trigger())}}function cn(e){return Yt(e)?e.value:e}const Uf={get:(e,t,n)=>t==="__v_raw"?e:cn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Yt(o)&&!Yt(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function vc(e){return is(e)?e:new Proxy(e,Uf)}class qf{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Zi(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ir-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&xt!==this)return tc(this,!0),!0}get value(){const t=this.dep.track();return rc(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Hf(e,t,n=!1){let r,o;return st(e)?r=e:(r=e.get,o=e.set),new qf(r,o,n)}const So={},Vo=new WeakMap;let Ss;function Wf(e,t=!1,n=Ss){if(n){let r=Vo.get(n);r||Vo.set(n,r=[]),r.push(e)}}function zf(e,t,n=_t){const{immediate:r,deep:o,once:i,scheduler:c,augmentJob:f,call:v}=n,y=T=>o?T:fn(T)||o===!1||o===0?Vn(T,1):Vn(T);let h,w,C,O,B=!1,te=!1;if(Yt(e)?(w=()=>e.value,B=fn(e)):is(e)?(w=()=>y(e),B=!0):Ye(e)?(te=!0,B=e.some(T=>is(T)||fn(T)),w=()=>e.map(T=>{if(Yt(T))return T.value;if(is(T))return y(T);if(st(T))return v?v(T,2):T()})):st(e)?t?w=v?()=>v(e,2):e:w=()=>{if(C){Mn();try{C()}finally{In()}}const T=Ss;Ss=h;try{return v?v(e,3,[O]):e(O)}finally{Ss=T}}:w=An,t&&o){const T=w,U=o===!0?1/0:o;w=()=>Vn(T(),U)}const se=kf(),ae=()=>{h.stop(),se&&se.active&&Gi(se.effects,h)};if(i&&t){const T=t;t=(...U)=>{try{return T(...U)}finally{ae()}}}let re=te?new Array(e.length).fill(So):So;const V=T=>{if(!(!(h.flags&1)||!h.dirty&&!T))if(t){const U=h.run();if(T||o||B||(te?U.some((J,Y)=>Tn(J,re[Y])):Tn(U,re))){const J=Ss;Mn();try{C&&C(),Ss=h;const Y=[U,re===So?void 0:te&&re[0]===So?[]:re,O];re=U,v?v(t,3,Y):t(...Y)}finally{Ss=J,In()}}}else h.run()};return f&&f(V),h=new Zu(w),h.scheduler=c?()=>c(V,!1):V,O=T=>Wf(T,!1,h),C=h.onStop=()=>{const T=Vo.get(h);if(T){if(v)v(T,4);else for(const U of T)U();Vo.delete(h)}},t?r?V(!0):re=h.run():c?c(V.bind(null,!0),!0):h.run(),ae.pause=h.pause.bind(h),ae.resume=h.resume.bind(h),ae.stop=ae,ae}function Vn(e,t=1/0,n){if(t<=0||!ht(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Yt(e))Vn(e.value,t,n);else if(Ye(e))for(let r=0;r{Vn(r,t,n)});else if(zu(e)){for(const r in e)Vn(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Vn(e[r],t,n)}return e}/** -* @vue/runtime-core v3.5.44 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Gr(e,t,n,r){try{return r?e(...r):e()}catch(o){va(o,t,n)}}function vn(e,t,n,r){if(st(e)){const o=Gr(e,t,n,r);return o&&Hu(o)&&o.catch(i=>{va(i,t,n)}),o}if(Ye(e)){const o=[];for(let i=0;i>>1,o=Zt[r],i=Dr(o);i=Dr(n)?Zt.push(e):Zt.splice(Yf(t),0,e),e.flags|=1,hc()}}function hc(){Bo||(Bo=mc.then(bc))}function Jf(e){if(!Ye(e))ss&&e.id===-1?ss.splice(Ys+1,0,e):e.flags&1||(Sn.push(e),e.flags|=1);else for(let t=0;t=t))continue;Zt.splice(r,1),r=e?r-1:hn,o.flags&4&&(o.flags&=-2),o(),o.flags&4||(o.flags&=-2)}}}function gc(e,t,n=0){if(Sn.length){let r=Sn,o=0;if(t){r=[];for(let c=0;cDr(c)-Dr(f));if(Sn.length=o,ss){for(let c=0;ce.id==null?e.flags&2?-1:1/0:e.id;function bc(e){try{for(hn=0;hn{r._d&&zo(-1);const i=Uo(t),c=js.length;let f;try{f=e(...o)}finally{for(let v=js.length;v>c;v--)Gc();Uo(i),r._d&&zo(1)}return f};return r._n=!0,r._c=!0,r._d=!0,r}function Oe(e,t){if(dn===null)return e;const n=wa(dn),r=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&st(t)?t.call(r&&r.proxy):t}}const Zf=Symbol.for("v-scx"),ep=()=>Mo(Zf);function wt(e,t,n){return _c(e,t,n)}function _c(e,t,n=_t){const{immediate:r,deep:o,flush:i,once:c}=n,f=It({},n),v=t&&r||!t&&i!=="post";let y;if(Vr){if(i==="sync"){const O=ep();y=O.__watcherHandles||(O.__watcherHandles=[])}else if(!v){const O=()=>{};return O.stop=An,O.resume=An,O.pause=An,O}}const h=tn;f.call=(O,B,te)=>vn(O,h,B,te);let w=!1;i==="post"?f.scheduler=O=>{O.i=h,Qt(O,h&&h.suspense)}:i!=="sync"&&(w=!0,f.scheduler=(O,B)=>{B?O():rl(O)}),f.augmentJob=O=>{t&&(O.flags|=4),w&&(O.flags|=2,h&&(O.id=h.uid,O.i=h))};const C=zf(e,t,f);return Vr&&(y?y.push(C):v&&C()),C}function tp(e,t,n){const r=this.proxy,o=St(e)?e.includes(".")?kc(r,e):()=>r[e]:e.bind(r,r);let i;st(t)?i=t:(i=t.handler,n=t);const c=Yr(this),f=_c(o,i.bind(r),n);return c(),f}function kc(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;oe.__isTeleport,Ts=e=>e&&(e.disabled||e.disabled===""),np=e=>e&&(e.defer||e.defer===""),ou=e=>typeof SVGElement<"u"&&e instanceof SVGElement,au=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,$i=(e,t)=>{const n=e&&e.to;return St(n)?t?t(n):null:n},sp={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,i,c,f,v,y){const{mc:h,pc:w,pbc:C,o:{insert:O,querySelector:B,createText:te,createComment:se,parentNode:ae}}=y,re=Ts(t.props);let{dynamicChildren:V}=t;const T=(Y,ne,$)=>{Y.shapeFlag&16&&h(Y.children,ne,$,o,i,c,f,v)},U=(Y=t)=>{const ne=Ts(Y.props),$=Y.target=$i(Y.props,B),R=Si($,Y,te,O);$&&(c!=="svg"&&ou($)?c="svg":c!=="mathml"&&au($)&&(c="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add($),ne||(T(Y,$,R),kr(Y,!1)))},J=Y=>{const ne=()=>{if(ts.get(Y)===ne){if(ts.delete(Y),Ts(Y.props)){const $=ae(Y.el)||n;T(Y,$,Y.anchor),kr(Y,!0)}U(Y)}};ts.set(Y,ne),Qt(ne,i)};if(e==null){const Y=t.el=te(""),ne=t.anchor=te("");if(O(Y,n,r),O(ne,n,r),np(t.props)||i&&i.pendingBranch){J(t);return}re&&(T(t,n,ne),kr(t,!0)),U()}else{t.el=e.el;const Y=t.anchor=e.anchor,ne=ts.get(e);if(ne){ne.flags|=8,ts.delete(e),J(t);return}t.targetStart=e.targetStart;const $=t.target=e.target,R=t.targetAnchor=e.targetAnchor,F=Ts(e.props),ee=F?n:$,Ie=F?Y:R;if(c==="svg"||ou($)?c="svg":(c==="mathml"||au($))&&(c="mathml"),V?(C(e.dynamicChildren,V,ee,o,i,c,f),ll(e,t,!0)):v||w(e,t,ee,Ie,o,i,c,f,!1),re)F?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Eo(t,n,Y,y,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const Pe=$i(t.props,B);Pe&&(t.target=Pe,Eo(t,Pe,null,y,0))}else F&&Eo(t,$,R,y,1);kr(t,re)}},remove(e,t,n,{um:r,o:{remove:o}},i){const{shapeFlag:c,children:f,anchor:v,targetStart:y,targetAnchor:h,target:w,props:C}=e,O=Ts(C),B=i||!O,te=ts.get(e);if(te&&(te.flags|=8,ts.delete(e)),w&&(o(y),o(h)),i&&o(v),!te&&(O||w)&&c&16)for(let se=0;se{e.isMounted=!0}),Oc(()=>{e.isUnmounting=!0}),e}const ln=[Function,Array],$c={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ln,onEnter:ln,onAfterEnter:ln,onEnterCancelled:ln,onBeforeLeave:ln,onLeave:ln,onAfterLeave:ln,onLeaveCancelled:ln,onBeforeAppear:ln,onAppear:ln,onAfterAppear:ln,onAppearCancelled:ln},op={name:"BaseTransition",props:$c,setup(e,{slots:t}){const n=ul(),r=Cc();return()=>{const o=t.default&&ol(t.default(),!0),i=o&&o.length?Sc(o):n.subTree?we():void 0;if(!i)return;const c=pt(e),{mode:f}=c;if(r.isLeaving)return li(i);const v=qo(i);if(!v)return li(i);let y=Lr(v,c,r,n,w=>y=w);v.type!==Gt&&ds(v,y);let h=n.subTree&&qo(n.subTree);if(h&&h.type!==Gt&&!As(h,v)&&Kr(n.subTree)){let w=Lr(h,c,r,n);if(ds(h,w),f==="out-in"&&v.type!==Gt)return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete w.afterLeave,h=void 0},li(i);f==="in-out"&&v.type!==Gt?w.delayLeave=(C,O,B)=>{const te=Ec(r,h);te[String(h.key)]=h,C[un]=()=>{O(),C[un]=void 0,delete y.delayedLeave,h=void 0},y.delayedLeave=()=>{B(),delete y.delayedLeave,h=void 0}}:h=void 0}else h&&(h=void 0);return i}}};function Sc(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Gt){t=n;break}}return t}const ap=op;function Ec(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Lr(e,t,n,r,o){const{appear:i,mode:c,persisted:f=!1,onBeforeEnter:v,onEnter:y,onAfterEnter:h,onEnterCancelled:w,onBeforeLeave:C,onLeave:O,onAfterLeave:B,onLeaveCancelled:te,onBeforeAppear:se,onAppear:ae,onAfterAppear:re,onAppearCancelled:V}=t,T=String(e.key),U=Ec(n,e),J=($,R)=>{$&&vn($,r,9,R)},Y=($,R)=>{const F=R[1];J($,R),Ye($)?$.every(ee=>ee.length<=1)&&F():$.length<=1&&F()},ne={mode:c,persisted:f,beforeEnter($){let R=v;if(!n.isMounted)if(i)R=se||v;else return;$[un]&&$[un](!0);const F=U[T];if(F&&As(e,F)){let ee=F.el[un];if(!ee){const Ie=Kr(F);ee=Ie&&Ie.el[un]}ee&&ee()}J(R,[$])},enter($){if(U[T]===e)return;let R=y,F=h,ee=w;if(!n.isMounted)if(i)R=ae||y,F=re||h,ee=V||w;else return;let Ie=!1;$[wr]=ke=>{Ie||(Ie=!0,ke?J(ee,[$]):J(F,[$]),ne.delayedLeave&&ne.delayedLeave(),$[wr]=void 0)};const Pe=$[wr].bind(null,!1);R?Y(R,[$,Pe]):Pe()},leave($,R){const F=String(e.key);if($[wr]&&$[wr](!0),n.isUnmounting)return R();J(C,[$]);let ee=!1;$[un]=Pe=>{ee||(ee=!0,R(),Pe?J(te,[$]):J(B,[$]),$[un]=void 0,U[F]===e&&delete U[F])};const Ie=$[un].bind(null,!1);U[F]=e,O?Y(O,[$,Ie]):Ie()},clone($){const R=Lr($,t,n,r,o);return o&&o(R),R}};return ne}function li(e){if(ha(e))return e=fs(e),e.children=null,e}function qo(e){if(!ha(e))return ma(e.type)&&e.children?Sc(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&st(n.default))return n.default()}}function ds(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;ds(ma(n.type)&&qo(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===Ke&&Ye(e.children)){const n=Lc(e.children,!1);n&&ds(n,t)}}function ol(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let i=0;iTr(te,t&&(Ye(t)?t[se]:t),n,r,o));return}if(Ar(r)&&!o){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Tr(e,t,n,r.component.subTree);return}const i=r.shapeFlag&4?wa(r.component):r.el,c=o?null:i,{i:f,r:v}=e,y=t&&t.r,h=f.refs===_t?f.refs={}:f.refs,w=f.setupState,C=pt(w),O=w===_t?qu:te=>iu(h,te)?!1:vt(C,te),B=(te,se)=>!(se&&iu(h,se));if(y!=null&&y!==v){if(lu(t),St(y))h[y]=null,O(y)&&(w[y]=null);else if(Yt(y)){const te=t;B(y,te.k)&&(y.value=null),te.k&&(h[te.k]=null)}}if(st(v))Gr(v,f,12,[c,h]);else{const te=St(v),se=Yt(v);if(te||se){const ae=()=>{if(e.f){const re=te?O(v)?w[v]:h[v]:B()||!e.k?v.value:h[e.k];if(o)Ye(re)&&Gi(re,i);else if(Ye(re))re.includes(i)||re.push(i);else if(te)h[v]=[i],O(v)&&(w[v]=h[v]);else{const V=[i];B(v,e.k)&&(v.value=V),e.k&&(h[e.k]=V)}}else te?(h[v]=c,O(v)&&(w[v]=c)):se&&(B(v,e.k)&&(v.value=c),e.k&&(h[e.k]=c))};if(c){const re=()=>{ae(),Ho.delete(e)};re.id=-1,Ho.set(e,re),Qt(re,n)}else lu(e),ae()}}}function lu(e){const t=Ho.get(e);t&&(t.flags|=8,Ho.delete(e))}fa().requestIdleCallback;fa().cancelIdleCallback;const Ar=e=>!!e.type.__asyncLoader,ha=e=>e.type.__isKeepAlive;function ip(e,t){Ac(e,"a",t)}function lp(e,t){Ac(e,"da",t)}function Ac(e,t,n=tn){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ya(t,r,n),n){let o=n.parent;for(;o&&o.parent;)ha(o.parent.vnode)&&up(r,t,n,o),o=o.parent}}function up(e,t,n,r){const o=ya(t,e,r,!0);Wn(()=>{Gi(r[t],o)},n)}function ya(e,t,n=tn,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...c)=>{Mn();const f=Yr(n),v=vn(t,n,e,c);return f(),In(),v});return r?o.unshift(i):o.push(i),i}}const Hn=e=>(t,n=tn)=>{(!Vr||e==="sp")&&ya(e,(...r)=>t(...r),n)},cp=Hn("bm"),an=Hn("m"),dp=Hn("bu"),Pc=Hn("u"),Oc=Hn("bum"),Wn=Hn("um"),fp=Hn("sp"),pp=Hn("rtg"),vp=Hn("rtc");function mp(e,t=tn){ya("ec",e,t)}const hp=Symbol.for("v-ndc");function at(e,t,n,r){let o;const i=n,c=Ye(e);if(c||St(e)){const f=c&&is(e);let v=!1,y=!1;f&&(v=!fn(e),y=jn(e),e=pa(e)),o=new Array(e.length);for(let h=0,w=e.length;ht(f,v,void 0,i));else{const f=Object.keys(e);o=new Array(f.length);for(let v=0,y=f.length;ve?Qc(e)?wa(e):Ei(e.parent):null,Pr=It(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ei(e.parent),$root:e=>Ei(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ic(e),$forceUpdate:e=>e.f||(e.f=()=>{rl(e.update)}),$nextTick:e=>e.n||(e.n=ir.bind(e.proxy)),$watch:e=>tp.bind(e)}),ui=(e,t)=>e!==_t&&!e.__isScriptSetup&&vt(e,t),yp={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:i,accessCache:c,type:f,appContext:v}=e;if(t[0]!=="$"){const C=c[t];if(C!==void 0)switch(C){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(ui(r,t))return c[t]=1,r[t];if(o!==_t&&vt(o,t))return c[t]=2,o[t];if(vt(i,t))return c[t]=3,i[t];if(n!==_t&&vt(n,t))return c[t]=4,n[t];Ti&&(c[t]=0)}}const y=Pr[t];let h,w;if(y)return t==="$attrs"&&zt(e.attrs,"get",""),y(e);if((h=f.__cssModules)&&(h=h[t]))return h;if(n!==_t&&vt(n,t))return c[t]=4,n[t];if(w=v.config.globalProperties,vt(w,t))return w[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return ui(o,t)?(o[t]=n,!0):r!==_t&&vt(r,t)?(r[t]=n,!0):vt(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,props:i,type:c}},f){let v;return!!(n[f]||e!==_t&&f[0]!=="$"&&vt(e,f)||ui(t,f)||vt(i,f)||vt(r,f)||vt(Pr,f)||vt(o.config.globalProperties,f)||(v=c.__cssModules)&&v[f])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:vt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function uu(e){return Ye(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Ti=!0;function gp(e){const t=Ic(e),n=e.proxy,r=e.ctx;Ti=!1,t.beforeCreate&&cu(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:c,watch:f,provide:v,inject:y,created:h,beforeMount:w,mounted:C,beforeUpdate:O,updated:B,activated:te,deactivated:se,beforeDestroy:ae,beforeUnmount:re,destroyed:V,unmounted:T,render:U,renderTracked:J,renderTriggered:Y,errorCaptured:ne,serverPrefetch:$,expose:R,inheritAttrs:F,components:ee,directives:Ie,filters:Pe}=t;if(y&&bp(y,r,null),c)for(const xe in c){const me=c[xe];st(me)&&(r[xe]=me.bind(n))}if(o){const xe=o.call(n,n);ht(xe)&&(e.data=tl(xe))}if(Ti=!0,i)for(const xe in i){const me=i[xe],_e=st(me)?me.bind(n,n):st(me.get)?me.get.bind(n,n):An,We=!st(me)&&st(me.set)?me.set.bind(n):An,Xe=it({get:_e,set:We});Object.defineProperty(r,xe,{enumerable:!0,configurable:!0,get:()=>Xe.value,set:Ae=>Xe.value=Ae})}if(f)for(const xe in f)Mc(f[xe],r,n,xe);if(v){const xe=st(v)?v.call(n):v;Reflect.ownKeys(xe).forEach(me=>{Qf(me,xe[me])})}h&&cu(h,e,"c");function Re(xe,me){Ye(me)?me.forEach(_e=>xe(_e.bind(n))):me&&xe(me.bind(n))}if(Re(cp,w),Re(an,C),Re(dp,O),Re(Pc,B),Re(ip,te),Re(lp,se),Re(mp,ne),Re(vp,J),Re(pp,Y),Re(Oc,re),Re(Wn,T),Re(fp,$),Ye(R))if(R.length){const xe=e.exposed||(e.exposed={});R.forEach(me=>{Object.defineProperty(xe,me,{get:()=>n[me],set:_e=>n[me]=_e,enumerable:!0})})}else e.exposed||(e.exposed={});U&&e.render===An&&(e.render=U),F!=null&&(e.inheritAttrs=F),ee&&(e.components=ee),Ie&&(e.directives=Ie),$&&Tc(e)}function bp(e,t,n=An){Ye(e)&&(e=Ai(e));for(const r in e){const o=e[r];let i;ht(o)?"default"in o?i=Mo(o.from||r,o.default,!0):i=Mo(o.from||r):i=Mo(o),Yt(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:c=>i.value=c}):t[r]=i}}function cu(e,t,n){vn(Ye(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Mc(e,t,n,r){let o=r.includes(".")?kc(n,r):()=>n[r];if(St(e)){const i=t[e];st(i)&&wt(o,i)}else if(st(e))wt(o,e.bind(n));else if(ht(e))if(Ye(e))e.forEach(i=>Mc(i,t,n,r));else{const i=st(e.handler)?e.handler.bind(n):t[e.handler];st(i)&&wt(o,i,e)}}function Ic(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:c}}=e.appContext,f=i.get(t);let v;return f?v=f:!o.length&&!n&&!r?v=t:(v={},o.length&&o.forEach(y=>Wo(v,y,c,!0)),Wo(v,t,c)),ht(t)&&i.set(t,v),v}function Wo(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&Wo(e,i,n,!0),o&&o.forEach(c=>Wo(e,c,n,!0));for(const c in t)if(!(r&&c==="expose")){const f=wp[c]||n&&n[c];e[c]=f?f(e[c],t[c]):t[c]}return e}const wp={data:du,props:fu,emits:fu,methods:xr,computed:xr,beforeCreate:Xt,created:Xt,beforeMount:Xt,mounted:Xt,beforeUpdate:Xt,updated:Xt,beforeDestroy:Xt,beforeUnmount:Xt,destroyed:Xt,unmounted:Xt,activated:Xt,deactivated:Xt,errorCaptured:Xt,serverPrefetch:Xt,components:xr,directives:xr,watch:kp,provide:du,inject:_p};function du(e,t){return t?e?function(){return It(st(e)?e.call(this,this):e,st(t)?t.call(this,this):t)}:t:e}function _p(e,t){return xr(Ai(e),Ai(t))}function Ai(e){if(Ye(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${yn(t)}Modifiers`]||e[`${ps(t)}Modifiers`];function Sp(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||_t;let o=n;const i=t.startsWith("update:"),c=i&&$p(r,t.slice(7));c&&(c.trim&&(o=n.map(h=>St(h)?h.trim():h)),c.number&&(o=o.map(da)));let f,v=r[f=ni(t)]||r[f=ni(yn(t))];!v&&i&&(v=r[f=ni(ps(t))]),v&&vn(v,e,6,o);const y=r[f+"Once"];if(y){if(!e.emitted)e.emitted={};else if(e.emitted[f])return;e.emitted[f]=!0,vn(y,e,6,o)}}const Ep=new WeakMap;function Dc(e,t,n=!1){const r=n?Ep:t.emitsCache,o=r.get(e);if(o!==void 0)return o;const i=e.emits;let c={},f=!1;if(!st(e)){const v=y=>{const h=Dc(y,t,!0);h&&(f=!0,It(c,h))};!n&&t.mixins.length&&t.mixins.forEach(v),e.extends&&v(e.extends),e.mixins&&e.mixins.forEach(v)}return!i&&!f?(ht(e)&&r.set(e,null),null):(Ye(i)?i.forEach(v=>c[v]=null):It(c,i),ht(e)&&r.set(e,c),c)}function ga(e,t){return!e||!la(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),vt(e,t[0].toLowerCase()+t.slice(1))||vt(e,ps(t))||vt(e,t))}function pu(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[i],slots:c,attrs:f,emit:v,render:y,renderCache:h,props:w,data:C,setupState:O,ctx:B,inheritAttrs:te}=e,se=Uo(e);let ae,re;try{if(n.shapeFlag&4){const T=o||r,U=T;ae=En(y.call(U,T,h,w,O,C,B)),re=f}else{const T=t;ae=En(T.length>1?T(w,{attrs:f,slots:c,emit:v}):T(w,null)),re=t.props?f:Tp(f)}}catch(T){js.length=0,va(T,e,1),ae=Me(Gt)}let V=ae;if(re&&te!==!1){const T=Object.keys(re),{shapeFlag:U}=V;T.length&&U&7&&(i&&T.some(ua)&&(re=Ap(re,i)),V=fs(V,re,!1,!0))}if(n.dirs&&(V=fs(V,null,!1,!0),V.dirs=V.dirs?V.dirs.concat(n.dirs):n.dirs),n.transition){const T=ma(V.type)&&qo(V)||V;ds(T,n.transition)}return ae=V,Uo(se),ae}function Lc(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||la(n))&&((t||(t={}))[n]=e[n]);return t},Ap=(e,t)=>{const n={};for(const r in e)(!ua(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Pp(e,t,n){const{props:r,children:o,component:i}=e,{props:c,children:f,patchFlag:v}=t,y=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&v>=0){if(v&1024)return!0;if(v&16)return r?vu(r,c,y):!!c;if(v&8){const h=t.dynamicProps;for(let w=0;wObject.create(Rc),Fc=e=>Object.getPrototypeOf(e)===Rc;function Mp(e,t,n,r=!1){const o={},i=Nc();e.propsDefaults=Object.create(null),Vc(e,t,o,i);for(const c in e.propsOptions[0])c in o||(o[c]=void 0);n?e.props=r?o:Nf(o):e.type.props?e.props=o:e.props=i,e.attrs=i}function Ip(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:c}}=e,f=pt(o),[v]=e.propsOptions;let y=!1;if((r||c>0)&&!(c&16)){if(c&8){const h=e.vnode.dynamicProps;for(let w=0;w{v=!0;const[C,O]=Bc(w,t,!0);It(c,C),O&&f.push(...O)};!n&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!i&&!v)return ht(e)&&r.set(e,Os),Os;if(Ye(i))for(let h=0;he==="_"||e==="_ctx"||e==="$stable",il=e=>Ye(e)?e.map(En):[En(e)],Dp=(e,t,n)=>{if(t._n)return t;const r=vs((...o)=>il(t(...o)),n);return r._c=!1,r},Uc=(e,t,n)=>{const r=e._ctx;for(const o in e){if(al(o))continue;const i=e[o];if(st(i))t[o]=Dp(o,i,r);else if(i!=null){const c=il(i);t[o]=()=>c}}},qc=(e,t)=>{const n=il(t);e.slots.default=()=>n},Hc=(e,t,n)=>{for(const r in t)(n||!al(r))&&(e[r]=t[r])},Lp=(e,t,n)=>{const r=e.slots=Nc();if(e.vnode.shapeFlag&32){const o=t._;o?(Hc(r,t,n),n&&Yu(r,"_",o,!0)):Uc(t,r)}else t&&qc(e,t)},Kp=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,c=_t;if(r.shapeFlag&32){const f=t._;f?n&&f===1?i=!1:Hc(o,t,n):(i=!t.$stable,Uc(t,o)),c=t}else t&&(qc(e,t),c={default:1});if(i)for(const f in o)!al(f)&&c[f]==null&&delete o[f]},Qt=Bp;function Rp(e){return Np(e)}function Np(e,t){const n=fa();n.__VUE__=!0;const{insert:r,remove:o,patchProp:i,createElement:c,createText:f,createComment:v,setText:y,setElementText:h,parentNode:w,nextSibling:C,setScopeId:O=An,insertStaticContent:B}=e,te=(b,_,X,de=null,H=null,ie=null,Se=void 0,Ee=null,ge=!!_.dynamicChildren)=>{if(b===_)return;b&&!As(b,_)&&(de=fe(b),Ae(b,H,ie,!0),b=null),_.patchFlag===-2&&(ge=!1,_.dynamicChildren=null),_.dynamicChildren&&b&&b.dynamicChildren&&b.dynamicChildren.hasOnce&&(_.dynamicChildren===Os&&(_.dynamicChildren=[]),_.dynamicChildren.hasOnce=!0);const{type:ce,ref:le,shapeFlag:S}=_;switch(ce){case ba:se(b,_,X,de);break;case Gt:ae(b,_,X,de);break;case Io:b==null&&re(_,X,de,Se);break;case Ke:ee(b,_,X,de,H,ie,Se,Ee,ge);break;default:S&1?U(b,_,X,de,H,ie,Se,Ee,ge):S&6?Ie(b,_,X,de,H,ie,Se,Ee,ge):(S&64||S&128)&&ce.process(b,_,X,de,H,ie,Se,Ee,ge,rt)}le!=null&&H?Tr(le,b&&b.ref,ie,_||b,!_):le==null&&b&&b.ref!=null&&Tr(b.ref,null,ie,b,!0)},se=(b,_,X,de)=>{if(b==null)r(_.el=f(_.children),X,de);else{const H=_.el=b.el;_.children!==b.children&&y(H,_.children)}},ae=(b,_,X,de)=>{b==null?r(_.el=v(_.children||""),X,de):_.el=b.el},re=(b,_,X,de)=>{[b.el,b.anchor]=B(b.children,_,X,de,b.el,b.anchor)},V=({el:b,anchor:_},X,de)=>{let H;for(;b&&b!==_;)H=C(b),r(b,X,de),b=H;r(_,X,de)},T=({el:b,anchor:_})=>{let X;for(;b&&b!==_;)X=C(b),o(b),b=X;o(_)},U=(b,_,X,de,H,ie,Se,Ee,ge)=>{if(_.type==="svg"?Se="svg":_.type==="math"&&(Se="mathml"),b==null)J(_,X,de,H,ie,Se,Ee,ge);else{const ce=b.el&&b.el._isVueCE?b.el:null;try{ce&&ce._beginPatch(),$(b,_,H,ie,Se,Ee,ge)}finally{ce&&ce._endPatch()}}},J=(b,_,X,de,H,ie,Se,Ee)=>{let ge,ce;const{props:le,shapeFlag:S,transition:x,dirs:Z}=b;if(ge=b.el=c(b.type,ie,le&&le.is,le),S&8?h(ge,b.children):S&16&&ne(b.children,ge,null,de,H,ci(b,ie),Se,Ee),Z&&xs(b,null,de,"created"),Y(ge,b,b.scopeId,Se,de),le){for(const Ue in le)Ue!=="value"&&!$r(Ue)&&i(ge,Ue,null,le[Ue],ie,de);"value"in le&&i(ge,"value",null,le.value,ie),(ce=le.onVnodeBeforeMount)&&kn(ce,de,b)}Z&&xs(b,null,de,"beforeMount");const Te=Fp(H,x);Te&&x.beforeEnter(ge),r(ge,_,X),((ce=le&&le.onVnodeMounted)||Te||Z)&&Qt(()=>{try{ce&&kn(ce,de,b),Te&&x.enter(ge),Z&&xs(b,null,de,"mounted")}finally{}},H)},Y=(b,_,X,de,H)=>{if(X&&O(b,X),de)for(let ie=0;ie{for(let ce=ge;ce{const Ee=_.el=b.el;let{patchFlag:ge,dynamicChildren:ce,dirs:le}=_;ge|=b.patchFlag&16;const S=b.props||_t,x=_.props||_t;let Z;if(X&&Cs(X,!1),(Z=x.onVnodeBeforeUpdate)&&kn(Z,X,_,b),le&&xs(_,b,X,"beforeUpdate"),X&&Cs(X,!0),ce&&(!b.dynamicChildren||b.dynamicChildren.length!==ce.length)&&(ge=0,Se=!1,ce=null),(S.innerHTML&&x.innerHTML==null||S.textContent&&x.textContent==null)&&h(Ee,""),ce?R(b.dynamicChildren,ce,Ee,X,de,ci(_,H),ie):Se||me(b,_,Ee,null,X,de,ci(_,H),ie,!1),ge>0){if(ge&16)F(Ee,S,x,X,H);else if(ge&2&&S.class!==x.class&&i(Ee,"class",null,x.class,H),ge&4&&i(Ee,"style",S.style,x.style,H),ge&8){const Te=_.dynamicProps;for(let Ue=0;Ue{Z&&kn(Z,X,_,b),le&&xs(_,b,X,"updated")},de)},R=(b,_,X,de,H,ie,Se)=>{for(let Ee=0;Ee<_.length;Ee++){const ge=b[Ee],ce=_[Ee],le=ge.el||Oi(ge),S=le&&(ge.type===Ke||!As(ge,ce)||ge.shapeFlag&198)?w(le):X;te(ge,ce,S,null,de,H,ie,Se,!0)}},F=(b,_,X,de,H)=>{if(_!==X){if(_!==_t)for(const ie in _)!$r(ie)&&!(ie in X)&&i(b,ie,_[ie],null,H,de);for(const ie in X){if($r(ie))continue;const Se=X[ie],Ee=_[ie];Se!==Ee&&ie!=="value"&&i(b,ie,Ee,Se,H,de)}"value"in X&&i(b,"value",_.value,X.value,H)}},ee=(b,_,X,de,H,ie,Se,Ee,ge)=>{const ce=_.el=b?b.el:f(""),le=_.anchor=b?b.anchor:f("");let{patchFlag:S,dynamicChildren:x,slotScopeIds:Z}=_;Z&&(Ee=Ee?Ee.concat(Z):Z),b==null?(r(ce,X,de),r(le,X,de),ne(_.children||[],X,le,H,ie,Se,Ee,ge)):S>0&&S&64&&x&&b.dynamicChildren&&b.dynamicChildren.length===x.length?(R(b.dynamicChildren,x,X,H,ie,Se,Ee),(_.key!=null||H&&_===H.subTree)&&ll(b,_,!0)):me(b,_,X,le,H,ie,Se,Ee,ge)},Ie=(b,_,X,de,H,ie,Se,Ee,ge)=>{_.slotScopeIds=Ee,b==null?_.shapeFlag&512?H.ctx.activate(_,X,de,Se,ge):Pe(_,X,de,H,ie,Se,ge):ke(b,_,ge)},Pe=(b,_,X,de,H,ie,Se)=>{const Ee=b.component=Yp(b,de,H);if(ha(b)&&(Ee.ctx.renderer=rt),Jp(Ee,!1,Se),Ee.asyncDep){if(H&&H.registerDep(Ee,Re,Se,ie),!b.el){const ge=Ee.subTree=Me(Gt);ae(null,ge,_,X),b.placeholder=ge.el}}else Re(Ee,b,_,X,H,ie,Se)},ke=(b,_,X)=>{const de=_.component=b.component;if(Pp(b,_,X))if(de.asyncDep&&!de.asyncResolved){_.el=b.el,_.placeholder=b.placeholder,xe(de,_,X);return}else de.next=_,de.update();else _.el=b.el,_.placeholder=b.placeholder,de.vnode=_},Re=(b,_,X,de,H,ie,Se)=>{const Ee=()=>{if(b.isMounted){let{next:S,bu:x,u:Z,parent:Te,vnode:Ue}=b;{const Kt=Wc(b);if(Kt){S&&(S.el=Ue.el,xe(b,S,Se)),Kt.asyncDep.then(()=>{Qt(()=>{b.isUnmounted||ce()},H)});return}}let Je=S,ct;Cs(b,!1),S?(S.el=Ue.el,xe(b,S,Se)):S=Ue,x&&Oo(x),(ct=S.props&&S.props.onVnodeBeforeUpdate)&&kn(ct,Te,S,Ue),Cs(b,!0);const Ge=pu(b),Lt=b.subTree;b.subTree=Ge,te(Lt,Ge,w(Lt.el),fe(Lt),b,H,ie),S.el=Ge.el,Je===null&&Op(b,Ge.el),Z&&Qt(Z,H),(ct=S.props&&S.props.onVnodeUpdated)&&Qt(()=>kn(ct,Te,S,Ue),H)}else{let S;const{el:x,props:Z}=_,{bm:Te,m:Ue,parent:Je,root:ct,type:Ge}=b,Lt=Ar(_);Cs(b,!1),Te&&Oo(Te),!Lt&&(S=Z&&Z.onVnodeBeforeMount)&&kn(S,Je,_),Cs(b,!0);{ct.ce&&ct.ce._hasShadowRoot()&&ct.ce._injectChildStyle(Ge,b.parent?b.parent.type:void 0);const Kt=b.subTree=pu(b);te(null,Kt,X,de,b,H,ie),_.el=Kt.el}if(Ue&&Qt(Ue,H),!Lt&&(S=Z&&Z.onVnodeMounted)){const Kt=_;Qt(()=>kn(S,Je,Kt),H)}(_.shapeFlag&256||Je&&Ar(Je.vnode)&&Je.vnode.shapeFlag&256)&&b.a&&Qt(b.a,H),b.isMounted=!0,_=X=de=null}};b.scope.on();const ge=b.effect=new Zu(Ee);b.scope.off();const ce=b.update=ge.run.bind(ge),le=b.job=ge.runIfDirty.bind(ge);le.i=b,le.id=b.uid,ge.scheduler=()=>rl(le),Cs(b,!0),ce()},xe=(b,_,X)=>{_.component=b;const de=b.vnode.props;b.vnode=_,b.next=null,Ip(b,_.props,de,X),Kp(b,_.children,X),Mn(),yc(b),In()},me=(b,_,X,de,H,ie,Se,Ee,ge=!1)=>{const ce=b&&b.children,le=b?b.shapeFlag:0,S=_.children,{patchFlag:x,shapeFlag:Z}=_;if(x>0){if(x&128){We(ce,S,X,de,H,ie,Se,Ee,ge);return}else if(x&256){_e(ce,S,X,de,H,ie,Se,Ee,ge);return}}Z&8?(le&16&&je(ce,H,ie),S!==ce&&h(X,S)):le&16?Z&16?We(ce,S,X,de,H,ie,Se,Ee,ge):je(ce,H,ie,!0):(le&8&&h(X,""),Z&16&&ne(S,X,de,H,ie,Se,Ee,ge))},_e=(b,_,X,de,H,ie,Se,Ee,ge)=>{b=b||Os,_=_||Os;const ce=b.length,le=_.length,S=Math.min(ce,le);let x;for(x=0;xle?je(b,H,ie,!0,!1,S):ne(_,X,de,H,ie,Se,Ee,ge,S)},We=(b,_,X,de,H,ie,Se,Ee,ge)=>{let ce=0;const le=_.length;let S=b.length-1,x=le-1;for(;ce<=S&&ce<=x;){const Z=b[ce],Te=_[ce]=ge?Nn(_[ce]):En(_[ce]);if(As(Z,Te))te(Z,Te,X,null,H,ie,Se,Ee,ge);else break;ce++}for(;ce<=S&&ce<=x;){const Z=b[S],Te=_[x]=ge?Nn(_[x]):En(_[x]);if(As(Z,Te))te(Z,Te,X,null,H,ie,Se,Ee,ge);else break;S--,x--}if(ce>S){if(ce<=x){const Z=x+1,Te=Zx)for(;ce<=S;)Ae(b[ce],H,ie,!0),ce++;else{const Z=ce,Te=ce,Ue=new Map;for(ce=Te;ce<=x;ce++){const Vt=_[ce]=ge?Nn(_[ce]):En(_[ce]);Vt.key!=null&&Ue.set(Vt.key,ce)}let Je,ct=0;const Ge=x-Te+1;let Lt=!1,Kt=0;const gt=new Array(Ge);for(ce=0;ce=Ge){Ae(Vt,H,ie,!0);continue}let jt;if(Vt.key!=null)jt=Ue.get(Vt.key);else for(Je=Te;Je<=x;Je++)if(gt[Je-Te]===0&&As(Vt,_[Je])){jt=Je;break}jt===void 0?Ae(Vt,H,ie,!0):(gt[jt-Te]=ce+1,jt>=Kt?Kt=jt:Lt=!0,te(Vt,_[jt],X,null,H,ie,Se,Ee,ge),ct++)}const ms=Lt?Vp(gt):Os;for(Je=ms.length-1,ce=Ge-1;ce>=0;ce--){const Vt=Te+ce,jt=_[Vt],ze=_[Vt+1],zn=Vt+1{const{el:ie,type:Se,transition:Ee,children:ge,shapeFlag:ce}=b;if(ce&6){Xe(b.component.subTree,_,X,de);return}if(ce&128){b.suspense.move(_,X,de);return}if(ce&64){Se.move(b,_,X,rt);return}if(Se===Ke){r(ie,_,X);for(let S=0;SEe.enter(ie),H));else{const{leave:S,delayLeave:x,afterLeave:Z}=Ee,Te=()=>{b.ctx.isUnmounted?o(ie):r(ie,_,X)},Ue=()=>{const Je=ie._isLeaving||!!ie[un];ie._isLeaving&&ie[un](!0),Ee.persisted&&!Je?Te():S(ie,()=>{Te(),Z&&Z()})};x?x(ie,Te,Ue):Ue()}else r(ie,_,X)},Ae=(b,_,X,de=!1,H=!1)=>{const{type:ie,props:Se,ref:Ee,children:ge,dynamicChildren:ce,shapeFlag:le,patchFlag:S,dirs:x,cacheIndex:Z,memo:Te}=b;if((S===-2||ce&&ce.hasOnce)&&(H=!1),Ee!=null&&(Mn(),Tr(Ee,null,X,b,!0),In()),Z!=null&&(!b.ctx||b.ctx===_)&&(_.renderCache[Z]=void 0),le&256){_.ctx.deactivate(b);return}const Ue=le&1&&x,Je=!Ar(b);let ct;if(Je&&(ct=Se&&Se.onVnodeBeforeUnmount)&&kn(ct,_,b),le&6)dt(b.component,X,de);else{if(le&128){b.suspense.unmount(X,de);return}Ue&&xs(b,null,_,"beforeUnmount"),le&64?b.type.remove(b,_,X,rt,de):ce&&!ce.hasOnce&&(ie!==Ke||S>0&&S&64)?je(ce,_,X,!1,!0):(ie===Ke&&S&384||!H&&le&16)&&je(ge,_,X),de&&pe(b)}const Ge=Te!=null&&Z==null;(Je&&(ct=Se&&Se.onVnodeUnmounted)||Ue||Ge)&&Qt(()=>{ct&&kn(ct,_,b),Ue&&xs(b,null,_,"unmounted"),Ge&&(b.el=null)},X)},pe=b=>{const{type:_,el:X,anchor:de,transition:H}=b,ie=_===Ke;if(ie&&!H){Ne(X,de);return}if(_===Io){T(b),H&&!H.persisted&&H.afterLeave&&H.afterLeave();return}const Se=ie?Kr(b):b,Ee=()=>{ie?w(X)&&Ne(X,de):o(X),H&&!H.persisted&&H.afterLeave&&H.afterLeave()};if(Se&&Se.shapeFlag&1&&H&&!H.persisted){const{leave:ge,delayLeave:ce}=H,le=Se.el,S=()=>ge(le,Ee);ce?ce(le,Ee,S):S()}else Ee()},Ne=(b,_)=>{let X;for(;b!==_;)X=C(b),o(b),b=X;o(_)},dt=(b,_,X)=>{const{bum:de,scope:H,job:ie,subTree:Se,um:Ee,m:ge,a:ce}=b;hu(ge),hu(ce),de&&Oo(de),H.stop(),ie?(ie.flags|=8,Ae(Se,b,_,X)):b.vnode.el&&Se&&(Se.transition=b.vnode.transition,Ae(Se,b,_,X)),Ee&&Qt(Ee,_),Qt(()=>{b.isUnmounted=!0},_)},je=(b,_,X,de=!1,H=!1,ie=0)=>{for(let Se=ie;Se{if(b.shapeFlag&6)return fe(b.component.subTree);if(b.shapeFlag&128)return b.suspense.next();const _=C(b.anchor||b.el),X=_&&_[xc];return X?C(X):_},De=(b,_,X)=>{const de=b&&_._vnode?void 0:b&&b.component?b.component.uid:Gp();Xf(()=>{b==null?_._vnode&&Ae(_._vnode,null,null,!0):te(_._vnode||null,b,_,null,null,null,X),_._vnode=b},de)},rt={p:te,um:Ae,m:Xe,r:pe,mt:Pe,mc:ne,pc:me,pbc:R,n:fe,o:e};return{render:De,hydrate:void 0,createApp:Cp(De)}}function ci({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Cs({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Fp(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ll(e,t,n=!1){const r=e.children,o=t.children;if(Ye(r)&&Ye(o))for(let i=0;i>1,e[n[f]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,c=n[i-1];i-- >0;)n[i]=c,c=t[c];return n}function Wc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Wc(t)}function hu(e){if(e)for(let t=0;te.__isSuspense;function Bp(e,t){t&&t.pendingBranch?Ye(e)?t.effects.push(...e):t.effects.push(e):Jf(e)}const Ke=Symbol.for("v-fgt"),ba=Symbol.for("v-txt"),Gt=Symbol.for("v-cmt"),Io=Symbol.for("v-stc"),js=[];let rn=null;function E(e=!1){js.push(rn=e?null:[])}function Gc(){js.pop(),rn=js[js.length-1]||null}let Rr=1;function zo(e,t=!1){Rr+=e,e<0&&rn&&t&&(rn.hasOnce=!0)}function Yc(e){return e.dynamicChildren=Rr>0?rn||Os:null,Gc(),Rr>0&&rn&&rn.push(e),e}function A(e,t,n,r,o,i){return Yc(l(e,t,n,r,o,i,!0))}function At(e,t,n,r,o){return Yc(Me(e,t,n,r,o,!0))}function Nr(e){return e?e.__v_isVNode===!0:!1}function As(e,t){return e.type===t.type&&e.key===t.key}const Jc=({key:e})=>e??null,jo=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?St(e)||Yt(e)||st(e)?{i:dn,r:e,k:t,f:!!n}:e:null);function l(e,t=null,n=null,r=0,o=null,i=e===Ke?0:1,c=!1,f=!1){const v={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Jc(t),ref:t&&jo(t),scopeId:wc,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:dn};return f?(Go(v,n),i&128&&e.normalize(v)):n&&(v.shapeFlag|=St(n)?8:16),Rr>0&&!c&&rn&&(v.patchFlag>0||i&6)&&v.patchFlag!==32&&rn.push(v),v}const Me=Up;function Up(e,t=null,n=null,r=0,o=null,i=!1){if((!e||e===hp)&&(e=Gt),Nr(e)){const f=fs(e,t,!0);return n&&Go(f,n),Rr>0&&!i&&rn&&(f.shapeFlag&6?rn[rn.indexOf(e)]=f:rn.push(f)),f.patchFlag=-2,f}if(ev(e)&&(e=e.__vccOpts),t){t=qp(t);let{class:f,style:v}=t;f&&!St(f)&&(t.class=tt(f)),ht(v)&&(sl(v)&&!Ye(v)&&(v=It({},v)),t.style=as(v))}const c=St(e)?1:zc(e)?128:ma(e)?64:ht(e)?4:st(e)?2:0;return l(e,t,n,r,o,c,i,!0)}function qp(e){return e?sl(e)||Fc(e)?It({},e):e:null}function fs(e,t,n=!1,r=!1){const{props:o,ref:i,patchFlag:c,children:f,transition:v}=e,y=t?Wp(o||{},t):o,h={__v_isVNode:!0,__v_skip:!0,type:e.type,props:y,key:y&&Jc(y),ref:t&&t.ref?n&&i?Ye(i)?i.concat(jo(t)):[i,jo(t)]:jo(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:f,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ke?c===-1?16:c|16:c,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:v,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&fs(e.ssContent),ssFallback:e.ssFallback&&fs(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return v&&r&&ds(h,v.clone(h)),h}function Pt(e=" ",t=0){return Me(ba,null,e,t)}function Hp(e,t){const n=Me(Io,null,e);return n.staticCount=t,n}function we(e="",t=!1){return t?(E(),At(Gt,null,e)):Me(Gt,null,e)}function En(e){return e==null||typeof e=="boolean"?Me(Gt):Ye(e)?Me(Ke,null,e.slice()):Nr(e)?Nn(e):Me(ba,null,String(e))}function Nn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:fs(e)}function Go(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Ye(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Go(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!Fc(t)?t._ctx=dn:o===3&&dn&&(dn.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(st(t)){if(r&65){Go(e,{default:t});return}t={default:t,_ctx:dn},n=32}else t=String(t),r&64?(n=16,t=[Pt(t)]):n=8;e.children=t,e.shapeFlag|=n}function Wp(...e){const t={};for(let n=0;ntn||dn;let Yo,Fr;{const e=fa(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),i=>{o.length>1?o.forEach(c=>c(i)):o[0](i)}};Yo=t("__VUE_INSTANCE_SETTERS__",n=>tn=n),Fr=t("__VUE_SSR_SETTERS__",n=>Vr=n)}const Yr=e=>{const t=tn;return Yo(e),e.scope.on(),()=>{e.scope.off(),Yo(t)}},yu=()=>{tn&&tn.scope.off(),Yo(null)};function Qc(e){return e.vnode.shapeFlag&4}let Vr=!1;function Jp(e,t=!1,n=!1){t&&Fr(t);const{props:r,children:o}=e.vnode,i=Qc(e);Mp(e,r,i,t),Lp(e,o,n||t);const c=i?Xp(e,t):void 0;return t&&Fr(!1),c}function Xp(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,yp);const{setup:r}=n;if(r){Mn();const o=e.setupContext=r.length>1?Zp(e):null,i=Yr(e),c=Gr(r,e,0,[e.props,o]),f=Hu(c);if(In(),i(),(f||e.sp)&&!Ar(e)&&Tc(e),f){if(c.then(yu,yu),t)return c.then(v=>{Fr(!0);try{gu(e,v,t)}finally{Fr(!1)}}).catch(v=>{va(v,e,0)});e.asyncDep=c}else gu(e,c)}else Zc(e)}function gu(e,t,n){st(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ht(t)&&(e.setupState=vc(t)),Zc(e)}function Zc(e,t,n){const r=e.type;e.render||(e.render=r.render||An);{const o=Yr(e);Mn();try{gp(e)}finally{In(),o()}}}const Qp={get(e,t){return zt(e,"get",""),e[t]}};function Zp(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Qp),slots:e.slots,emit:e.emit,expose:t}}function wa(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(vc(Ff(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Pr)return Pr[n](e)},has(t,n){return n in t||n in Pr}})):e.proxy}function ev(e){return st(e)&&"__vccOpts"in e}const it=(e,t)=>Hf(e,t,Vr);function tv(e,t,n){try{zo(-1);const r=arguments.length;return r===2?ht(t)&&!Ye(t)?Nr(t)?Me(e,null,[t]):Me(e,t):Me(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Nr(n)&&(n=[n]),Me(e,t,n))}finally{zo(1)}}const nv="3.5.44";/** -* @vue/runtime-dom v3.5.44 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Mi;const bu=typeof window<"u"&&window.trustedTypes;if(bu)try{Mi=bu.createPolicy("vue",{createHTML:e=>e})}catch{}const ed=Mi?e=>Mi.createHTML(e):e=>e,sv="http://www.w3.org/2000/svg",rv="http://www.w3.org/1998/Math/MathML",Rn=typeof document<"u"?document:null,wu=Rn&&Rn.createElement("template"),ov={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Rn.createElementNS(sv,e):t==="mathml"?Rn.createElementNS(rv,e):n?Rn.createElement(e,{is:n}):Rn.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Rn.createTextNode(e),createComment:e=>Rn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Rn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const c=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{wu.innerHTML=ed(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const f=wu.content;if(r==="svg"||r==="mathml"){const v=f.firstChild;for(;v.firstChild;)f.appendChild(v.firstChild);f.removeChild(v)}t.insertBefore(f,n)}return[c?c.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},es="transition",_r="animation",sr=Symbol("_vtc"),td={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},nd=It({},$c,td),av=e=>(e.displayName="Transition",e.props=nd,e),lr=av((e,{slots:t})=>tv(ap,sd(e),t)),$s=(e,t=[])=>{Ye(e)?e.forEach(n=>n(...t)):e&&e(...t)},_u=e=>e?Ye(e)?e.some(t=>t.length>1):e.length>1:!1;function sd(e){const t={};for(const ee in e)ee in td||(t[ee]=e[ee]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:c=`${n}-enter-active`,enterToClass:f=`${n}-enter-to`,appearFromClass:v=i,appearActiveClass:y=c,appearToClass:h=f,leaveFromClass:w=`${n}-leave-from`,leaveActiveClass:C=`${n}-leave-active`,leaveToClass:O=`${n}-leave-to`}=e,B=iv(o),te=B&&B[0],se=B&&B[1],{onBeforeEnter:ae,onEnter:re,onEnterCancelled:V,onLeave:T,onLeaveCancelled:U,onBeforeAppear:J=ae,onAppear:Y=re,onAppearCancelled:ne=V}=t,$=(ee,Ie,Pe,ke)=>{ee._enterCancelled=ke,ns(ee,Ie?h:f),ns(ee,Ie?y:c),Pe&&Pe()},R=(ee,Ie)=>{ee._isLeaving=!1,ns(ee,w),ns(ee,O),ns(ee,C),Ie&&Ie()},F=ee=>(Ie,Pe)=>{const ke=ee?Y:re,Re=()=>$(Ie,ee,Pe);$s(ke,[Ie,Re]),ku(()=>{ns(Ie,ee?v:i),xn(Ie,ee?h:f),_u(ke)||xu(Ie,r,te,Re)})};return It(t,{onBeforeEnter(ee){$s(ae,[ee]),xn(ee,i),xn(ee,c)},onBeforeAppear(ee){$s(J,[ee]),xn(ee,v),xn(ee,y)},onEnter:F(!1),onAppear:F(!0),onLeave(ee,Ie){ee._isLeaving=!0;const Pe=()=>R(ee,Ie);xn(ee,w),ee._enterCancelled?(xn(ee,C),Ii(ee)):(Ii(ee),xn(ee,C)),ku(()=>{ee._isLeaving&&(ns(ee,w),xn(ee,O),_u(T)||xu(ee,r,se,Pe))}),$s(T,[ee,Pe])},onEnterCancelled(ee){$(ee,!1,void 0,!0),$s(V,[ee])},onAppearCancelled(ee){$(ee,!0,void 0,!0),$s(ne,[ee])},onLeaveCancelled(ee){R(ee),$s(U,[ee])}})}function iv(e){if(e==null)return null;if(ht(e))return[di(e.enter),di(e.leave)];{const t=di(e);return[t,t]}}function di(e){return df(e)}function xn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sr]||(e[sr]=new Set)).add(t)}function ns(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[sr];n&&(n.delete(t),n.size||(e[sr]=void 0))}function ku(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let lv=0;function xu(e,t,n,r){const o=e._endId=++lv,i=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:c,timeout:f,propCount:v}=rd(e,t);if(!c)return r();const y=c+"end";let h=0;const w=()=>{e.removeEventListener(y,C),i()},C=O=>{O.target===e&&++h>=v&&w()};setTimeout(()=>{h(n[B]||"").split(", "),o=r(`${es}Delay`),i=r(`${es}Duration`),c=Cu(o,i),f=r(`${_r}Delay`),v=r(`${_r}Duration`),y=Cu(f,v);let h=null,w=0,C=0;t===es?c>0&&(h=es,w=c,C=i.length):t===_r?y>0&&(h=_r,w=y,C=v.length):(w=Math.max(c,y),h=w>0?c>y?es:_r:null,C=h?h===es?i.length:v.length:0);const O=h===es&&/\b(?:transform|all)(?:,|$)/.test(r(`${es}Property`).toString());return{type:h,timeout:w,propCount:C,hasTransform:O}}function Cu(e,t){for(;e.length$u(n)+$u(e[r])))}function $u(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ii(e){return(e?e.ownerDocument:document).body.offsetHeight}function uv(e,t,n){const r=e[sr];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Su=Symbol("_vod"),od=Symbol("_vsh"),cv=Symbol(""),dv=/(?:^|;)\s*display\s*:/;function fv(e,t,n){const r=e.style,o=St(n);let i=!1;if(n&&!o){if(t)if(St(t))for(const c of t.split(";")){const f=c.slice(0,c.indexOf(":")).trim();n[f]==null&&Cr(r,f,"")}else for(const c in t)n[c]==null&&Cr(r,c,"");for(const c in n){c==="display"&&(i=!0);const f=n[c];f!=null?vv(e,c,!St(t)&&t?t[c]:void 0,f)||Cr(r,c,f):Cr(r,c,"")}}else if(o){if(t!==n){const c=r[cv];c&&(n+=";"+c),r.cssText=n,i=dv.test(n)}}else t&&e.removeAttribute("style");Su in e&&((!o||t!==n)&&(e[Su]=i?r.display:""),e[od]&&(r.display="none"))}const To=/\s*!important$/;function Cr(e,t,n){if(Ye(n))n.forEach(r=>Cr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))To.test(n)?e.setProperty(t,n.replace(To,""),"important"):e.setProperty(t,n);else{const r=pv(e,t);To.test(n)?e.setProperty(ps(r),n.replace(To,""),"important"):e[r]=n}}const Eu=["Webkit","Moz","ms"],fi={};function pv(e,t){const n=fi[t];if(n)return n;let r=yn(t);if(r!=="filter"&&r in e)return fi[t]=r;r=Gu(r);for(let o=0;opi||(wv.then(()=>pi=0),pi=Date.now());function kv(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;const o=n.value;if(Ye(o)){const i=r.stopImmediatePropagation;r.stopImmediatePropagation=()=>{i.call(r),r._stopped=!0};const c=o.slice(),f=[r];for(let v=0;ve.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,xv=(e,t,n,r,o,i)=>{const c=o==="svg";t==="class"?uv(e,r,c):t==="style"?fv(e,n,r):la(t)?ua(t)||hv(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Cv(e,t,r,c))?(Pu(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Au(e,t,r,c,i,t!=="value")):e._isVueCE&&($v(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!St(r)))?Pu(e,yn(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Au(e,t,r,c))};function Cv(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Mu(t)&&st(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Mu(t)&&St(n)?!1:t in e}function $v(e,t){const n=e._def.props;if(!n)return!1;const r=yn(t);return Array.isArray(n)?n.some(o=>yn(o)===r):Object.keys(n).some(o=>yn(o)===r)}const ad=new WeakMap,id=new WeakMap,Jo=Symbol("_moveCb"),Iu=Symbol("_enterCb"),ji=new WeakMap,Sv=e=>(delete e.props.mode,e),Ev=Sv({name:"TransitionGroup",props:It({},nd,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ul(),r=Cc();let o,i,c,f;const v=()=>(f===void 0&&(f=o.length>0&&Dv(o[0].el,n.vnode.el,ju(e))),f);return Pc(()=>{if(ji.delete(n),!v()){o=[],c=void 0;return}const y=ju(e);o.forEach(Av);const h=c&&jv(c,n.vnode.el);c=void 0,o.forEach(C=>Pv(C,h));const w=o.filter(Ov);Ii(n.vnode.el),w.forEach(C=>{const O=C.el,B=O.style;xn(O,y),B.transform=B.webkitTransform=B.transitionDuration="";const te=O[Jo]=se=>{se&&se.target!==O||(!se||se.propertyName.endsWith("transform"))&&(O.removeEventListener("transitionend",te),O[Jo]=null,ns(O,y))};O.addEventListener("transitionend",te)}),o=[]}),()=>{const y=pt(e),h=sd(y);let w=y.tag||Ke;if(o=[],f=void 0,i)for(let C=0;Cr.willMove()&&r.item.contains(t));return n&&_a(n.item,n)}function Dv(e,t,n){const r=e.cloneNode(),o=e[sr];o&&o.forEach(f=>{f.split(/\s+/).forEach(v=>v&&r.classList.remove(v))}),n.split(/\s+/).forEach(f=>f&&r.classList.add(f)),r.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(r);const{hasTransform:c}=rd(r);return i.removeChild(r),c}const Xo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Ye(t)?n=>Oo(t,n):t};function Lv(e){e.target.composing=!0}function Du(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ms=Symbol("_assign"),Ao=Symbol("_initialValue");function vi(e,t,n){return t&&(e=e.trim()),n&&(e=da(e)),e}const Fe={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e.parentNode&&(e.type==="text"?e[Ao]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Ao]=e.defaultValue.replace(/\r\n?/g,` -`))),e[Ms]=Xo(o);const i=r||o.props&&o.props.type==="number";Ps(e,t?"change":"input",c=>{c.target.composing||e[Ms](vi(e.value,n,i))}),(n||i)&&Ps(e,"change",()=>{e.value=vi(e.value,n,i)}),t||(Ps(e,"compositionstart",Lv),Ps(e,"compositionend",Du),Ps(e,"change",Du))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){const o=t??"",i=e[Ao];delete e[Ao],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[Ms](vi(e.value,n,r)):e.value=o},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:i}},c){if(e[Ms]=Xo(c),e.composing)return;const f=(i||e.type==="number")&&!/^0\d/.test(e.value)?da(e.value):e.value,v=t??"";if(f===v)return;const y=e.getRootNode();(y instanceof Document||y instanceof ShadowRoot)&&y.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===v)||(e.value=v)}},Pn={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,Ps(e,"change",()=>{const o=Array.prototype.filter.call(e.options,v=>v.selected).map(v=>n?da(Qo(v)):Qo(v)),i=e.multiple,c=i?Ds(e._modelValue)?new Set(o):o:o[0],f=e._pendingValue=[i,i?Ye(c)?o.slice():o:c];try{e[Ms](c)}finally{ir(()=>{e._pendingValue===f&&(e._pendingValue=void 0)})}}),e[Ms]=Xo(r)},mounted(e,{value:t}){Lu(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[Ms]=Xo(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Kv(t,n[1],n[0]))&&Lu(e,t)}};function Kv(e,t,n){if(!n||Ye(e))return ls(e,t);if(Ds(e)){if(e.size!==t.length)return!1;for(const r of t)if(!e.has(r))return!1;return!0}return!1}function Lu(e,t){const n=e.multiple,r=Ye(t);if(!(n&&!r&&!Ds(t))){for(let o=0,i=e.options.length;oString(y)===String(f)):c.selected=wf(t,f)>-1}else c.selected=t.has(f);else if(ls(Qo(c),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Qo(e){return"_value"in e?e._value:e.value}const Rv=["ctrl","shift","alt","meta"],Nv={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Rv.some(n=>e[`${n}Key`]&&!t.includes(n))},en=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...i)=>{for(let c=0;c{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const i=ps(o.key);if(t.some(c=>c===i||Fv[c]===i))return e(o)})},Vv=It({patchProp:xv},ov);let Ku;function Bv(){return Ku||(Ku=Rp(Vv))}const Uv=(...e)=>{const t=Bv().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Hv(r);if(!o)return;const i=t._component;!st(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const c=n(o,!1,qv(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),c},t};function qv(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Hv(e){return St(e)?document.querySelector(e):e}function Tt(e){return''+e+""}const Wv={calendar:Tt(''),clock:Tt(''),"check-circle":Tt(''),edit:Tt(''),tag:Tt(''),star:Tt(''),close:Tt(''),flag:Tt(''),chart:Tt(''),export:Tt(''),"chevron-left":Tt(''),"chevron-right":Tt(''),"chevron-down":Tt(''),plus:Tt(''),search:Tt(''),settings:Tt(''),memo:Tt(''),lock:Tt(''),wallet:Tt(''),more:Tt(''),shield:Tt(''),plan:Tt('')},zv=["innerHTML"],et=Ft({__name:"Icon",props:{name:{},size:{default:16}},setup(e){const t=e,n=it(()=>Wv[t.name]||"");return(r,o)=>(E(),A("span",{class:"icon",style:as({width:e.size+"px",height:e.size+"px"}),innerHTML:n.value},null,12,zv))}}),Gv=["aria-label"],Yv={class:"dialog-title"},Jv={class:"dialog-msg"},Xv={class:"dialog-btns"},Qv=Ft({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{default:"确认"},cancelText:{default:"取消"},danger:{type:Boolean,default:!1}},emits:["cancel","confirm"],setup(e,{emit:t}){const n=e,r=t;function o(i){n.open&&i.key==="Escape"&&r("cancel")}return wt(()=>n.open,i=>{i?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),Wn(()=>window.removeEventListener("keydown",o)),(i,c)=>(E(),At(cs,{to:"body"},[Me(lr,{name:"modal"},{default:vs(()=>[e.open?(E(),A("div",{key:0,class:"mask",onClick:c[2]||(c[2]=en(f=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",Yv,z(e.title),1),l("div",Jv,z(e.message),1),l("div",Xv,[l("button",{class:"btn btn-sm",onClick:c[0]||(c[0]=f=>r("cancel"))},z(e.cancelText),1),l("button",{class:tt(["btn btn-sm",e.danger?"btn-danger-solid":"btn-primary"]),onClick:c[1]||(c[1]=f=>r("confirm"))},z(e.confirmText),3)])],8,Gv)])):we("",!0)]),_:1})]))}}),Ut=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},qn=Ut(Qv,[["__scopeId","data-v-f27041d4"]]);var Ru=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Zv(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ld={exports:{}};(function(e,t){((n,r)=>{e.exports=r()})(Ru,function(){var n=function(s,a){return(n=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(u,d){u.__proto__=d}:function(u,d){for(var p in d)Object.prototype.hasOwnProperty.call(d,p)&&(u[p]=d[p])}))(s,a)},r=function(){return(r=Object.assign||function(s){for(var a,u=1,d=arguments.length;u"u"||i.Promise||(i.Promise=Promise);var y=Object.getPrototypeOf,h={}.hasOwnProperty;function w(s,a){return h.call(s,a)}function C(s,a){typeof a=="function"&&(a=a(y(s))),(typeof Reflect>"u"?c:Reflect.ownKeys)(a).forEach(function(u){B(s,u,a[u])})}var O=Object.defineProperty;function B(s,a,u,d){O(s,a,v(u&&w(u,"get")&&typeof u.get=="function"?{get:u.get,set:u.set,configurable:!0}:{value:u,configurable:!0,writable:!0},d))}function te(s){return{from:function(a){return s.prototype=Object.create(a.prototype),B(s.prototype,"constructor",s),{extend:C.bind(null,s.prototype)}}}}var se=Object.getOwnPropertyDescriptor,ae=[].slice;function re(s,a,u){return ae.call(s,a,u)}function V(s,a){return a(s)}function T(s){if(!s)throw new Error("Assertion Failed")}function U(s){i.setImmediate?setImmediate(s):setTimeout(s,0)}function J(s,a){if(typeof a=="string"&&w(s,a))return s[a];if(!a)return s;if(typeof a!="string"){for(var u=[],d=0,p=a.length;d"u"?[]:(Ue=Promise.resolve(),typeof crypto<"u"&&crypto.subtle?[Te=crypto.subtle.digest("SHA-512",new Uint8Array([0])),y(Te),Ue]:[Ue,y(Ue),Ue]),Ue=Te[0],Ws=Te[1],Ws=Ws&&Ws.then,Je=Ue&&Ue.constructor,ct=!!Te[2],Ge=function(s,a){zn.push([s,a]),Kt&&(queueMicrotask(Ld),Kt=!1)},Lt=!0,Kt=!0,gt=[],ms=[],Vt=X,jt={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:_,pgp:!1,env:{},finalize:_},ze=jt,zn=[],hs=0,Qr=[];function Le(s){if(typeof this!="object")throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var a=this._PSD=ze;if(typeof s!="function"){if(s!==x)throw new TypeError("Not a function");this._state=arguments[1],this._value=arguments[2],this._state===!1&&Sa(this,this._value)}else this._state=null,this._value=null,++a.ref,function u(d,p){try{p(function(m){if(d._state===null){if(m===d)throw new TypeError("A promise cannot be resolved with itself.");var g=d._lib&&Fs();m&&typeof m.then=="function"?u(d,function(k,I){m instanceof Le?m._then(k,I):m.then(k,I)}):(d._state=!0,d._value=m,wl(d)),g&&Vs()}},Sa.bind(null,d))}catch(m){Sa(d,m)}}(this,s)}var $a={get:function(){var s=ze,a=no;function u(d,p){var m=this,g=!s.global&&(s!==ze||a!==no),k=g&&!Yn(),I=new Le(function(W,D){Ea(m,new bl(kl(d,s,g,k),kl(p,s,g,k),W,D,s))});return this._consoleTask&&(I._consoleTask=this._consoleTask),I}return u.prototype=x,u},set:function(s){B(this,"then",s&&s.prototype===x?$a:{get:function(){return s},set:$a.set})}};function bl(s,a,u,d,p){this.onFulfilled=typeof s=="function"?s:null,this.onRejected=typeof a=="function"?a:null,this.resolve=u,this.reject=d,this.psd=p}function Sa(s,a){var u,d;ms.push(a),s._state===null&&(u=s._lib&&Fs(),a=Vt(a),s._state=!1,s._value=a,d=s,gt.some(function(p){return p._value===d._value})||gt.push(d),wl(s),u)&&Vs()}function wl(s){var a=s._listeners;s._listeners=[];for(var u=0,d=a.length;u{for(var g=gt.length;g;)if(gt[--g]._value===m._value)return gt.splice(g,1)})(a),u.resolve(d)}catch(m){u.reject(m)}finally{--hs==0&&Ta(),--u.psd.ref||u.psd.finalize()}}function Ld(){ys(jt,function(){Fs()&&Vs()})}function Fs(){var s=Lt;return Kt=Lt=!1,s}function Vs(){var s,a,u;do for(;0.",xl="String expected.",ro="__dbnames",Pa="readonly",Oa="readwrite";function bs(s,a){return s?a?function(){return s.apply(this,arguments)&&a.apply(this,arguments)}:s:a}var Cl={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function oo(s){return typeof s!="string"||/\./.test(s)?function(a){return a}:function(a){return a[s]===void 0&&s in a&&delete(a=Ie(a))[s],a}}function $l(){throw Ve.Type("Entity instances must never be new:ed. Instances are generated by the framework bypassing the constructor.")}function ut(s,a){try{var u=Sl(s),d=Sl(a);if(u!==d)return u==="Array"?1:d==="Array"?-1:u==="binary"?1:d==="binary"?-1:u==="string"?1:d==="string"?-1:u==="Date"?1:d!=="Date"?NaN:-1;switch(u){case"number":case"Date":case"string":return a{var k=D,I=g;if(typeof I!="function"&&I!==null)throw new TypeError("Class extends value "+String(I)+" is not a constructor or null");function W(){this.constructor=k}function D(){return g!==null&&g.apply(this,arguments)||this}return n(k,I),k.prototype=I===null?Object.create(I):(W.prototype=I.prototype,new W),Object.defineProperty(D.prototype,"db",{get:function(){return a},enumerable:!1,configurable:!0}),D.prototype.table=function(){return u},D})(s)),new Set),p=s.prototype;p;p=y(p))Object.getOwnPropertyNames(p).forEach(function(g){return d.add(g)});function m(g){if(!g)return g;var k,I=Object.create(s.prototype);for(k in g)if(!d.has(k))try{I[k]=g[k]}catch{}return I}return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=m,this.hook("reading",m),s},kt.prototype.defineClass=function(){return this.mapToClass(function(s){v(this,s)})},kt.prototype.add=function(s,a){var u=this,d=this.schema.primKey,p=d.auto,m=d.keyPath,g=s;return m&&p&&(g=oo(m)(s)),this._trans("readwrite",function(k){return u.core.mutate({trans:k,type:"add",keys:a!=null?[a]:null,values:[g]})}).then(function(k){return k.numFailures?Le.reject(k.failures[0]):k.lastResult}).then(function(k){if(m)try{Y(s,m,k)}catch{}return k})},kt.prototype.upsert=function(s,a){var u=this,d=this.schema.primKey.keyPath;return this._trans("readwrite",function(p){return u.core.get({trans:p,key:s}).then(function(m){var g=m??{};return Al(g,a),d&&Y(g,d,s),u.core.mutate({trans:p,type:"put",values:[g],keys:[s],upsert:!0,updates:{keys:[s],changeSpecs:[a]}}).then(function(k){return k.numFailures?Le.reject(k.failures[0]):!!m})})})},kt.prototype.update=function(s,a){return typeof s!="object"||f(s)?this.where(":id").equals(s).modify(a):(s=J(s,this.schema.primKey.keyPath))===void 0?Ot(new Ve.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(s).modify(a)},kt.prototype.put=function(s,a){var u=this,d=this.schema.primKey,p=d.auto,m=d.keyPath,g=s;return m&&p&&(g=oo(m)(s)),this._trans("readwrite",function(k){return u.core.mutate({trans:k,type:"put",values:[g],keys:a!=null?[a]:null})}).then(function(k){return k.numFailures?Le.reject(k.failures[0]):k.lastResult}).then(function(k){if(m)try{Y(s,m,k)}catch{}return k})},kt.prototype.delete=function(s){var a=this;return this._trans("readwrite",function(u){return a.core.mutate({trans:u,type:"delete",keys:[s]}).then(function(d){return ao(a,[s],d)}).then(function(d){return d.numFailures?Le.reject(d.failures[0]):void 0})})},kt.prototype.clear=function(){var s=this;return this._trans("readwrite",function(a){return s.core.mutate({trans:a,type:"deleteRange",range:Cl}).then(function(u){return ao(s,null,u)})}).then(function(a){return a.numFailures?Le.reject(a.failures[0]):void 0})},kt.prototype.bulkGet=function(s){var a=this;return this._trans("readonly",function(u){return a.core.getMany({keys:s,trans:u}).then(function(d){return d.map(function(p){return a.hook.reading.fire(p)})})})},kt.prototype.bulkAdd=function(s,a,u){var d=this,p=Array.isArray(a)?a:void 0,m=(u=u||(p?void 0:a))?u.allKeys:void 0;return this._trans("readwrite",function(g){var k=d.schema.primKey,W=k.auto,k=k.keyPath;if(k&&p)throw new Ve.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(p&&p.length!==s.length)throw new Ve.InvalidArgument("Arguments objects and keys must have the same length");var I=s.length,W=k&&W?s.map(oo(k)):s;return d.core.mutate({trans:g,type:"add",keys:p,values:W,wantResults:m}).then(function(D){var M=D.numFailures,j=D.failures;if(M===0)return m?D.results:D.lastResult;throw new fe("".concat(d.name,".bulkAdd(): ").concat(M," of ").concat(I," operations failed"),j)})})},kt.prototype.bulkPut=function(s,a,u){var d=this,p=Array.isArray(a)?a:void 0,m=(u=u||(p?void 0:a))?u.allKeys:void 0;return this._trans("readwrite",function(g){var k=d.schema.primKey,W=k.auto,k=k.keyPath;if(k&&p)throw new Ve.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(p&&p.length!==s.length)throw new Ve.InvalidArgument("Arguments objects and keys must have the same length");var I=s.length,W=k&&W?s.map(oo(k)):s;return d.core.mutate({trans:g,type:"put",keys:p,values:W,wantResults:m}).then(function(D){var M=D.numFailures,j=D.failures;if(M===0)return m?D.results:D.lastResult;throw new fe("".concat(d.name,".bulkPut(): ").concat(M," of ").concat(I," operations failed"),j)})})},kt.prototype.bulkUpdate=function(s){var a=this,u=this.core,d=s.map(function(g){return g.key}),p=s.map(function(g){return g.changes}),m=[];return this._trans("readwrite",function(g){return u.getMany({trans:g,keys:d,cache:"clone"}).then(function(k){var I=[],W=[],D=(s.forEach(function(M,j){var q=M.key,K=M.changes,L=k[j];if(L){for(var N=0,Q=Object.keys(K);NG+oe&&N(G+W)})})}var Q=Us(u)&&u.limit===1/0&&(typeof s!="function"||K)&&{index:u.index,range:u.range};return N(0).then(function(){if(0{for(var Ze=Math.min(be.length,qe.length),ot=-1,lt=0;lt=j})).length===0?Le.resolve():(N.forEach(function(G){L.push(function(){var oe,ve,ye,$e=Q,be=G._cfg.dbschema,Be=(ho(M,$e,K),ho(M,be,K),Q=M._dbSchema=be,Na($e,be)),Ce=(Be.add.forEach(function(qe){Fa(K,qe[0],qe[1].primKey,qe[1].indexes)}),Be.change.forEach(function(qe){if(qe.recreate)throw new Ve.Upgrade("Not yet support for changing primary key");var he=K.objectStore(qe.name);qe.add.forEach(function(Qe){return vo(he,Qe)}),qe.change.forEach(function(Qe){he.deleteIndex(Qe.name),vo(he,Qe)}),qe.del.forEach(function(Qe){return he.deleteIndex(Qe)})}),G._cfg.contentUpgrade);if(Ce&&G._cfg.version>j)return fo(M,K),q._memoizedTables={},oe=ne(be),Be.del.forEach(function(qe){oe[qe]=$e[qe]}),Ra(M,[M.Transaction.prototype]),po(M,[M.Transaction.prototype],c(oe),oe),q.schema=oe,(ve=Xe(Ce))&&Bs(),be=Le.follow(function(){var qe;(ye=Ce(q))&&ve&&(qe=Yn.bind(null,null),ye.then(qe,qe))}),ye&&typeof ye.then=="function"?Le.resolve(ye):be.then(function(){return ye})}),L.push(function(oe){var ve,ye,$e=G._cfg.dbschema;ve=$e,ye=oe,[].slice.call(ye.db.objectStoreNames).forEach(function(be){return ve[be]==null&&ye.db.deleteObjectStore(be)}),Ra(M,[M.Transaction.prototype]),po(M,[M.Transaction.prototype],M._storeNames,M._dbSchema),q.schema=M._dbSchema}),L.push(function(oe){M.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(M.idbdb.version/10)===G._cfg.version?(M.idbdb.deleteObjectStore("$meta"),delete M._dbSchema.$meta,M._storeNames=M._storeNames.filter(function(ve){return ve!=="$meta"})):oe.objectStore("$meta").put(G._cfg.version,"version"))})}),function G(){return L.length?Le.resolve(L.shift()(q.idbtrans)).then(G):Le.resolve()}().then(function(){Rl(Q,K)}))}).catch(g);var I,W;c(p).forEach(function(D){Fa(u,D,p[D].primKey,p[D].indexes)}),fo(s,u),Le.follow(function(){return s.on.populate.fire(m)}).catch(g)})}function Yd(s,a){Rl(s._dbSchema,a),a.db.version%10!=0||a.objectStoreNames.contains("$meta")||a.db.createObjectStore("$meta").add(Math.ceil(a.db.version/10-1),"version");var u=mo(0,s.idbdb,a);ho(s,s._dbSchema,a);for(var d=0,p=Na(u,s._dbSchema).change;d{if(g.change.length||g.recreate)return console.warn("Unable to patch indexes of table ".concat(g.name," because it has changes on the type of index or primary key.")),{value:void 0};var k=a.objectStore(g.name);g.add.forEach(function(I){le&&console.debug("Dexie upgrade patch: Creating missing index ".concat(g.name,".").concat(I.src)),vo(k,I)})})(p[d]);if(typeof m=="object")return m.value}}function Na(s,a){var u,d={del:[],add:[],change:[]};for(u in s)a[u]||d.del.push(u);for(u in a){var p=s[u],m=a[u];if(p){var g={name:u,def:m,recreate:!1,del:[],add:[],change:[]};if(""+(p.primKey.keyPath||"")!=""+(m.primKey.keyPath||"")||p.primKey.auto!==m.primKey.auto)g.recreate=!0,d.change.push(g);else{var k=p.idxByName,I=m.idxByName,W=void 0;for(W in k)I[W]||g.del.push(W);for(W in I){var D=k[W],M=I[W];D?D.src!==M.src&&g.change.push(M):g.add.push(M)}(0{var s,a,u;return typeof FinalizationRegistry<"u"&&typeof WeakRef<"u"?(s=new Set,a=new FinalizationRegistry(function(d){s.delete(d)}),{toArray:function(){return Array.from(s).map(function(d){return d.deref()}).filter(function(d){return d!==void 0})},add:function(d){var p=new WeakRef(d._novip);s.add(p),a.register(d._novip,p,p),s.size>d._options.maxConnections&&(p=s.values().next().value,s.delete(p),a.unregister(p))},remove:function(d){if(d)for(var p=s.values(),m=p.next();!m.done;){var g=m.value;if(g.deref()===d._novip)return s.delete(g),void a.unregister(g);m=p.next()}}}):(u=[],{toArray:function(){return u},add:function(d){u.push(d._novip)},remove:function(d){d&&(d=u.indexOf(d._novip))!==-1&&u.splice(d,1)}})})();function Va(s,a){var u=s._dbNamesDB;return u||(u=s._dbNamesDB=new Ln(ro,{addons:[],indexedDB:s,IDBKeyRange:a})).version(1).stores({dbnames:"name"}),u.table("dbnames")}function Ba(s){return s&&typeof s.databases=="function"}function Ua(s){return Gn(function(){return ze.letThrough=!0,s()})}function qa(s){return!("from"in s)}var qt=function(s,a){var u;if(!this)return u=new qt,s&&"d"in s&&v(u,s),u;v(this,arguments.length?{d:1,from:s,to:1Math.pow(2,62)?0:N.oldVersion,M=Q<1,s.idbdb=L.result,m&&Yd(s,D),Gd(s,Q/10,D,q))},q),L.onsuccess=$t(function(){D=null;var N,Q,G,oe,ve,ye,$e=s.idbdb=L.result,be=re($e.objectStoreNames);if(0"u"?Le.resolve():!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(j){function q(){return indexedDB.databases().finally(j)}I=setInterval(q,100),q()}).finally(function(){return clearInterval(I)}):Promise.resolve()).then(k)]).then(function(){return g(),a.onReadyBeingFired=[],Le.resolve(Ua(function(){return s.on.ready.fire(s.vip)})).then(function j(){var q;if(0a.limit?d.length=a.limit:s.length===a.limit&&d.length{if(u===void 0)return d!==void 0?-1:0;if(d===void 0)return 1;if((u=ut(u,d))===0){if(p&&m)return 0;if(p)return 1;if(m)return-1}return u})(s.lower,a.lower,s.lowerOpen,a.lowerOpen)<=0&&0<=((u,d,p,m)=>{if(u===void 0)return d!==void 0?1:0;if(d===void 0)return-1;if((u=ut(u,d))===0){if(p&&m)return 0;if(p)return-1;if(m)return 1}return u})(s.upper,a.upper,s.upperOpen,a.upperOpen)}function sf(s,a,u,d){s.subscribers.add(u),d.addEventListener("abort",function(){var p,m;s.subscribers.delete(u),s.subscribers.size===0&&(p=s,m=a,setTimeout(function(){p.subscribers.size===0&&me(m,p)},3e3))})}var rf={stack:"dbcore",level:0,name:"Cache",create:function(s){var a=s.schema.name;return r(r({},s),{transaction:function(u,d,p){var m,g,k=s.transaction(u,d,p);return d==="readwrite"&&(p=(m=new AbortController).signal,k.addEventListener("abort",(g=function(I){return function(){if(m.abort(),d==="readwrite"){for(var W=new Set,D=0,M=u;D{var Q=ws["idb://".concat(q,"/").concat(K)];if(!Q)return[];if(!(q=Q.queries[L]))return[null,!1,Q,null];var G=q[(N.query?N.query.index.name:null)||""];if(!G)return[null,!1,Q,null];switch(L){case"query":var oe=(ve=N.direction)!=null?ve:"next",ve=G.find(function(ye){var $e;return ye.req.limit===N.limit&&ye.req.values===N.values&&(($e=ye.req.direction)!=null?$e:"next")===oe&&Yl(ye.req.query.range,N.query.range)});return ve?[ve,!0,Q,G]:[G.find(function(ye){var $e;return("limit"in ye.req?ye.req.limit:1/0)>=N.limit&&(($e=ye.req.direction)!=null?$e:"next")===oe&&(!N.values||ye.req.values)&&nf(ye.req.query.range,N.query.range)}),!1,Q,G];case"count":return ve=G.find(function(ye){return Yl(ye.req.query.range,N.query.range)}),[ve,!!ve,Q,G]}})(a,u,"query",m),j=M[0],W=M[2],D=M[3],j&&M[1]?j.obsSet=m.obsSet:(M=d.query(m).then(function(q){var K=q.result;if(j&&(j.res=K),g){for(var L=0,N=K.length;L{var ve=Fs();try{m&&Bs();var ye=Gn(s,oe);return ye=m?ye.finally(Yn):ye}finally{ve&&Vs()}})(Q={subscr:N,signal:g.signal,requery:j,querier:s,trans:null}),M||(Qn.storagemutated.subscribe(K),M=!0),Promise.resolve(G).then(function(oe){u=!0,a=oe,k||Q.signal.aborted||(q()||(W=N,q())?j():(I={},Aa(function(){return!k&&p.next&&p.next(oe)})))},function(oe){u=!1,["DatabaseClosedError","AbortError"].includes(oe==null?void 0:oe.name)||k||Aa(function(){k||p.error&&p.error(oe)})}))};return setTimeout(j,0),D});return d.hasValue=function(){return u},d.getValue=function(){return a},d}var _s=Ln;function ei(s){var a=Zn;try{Zn=!0,Qn.storagemutated.fire(s),Ga(s,!0)}finally{Zn=a}}C(_s,r(r({},Ae),{delete:function(s){return new _s(s,{addons:[]}).delete()},exists:function(s){return new _s(s,{addons:[]}).open().then(function(a){return a.close(),!0}).catch("NoSuchDatabaseError",function(){return!1})},getDatabaseNames:function(s){try{return a=_s.dependencies,u=a.indexedDB,a=a.IDBKeyRange,(Ba(u)?Promise.resolve(u.databases()).then(function(d){return d.map(function(p){return p.name}).filter(function(p){return p!==ro})}):Va(u,a).toCollection().primaryKeys()).then(s)}catch{return Ot(new Ve.MissingAPI)}var a,u},defineClass:function(){return function(s){v(this,s)}},ignoreTransaction:function(s){return ze.trans?ys(ze.transless||jt,s):s()},vip:Ua,async:function(s){return function(){try{var a=Ya(s.apply(this,arguments));return a&&typeof a.then=="function"?a:Le.resolve(a)}catch(u){return Ot(u)}}},spawn:function(s,a,u){try{var d=Ya(s.apply(u,a||[]));return d&&typeof d.then=="function"?d:Le.resolve(d)}catch(p){return Ot(p)}},currentTransaction:{get:function(){return ze.trans||null}},waitFor:function(s,a){return s=Le.resolve(typeof s=="function"?_s.ignoreTransaction(s):s).timeout(a||6e4),ze.trans?ze.trans.waitFor(s):s},Promise:Le,debug:{get:function(){return le},set:function(s){S(s)}},derive:te,extend:v,props:C,override:V,Events:dr,on:Qn,liveQuery:Jl,extendObservabilitySet:go,getByKeyPath:J,setByKeyPath:Y,delByKeyPath:function(s,a){typeof a=="string"?Y(s,a,void 0):"length"in a&&[].map.call(a,function(u){Y(s,u,void 0)})},shallowClone:ne,deepClone:Ie,getObjectDiff:Ja,cmp:ut,asap:U,minKey:-1/0,addons:[],connections:{get:hr.toArray},errnames:De,dependencies:ko,cache:ws,semVer:"4.4.6",version:"4.4.6".split(".").map(function(s){return parseInt(s)}).reduce(function(s,a,u){return s+a/Math.pow(10,2*u)})})),_s.maxKey=vr(_s.dependencies.IDBKeyRange),typeof dispatchEvent<"u"&&typeof addEventListener<"u"&&(Qn(co,function(s){Zn||(s=new CustomEvent(ja,{detail:s}),Zn=!0,dispatchEvent(s),Zn=!1)}),addEventListener(ja,function(s){s=s.detail,Zn||ei(s)}));var zs,Zn=!1,Xl=function(){};return typeof BroadcastChannel<"u"&&((Xl=function(){(zs=new BroadcastChannel(ja)).onmessage=function(s){return s.data&&ei(s.data)}})(),typeof zs.unref=="function"&&zs.unref(),Qn(co,function(s){Zn||zs.postMessage(s)})),typeof addEventListener<"u"&&(addEventListener("pagehide",function(s){if(!Ln.disableBfCache&&s.persisted){le&&console.debug("Dexie: handling persisted pagehide"),zs!=null&&zs.close();for(var a=0,u=hr.toArray();a{const r={dev:"项目实操",test:"项目实操",bugfix:"售后服务",learning:"产品学习",meeting:"打杂",doc:"打杂",other:"打杂"};await n.table("log_item").toCollection().modify(o=>{o.category&&r[o.category]&&(o.category=r[o.category])})})}}let ue;function sm(e){ue=e}function cl(){ue&&ue.close(),ue=void 0}const rm=5,Fu=["公司","客户现场","出差","居家办公"],om={dev:"项目实操",test:"项目实操",bugfix:"售后服务",learning:"产品学习",meeting:"打杂",doc:"打杂",other:"打杂"};function Li(e){return om[e]||e}function Or(e){return e<10?"0"+e:String(e)}function Bn(e){return e.getFullYear()+"-"+Or(e.getMonth()+1)+"-"+Or(e.getDate())}function bt(){return Bn(new Date)}function mt(){const e=new Date;return Bn(e)+"T"+Or(e.getHours())+":"+Or(e.getMinutes())+":"+Or(e.getSeconds())}function Un(e){if(!e)return"--:--";const t=e.indexOf("T");return t>=0?e.slice(t+1,t+6):e.slice(0,5)}function Rs(e){const t=e.split("-").map(Number);return new Date(t[0],t[1]-1,t[2])}function on(e,t){const n=Rs(e);return n.setDate(n.getDate()+t),Bn(n)}function ea(e,t){const n=Rs(e),r=n.getDate();n.setDate(1),n.setMonth(n.getMonth()+t);const o=new Date(n.getFullYear(),n.getMonth()+1,0).getDate();return n.setDate(Math.min(r,o)),Bn(n)}function Qs(e){const t=Rs(e),n=(t.getDay()+6)%7;return t.setDate(t.getDate()-n),Bn(t)}function am(e){const t=Rs(e).getDay();return t===0||t===6}function im(e,t){return Math.round((new Date(t).getTime()-new Date(e).getTime())/6e4)}function ud(e){const t=Rs(e),n=["周日","周一","周二","周三","周四","周五","周六"];return t.getFullYear()+" 年 "+(t.getMonth()+1)+" 月 "+t.getDate()+" 日 "+n[t.getDay()]}const lm=15e4;function Ki(e){const t=new Uint8Array(e);let n="";for(let r=0;r({}));if(!o.ok){const c=i&&i.error||"服务返回 "+o.status;throw e==="register"&&o.status===409?new Error("云端已有同名账号且密码一致,直接登录即可"):new Error(String(c))}if(!i.userId||!i.username)throw new Error("登录响应异常");return{userId:String(i.userId),username:String(i.username)}}async function vl(e,t,n){const r=await Em(n,e,t);oa(r.userId);const o={userId:r.userId,username:r.username};return $m(o),md(r.username,t),o}async function Tm(e,t){const n=(e||"").trim();if(!n||!t)throw new Error("请输入用户名与密码");return vl(n,t,"login")}async function Am(e,t,n){const r=(e||"").trim();if(r.length<2||r.length>20)throw new Error("用户名需 2 到 20 个字符");if(t.length<6)throw new Error("登录密码至少 6 位");return vl(r,t,"register")}async function Pm(){const e=bn();if(!e)return null;try{return await vl(e.username,e.password,"login")}catch{return null}}async function Om(){sa(),cl(),ra=null,vd()}function Mm(){sa(),cl(),ra=null,vd(),Sm()}async function Im(e,t){if(!Ur())throw new Error("未登录");if(t.length<6)throw new Error("新密码至少 6 位");const r=bn();if(!r||r.password!==e)throw new Error("旧密码不正确");const o=await Ns();let i;try{i=await fetch(o+"/api/auth/password",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+hd()},body:JSON.stringify({oldPassword:e,newPassword:t})})}catch{throw new Error("无法连接同步服务器")}if(!i.ok){const c=await i.json().catch(()=>({}));throw new Error(c&&c.error||"修改失败 "+i.status)}md(r.username,t)}async function jm(){if(!Ur())throw new Error("未登录");const t=await Ns();let n;try{n=await fetch(t+"/api/auth/delete",{method:"POST",headers:{Authorization:"Bearer "+hd()}})}catch{throw new Error("无法连接同步服务器")}if(!n.ok){const r=await n.json().catch(()=>({}));throw new Error(r&&r.error||"删除失败 "+n.status)}Mm()}function hd(){return xa()}const Fi=P(null),Vi=P(null),ur=P(0);function rs(){ur.value++}const Zs=P(""),qr=["project","work_log","log_item","attendance","weekly_note","setting","memo","credential","transaction","plan"],Js=new Set(["sync_cursor","sync_last_time","sync_token","last_project","last_category"]);function Do(e){return JSON.stringify(e)}async function Dm(e){return ue.table(e).toArray()}function Lo(e,t){return e==="setting"?t.key:t.id}async function Lm(){for(const e of qr){const t=ue.table(e),n=await t.toArray();for(const r of n){if(e==="setting"&&Js.has(r.key))continue;const o={};r.uuid||(o.uuid=Km()),!r.updated_at&&r.created_at&&(o.updated_at=r.created_at),Object.keys(o).length&&await t.update(Lo(e,r),o)}}}function Km(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"u"+Date.now().toString(36)+Math.random().toString(36).slice(2,10)}async function Rm(){return bn()!=null}async function Nm(){try{return localStorage.getItem("dsh_last_sync")||""}catch{return""}}async function Fm(e){try{localStorage.setItem("dsh_last_sync",e)}catch{}}async function yd(e,t){const n=await fetch(e+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t.username.trim(),password:t.password})});if(!n.ok)throw new Error("云端账号或密码不正确");const r=await n.json();if(!r||!r.token)throw new Error("云端登录异常");return String(r.token)}async function Vm(e,t){let n=xa();return n||(n=await yd(e,t),Br(n),n)}async function gd(){const e=bn();if(!e)throw new Error("未登录");const t=await Ns(),n=await fetch(t+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.password})});if(!n.ok)throw new Error("云端账号校验失败:"+n.status)}async function Bi(){const e=bn();if(!e)throw new Error("未登录,无法同步");return kd({baseUrl:await Ns(),username:e.username,password:e.password})}async function bd(){try{await Bi()}catch(e){Zs.value=e instanceof Error?e.message:String(e);try{await Bi()}catch{}throw e}}function wd(e,t,n){const r={};for(const o of Object.keys(t))o!=="id"&&(r[o]=t[o]);if(e==="log_item"){delete r.work_log_id,delete r.project_id;const o=t.work_log_id?n.workLog.get(t.work_log_id):null;o&&o.uuid&&(r.wuuid=o.uuid);const i=t.project_id?n.project.get(t.project_id):null;i&&i.uuid&&(r.puuid=i.uuid)}return r}async function _d(){const e=await ue.work_log.toArray(),t=await ue.project.toArray();return{workLog:new Map(e.map(n=>[n.id,n])),project:new Map(t.map(n=>[n.id,n]))}}let Mr=!1,Ko=!1,Ui=!1,er=null,Cn=null,qi="",Hi=!1,Ro=null;async function tr(){if(Mr){Ko=!0;return}try{if(!await Rm())return;await kd(await Bm()),Zs.value=""}catch(e){Zs.value=e instanceof Error?e.message:String(e)}}async function Bm(){const e=bn();if(!e)throw new Error("未登录,无法同步");return{baseUrl:await Ns(),username:e.username,password:e.password}}function Um(){if(Hi)return;Hi=!0,Ro=tm(async()=>{const t={};for(const n of qr)t[n]=await ue.table(n).count();return t}).subscribe({next:()=>{Ui||Mr||(er&&globalThis.clearTimeout(er),er=globalThis.setTimeout(()=>{tr()},3e3))},error:()=>{}})}function qm(){Ro&&(Ro.unsubscribe(),Ro=null),Cn&&(Cn.close(),Cn=null,qi=""),er&&(globalThis.clearTimeout(er),er=null),Hi=!1}function Hm(e,t){const n=e+"|"+t;if(!(Cn&&qi===n)){Cn&&(Cn.close(),Cn=null);try{Cn=new EventSource(e+"/api/events?token="+encodeURIComponent(t)),qi=n,Cn.onmessage=()=>{tr()}}catch{Cn=null}}}async function kd(e){if(Mr)return Ko=!0,{pushed:0,pulled:0,removed:0,errors:0,at:""};Mr=!0,Ui=!0;try{const t=await Wm(e);return Ko&&(Ko=!1,globalThis.setTimeout(()=>{tr()},800)),t}finally{Mr=!1,Ui=!1}}async function Wm(e){const t=e.baseUrl.trim().replace(/\/+$/,"");if(!t)throw new Error("请先配置同步服务地址");await Lm();const n=await _d(),r=await ue.sync_mirror.toArray(),o=new Map;for(const se of r)o.set(se.table+"|"+se.uuid,se);const i={},c=[];let f=0;for(const se of qr){let ae=await Dm(se);se==="setting"&&(ae=ae.filter(V=>!Js.has(V.key)));const re=new Map;for(const V of ae)re.set(V.uuid,V);for(const[V,T]of re){const U=wd(se,T,n),J=Do(U),Y=o.get(se+"|"+V);(!Y||Y.hash!==J)&&(i[se]=i[se]||[],i[se].push(U),f++)}for(const[V,T]of o)V.startsWith(se+"|")&&!re.has(T.uuid)&&c.push({table:se,uuid:T.uuid,deleted_at:mt()});i[se]=i[se]||[]}c.push(...Xm());const v=await Vm(t,e),y=se=>fetch(t+"/api/sync",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+se},body:JSON.stringify({device:"client",tables:i,tombstones:c})});let h=await y(v);if(h.status===401){Br("");const se=await yd(t,e);Br(se),h=await y(se)}if(!h.ok)throw new Error("同步服务返回 "+h.status);const w=await h.json(),C=w.tables||{},O=w.tombstones||[],B=await Ym(C,O);Hm(t,xa()||v);const te=mt();return await Fm(te),(B.changed>0||B.removed>0||f>0)&&rs(),{pushed:f,pulled:B.changed,removed:B.removed,errors:0,at:te}}function xd(){var t;return"dsh_idmap_"+(((t=bn())==null?void 0:t.username)||"anon")}function zm(){try{const e=localStorage.getItem(xd());if(e)return JSON.parse(e)}catch{}return{}}function Gm(e){try{localStorage.setItem(xd(),JSON.stringify(e))}catch{}}async function Ym(e,t){const n=zm(),r=new Set(t.map(C=>C.table+"|"+C.uuid)),o=new Map;for(const C of await ue.sync_mirror.toArray())o.set(C.table+"|"+C.uuid,C);const i=new Set(Array.from(o.keys()).map(C=>C.split("|")[1]));let c=0,f=0;const v={},y={};for(const C of qr){const O=ue.table(C),B=await O.toArray(),te=new Map(B.map($=>[Lo(C,$),$])),se=new Map(B.filter($=>$.uuid).map($=>[$.uuid,$])),ae=(e[C]||[]).filter($=>!r.has(C+"|"+$.uuid)),re=ae.filter($=>!(C==="setting"&&Js.has($.key))),V=ae.filter($=>C==="setting"&&Js.has($.key));for(const $ of V)Jm(C,$.uuid);const T=C==="setting"?[]:B.filter($=>$.uuid&&!i.has($.uuid)&&!r.has(C+"|"+$.uuid)),U={v:Math.max(0,...B.map($=>Number($.id)||0))};re.length;const J=[];for(const $ of re){const R={...$};if(C==="log_item"){const Ie=R.wuuid?v[R.wuuid]:void 0;if(!Ie)continue;R.work_log_id=Ie,delete R.wuuid,R.project_id=R.puuid?y[R.puuid]??null:null,delete R.puuid}let F=Lo(C,$);if(C==="setting")F=$.key;else{const Ie=n[C]&&n[C][$.uuid],Pe=se.get($.uuid);Pe&&Pe.id!=null?F=Pe.id:typeof Ie=="number"?F=Ie:F=++U.v}const ee={...R,id:F};C==="setting"&&Js.has(ee.key)||(J.push(ee),C==="work_log"&&(v[$.uuid]=F),C==="project"&&(y[$.uuid]=F))}const Y=J.concat(T);for(const $ of Y){const R=te.get(Lo(C,$));(!R||Do(R)!==Do($))&&c++}f+=B.filter($=>$.uuid&&!J.some(R=>R.uuid===$.uuid)&&!r.has(C+"|"+$.uuid)).length,await O.clear(),Y.length&&await O.bulkPut(Y);const ne={};for(const $ of Y)$.uuid&&(ne[$.uuid]=$.id);n[C]=ne}Gm(n);const h=await _d(),w=[];for(const C of qr){const O=await ue.table(C).toArray();for(const B of O)C==="setting"&&Js.has(B.key)||B.uuid&&w.push({table:C,uuid:B.uuid,hash:Do(wd(C,B,h))})}return await ue.sync_mirror.clear(),w.length&&await ue.sync_mirror.bulkAdd(w.map(C=>({...C}))),await ue.tombstone.clear(),{changed:c,removed:f+aa.length}}const aa=[];function Jm(e,t){aa.some(n=>n.table===e&&n.uuid===t)||aa.push({table:e,uuid:t,deleted_at:mt()})}function Xm(){return aa.splice(0)}const Qm=new Set(["sync_cursor","sync_last_time","sync_token","last_project","last_category"]);async function yt(){await bd()}async function Ct(e,t){const n=await ue.setting.get(e);return n?n.value:t}async function Dt(e,t){await ue.setting.put({key:e,value:t}),Qm.has(e)||await yt()}async function Ks(){const e=await Promise.all([Ct("work_start","09:00"),Ct("work_end","18:00"),Ct("grace_minutes","10"),Ct("lunch_minutes","60"),Ct("remind_weekly","friday")]);return{work_start:e[0],work_end:e[1],grace_minutes:Number(e[2])||0,lunch_minutes:Number(e[3])||0,remind_weekly:e[4]}}async function Zm(){const e=await Ct("last_project",""),t=await Ct("last_category","dev");return{project_id:e?Number(e):null,category:t||"dev"}}async function eh(){return Ct("last_location","")}async function th(e,t){const n=t.trim();await Dt("last_location",n),n&&await ia(n);let r=!1;const o=await wn(e);o&&o.id?(o.location||"")!==n&&(await ue.attendance.update(o.id,{location:n||null}),r=!0):n&&(await ue.attendance.add({date:e,clock_in_at:null,clock_out_at:null,kind:"normal",note:null,location:n,created_at:mt()}),r=!0),r&&await yt()}async function ml(){const e=await Ct("location_presets","");if(!e)return Fu.slice();try{const t=JSON.parse(e);if(Array.isArray(t))return t.filter(n=>typeof n=="string"&&n.trim()).map(n=>n.trim())}catch{}return Fu.slice()}async function Cd(e){const t=Array.from(new Set(e.map(n=>n.trim()).filter(Boolean)));await Dt("location_presets",JSON.stringify(t))}async function ia(e){const t=e.trim();if(!t)return;const n=await ml();n.includes(t)||await Cd([...n,t])}async function nr(e=!1){const t=await ue.project.orderBy("name").toArray();return e?t:t.filter(n=>n.archived!==1)}async function nh(e){await ue.project.add({name:e.trim(),archived:0,created_at:mt()}),await yt()}async function sh(e,t){await ue.project.update(e,{name:t.trim()}),await yt()}async function rh(e,t){await ue.project.update(e,{archived:t?1:0}),await yt()}async function wn(e){return ue.attendance.where("date").equals(e).first()}async function $d(e,t){const n=((t===void 0?await Ct("last_location",""):t)||"").trim();let r=!1;const o=await wn(e);if(o&&o.id){if(!o.clock_in_at){const i={clock_in_at:mt()};n&&(i.location=n),await ue.attendance.update(o.id,i),r=!0}n&&(await Ct("last_location","")!==n&&await Dt("last_location",n),await ia(n)),r&&await yt();return}await ue.attendance.add({date:e,clock_in_at:mt(),clock_out_at:null,kind:"normal",note:null,location:n||null,created_at:mt()}),n&&(await Dt("last_location",n),await ia(n)),await yt()}async function oh(e){const t=await wn(e);t&&t.id&&t.clock_in_at&&!t.clock_out_at&&(await ue.attendance.update(t.id,{clock_out_at:mt()}),await yt())}async function ah(){const e=new Date,t=Bn(e);let n="";if(e.getHours()<4){const r=await wn(on(t,-1));r&&r.id&&r.clock_in_at&&!r.clock_out_at&&(await ue.attendance.update(r.id,{clock_out_at:mt()}),n=r.date)}if(!n){const r=await wn(t);r&&r.id&&r.clock_in_at&&!r.clock_out_at&&(await ue.attendance.update(r.id,{clock_out_at:mt()}),n=r.date)}if(!n)throw new Error("没有进行中的打卡");return await yt(),n}async function ih(e,t,n,r,o){(o||"").trim()&&await ia(o);const i=await wn(e),c={date:e,clock_in_at:t,clock_out_at:n,kind:"makeup",note:r||null,location:(o||"").trim()||null,created_at:mt()};i&&i.id?await ue.attendance.update(i.id,c):await ue.attendance.add(c),await yt()}async function lh(e,t,n){const r=(n||"").trim();if(!r)return;const o=await wn(e);o&&o.id&&(await ue.attendance.update(o.id,{[t]:e+"T"+r+":00"}),await yt())}async function Ca(e,t){return ue.attendance.where("date").between(e,t,!0,!0).toArray()}async function uh(e,t){const n=await wn(e);if(t){const r={date:e,kind:"leave",clock_in_at:null,clock_out_at:null,created_at:mt()};n&&n.id?await ue.attendance.update(n.id,r):await ue.attendance.add({...r,note:null,location:null})}else n&&n.id&&await ue.attendance.update(n.id,{kind:"normal"});await yt()}async function ch(e){const t=await ue.work_log.where("date").equals(e).first();return t||{id:await ue.work_log.add({date:e,created_at:mt()}),date:e,created_at:mt()}}async function dh(e){return ue.work_log.where("date").equals(e).first()}async function fh(e){const t=await dh(e);return!t||!t.id?[]:(await ue.log_item.where("work_log_id").equals(t.id).toArray()).sort((r,o)=>o.id-r.id)}async function ph(e,t){const n=await ue.work_log.where("date").equals(e).first();let r;n&&n.id?r=n:r=await ch(e),await ue.table("log_item").add({work_log_id:r.id,content:t.content,project_id:t.project_id,category:t.category,minutes:t.minutes,is_milestone:0,needs_followup:0,takeaway:t.takeaway,remark:t.remark,sort_order:0,created_at:mt()});const o=t.project_id?String(t.project_id):"";await Ct("last_project","")!==o&&await Dt("last_project",o),await Ct("last_category","")!==t.category&&await Dt("last_category",t.category),await yt()}async function hi(e,t){await ue.table("log_item").update(e,t),await yt()}async function vh(e){await ue.table("log_item").delete(e),await yt()}async function Hr(e,t){const n=await ue.work_log.where("date").between(e,t,!0,!0).toArray();if(!n.length)return[];const r=new Map(n.map(i=>[i.id,i.date]));return(await ue.table("log_item").where("work_log_id").anyOf(n.map(i=>i.id)).toArray()).map(i=>({...i,date:r.get(i.work_log_id)||""})).sort((i,c)=>i.date===c.date?i.id-c.id:i.daten.start_time!!n.timer_started_at).toArray();for(const n of t)n.id!==e&&await yl(n.id);await ue.plan.update(e,{timer_started_at:mt(),updated_at:mt()}),await yt()}async function yl(e){const t=await ue.plan.get(e);if(!t||!t.timer_started_at)return;const n=Math.max(0,Math.round((Date.now()-new Date(t.timer_started_at).getTime())/6e4));await ue.plan.update(e,{actual_minutes:(t.actual_minutes||0)+n,timer_started_at:null,updated_at:mt()}),await yt()}async function xh(){return(await ue.memo.toArray()).sort((t,n)=>t.updated_at[c.id,c.date]));return(await ue.table("log_item").toArray()).filter(c=>((c.content||"")+" "+(c.takeaway||"")+" "+(c.remark||"")).toLowerCase().includes(n)).sort((c,f)=>f.id-c.id).slice(0,t).map(c=>({...c,date:o.get(c.work_log_id)||""}))}async function Th(e,t=4){const n=e.trim().toLowerCase();return n?(await ue.memo.toArray()).filter(o=>((o.title||"")+" "+(o.content||"")).toLowerCase().includes(n)).sort((o,i)=>o.updated_at{await Promise.all([ue.project.clear(),ue.work_log.clear(),r.clear(),ue.attendance.clear(),ue.weekly_note.clear(),ue.setting.clear(),ue.memo.clear(),ue.credential.clear(),o.clear(),i.clear()]),n.project&&n.project.length&&await ue.project.bulkAdd(n.project),n.work_log&&n.work_log.length&&await ue.work_log.bulkAdd(n.work_log),n.log_item&&n.log_item.length&&await r.bulkAdd(n.log_item),n.attendance&&n.attendance.length&&await ue.attendance.bulkAdd(n.attendance),n.weekly_note&&n.weekly_note.length&&await ue.weekly_note.bulkAdd(n.weekly_note),n.setting&&n.setting.length&&await ue.setting.bulkAdd(n.setting),n.memo&&n.memo.length&&await ue.memo.bulkAdd(n.memo),n.credential&&n.credential.length&&await ue.credential.bulkAdd(n.credential),n.transaction&&n.transaction.length&&await o.bulkAdd(n.transaction),n.plan&&n.plan.length&&await i.bulkAdd(n.plan)}),await yt()}const Lh=["制度学习","产品学习","打杂","项目实操","售后服务"],Kh=["餐饮","交通","住房","通讯","学习","娱乐","其他"],Rh=["工资","报销","其他"],Sd="log_categories",Ed="ledger_expense_categories",Td="ledger_income_categories";function Ad(e,t){if(!e)return t.slice();try{const n=JSON.parse(e);if(Array.isArray(n)){const r=n.filter(o=>typeof o=="string"&&o.trim()).map(o=>o.trim());if(r.length)return Array.from(new Set(r))}}catch{}return t.slice()}async function Jr(){return Ad(await Ct(Sd,""),Lh)}async function yi(e){await Dt(Sd,JSON.stringify(e))}async function Wr(e){return Ad(await Ct(e==="expense"?Ed:Td,""),e==="expense"?Kh:Rh)}async function Es(e,t){await Dt(e==="expense"?Ed:Td,JSON.stringify(t))}const Nh={class:"dialog",role:"dialog","aria-label":"编辑工作记录"},Fh={class:"dialog-head"},Vh={key:0,class:"muted dialog-sub"},Bh={class:"dialog-body"},Uh={class:"form-grid"},qh={class:"field span2"},Hh={key:0,class:"form-error"},Wh={class:"field"},zh=["value"],Gh={class:"field"},Yh=["value"],Jh={class:"field"},Xh={class:"field"},Qh={class:"field span2"},Zh={class:"field"},ey={class:"field"},ty={class:"dialog-btns"},ny=Ft({__name:"EditLogDialog",props:{open:{type:Boolean},item:{},projects:{},date:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=P([]);Jr().then(re=>{n.value=re});const r=e,o=t,i=P(""),c=P(null),f=P("dev"),v=P(null),y=P(""),h=P(""),w=P(0),C=P(0),O=P(""),B=P(null),te=it(()=>{var T;const re=r.projects.filter(U=>U.archived!==1),V=(T=r.item)==null?void 0:T.project_id;if(V&&!re.some(U=>U.id===V)){const U=r.projects.find(Y=>Y.id===V),J=re.slice();return U&&J.unshift({...U,name:U.name+"(已归档)"}),J}return re});function se(re){r.open&&re.key==="Escape"&&o("cancel")}wt(()=>r.open,async re=>{var V;if(re){const T=r.item;i.value=(T==null?void 0:T.content)??"",c.value=(T==null?void 0:T.project_id)??null,f.value=(T==null?void 0:T.category)??"dev",v.value=(T==null?void 0:T.minutes)??null,y.value=(T==null?void 0:T.takeaway)??"",h.value=(T==null?void 0:T.remark)??"",w.value=(T==null?void 0:T.is_milestone)??0,C.value=(T==null?void 0:T.needs_followup)??0,O.value="",window.addEventListener("keydown",se),await ir(),(V=B.value)==null||V.focus()}else window.removeEventListener("keydown",se)}),Wn(()=>window.removeEventListener("keydown",se)),wt(i,()=>{O.value&&(O.value="")});function ae(){const re=i.value.trim();if(!re){O.value="请填写工作内容";return}if(!r.item||!r.item.id){o("cancel");return}o("save",{id:r.item.id,content:re,project_id:c.value,category:f.value,minutes:v.value&&v.value>0?v.value:null,takeaway:y.value.trim()||null,remark:h.value.trim()||null,is_milestone:w.value?1:0,needs_followup:C.value?1:0})}return(re,V)=>(E(),At(cs,{to:"body"},[Me(lr,{name:"modal"},{default:vs(()=>[e.open?(E(),A("div",{key:0,class:"mask",onClick:V[10]||(V[10]=en(T=>o("cancel"),["self"]))},[l("div",Nh,[l("div",Fh,[l("div",null,[V[11]||(V[11]=l("div",{class:"dialog-title"},"编辑工作记录",-1)),e.date?(E(),A("div",Vh,z(e.date),1)):we("",!0)]),l("button",{class:"icon-btn",title:"关闭",onClick:V[0]||(V[0]=T=>o("cancel"))},[Me(et,{name:"close",size:16})])]),l("div",Bh,[l("div",Uh,[l("div",qh,[V[12]||(V[12]=l("label",null,"工作内容(必填)",-1)),Oe(l("input",{ref_key:"contentInput",ref:B,class:tt(["input",{invalid:O.value}]),"onUpdate:modelValue":V[1]||(V[1]=T=>i.value=T),onKeydown:Et(ae,["enter"])},null,34),[[Fe,i.value]]),O.value?(E(),A("div",Hh,z(O.value),1)):we("",!0)]),l("div",Wh,[V[14]||(V[14]=l("label",null,"所属项目",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":V[2]||(V[2]=T=>c.value=T)},[V[13]||(V[13]=l("option",{value:null},"无项目",-1)),(E(!0),A(Ke,null,at(te.value,T=>(E(),A("option",{key:T.id,value:T.id},z(T.name),9,zh))),128))],512),[[Pn,c.value]])]),l("div",Gh,[V[15]||(V[15]=l("label",null,"工作分类",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":V[3]||(V[3]=T=>f.value=T)},[(E(!0),A(Ke,null,at(n.value,T=>(E(),A("option",{key:T,value:T},z(T),9,Yh))),128))],512),[[Pn,f.value]])]),l("div",Jh,[V[16]||(V[16]=l("label",null,"耗时(分钟)",-1)),Oe(l("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":V[4]||(V[4]=T=>v.value=T),placeholder:"选填"},null,512),[[Fe,v.value,void 0,{number:!0}]])]),l("div",Xh,[V[17]||(V[17]=l("label",null,"主要收获",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":V[5]||(V[5]=T=>y.value=T),placeholder:"一句话:学到了什么"},null,512),[[Fe,y.value]])]),l("div",Qh,[V[18]||(V[18]=l("label",null,"备注",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":V[6]||(V[6]=T=>h.value=T),placeholder:"背景、链接、未决事项(选填)"},null,512),[[Fe,h.value]])]),l("div",Zh,[V[19]||(V[19]=l("label",null,"成果标记",-1)),l("button",{class:tt(["toggle-btn",{on:w.value===1}]),onClick:V[7]||(V[7]=T=>w.value=w.value===1?0:1)},z(w.value===1?"已标记为成果":"未标记"),3)]),l("div",ey,[V[20]||(V[20]=l("label",null,"待跟进",-1)),l("button",{class:tt(["toggle-btn",{onwarn:C.value===1}]),onClick:V[8]||(V[8]=T=>C.value=C.value===1?0:1)},z(C.value===1?"需要跟进":"无需跟进"),3)])])]),l("div",ty,[l("button",{class:"btn btn-sm",onClick:V[9]||(V[9]=T=>o("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:ae},"保存修改")])])])):we("",!0)]),_:1})]))}}),sy=Ut(ny,[["__scopeId","data-v-aaf87f80"]]);function Po(e){const t=e.split(":");return Number(t[0])*60+Number(t[1])}function Xr(e,t,n,r){if(e&&e.kind==="leave")return{status:"leave",label:"请假",makeup:!1,workedMinutes:null};if(am(t))return{status:"rest",label:"休息日",makeup:!1,workedMinutes:null};if(!e||!e.clock_in_at)return r?{status:"none",label:"未打卡",makeup:!1,workedMinutes:null}:{status:"absent",label:"缺勤",makeup:!!(e&&e.kind==="makeup"),workedMinutes:null};const o=e.kind==="makeup";if(!e.clock_out_at)return{status:"incomplete",label:r?"进行中":"未完成",makeup:o,workedMinutes:null};const i=Po(Un(e.clock_in_at)),c=Po(Un(e.clock_out_at)),f=Po(n.work_start),v=Po(n.work_end);let y="normal";!o&&i>f+n.grace_minutes?y="late":!o&&c{No.value=No.value.filter(n=>n.id!==t)},2e3)}function oy(){return No}const ay={class:"day-panel"},iy={class:"dp-head"},ly={class:"dp-date"},uy={class:"card sec"},cy={class:"att-grid"},dy={class:"att-cell"},fy={key:0,class:"edit-row"},py={key:1,class:"att-val"},vy={class:"att-cell"},my={key:0,class:"edit-row"},hy={key:1,class:"att-val"},yy={class:"att-cell"},gy=["list"],by=["id"],wy=["value"],_y={class:"att-cell"},ky={class:"att-val status-val"},xy={key:0,class:"tag"},Cy={key:1,class:"muted"},$y={key:0,class:"att-note muted"},Sy={class:"att-actions"},Ey=["disabled"],Ty=["disabled"],Ay=["disabled"],Py=["disabled"],Oy={key:0,class:"card sec makeup"},My={class:"form-grid"},Iy={class:"field"},jy={class:"field"},Dy={class:"field span2"},Ly=["list"],Ky={class:"field span2"},Ry={key:0,class:"form-error"},Ny={class:"form-footer"},Fy={class:"card sec"},Vy={class:"form-grid"},By={class:"field span2"},Uy={key:0,class:"form-error"},qy={class:"field"},Hy=["value"],Wy={class:"field"},zy=["value"],Gy={class:"field"},Yy={class:"field"},Jy={class:"field span2"},Xy={class:"form-footer"},Qy=["disabled"],Zy=["disabled"],eg={class:"list-sec"},tg={class:"sec-title"},ng={key:0,class:"empty muted"},sg={class:"item-main"},rg={class:"tag"},og=["onClick"],ag={key:0,class:"muted item-meta"},ig={key:1,class:"muted num item-meta"},lg=["onClick"],ug=["onClick"],cg=["onClick"],dg=["onClick"],fg={key:0,class:"item-sub"},pg={key:0,class:"muted2"},vg={key:1,class:"muted"},mg={key:1,class:"dp-foot muted num"},hg=Ft({__name:"DayPanel",props:{date:{}},setup(e){const t=P([]);Jr().then(le=>{t.value=le});const n=e,r=P(!0),o=P(null),i=P(void 0),c=P([]),f=P([]),v=P(""),y=P([]),h=it(()=>"loc-list-"+n.date),w=it(()=>n.date===bt());async function C(){r.value=!0,o.value=await Ks(),i.value=await wn(n.date),c.value=await fh(n.date),f.value=await nr(!0),y.value=await ml(),v.value=i.value&&i.value.location||await eh(),r.value=!1}an(C),wt(()=>n.date,C),wt(ur,()=>{C()});const O=it(()=>f.value.filter(le=>le.archived!==1));function B(le){if(!le)return"";const S=f.value.find(x=>x.id===le);return S?S.name:"已删除项目"}const te=it(()=>o.value?Xr(i.value,n.date,o.value,w.value):null),se=it(()=>c.value.reduce((le,S)=>le+(S.minutes||0),0)),ae=P(!1);async function re(){ae.value||(ae.value=!0,await $d(n.date,v.value),await C(),rs(),He("上班打卡成功"),ae.value=!1)}async function V(){ae.value||(ae.value=!0,await oh(n.date),await C(),rs(),He("下班打卡成功"),ae.value=!1)}async function T(){await th(n.date,v.value),rs(),He("地点已更新")}const U=P(!1),J=it(()=>{var le;return((le=i.value)==null?void 0:le.kind)==="leave"});function Y(){if(i.value&&i.value.clock_in_at){U.value=!0;return}ne(!0)}async function ne(le){U.value=!1,await uh(n.date,le),await C(),rs(),He(le?"已标记为休假":"已取消休假")}const $=P(null),R=P(""),F=P(null);wt($,async le=>{var S;le&&(await ir(),(S=F.value)==null||S.focus())});function ee(le){var x,Z;const S=le==="in"?(x=i.value)==null?void 0:x.clock_in_at:(Z=i.value)==null?void 0:Z.clock_out_at;$.value=le,R.value=S?Un(S):le==="in"?"09:00":"18:00"}function Ie(){$.value=null}async function Pe(){const le=$.value;le&&($.value=null,R.value&&(await lh(n.date,le==="in"?"clock_in_at":"clock_out_at",R.value),await C(),rs(),He("打卡时间已修改")))}const ke=P(!1),Re=P("09:00"),xe=P("18:00"),me=P(""),_e=P(""),We=P("");function Xe(){_e.value=v.value,We.value="",ke.value=!ke.value}async function Ae(){if(!Re.value||!xe.value){We.value="请填写上班与下班时间";return}await ih(n.date,n.date+"T"+Re.value+":00",n.date+"T"+xe.value+":00",me.value.trim(),_e.value),ke.value=!1,me.value="",We.value="",await C(),rs(),He("补卡已保存")}const pe=P(""),Ne=P("");wt(pe,()=>{Ne.value&&(Ne.value="")});const dt=P(null),je=P("dev"),fe=P(null),De=P(""),rt=P(""),Ve=P(!1),b=it(()=>!!(pe.value.trim()||fe.value||De.value.trim()||rt.value.trim()));an(async()=>{const le=await Zm();dt.value=le.project_id,je.value=le.category});function _(){pe.value="",fe.value=null,De.value="",rt.value="",Ne.value=""}async function X(){const le=pe.value.trim();if(!le){Ne.value="请填写工作内容";return}Ve.value||(Ve.value=!0,await ph(n.date,{content:le,project_id:dt.value,category:je.value,minutes:fe.value&&fe.value>0?fe.value:null,takeaway:De.value.trim()||null,remark:rt.value.trim()||null}),_(),await C(),He("记录已添加"),Ve.value=!1)}const de=P(null);function H(le){de.value=le}async function ie(le){const S=le.id,x={content:le.content,project_id:le.project_id,category:le.category,minutes:le.minutes,takeaway:le.takeaway,remark:le.remark,is_milestone:le.is_milestone,needs_followup:le.needs_followup};await hi(S,x),de.value=null,await C(),He("修改已保存")}async function Se(le){await hi(le.id,{is_milestone:le.is_milestone?0:1}),await C()}async function Ee(le){await hi(le.id,{needs_followup:le.needs_followup?0:1}),await C()}const ge=P(null);async function ce(){ge.value&&ge.value.id&&await vh(ge.value.id),ge.value=null,await C(),He("记录已删除")}return(le,S)=>(E(),A("div",ay,[l("div",iy,[l("div",ly,z(cn(ud)(e.date)),1)]),l("div",uy,[S[25]||(S[25]=l("div",{class:"sec-title"},"出勤信息",-1)),l("div",cy,[l("div",dy,[S[21]||(S[21]=l("label",null,"上班时间",-1)),$.value==="in"?(E(),A("div",fy,[Oe(l("input",{ref_key:"timeInput",ref:F,type:"time",class:"input time-input","onUpdate:modelValue":S[0]||(S[0]=x=>R.value=x),onKeydown:[Et(Pe,["enter"]),Et(Ie,["esc"])]},null,544),[[Fe,R.value]]),l("button",{class:"btn btn-primary btn-sm",onClick:Pe},"确认"),l("button",{class:"btn btn-sm",onClick:Ie},"取消")])):(E(),A("div",py,[l("span",{class:tt(["num",{"val-empty":!(i.value&&i.value.clock_in_at)}])},z(i.value&&i.value.clock_in_at?cn(Un)(i.value.clock_in_at):"未打卡"),3),i.value&&i.value.id?(E(),A("button",{key:0,class:"icon-btn",title:"修改上班时间",onClick:S[1]||(S[1]=x=>ee("in"))},[Me(et,{name:"edit",size:13})])):we("",!0)]))]),l("div",vy,[S[22]||(S[22]=l("label",null,"下班时间",-1)),$.value==="out"?(E(),A("div",my,[Oe(l("input",{ref_key:"timeInput",ref:F,type:"time",class:"input time-input","onUpdate:modelValue":S[2]||(S[2]=x=>R.value=x),onKeydown:[Et(Pe,["enter"]),Et(Ie,["esc"])]},null,544),[[Fe,R.value]]),l("button",{class:"btn btn-primary btn-sm",onClick:Pe},"确认"),l("button",{class:"btn btn-sm",onClick:Ie},"取消")])):(E(),A("div",hy,[l("span",{class:tt(["num",{"val-empty":!(i.value&&i.value.clock_out_at)}])},z(i.value&&i.value.clock_out_at?cn(Un)(i.value.clock_out_at):"未打卡"),3),i.value&&i.value.id?(E(),A("button",{key:0,class:"icon-btn",title:"修改下班时间",onClick:S[3]||(S[3]=x=>ee("out"))},[Me(et,{name:"edit",size:13})])):we("",!0)]))]),l("div",yy,[S[23]||(S[23]=l("label",null,"上班地点",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":S[4]||(S[4]=x=>v.value=x),list:h.value,placeholder:"可直接输入",title:"上班地点,可自由输入",onChange:T},null,40,gy),[[Fe,v.value]]),l("datalist",{id:h.value},[(E(!0),A(Ke,null,at(y.value,x=>(E(),A("option",{key:x,value:x},null,8,wy))),128))],8,by)]),l("div",_y,[S[24]||(S[24]=l("label",null,"考勤状态",-1)),l("div",ky,[te.value?(E(),A(Ke,{key:0},[l("span",{class:tt(["dot",te.value.status])},null,2),l("span",null,z(te.value.label),1),i.value&&i.value.kind==="makeup"?(E(),A("span",xy,"补卡")):we("",!0)],64)):(E(),A("span",Cy,"--"))])])]),i.value&&i.value.note?(E(),A("div",$y,"补卡说明:"+z(i.value.note),1)):we("",!0),l("div",Sy,[w.value&&(!i.value||!i.value.clock_in_at)?(E(),A("button",{key:0,class:"btn btn-primary btn-sm",disabled:ae.value,onClick:re},"上班打卡",8,Ey)):w.value&&i.value&&i.value.clock_in_at&&!i.value.clock_out_at?(E(),A("button",{key:1,class:"btn btn-primary btn-sm",disabled:ae.value,onClick:V},"下班打卡",8,Ty)):we("",!0),!w.value&&(!i.value||!i.value.clock_in_at)?(E(),A("button",{key:2,class:"btn btn-sm",onClick:Xe},"补卡")):we("",!0),J.value?(E(),A("button",{key:4,class:"btn btn-sm",disabled:ae.value,onClick:S[5]||(S[5]=x=>ne(!1))},"取消休假",8,Py)):(E(),A("button",{key:3,class:"btn btn-sm",disabled:ae.value,onClick:Y},"标记休假",8,Ay))])]),ke.value?(E(),A("div",Oy,[S[30]||(S[30]=l("div",{class:"sec-title"},"补卡登记",-1)),l("div",My,[l("div",Iy,[S[26]||(S[26]=l("label",null,"上班时间",-1)),Oe(l("input",{type:"time",class:"input","onUpdate:modelValue":S[6]||(S[6]=x=>Re.value=x)},null,512),[[Fe,Re.value]])]),l("div",jy,[S[27]||(S[27]=l("label",null,"下班时间",-1)),Oe(l("input",{type:"time",class:"input","onUpdate:modelValue":S[7]||(S[7]=x=>xe.value=x)},null,512),[[Fe,xe.value]])]),l("div",Dy,[S[28]||(S[28]=l("label",null,"上班地点",-1)),Oe(l("input",{class:"input",list:h.value,"onUpdate:modelValue":S[8]||(S[8]=x=>_e.value=x),placeholder:"可直接输入"},null,8,Ly),[[Fe,_e.value]])]),l("div",Ky,[S[29]||(S[29]=l("label",null,"补卡原因",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":S[9]||(S[9]=x=>me.value=x),placeholder:"如:外出拜访客户忘记打卡"},null,512),[[Fe,me.value]])])]),We.value?(E(),A("div",Ry,z(We.value),1)):we("",!0),l("div",Ny,[l("button",{class:"btn btn-sm",onClick:S[10]||(S[10]=x=>ke.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:Ae},"保存补卡")])])):we("",!0),l("div",Fy,[S[38]||(S[38]=l("div",{class:"sec-head"},[l("span",{class:"sec-title"},"新增工作记录"),l("span",{class:"muted form-hint"},"内容必填,其余选填")],-1)),l("div",Vy,[l("div",By,[S[31]||(S[31]=l("label",null,"工作内容(必填)",-1)),Oe(l("input",{class:tt(["input",{invalid:Ne.value}]),"onUpdate:modelValue":S[11]||(S[11]=x=>pe.value=x),placeholder:"做了什么,一句话一条",onKeydown:Et(X,["enter"])},null,34),[[Fe,pe.value]]),Ne.value?(E(),A("div",Uy,z(Ne.value),1)):we("",!0)]),l("div",qy,[S[33]||(S[33]=l("label",null,"所属项目",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":S[12]||(S[12]=x=>dt.value=x)},[S[32]||(S[32]=l("option",{value:null},"无项目",-1)),(E(!0),A(Ke,null,at(O.value,x=>(E(),A("option",{key:x.id,value:x.id},z(x.name),9,Hy))),128))],512),[[Pn,dt.value]])]),l("div",Wy,[S[34]||(S[34]=l("label",null,"工作分类",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":S[13]||(S[13]=x=>je.value=x)},[(E(!0),A(Ke,null,at(t.value,x=>(E(),A("option",{key:x,value:x},z(x),9,zy))),128))],512),[[Pn,je.value]])]),l("div",Gy,[S[35]||(S[35]=l("label",null,"耗时(分钟)",-1)),Oe(l("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":S[14]||(S[14]=x=>fe.value=x),placeholder:"选填"},null,512),[[Fe,fe.value,void 0,{number:!0}]])]),l("div",Yy,[S[36]||(S[36]=l("label",null,"主要收获",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":S[15]||(S[15]=x=>De.value=x),placeholder:"一句话:学到了什么"},null,512),[[Fe,De.value]])]),l("div",Jy,[S[37]||(S[37]=l("label",null,"备注",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":S[16]||(S[16]=x=>rt.value=x),placeholder:"背景、链接、未决事项(选填)"},null,512),[[Fe,rt.value]])])]),l("div",Xy,[l("button",{class:"btn btn-sm",disabled:!b.value,onClick:_},"重置",8,Qy),l("button",{class:"btn btn-primary btn-sm",disabled:Ve.value,onClick:X},"添加记录",8,Zy)])]),l("div",eg,[l("div",tg,"工作记录("+z(c.value.length)+")",1),!c.value.length&&!r.value?(E(),A("div",ng,"暂无记录")):we("",!0),(E(!0),A(Ke,null,at(c.value,x=>(E(),A("div",{key:x.id,class:"item"},[l("div",sg,[l("span",rg,z(cn(Li)(x.category)),1),l("span",{class:"item-content",title:"点击编辑",onClick:Z=>H(x)},z(x.content),9,og),x.project_id?(E(),A("span",ag,z(B(x.project_id)),1)):we("",!0),x.minutes?(E(),A("span",ig,z(x.minutes)+" 分钟",1)):we("",!0),S[39]||(S[39]=l("span",{class:"flex1"},null,-1)),l("button",{class:"icon-btn",title:"编辑完整信息",onClick:Z=>H(x)},[Me(et,{name:"edit",size:14})],8,lg),l("button",{class:tt(["icon-btn",{active:x.is_milestone===1}]),title:"成果标记",onClick:Z=>Se(x)},[Me(et,{name:"star",size:14})],10,ug),l("button",{class:tt(["icon-btn",{"active-warn":x.needs_followup===1}]),title:"待跟进",onClick:Z=>Ee(x)},[Me(et,{name:"flag",size:14})],10,cg),l("button",{class:"icon-btn",title:"删除",onClick:Z=>ge.value=x},[Me(et,{name:"close",size:14})],8,dg)]),x.takeaway||x.remark?(E(),A("div",fg,[x.takeaway?(E(),A("div",pg,"收获:"+z(x.takeaway),1)):we("",!0),x.remark?(E(),A("div",vg,"备注:"+z(x.remark),1)):we("",!0)])):we("",!0)]))),128)),c.value.length?(E(),A("div",mg,[Pt(" 共 "+z(c.value.length)+" 条事项 ",1),se.value?(E(),A(Ke,{key:0},[Pt(" · "+z((se.value/60).toFixed(1))+" 小时",1)],64)):we("",!0)])):we("",!0)]),Me(qn,{open:!!ge.value,title:"删除确认",message:ge.value?"将删除工作记录「"+ge.value.content+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:S[17]||(S[17]=x=>ge.value=null),onConfirm:ce},null,8,["open","message"]),Me(qn,{open:U.value,title:"标记休假确认",message:"该日已有打卡记录,标记休假将清空上下班时间。是否继续?","confirm-text":"标记休假",danger:"",onCancel:S[18]||(S[18]=x=>U.value=!1),onConfirm:S[19]||(S[19]=x=>ne(!0))},null,8,["open"]),Me(sy,{open:!!de.value,item:de.value,projects:f.value,date:e.date,onCancel:S[20]||(S[20]=x=>de.value=null),onSave:ie},null,8,["open","item","projects","date"])]))}}),Pd=Ut(hg,[["__scopeId","data-v-de6fe794"]]),yg={class:"cal-page"},gg={class:"cal-toolbar"},bg={class:"cal-title num"},wg={class:"cal-head"},_g={class:"cal-grid"},kg=["title","onClick"],xg={class:"cal-marks"},Cg={key:0,class:"drawer"},$g={class:"drawer-head"},Sg={class:"drawer-body"},Eg=Ft({__name:"CalendarView",setup(e){const t=P(bt()),n=it(()=>Number(t.value.slice(0,4))),r=it(()=>Number(t.value.slice(5,7))-1),o=it(()=>n.value+" 年 "+(r.value+1)+" 月"),i=["一","二","三","四","五","六","日"],c=it(()=>{const T=(new Date(n.value,r.value,1).getDay()+6)%7,U=new Date(n.value,r.value+1,0).getDate(),J=[];for(let Y=0;Y[F.date,F])),ne=U[2],$=new Map;for(const F of c.value){if(!F.inMonth)continue;const ee=Xr(Y.get(F.date),F.date,J,F.date===v),Ie=ne.filter(Pe=>Pe.date===F.date);$.set(F.date,{status:ee.status,label:ee.label,location:((R=Y.get(F.date))==null?void 0:R.location)||"",hasLog:Ie.length>0,hasMilestone:Ie.some(Pe=>Pe.is_milestone===1)})}f.value=$}wt([n,r],y,{immediate:!0}),wt(ur,()=>{y()});function h(V){var T;return((T=f.value.get(V))==null?void 0:T.status)??""}function w(V){const T=f.value.get(V);return T?V+" · "+T.label+(T.location?" · "+T.location:""):V}function C(V){var T;return!!((T=f.value.get(V))!=null&&T.hasLog)}function O(V){var T;return!!((T=f.value.get(V))!=null&&T.hasMilestone)}function B(){t.value=ea(t.value,-1)}function te(){t.value=ea(t.value,1)}function se(){t.value=bt()}const ae=P(null);function re(V,T){T&&(ae.value=V)}return wt(Fi,V=>{V&&(t.value=V,ae.value=V,Fi.value=null)},{immediate:!0}),(V,T)=>(E(),A("div",yg,[l("div",gg,[l("button",{class:"icon-btn",onClick:B},[Me(et,{name:"chevron-left",size:16})]),l("span",bg,z(o.value),1),l("button",{class:"icon-btn",onClick:te},[Me(et,{name:"chevron-right",size:16})]),l("button",{class:"btn btn-sm",onClick:se},"回到今天")]),l("div",wg,[(E(),A(Ke,null,at(i,U=>l("span",{key:U,class:"cal-week muted"},z(U),1)),64))]),l("div",_g,[(E(!0),A(Ke,null,at(c.value,(U,J)=>(E(),A("button",{key:J,class:tt(["cal-cell",{blank:!U.inMonth,weekend:U.weekend,selected:ae.value===U.date}]),title:U.inMonth?w(U.date):void 0,onClick:Y=>re(U.date,U.inMonth)},[U.inMonth?(E(),A(Ke,{key:0},[l("span",{class:tt(["daynum num",{today:U.date===cn(v)}])},z(Number(U.date.slice(8,10))),3),l("span",xg,[h(U.date)?(E(),A("span",{key:0,class:tt(["dot",h(U.date)])},null,2)):we("",!0),C(U.date)?(E(),At(et,{key:1,name:"check-circle",size:12,class:"mark-log"})):we("",!0),O(U.date)?(E(),At(et,{key:2,name:"star",size:12,class:"mark-star"})):we("",!0)])],64)):we("",!0)],10,kg))),128))]),Me(lr,{name:"drawer"},{default:vs(()=>[ae.value?(E(),A("aside",Cg,[l("div",$g,[T[1]||(T[1]=l("span",{class:"drawer-title"},"当日详情",-1)),l("button",{class:"icon-btn",onClick:T[0]||(T[0]=U=>ae.value=null)},[Me(et,{name:"close",size:16})])]),l("div",Sg,[Me(Pd,{date:ae.value},null,8,["date"])])])):we("",!0)]),_:1})]))}}),Tg=Ut(Eg,[["__scopeId","data-v-2404dfbe"]]),Ag={class:"detail-page"},Pg={class:"detail-toolbar"},Og=["value"],Mg=["disabled"],Ig=Ft({__name:"TodayView",setup(e){const t=P(bt()),n=it(()=>t.value===bt());function r(){t.value=on(t.value,-1)}function o(){t.value=on(t.value,1)}function i(){t.value=bt()}function c(f){const v=f.target.value;v&&(t.value=v)}return(f,v)=>(E(),A("div",Ag,[l("div",Pg,[l("button",{class:"icon-btn",title:"前一天",onClick:r},[Me(et,{name:"chevron-left",size:16})]),l("span",{class:tt(["date-title num",{"is-today":n.value}])},z(cn(ud)(t.value)),3),l("button",{class:"icon-btn",title:"后一天",onClick:o},[Me(et,{name:"chevron-right",size:16})]),l("input",{type:"date",class:"input w-date",value:t.value,onChange:c},null,40,Og),l("button",{class:"btn btn-sm",disabled:n.value,onClick:i},"回到今天",8,Mg)]),Me(Pd,{date:t.value},null,8,["date"])]))}}),jg=Ut(Ig,[["__scopeId","data-v-76243d98"]]),Dg={class:"plan-page"},Lg={class:"card sec plan-head"},Kg={class:"nav-row"},Rg={class:"date-box"},Ng={class:"date-main num"},Fg={class:"muted date-sub num"},Vg={class:"muted sum-line"},Bg={class:"plan-list"},Ug={key:0,class:"card sec empty muted"},qg={class:"pi-time num"},Hg={class:"muted"},Wg={class:"pi-main"},zg={class:"pi-title"},Gg={class:"tag"},Yg={key:0,class:"state-done"},Jg={key:1,class:"state-skip"},Xg={key:0,class:"muted pi-note"},Qg={class:"muted pi-meta num"},Zg={key:0,class:"timer-live"},eb={class:"pi-ops"},tb=["onClick"],nb=["onClick"],sb=["onClick"],rb=["onClick"],ob=["onClick"],ab=["onClick"],ib={class:"dialog",role:"dialog","aria-label":"计划"},lb={class:"dialog-head"},ub={class:"dialog-title"},cb={class:"dialog-body"},db={class:"form-row"},fb={class:"form-row"},pb=["value"],vb={class:"form-row two"},mb={class:"form-row"},hb={key:0,class:"form-error"},yb={class:"dialog-btns"},gb=Ft({__name:"PlanView",setup(e){const t=P(bt()),n=P([]),r=P(!0),o=P(Date.now());let i=null;const c=it(()=>t.value===bt());async function f(){r.value=!0,n.value=await yh(t.value),r.value=!1}wt(t,f),wt(ur,f),an(()=>{f(),i=window.setInterval(()=>{o.value=Date.now()},3e4)}),Wn(()=>{i&&window.clearInterval(i)});function v(){t.value=on(t.value,-1)}function y(){t.value=on(t.value,1)}function h(){t.value=bt()}const w=it(()=>{const xe=n.value.length,me=n.value.filter(Ae=>Ae.status==="done").length,_e=n.value.reduce((Ae,pe)=>Ae+C(pe),0),We=n.value.reduce((Ae,pe)=>Ae+(pe.actual_minutes||0),0),Xe=B.value;if(Xe){const Ae=n.value.find(pe=>pe.id===Xe);Ae&&We+elapsedMinutes(Ae)}return{total:xe,done:me,plannedMin:_e,actualMin:We}});function C(xe){const[me,_e]=xe.start_time.split(":").map(Number),[We,Xe]=xe.end_time.split(":").map(Number);return Math.max(0,We*60+Xe-(me*60+_e))}function O(xe){return xe<60?xe+" 分钟":Math.floor(xe/60)+" 小时 "+xe%60+" 分"}const B=it(()=>{const xe=n.value.find(me=>!!me.timer_started_at);return xe?xe.id:null});function te(xe){if(!xe.timer_started_at)return xe.actual_minutes||0;const me=Math.max(0,Math.round((o.value-new Date(xe.timer_started_at).getTime())/6e4));return(xe.actual_minutes||0)+me}async function se(xe){xe.timer_started_at?(await yl(xe.id),He("已停止计时:"+xe.title)):(await kh(xe.id),He("开始计时:"+xe.title)),await f()}async function ae(xe,me){await _h(xe.id,me),await f()}const re=P(!1),V=P(null),T=P(""),U=P("学习"),J=P("09:00"),Y=P("10:00"),ne=P(""),$=P(""),R=["学习","健身","自律","工作","阅读","其他"];function F(){V.value=null,T.value="",U.value="学习",J.value="09:00",Y.value="10:00",ne.value="",$.value="",re.value=!0}function ee(xe){V.value=xe.id,T.value=xe.title,U.value=xe.kind,J.value=xe.start_time,Y.value=xe.end_time,ne.value=xe.note||"",$.value="",re.value=!0}async function Ie(){if(!T.value.trim()){$.value="请填写计划内容";return}if(Y.value<=J.value){$.value="结束时间需晚于开始时间";return}V.value?(await bh(V.value,{title:T.value.trim(),kind:U.value,start_time:J.value,end_time:Y.value,note:ne.value}),He("计划已更新")):(await gh({date:t.value,start_time:J.value,end_time:Y.value,title:T.value,kind:U.value,note:ne.value}),He("计划已添加")),re.value=!1,await f()}async function Pe(xe){await wh(xe.id),He("已删除"),await f()}const ke=["周日","周一","周二","周三","周四","周五","周六"];function Re(xe){return ke[Rs(xe).getDay()]}return(xe,me)=>(E(),A("div",Dg,[l("div",Lg,[l("div",Kg,[l("button",{class:"icon-btn",onClick:v},[Me(et,{name:"chevron-left",size:16})]),l("div",Rg,[l("span",Ng,z(t.value.slice(5))+" "+z(Re(t.value)),1),l("span",Fg,z(t.value),1)]),l("button",{class:"icon-btn",onClick:y},[Me(et,{name:"chevron-right",size:16})]),l("button",{class:tt(["btn btn-sm",{"btn-primary":!c.value}]),onClick:h},"今天",2),me[9]||(me[9]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-primary btn-sm",onClick:F},[Me(et,{name:"plus",size:14}),me[8]||(me[8]=Pt(" 添加计划",-1))])]),l("div",Vg,[Pt(" 共 "+z(w.value.total)+" 项 · 完成 "+z(w.value.done)+" 项 · 计划 "+z(O(w.value.plannedMin))+" · 实际投入 "+z(O(w.value.actualMin))+" ",1),B.value?(E(),A(Ke,{key:0},[me[10]||(me[10]=Pt(" · ",-1)),me[11]||(me[11]=l("span",{class:"timer-live"},"计时中",-1))],64)):we("",!0)])]),l("div",Bg,[!r.value&&!n.value.length?(E(),A("div",Ug," 今天还没有计划,点右上角「添加计划」开始规划:学习、健身、自律…… ")):we("",!0),(E(!0),A(Ke,null,at(n.value,_e=>(E(),A("div",{key:_e.id,class:tt(["card sec plan-item",{done:_e.status==="done",skip:_e.status==="skip",running:!!_e.timer_started_at}])},[l("div",qg,[Pt(z(_e.start_time),1),l("span",Hg," - "+z(_e.end_time),1)]),l("div",Wg,[l("div",zg,[l("span",Gg,z(_e.kind),1),l("span",{class:tt(["pi-text",{strike:_e.status==="done"}])},z(_e.title),3),_e.status==="done"?(E(),A("span",Yg,"已完成")):_e.status==="skip"?(E(),A("span",Jg,"已跳过")):we("",!0)]),_e.note?(E(),A("div",Xg,z(_e.note),1)):we("",!0),l("div",Qg,[_e.timer_started_at?(E(),A("span",Zg,"计时中 · 已 "+z(te(_e))+" 分钟",1)):_e.actual_minutes>0?(E(),A(Ke,{key:1},[Pt("实际投入 "+z(_e.actual_minutes)+" 分钟",1)],64)):we("",!0)])]),l("div",eb,[_e.status!=="done"?(E(),A("button",{key:0,class:tt(["btn btn-xs",{"timer-on":!!_e.timer_started_at}]),onClick:We=>se(_e)},z(_e.timer_started_at?"停止计时":"计时"),11,tb)):we("",!0),_e.status!=="done"?(E(),A("button",{key:1,class:"btn btn-xs",onClick:We=>ae(_e,"done")},"完成",8,nb)):we("",!0),_e.status==="todo"?(E(),A("button",{key:2,class:"btn btn-xs",onClick:We=>ae(_e,"skip")},"跳过",8,sb)):we("",!0),_e.status!=="todo"?(E(),A("button",{key:3,class:"btn btn-xs",onClick:We=>ae(_e,"todo")},"恢复",8,rb)):we("",!0),l("button",{class:"icon-btn",title:"编辑",onClick:We=>ee(_e)},[Me(et,{name:"edit",size:14})],8,ob),l("button",{class:"icon-btn",title:"删除",onClick:We=>Pe(_e)},[Me(et,{name:"close",size:14})],8,ab)])],2))),128))]),(E(),At(cs,{to:"body"},[re.value?(E(),A("div",{key:0,class:"fixed-mask",onClick:me[7]||(me[7]=en(_e=>re.value=!1,["self"]))},[l("div",ib,[l("div",lb,[l("span",ub,z(V.value?"编辑计划":"添加计划"),1),l("button",{class:"icon-btn",onClick:me[0]||(me[0]=_e=>re.value=!1)},[Me(et,{name:"close",size:16})])]),l("div",cb,[l("div",db,[me[12]||(me[12]=l("label",null,"计划内容(学什么、做什么)",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":me[1]||(me[1]=_e=>T.value=_e),placeholder:"如:产品文档第三章 / 晨跑 5 公里",onKeydown:Et(Ie,["enter"])},null,544),[[Fe,T.value]])]),l("div",fb,[me[13]||(me[13]=l("label",null,"类别",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":me[2]||(me[2]=_e=>U.value=_e)},[(E(),A(Ke,null,at(R,_e=>l("option",{key:_e,value:_e},z(_e),9,pb)),64))],512),[[Pn,U.value]])]),l("div",vb,[l("div",null,[me[14]||(me[14]=l("label",null,"开始时间",-1)),Oe(l("input",{class:"input",type:"time","onUpdate:modelValue":me[3]||(me[3]=_e=>J.value=_e)},null,512),[[Fe,J.value]])]),l("div",null,[me[15]||(me[15]=l("label",null,"结束时间",-1)),Oe(l("input",{class:"input",type:"time","onUpdate:modelValue":me[4]||(me[4]=_e=>Y.value=_e)},null,512),[[Fe,Y.value]])])]),l("div",mb,[me[16]||(me[16]=l("label",null,"备注(选填)",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":me[5]||(me[5]=_e=>ne.value=_e),placeholder:"目标、资料、提醒等",onKeydown:Et(Ie,["enter"])},null,544),[[Fe,ne.value]])]),$.value?(E(),A("div",hb,z($.value),1)):we("",!0)]),l("div",yb,[l("button",{class:"btn btn-sm",onClick:me[6]||(me[6]=_e=>re.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:Ie},z(V.value?"保存":"添加"),1)])])])):we("",!0)]))]))}}),bb=Ut(gb,[["__scopeId","data-v-dd89fae2"]]),wb={class:"stats"},_b={class:"cards"},kb={class:"card stat-card"},xb={class:"stat-num num"},Cb={class:"card stat-card"},$b={class:"stat-num num"},Sb={class:"card stat-card"},Eb={class:"stat-num num"},Tb={class:"card stat-card"},Ab={class:"stat-num num"},Pb={class:"card section"},Ob={class:"heat"},Mb=["title"],Ib={class:"two-col"},jb={class:"card section"},Db={class:"bar-label"},Lb={class:"bar-track"},Kb={class:"muted num bar-num"},Rb={key:0,class:"muted"},Nb={class:"card section"},Fb={class:"bar-label"},Vb={class:"bar-track"},Bb={class:"muted num bar-num"},Ub={key:0,class:"muted"},qb={class:"card section"},Hb={class:"bar-label loc-label"},Wb={class:"bar-track"},zb={class:"muted num bar-num"},Gb={key:0,class:"muted"},Yb=Ft({__name:"StatsView",setup(e){const t=P({attendDays:0,totalHours:"0",itemCount:0,streak:0}),n=P([]),r=P([]),o=P([]),i=P([]);async function c(){const y=bt(),h="2000-01-01",w=await Promise.all([Ks(),Ca(h,y),Hr(h,y),nr(!0)]),C=w[0],O=w[1],B=w[2],te=w[3],se=O.filter(ke=>ke.clock_in_at||ke.kind==="makeup");let ae=0;for(const ke of se){const Re=Xr(ke,ke.date,C,ke.date===y);ae+=Re.workedMinutes??0}const re=new Set(B.map(ke=>ke.date));let V=0,T=y;for(re.has(T)||(T=on(y,-1));re.has(T);)V++,T=on(T,-1);t.value={attendDays:se.length,totalHours:(ae/60).toFixed(1),itemCount:B.length,streak:V};const U=new Map;for(const ke of se){const Re=ke.location||"未记录";U.set(Re,(U.get(Re)||0)+1)}i.value=Array.from(U.entries()).map(ke=>({name:ke[0],count:ke[1],percent:Math.round(ke[1]/(se.length||1)*100)})).sort((ke,Re)=>Re.count-ke.count);const J=B.length||1,Y=await Jr(),ne=new Map;for(const ke of B)ne.set(ke.category,(ne.get(ke.category)||0)+1);const $=new Set(Y);for(const ke of ne.keys())$.has(ke)||Y.push(ke);r.value=Y.map(ke=>{const Re=ne.get(ke)||0;return{key:ke,label:ke,count:Re,percent:Math.round(Re/J*100)}}).filter(ke=>ke.count>0).sort((ke,Re)=>Re.count-ke.count);const R=new Map(te.map(ke=>[ke.id,ke.name])),F=new Map;for(const ke of B){const Re=ke.project_id?R.get(ke.project_id)||"已删除项目":"无项目";F.set(Re,(F.get(Re)||0)+1)}o.value=Array.from(F.entries()).map(ke=>({name:ke[0],count:ke[1],percent:Math.round(ke[1]/J*100)})).sort((ke,Re)=>Re.count-ke.count);const ee=new Map;for(const ke of B)ee.set(ke.date,(ee.get(ke.date)||0)+1);const Ie=Qs(y),Pe=[];for(let ke=11;ke>=0;ke--){const Re=on(Ie,-7*ke),xe=[];for(let me=0;me<7;me++){const _e=on(Re,me);xe.push({date:_e,count:ee.get(_e)||0})}Pe.push(xe)}n.value=Pe}an(async()=>{await c()}),wt(ur,()=>{c()});function f(y){return y===0?0:y===1?1:y<=3?2:y<=5?3:4}function v(y,h){return y+" · "+(h?h+" 条":"无记录")}return(y,h)=>(E(),A("div",wb,[l("div",_b,[l("div",kb,[h[0]||(h[0]=l("div",{class:"muted"},"出勤天数",-1)),l("div",xb,z(t.value.attendDays),1)]),l("div",Cb,[h[1]||(h[1]=l("div",{class:"muted"},"累计工时(小时)",-1)),l("div",$b,z(t.value.totalHours),1)]),l("div",Sb,[h[2]||(h[2]=l("div",{class:"muted"},"记录条数",-1)),l("div",Eb,z(t.value.itemCount),1)]),l("div",Tb,[h[3]||(h[3]=l("div",{class:"muted"},"连续记录(天)",-1)),l("div",Ab,z(t.value.streak),1)])]),l("div",Pb,[h[4]||(h[4]=l("div",{class:"section-title"},"记录热力图(近 12 周)",-1)),l("div",Ob,[(E(!0),A(Ke,null,at(n.value,(w,C)=>(E(),A("div",{key:C,class:"heat-col"},[(E(!0),A(Ke,null,at(w,O=>(E(),A("span",{key:O.date,class:tt(["heat-cell","lv"+f(O.count)]),title:v(O.date,O.count)},null,10,Mb))),128))]))),128))]),h[5]||(h[5]=Hp('
少多
',1))]),l("div",Ib,[l("div",jb,[h[6]||(h[6]=l("div",{class:"section-title"},"分类分布",-1)),(E(!0),A(Ke,null,at(r.value,w=>(E(),A("div",{key:w.key,class:"bar-row"},[l("span",Db,z(w.label),1),l("span",Lb,[l("span",{class:"bar-fill",style:as({width:w.percent+"%"})},null,4)]),l("span",Kb,z(w.count)+" 条 · "+z(w.percent)+"%",1)]))),128)),r.value.length?we("",!0):(E(),A("div",Rb,"暂无数据"))]),l("div",Nb,[h[7]||(h[7]=l("div",{class:"section-title"},"项目投入",-1)),(E(!0),A(Ke,null,at(o.value,w=>(E(),A("div",{key:w.name,class:"bar-row"},[l("span",Fb,z(w.name),1),l("span",Vb,[l("span",{class:"bar-fill",style:as({width:w.percent+"%"})},null,4)]),l("span",Bb,z(w.count)+" 条 · "+z(w.percent)+"%",1)]))),128)),o.value.length?we("",!0):(E(),A("div",Ub,"暂无数据"))])]),l("div",qb,[h[8]||(h[8]=l("div",{class:"section-title"},"地点分布(按出勤天)",-1)),(E(!0),A(Ke,null,at(i.value,w=>(E(),A("div",{key:w.name,class:"bar-row"},[l("span",Hb,z(w.name),1),l("span",Wb,[l("span",{class:"bar-fill",style:as({width:w.percent+"%"})},null,4)]),l("span",zb,z(w.count)+" 天 · "+z(w.percent)+"%",1)]))),128)),i.value.length?we("",!0):(E(),A("div",Gb,"暂无数据"))])]))}}),Jb=Ut(Yb,[["__scopeId","data-v-f8410651"]]);async function Xb(e,t,n){const r=bt(),o=await Promise.all([Ks(),Ca(e,t),Hr(e,t),nr(!0),hh(e,t),Jr()]),i=o[0],c=o[1],f=o[2],v=o[3],y=o[4],h=o[5];let w=0,C=0,O=0;for(const F of c){(F.clock_in_at||F.kind==="makeup")&&w++,F.kind==="makeup"&&O++;const ee=Xr(F,F.date,i,F.date===r);C+=ee.workedMinutes??0}const B=new Map;for(const F of c){if(!(F.clock_in_at||F.kind==="makeup"))continue;const ee=F.location||"未记录";B.set(ee,(B.get(ee)||0)+1)}const te=Array.from(B.entries()).map(F=>({name:F[0],count:F[1]})).sort((F,ee)=>ee.count-F.count),se=f.length||1,ae=new Map;for(const F of f)ae.set(F.category,(ae.get(F.category)||0)+1);const re=new Set(h);for(const F of ae.keys())re.has(F)||h.push(F);const V=h.map(F=>{const ee=ae.get(F)||0;return{key:F,label:F,count:ee,percent:Math.round(ee/se*100)}}).filter(F=>F.count>0).sort((F,ee)=>ee.count-F.count),T=new Map(v.map(F=>[F.id,F.name])),U=new Map;for(const F of f){const ee=F.project_id?T.get(F.project_id)||"已删除项目":"无项目";U.set(ee,(U.get(ee)||0)+1)}const J=Array.from(U.entries()).map(F=>({name:F[0],count:F[1]})).sort((F,ee)=>ee.count-F.count),Y=f.filter(F=>F.is_milestone===1).map(F=>({date:F.date,content:F.content})),ne=f.filter(F=>F.needs_followup===1).map(F=>({date:F.date,content:F.content,remark:F.remark||""})),$=f.filter(F=>!!F.takeaway).map(F=>({date:F.date,text:F.takeaway})),R=y.map(F=>({weekStart:F.week_start,highlights:F.highlights||"",challenges:F.challenges||"",plan_next:F.plan_next||""}));return{range:{start:e,end:t,label:n},attendDays:w,totalHours:(C/60).toFixed(1),makeupCount:O,leaveCount:c.filter(F=>F.kind==="leave").length,itemCount:f.length,categoryStats:V,projectStats:J,locationStats:te,milestones:Y,followups:ne,takeaways:$,weekNotes:R}}function Qb(e){const t=[];t.push("# 实习工作总结("+e.range.start+" ~ "+e.range.end+")"),t.push(""),t.push("## 一、考勤概况"),t.push(""),t.push("出勤 "+e.attendDays+" 天,累计工时 "+e.totalHours+" 小时,补卡 "+e.makeupCount+" 次"+(e.leaveCount?",请假 "+e.leaveCount+" 天":""));const n=e.locationStats.filter(r=>r.name!=="未记录");n.length&&t.push("其中:"+n.map(r=>r.name+" "+r.count+" 天").join(",")),t.push(""),t.push("## 二、工作内容分布"),t.push(""),t.push(e.categoryStats.length?e.categoryStats.map(r=>r.label+" "+r.percent+"%("+r.count+" 条)").join(","):"(无记录)"),t.push(""),t.push("## 三、项目投入"),t.push(""),t.push(e.projectStats.length?e.projectStats.map(r=>r.name+" "+r.count+" 条").join(","):"(无记录)"),t.push(""),t.push("## 四、主要成果"),t.push(""),e.milestones.length?e.milestones.forEach((r,o)=>t.push(o+1+". 【成果】"+r.content+"("+r.date+")")):t.push("(无)"),t.push(""),t.push("## 五、待跟进事项"),t.push(""),e.followups.length?e.followups.forEach(r=>t.push("- 【待跟进】"+r.content+(r.remark?"("+r.date+" 备注:"+r.remark+")":"("+r.date+")"))):t.push("(无)"),t.push(""),t.push("## 六、学习与成长"),t.push(""),e.takeaways.length?e.takeaways.forEach(r=>t.push("- "+r.text+"("+r.date+")")):t.push("(无)");for(const r of e.weekNotes)t.push(""),t.push("### 周记("+r.weekStart+" 起)"),t.push(""),t.push("- 本周亮点:"+(r.highlights||"(无)")),t.push("- 踩的坑:"+(r.challenges||"(无)")),t.push("- 下周计划:"+(r.plan_next||"(无)"));return t.push(""),t.join(` -`)}const Zb="modulepreload",ew=function(e,t){return new URL(e,t).href},Vu={},Od=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const c=document.getElementsByTagName("link"),f=document.querySelector("meta[property=csp-nonce]"),v=(f==null?void 0:f.nonce)||(f==null?void 0:f.getAttribute("nonce"));o=Promise.allSettled(n.map(y=>{if(y=ew(y,r),y in Vu)return;Vu[y]=!0;const h=y.endsWith(".css"),w=h?'[rel="stylesheet"]':"";if(!!r)for(let B=c.length-1;B>=0;B--){const te=c[B];if(te.href===y&&(!h||te.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${y}"]${w}`))return;const O=document.createElement("link");if(O.rel=h?"stylesheet":Zb,h||(O.as="script"),O.crossOrigin="",O.href=y,v&&O.setAttribute("nonce",v),document.head.appendChild(O),h)return new Promise((B,te)=>{O.addEventListener("load",B),O.addEventListener("error",()=>te(new Error(`Unable to preload CSS for ${y}`)))})}))}function i(c){const f=new Event("vite:preloadError",{cancelable:!0});if(f.payload=c,window.dispatchEvent(f),!f.defaultPrevented)throw c}return o.then(c=>{for(const f of c||[])f.status==="rejected"&&i(f.reason);return t().catch(i)})};/*! Capacitor: https://capacitorjs.com/ - MIT License */const tw=e=>{const t=new Map;t.set("web",{name:"web"});const n=e.CapacitorPlatforms||{currentPlatform:{name:"web"},platforms:t},r=(i,c)=>{n.platforms.set(i,c)},o=i=>{n.platforms.has(i)&&(n.currentPlatform=n.platforms.get(i))};return n.addPlatform=r,n.setPlatform=o,n},nw=e=>e.CapacitorPlatforms=tw(e),Md=nw(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});Md.addPlatform;Md.setPlatform;var or;(function(e){e.Unimplemented="UNIMPLEMENTED",e.Unavailable="UNAVAILABLE"})(or||(or={}));class gi extends Error{constructor(t,n,r){super(t),this.message=t,this.code=n,this.data=r}}const sw=e=>{var t,n;return e!=null&&e.androidBridge?"android":!((n=(t=e==null?void 0:e.webkit)===null||t===void 0?void 0:t.messageHandlers)===null||n===void 0)&&n.bridge?"ios":"web"},rw=e=>{var t,n,r,o,i;const c=e.CapacitorCustomPlatform||null,f=e.Capacitor||{},v=f.Plugins=f.Plugins||{},y=e.CapacitorPlatforms,h=()=>c!==null?c.name:sw(e),w=((t=y==null?void 0:y.currentPlatform)===null||t===void 0?void 0:t.getPlatform)||h,C=()=>w()!=="web",O=((n=y==null?void 0:y.currentPlatform)===null||n===void 0?void 0:n.isNativePlatform)||C,B=Y=>{const ne=T.get(Y);return!!(ne!=null&&ne.platforms.has(w())||ae(Y))},te=((r=y==null?void 0:y.currentPlatform)===null||r===void 0?void 0:r.isPluginAvailable)||B,se=Y=>{var ne;return(ne=f.PluginHeaders)===null||ne===void 0?void 0:ne.find($=>$.name===Y)},ae=((o=y==null?void 0:y.currentPlatform)===null||o===void 0?void 0:o.getPluginHeader)||se,re=Y=>e.console.error(Y),V=(Y,ne,$)=>Promise.reject(`${$} does not have an implementation of "${ne}".`),T=new Map,U=(Y,ne={})=>{const $=T.get(Y);if($)return console.warn(`Capacitor plugin "${Y}" already registered. Cannot register plugins twice.`),$.proxy;const R=w(),F=ae(Y);let ee;const Ie=async()=>(!ee&&R in ne?ee=typeof ne[R]=="function"?ee=await ne[R]():ee=ne[R]:c!==null&&!ee&&"web"in ne&&(ee=typeof ne.web=="function"?ee=await ne.web():ee=ne.web),ee),Pe=(We,Xe)=>{var Ae,pe;if(F){const Ne=F==null?void 0:F.methods.find(dt=>Xe===dt.name);if(Ne)return Ne.rtype==="promise"?dt=>f.nativePromise(Y,Xe.toString(),dt):(dt,je)=>f.nativeCallback(Y,Xe.toString(),dt,je);if(We)return(Ae=We[Xe])===null||Ae===void 0?void 0:Ae.bind(We)}else{if(We)return(pe=We[Xe])===null||pe===void 0?void 0:pe.bind(We);throw new gi(`"${Y}" plugin is not implemented on ${R}`,or.Unimplemented)}},ke=We=>{let Xe;const Ae=(...pe)=>{const Ne=Ie().then(dt=>{const je=Pe(dt,We);if(je){const fe=je(...pe);return Xe=fe==null?void 0:fe.remove,fe}else throw new gi(`"${Y}.${We}()" is not implemented on ${R}`,or.Unimplemented)});return We==="addListener"&&(Ne.remove=async()=>Xe()),Ne};return Ae.toString=()=>`${We.toString()}() { [capacitor code] }`,Object.defineProperty(Ae,"name",{value:We,writable:!1,configurable:!1}),Ae},Re=ke("addListener"),xe=ke("removeListener"),me=(We,Xe)=>{const Ae=Re({eventName:We},Xe),pe=async()=>{const dt=await Ae;xe({eventName:We,callbackId:dt},Xe)},Ne=new Promise(dt=>Ae.then(()=>dt({remove:pe})));return Ne.remove=async()=>{console.warn("Using addListener() without 'await' is deprecated."),await pe()},Ne},_e=new Proxy({},{get(We,Xe){switch(Xe){case"$$typeof":return;case"toJSON":return()=>({});case"addListener":return F?me:Re;case"removeListener":return xe;default:return ke(Xe)}}});return v[Y]=_e,T.set(Y,{name:Y,proxy:_e,platforms:new Set([...Object.keys(ne),...F?[R]:[]])}),_e},J=((i=y==null?void 0:y.currentPlatform)===null||i===void 0?void 0:i.registerPlugin)||U;return f.convertFileSrc||(f.convertFileSrc=Y=>Y),f.getPlatform=w,f.handleError=re,f.isNativePlatform=O,f.isPluginAvailable=te,f.pluginMethodNoop=V,f.registerPlugin=J,f.Exception=gi,f.DEBUG=!!f.DEBUG,f.isLoggingEnabled=!!f.isLoggingEnabled,f.platform=f.getPlatform(),f.isNative=f.isNativePlatform(),f},ow=e=>e.Capacitor=rw(e),ar=ow(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Id=ar.registerPlugin;ar.Plugins;class jd{constructor(t){this.listeners={},this.retainedEventArguments={},this.windowListeners={},t&&(console.warn(`Capacitor WebPlugin "${t.name}" config object was deprecated in v3 and will be removed in v4.`),this.config=t)}addListener(t,n){let r=!1;this.listeners[t]||(this.listeners[t]=[],r=!0),this.listeners[t].push(n);const i=this.windowListeners[t];i&&!i.registered&&this.addWindowListener(i),r&&this.sendRetainedArgumentsForEvent(t);const c=async()=>this.removeListener(t,n);return Promise.resolve({remove:c})}async removeAllListeners(){this.listeners={};for(const t in this.windowListeners)this.removeWindowListener(this.windowListeners[t]);this.windowListeners={}}notifyListeners(t,n,r){const o=this.listeners[t];if(!o){if(r){let i=this.retainedEventArguments[t];i||(i=[]),i.push(n),this.retainedEventArguments[t]=i}return}o.forEach(i=>i(n))}hasListeners(t){return!!this.listeners[t].length}registerWindowListener(t,n){this.windowListeners[n]={registered:!1,windowEventName:t,pluginEventName:n,handler:r=>{this.notifyListeners(n,r)}}}unimplemented(t="not implemented"){return new ar.Exception(t,or.Unimplemented)}unavailable(t="not available"){return new ar.Exception(t,or.Unavailable)}async removeListener(t,n){const r=this.listeners[t];if(!r)return;const o=r.indexOf(n);this.listeners[t].splice(o,1),this.listeners[t].length||this.removeWindowListener(this.windowListeners[t])}addWindowListener(t){window.addEventListener(t.windowEventName,t.handler),t.registered=!0}removeWindowListener(t){t&&(window.removeEventListener(t.windowEventName,t.handler),t.registered=!1)}sendRetainedArgumentsForEvent(t){const n=this.retainedEventArguments[t];n&&(delete this.retainedEventArguments[t],n.forEach(r=>{this.notifyListeners(t,r)}))}}const Bu=e=>encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape),Uu=e=>e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent);class aw extends jd{async getCookies(){const t=document.cookie,n={};return t.split(";").forEach(r=>{if(r.length<=0)return;let[o,i]=r.replace(/=/,"CAP_COOKIE").split("CAP_COOKIE");o=Uu(o).trim(),i=Uu(i).trim(),n[o]=i}),n}async setCookie(t){try{const n=Bu(t.key),r=Bu(t.value),o=`; expires=${(t.expires||"").replace("expires=","")}`,i=(t.path||"/").replace("path=",""),c=t.url!=null&&t.url.length>0?`domain=${t.url}`:"";document.cookie=`${n}=${r||""}${o}; path=${i}; ${c};`}catch(n){return Promise.reject(n)}}async deleteCookie(t){try{document.cookie=`${t.key}=; Max-Age=0`}catch(n){return Promise.reject(n)}}async clearCookies(){try{const t=document.cookie.split(";")||[];for(const n of t)document.cookie=n.replace(/^ +/,"").replace(/=.*/,`=;expires=${new Date().toUTCString()};path=/`)}catch(t){return Promise.reject(t)}}async clearAllCookies(){try{await this.clearCookies()}catch(t){return Promise.reject(t)}}}Id("CapacitorCookies",{web:()=>new aw});const iw=async e=>new Promise((t,n)=>{const r=new FileReader;r.onload=()=>{const o=r.result;t(o.indexOf(",")>=0?o.split(",")[1]:o)},r.onerror=o=>n(o),r.readAsDataURL(e)}),lw=(e={})=>{const t=Object.keys(e);return Object.keys(e).map(o=>o.toLocaleLowerCase()).reduce((o,i,c)=>(o[i]=e[t[c]],o),{})},uw=(e,t=!0)=>e?Object.entries(e).reduce((r,o)=>{const[i,c]=o;let f,v;return Array.isArray(c)?(v="",c.forEach(y=>{f=t?encodeURIComponent(y):y,v+=`${i}=${f}&`}),v.slice(0,-1)):(f=t?encodeURIComponent(c):c,v=`${i}=${f}`),`${r}&${v}`},"").substr(1):null,cw=(e,t={})=>{const n=Object.assign({method:e.method||"GET",headers:e.headers},t),o=lw(e.headers)["content-type"]||"";if(typeof e.data=="string")n.body=e.data;else if(o.includes("application/x-www-form-urlencoded")){const i=new URLSearchParams;for(const[c,f]of Object.entries(e.data||{}))i.set(c,f);n.body=i.toString()}else if(o.includes("multipart/form-data")||e.data instanceof FormData){const i=new FormData;if(e.data instanceof FormData)e.data.forEach((f,v)=>{i.append(v,f)});else for(const f of Object.keys(e.data))i.append(f,e.data[f]);n.body=i;const c=new Headers(n.headers);c.delete("content-type"),n.headers=c}else(o.includes("application/json")||typeof e.data=="object")&&(n.body=JSON.stringify(e.data));return n};class dw extends jd{async request(t){const n=cw(t,t.webFetchExtra),r=uw(t.params,t.shouldEncodeUrlParams),o=r?`${t.url}?${r}`:t.url,i=await fetch(o,n),c=i.headers.get("content-type")||"";let{responseType:f="text"}=i.ok?t:{};c.includes("application/json")&&(f="json");let v,y;switch(f){case"arraybuffer":case"blob":y=await i.blob(),v=await iw(y);break;case"json":v=await i.json();break;case"document":case"text":default:v=await i.text()}const h={};return i.headers.forEach((w,C)=>{h[C]=w}),{data:v,headers:h,status:i.status,url:i.url}}async get(t){return this.request(Object.assign(Object.assign({},t),{method:"GET"}))}async post(t){return this.request(Object.assign(Object.assign({},t),{method:"POST"}))}async put(t){return this.request(Object.assign(Object.assign({},t),{method:"PUT"}))}async patch(t){return this.request(Object.assign(Object.assign({},t),{method:"PATCH"}))}async delete(t){return this.request(Object.assign(Object.assign({},t),{method:"DELETE"}))}}Id("CapacitorHttp",{web:()=>new dw});async function gl(e,t){const n=window;if(n.electronAPI&&n.electronAPI.saveFile){const c=await n.electronAPI.saveFile(e,t);return c&&c.saved?c.path:""}if(ar.isNativePlatform()){const{Filesystem:c,Directory:f,Encoding:v}=await Od(async()=>{const{Filesystem:y,Directory:h,Encoding:w}=await import("./index-NiysaoXd.js");return{Filesystem:y,Directory:h,Encoding:w}},[],import.meta.url);try{return(await c.writeFile({path:e,data:t,directory:f.Documents,encoding:v.UTF8,recursive:!0})).uri}catch{return(await c.writeFile({path:e,data:t,directory:f.Cache,encoding:v.UTF8,recursive:!0})).uri}}const r=new Blob([t],{type:"text/plain;charset=utf-8"}),o=URL.createObjectURL(r),i=document.createElement("a");return i.href=o,i.download=e,i.click(),window.setTimeout(()=>URL.revokeObjectURL(o),1e4),""}const fw=Object.freeze(Object.defineProperty({__proto__:null,downloadText:gl},Symbol.toStringTag,{value:"Module"}));async function Wi(e){try{await navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}}async function pw(e){const t=await Promise.all([Ct("ai_base_url",""),Ct("ai_api_key",""),Ct("ai_model","")]),n=t[0].trim().replace(/\/+$/,""),r=t[1].trim(),o=t[2].trim();if(!n||!o)throw new Error("请先在设置页配置 AI 接口地址与模型名称");const i=n+"/chat/completions",c={"Content-Type":"application/json"};r&&(c.Authorization="Bearer "+r);const v=JSON.stringify({model:o,messages:[{role:"system",content:"你是一名严谨的中文助理。请将用户提供的工作总结 Markdown 草稿润色为通顺、专业、简洁的工作总结。要求:保留原有章节结构与全部事实数据(数字、日期、条目),不得虚构或遗漏内容,只输出 Markdown 正文。"},{role:"user",content:e}],temperature:.3});let y;try{y=await fetch(i,{method:"POST",headers:c,body:v})}catch{throw new Error("无法访问 AI 接口:请检查地址是否正确、服务端是否允许浏览器跨域访问")}if(!y.ok){let C="接口返回 "+y.status;try{const O=await y.json();O&&O.error&&O.error.message&&(C+=":"+O.error.message)}catch{}throw new Error(C)}const h=await y.json(),w=h&&h.choices&&h.choices[0]&&h.choices[0].message&&h.choices[0].message.content;if(!w)throw new Error("接口未返回内容");return String(w)}const vw={class:"report"},mw={class:"report-toolbar"},hw={class:"seg"},yw=["onClick"],gw=["disabled"],bw=["disabled"],ww={key:0,class:"ai-error"},_w={class:"report-grid"},kw={class:"report-left"},xw={class:"card section"},Cw={class:"section-title"},$w={class:"muted note-saved"},Sw={class:"card section"},Ew={class:"report-right"},Tw={key:0,class:"card section"},Aw={class:"sum-row"},Pw={class:"num"},Ow={class:"sum-row"},Mw={class:"num"},Iw={class:"sum-row"},jw={class:"num"},Dw={class:"sum-row"},Lw={class:"num"},Kw={class:"sum-row"},Rw={class:"num"},Nw={class:"muted"},Fw={class:"num"},Vw={key:0,class:"muted sum-empty"},Bw={class:"muted"},Uw={key:1,class:"muted sum-empty"},qw={class:"muted"},Hw={key:2,class:"muted sum-empty"},Ww={class:"muted"},zw={key:3,class:"muted sum-empty"},Gw=Ft({__name:"ReportView",setup(e){const t=[{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"all",label:"全部"},{key:"custom",label:"自定义"}],n=P("week"),r=P(Qs(bt())),o=P(bt()),i=P(null),c=P(""),f=P(!1),v=P(!1),y=P(null),h=P(""),w=P(Qs(bt())),C=P(""),O=P(""),B=P(""),te=P(!1);async function se(){const ne=await hl(w.value);C.value=(ne==null?void 0:ne.highlights)||"",O.value=(ne==null?void 0:ne.challenges)||"",B.value=(ne==null?void 0:ne.plan_next)||"",te.value=!1}async function ae(){await mh(w.value,{highlights:C.value.trim()||null,challenges:O.value.trim()||null,plan_next:B.value.trim()||null}),te.value=!0,await V()}function re(ne){const $=bt();if(ne==="week"){const R=Qs($);return{start:R,end:on(R,6),label:"本周"}}if(ne==="month"){const R=$.slice(0,7);return{start:R+"-01",end:$,label:R+" 本月"}}return ne==="all"?{start:"2000-01-01",end:$,label:"全部实习期"}:{start:r.value,end:o.value,label:r.value+" ~ "+o.value}}async function V(){f.value=!0;const ne=re(n.value),$=await Xb(ne.start,ne.end,ne.label);i.value=$,c.value=Qb($),f.value=!1}wt(n,V),wt([r,o],()=>{n.value==="custom"&&V()}),an(async()=>{await se(),await V()});async function T(){const ne=bt().replace(/-/g,""),$=await gl("实习工作总结_"+ne+".md",c.value);He($?"总结已导出到:"+$:"总结已导出到系统下载目录")}async function U(){await Wi(c.value),He("总结已复制到剪贴板")}async function J(){if(v.value)return;h.value="";const ne=c.value.trim();if(!ne){h.value="当前草稿为空,无法润色";return}v.value=!0;try{y.value=c.value,c.value=await pw(ne),He("AI 润色完成")}catch($){y.value=null,h.value=$ instanceof Error?$.message:"润色失败"}v.value=!1}function Y(){y.value!==null&&(c.value=y.value),y.value=null}return(ne,$)=>(E(),A("div",vw,[l("div",mw,[l("div",hw,[(E(),A(Ke,null,at(t,R=>l("button",{key:R.key,class:tt(["seg-btn",{active:n.value===R.key}]),onClick:F=>n.value=R.key},z(R.label),11,yw)),64))]),n.value==="custom"?(E(),A(Ke,{key:0},[Oe(l("input",{type:"date",class:"input w-date","onUpdate:modelValue":$[0]||($[0]=R=>r.value=R)},null,512),[[Fe,r.value]]),$[6]||($[6]=l("span",{class:"muted"},"至",-1)),Oe(l("input",{type:"date",class:"input w-date","onUpdate:modelValue":$[1]||($[1]=R=>o.value=R)},null,512),[[Fe,o.value]])],64)):we("",!0),$[10]||($[10]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-sm",disabled:v.value,onClick:J},[Me(et,{name:"edit",size:14}),$[7]||($[7]=Pt("AI 润色 ",-1))],8,gw),y.value!==null?(E(),A("button",{key:1,class:"btn btn-sm",onClick:Y},"还原润色前")):we("",!0),l("button",{class:"btn btn-sm",disabled:f.value,onClick:V},[Me(et,{name:"edit",size:14}),$[8]||($[8]=Pt("重新生成 ",-1))],8,bw),l("button",{class:"btn btn-sm",onClick:U},"复制"),l("button",{class:"btn btn-primary btn-sm",onClick:T},[Me(et,{name:"export",size:14}),$[9]||($[9]=Pt("导出 Markdown ",-1))])]),h.value?(E(),A("div",ww,z(h.value),1)):we("",!0),l("div",_w,[l("div",kw,[l("div",xw,[l("div",Cw,"本周周记("+z(w.value)+" 起)",1),$[11]||($[11]=l("label",{class:"note-label muted"},"本周亮点",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":$[2]||($[2]=R=>C.value=R),placeholder:"本周最有价值的一件事",onBlur:ae},null,544),[[Fe,C.value]]),$[12]||($[12]=l("label",{class:"note-label muted"},"踩的坑",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":$[3]||($[3]=R=>O.value=R),placeholder:"遇到的问题与教训",onBlur:ae},null,544),[[Fe,O.value]]),$[13]||($[13]=l("label",{class:"note-label muted"},"下周计划",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":$[4]||($[4]=R=>B.value=R),placeholder:"下周准备做什么",onBlur:ae},null,544),[[Fe,B.value]]),l("div",$w,z(te.value?"已保存":"失焦自动保存"),1)]),l("div",Sw,[$[14]||($[14]=l("div",{class:"section-title"},"总结草稿(可编辑)",-1)),Oe(l("textarea",{class:"textarea md-editor","onUpdate:modelValue":$[5]||($[5]=R=>c.value=R),spellcheck:"false"},null,512),[[Fe,c.value]])])]),l("div",Ew,[i.value?(E(),A("div",Tw,[$[20]||($[20]=l("div",{class:"section-title"},"数据摘要",-1)),l("div",Aw,[$[15]||($[15]=l("span",{class:"muted"},"出勤",-1)),l("span",Pw,z(i.value.attendDays)+" 天",1)]),l("div",Ow,[$[16]||($[16]=l("span",{class:"muted"},"工时",-1)),l("span",Mw,z(i.value.totalHours)+" 小时",1)]),l("div",Iw,[$[17]||($[17]=l("span",{class:"muted"},"补卡",-1)),l("span",jw,z(i.value.makeupCount)+" 次",1)]),l("div",Dw,[$[18]||($[18]=l("span",{class:"muted"},"请假",-1)),l("span",Lw,z(i.value.leaveCount)+" 天",1)]),l("div",Kw,[$[19]||($[19]=l("span",{class:"muted"},"记录",-1)),l("span",Rw,z(i.value.itemCount)+" 条",1)]),$[21]||($[21]=l("div",{class:"section-sub"},"分类分布",-1)),(E(!0),A(Ke,null,at(i.value.categoryStats,R=>(E(),A("div",{key:R.key,class:"sum-row"},[l("span",Nw,z(R.label),1),l("span",Fw,z(R.count)+" 条 · "+z(R.percent)+"%",1)]))),128)),i.value.categoryStats.length?we("",!0):(E(),A("div",Vw,"(无)")),$[22]||($[22]=l("div",{class:"section-sub"},"主要成果",-1)),(E(!0),A(Ke,null,at(i.value.milestones,(R,F)=>(E(),A("div",{key:"m"+F,class:"sum-item"},[Pt(z(R.content),1),l("span",Bw,"("+z(R.date)+")",1)]))),128)),i.value.milestones.length?we("",!0):(E(),A("div",Uw,"(无)")),$[23]||($[23]=l("div",{class:"section-sub"},"待跟进",-1)),(E(!0),A(Ke,null,at(i.value.followups,(R,F)=>(E(),A("div",{key:"f"+F,class:"sum-item"},[Pt(z(R.content),1),l("span",qw,"("+z(R.date)+")",1)]))),128)),i.value.followups.length?we("",!0):(E(),A("div",Hw,"(无)")),$[24]||($[24]=l("div",{class:"section-sub"},"学习与成长",-1)),(E(!0),A(Ke,null,at(i.value.takeaways,(R,F)=>(E(),A("div",{key:"t"+F,class:"sum-item"},[Pt(z(R.text),1),l("span",Ww,"("+z(R.date)+")",1)]))),128)),i.value.takeaways.length?we("",!0):(E(),A("div",zw,"(无)"))])):we("",!0)])])]))}}),Yw=Ut(Gw,[["__scopeId","data-v-43f9c59b"]]),Jw=["aria-label"],Xw={class:"dialog-head"},Qw={class:"dialog-title"},Zw={class:"dialog-body"},e_={class:"form-grid"},t_={class:"field span2"},n_={class:"seg"},s_={class:"field"},r_={class:"field"},o_={class:"field"},a_=["value"],i_={class:"add-cat"},l_=["onKeydown"],u_={key:0,class:"field"},c_={class:"seg"},d_={class:"field span2"},f_={key:0,class:"form-error"},p_={class:"dialog-btns"},v_=Ft({__name:"TransactionDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,r=t,o=P("expense"),i=P(""),c=P(""),f=P(""),v=P(""),y=P(!1),h=P(!1),w=P(""),C=P(null);function O(T){n.open&&T.key==="Escape"&&r("cancel")}wt(()=>n.open,async T=>{var U;T?(await te(),o.value=n.initial.type==="income"?"income":"expense",i.value=n.initial.category,c.value=n.initial.amountYuan,f.value=n.initial.date,v.value=n.initial.note,y.value=n.initial.reimbursable===1,h.value=n.initial.reimbursed===1,w.value="",window.addEventListener("keydown",O),await ir(),(U=C.value)==null||U.focus()):window.removeEventListener("keydown",O)}),Wn(()=>window.removeEventListener("keydown",O)),wt(o,T=>{i.value=T==="expense"?EXPENSE_CATEGORIES[0]:INCOME_CATEGORIES[0]});const B=P([]);async function te(){B.value=await Wr(o.value)}const se=P("");async function ae(){const T=se.value.trim();if(T){if(B.value.includes(T)){se.value="";return}B.value.push(T),await Es(o.value,B.value),i.value=T,se.value=""}}function re(){return i.value&&B.value.includes(i.value)?i.value:B.value[0]}function V(){const T=String(c.value??"").trim(),U=Number(T);if(!T||!isFinite(U)||U<=0){w.value="请填写大于 0 的金额";return}if(!f.value){w.value="请选择日期";return}const J=o.value==="expense"&&y.value?1:0;r("save",{type:o.value,category:re(),amount:Math.round(U*100),date:f.value,note:String(v.value??"").trim(),reimbursable:J,reimbursed:J&&h.value?1:0})}return(T,U)=>(E(),At(cs,{to:"body"},[Me(lr,{name:"modal"},{default:vs(()=>[e.open?(E(),A("div",{key:0,class:"mask",onClick:U[12]||(U[12]=en(J=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",Xw,[l("span",Qw,z(e.title),1),l("button",{class:"icon-btn",title:"关闭",onClick:U[0]||(U[0]=J=>r("cancel"))},[Me(et,{name:"close",size:16})])]),l("div",Zw,[l("div",e_,[l("div",t_,[U[13]||(U[13]=l("label",null,"类型",-1)),l("div",n_,[l("button",{class:tt(["seg-btn",{active:o.value==="expense"}]),onClick:U[1]||(U[1]=J=>o.value="expense")},"支出",2),l("button",{class:tt(["seg-btn",{active:o.value==="income"}]),onClick:U[2]||(U[2]=J=>o.value="income")},"收入",2)])]),l("div",s_,[U[14]||(U[14]=l("label",null,"金额(元,必填)",-1)),Oe(l("input",{ref_key:"amountInput",ref:C,class:tt(["input",{invalid:w.value}]),"onUpdate:modelValue":U[3]||(U[3]=J=>c.value=J),type:"number",min:"0",step:"0.01",placeholder:"0.00"},null,2),[[Fe,c.value]])]),l("div",r_,[U[15]||(U[15]=l("label",null,"日期(必填)",-1)),Oe(l("input",{class:"input",type:"date","onUpdate:modelValue":U[4]||(U[4]=J=>f.value=J)},null,512),[[Fe,f.value]])]),l("div",o_,[U[16]||(U[16]=l("label",null,"分类(可直接新增)",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":U[5]||(U[5]=J=>i.value=J)},[(E(!0),A(Ke,null,at(B.value,J=>(E(),A("option",{key:J,value:J},z(J),9,a_))),128))],512),[[Pn,i.value]]),l("div",i_,[Oe(l("input",{class:"input add-cat-input","onUpdate:modelValue":U[6]||(U[6]=J=>se.value=J),placeholder:"新增分类名",onKeydown:Et(en(ae,["prevent"]),["enter"])},null,40,l_),[[Fe,se.value]]),l("button",{class:"btn btn-xs",type:"button",onClick:ae},"添加")])]),o.value==="expense"?(E(),A("div",u_,[U[17]||(U[17]=l("label",null,"报销状态",-1)),l("div",c_,[l("button",{class:tt(["seg-btn",{active:!y.value}]),onClick:U[7]||(U[7]=J=>{y.value=!1,h.value=!1})},"无需报销",2),l("button",{class:tt(["seg-btn",{active:y.value&&!h.value}]),onClick:U[8]||(U[8]=J=>{y.value=!0,h.value=!1})},"待报销",2),l("button",{class:tt(["seg-btn",{active:y.value&&h.value}]),onClick:U[9]||(U[9]=J=>{y.value=!0,h.value=!0})},"已报销",2)])])):we("",!0),l("div",d_,[U[18]||(U[18]=l("label",null,"备注",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":U[10]||(U[10]=J=>v.value=J),placeholder:"选填"},null,512),[[Fe,v.value]])])]),w.value?(E(),A("div",f_,z(w.value),1)):we("",!0)]),l("div",p_,[l("button",{class:"btn btn-sm",onClick:U[11]||(U[11]=J=>r("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:V},"保存")])],8,Jw)])):we("",!0)]),_:1})]))}}),m_=Ut(v_,[["__scopeId","data-v-9f38206c"]]),h_={class:"ledger-page"},y_={class:"ledger-toolbar"},g_={class:"month-title num"},b_={class:"cards"},w_={class:"card stat-card"},__={class:"stat-num num amt-income"},k_={class:"card stat-card"},x_={class:"stat-num num"},C_={class:"card stat-card"},$_={class:"card stat-card"},S_={class:"stat-num num amt-warn"},E_={class:"card sec"},T_={class:"form-grid"},A_={class:"field span2"},P_={class:"seg"},O_={class:"field"},M_={class:"field"},I_={class:"field"},j_=["value"],D_={key:0,class:"field"},L_={class:"field span2"},K_={key:0,class:"form-error"},R_={class:"form-footer"},N_=["disabled"],F_=["disabled"],V_={key:0,class:"card sec"},B_={class:"bar-label"},U_={class:"bar-track"},q_={class:"muted num bar-num"},H_={key:1,class:"card section"},W_={class:"form-error"},z_={class:"card table-card"},G_={class:"tx-table"},Y_={class:"num","data-label":"日期"},J_={"data-label":"分类"},X_={class:"tag"},Q_={class:"td-note","data-label":"备注"},Z_={"data-label":"报销"},e1={key:0,class:"muted"},t1={key:1,class:"tx-done"},n1={key:2,class:"tx-pending"},s1={class:"ops-cell"},r1={class:"ops"},o1=["onClick"],a1=["onClick"],i1=["onClick"],l1={key:0},u1={class:"muted vault-note num"},c1=Ft({__name:"LedgerView",setup(e){const t=P(bt()),n=P([]),r=P(!0),o=P("expense"),i=P(""),c=P(""),f=P(bt()),v=P(""),y=P(!1),h=P(""),w=P(""),C=P(!1),O=P(!1),B=P(null),te=P({type:"expense",category:"",amountYuan:"",date:bt(),note:"",reimbursable:0,reimbursed:0}),se=P(null),ae=it(()=>t.value.slice(0,7)+"-01"),re=it(()=>{const je=Number(t.value.slice(0,4)),fe=Number(t.value.slice(5,7))-1,De=new Date(je,fe+1,0).getDate();return t.value.slice(0,7)+"-"+(De<10?"0"+De:String(De))}),V=it(()=>Number(t.value.slice(0,4))+" 年 "+Number(t.value.slice(5,7))+" 月");async function T(){r.value=!0;try{n.value=await Ah(ae.value,re.value),w.value=""}catch(je){w.value="账目加载失败:"+(je instanceof Error?je.stack||je.message:String(je)),He("账目加载失败")}r.value=!1}an(T),wt(t,T);const U=P([]),J=P([]);async function Y(){U.value=await Wr("expense"),J.value=await Wr("income"),o.value==="expense"&&!U.value.includes(c.value)&&(c.value=U.value[0]||""),o.value==="income"&&!J.value.includes(c.value)&&(c.value=J.value[0]||"")}Y(),wt(o,je=>{c.value=je==="expense"?U.value[0]||"":J.value[0]||""});const ne=it(()=>n.value.slice().sort((je,fe)=>je.date===fe.date?fe.id-je.id:je.date{let je=0,fe=0,De=0;for(const rt of n.value)rt.type==="income"?je+=rt.amount:(fe+=rt.amount,rt.reimbursable===1&&rt.reimbursed!==1&&(De+=rt.amount));return{income:je,expense:fe,pending:De,balance:je-fe}}),R=P("all"),F=P("all"),ee=it(()=>ne.value.filter(je=>!(R.value!=="all"&&je.type!==R.value||F.value==="pending"&&!(je.type==="expense"&&je.reimbursable===1&&je.reimbursed!==1)||F.value==="done"&&!(je.reimbursable===1&&je.reimbursed===1)))),Ie=it(()=>{const je=new Map;let fe=0;for(const rt of n.value)rt.type==="expense"&&(je.set(rt.category,(je.get(rt.category)||0)+rt.amount),fe+=rt.amount);const De=fe||1;return Array.from(je.entries()).map(rt=>({name:rt[0],amount:rt[1],percent:Math.round(rt[1]/De*100)})).sort((rt,Ve)=>Ve.amount-rt.amount)});function Pe(je){return(je/100).toFixed(2)}function ke(je){return(je.type==="income"?"+":"-")+Pe(je.amount)}function Re(){t.value=ea(t.value,-1)}function xe(){t.value=ea(t.value,1)}function me(){t.value=bt()}wt(i,()=>{h.value&&(h.value="")});async function _e(){const je=String(i.value??"").trim(),fe=Number(je);if(!je||!isFinite(fe)||fe<=0){h.value="请填写大于 0 的金额";return}if(!f.value){h.value="请选择日期";return}if(!C.value){C.value=!0;try{await Ph({type:o.value,category:c.value,amount:Math.round(fe*100),date:f.value,note:String(v.value??"").trim(),reimbursable:o.value==="expense"&&y.value?1:0,reimbursed:0})}catch(De){He("添加失败:"+(De instanceof Error?De.message:String(De))),C.value=!1;return}i.value="",v.value="",y.value=!1,h.value="",await T(),He("记账已添加"),C.value=!1}}const We=it(()=>String(i.value??"").trim()!==""||String(v.value??"").trim()!=="");function Xe(){i.value="",v.value="",y.value=!1,h.value=""}async function Ae(je){await Ih(je.id),await T(),He("已标记为已报销")}function pe(je){B.value=je.id,te.value={type:je.type,category:je.category,amountYuan:Pe(je.amount),date:je.date,note:je.note||"",reimbursable:je.reimbursable,reimbursed:je.reimbursed},O.value=!0}async function Ne(je){const fe=B.value;await Oh(fe,je),O.value=!1,await T(),He("账目已更新")}async function dt(){se.value&&se.value.id&&await Mh(se.value.id),se.value=null,await T(),He("账目已删除")}return(je,fe)=>(E(),A("div",h_,[l("div",y_,[l("button",{class:"icon-btn",onClick:Re},[Me(et,{name:"chevron-left",size:16})]),l("span",g_,z(V.value),1),l("button",{class:"icon-btn",onClick:xe},[Me(et,{name:"chevron-right",size:16})]),l("button",{class:"btn btn-sm",onClick:me},"回到本月"),fe[13]||(fe[13]=l("span",{class:"flex1"},null,-1)),Oe(l("select",{class:"select w-filter","onUpdate:modelValue":fe[0]||(fe[0]=De=>R.value=De)},[...fe[11]||(fe[11]=[l("option",{value:"all"},"全部类型",-1),l("option",{value:"expense"},"仅支出",-1),l("option",{value:"income"},"仅收入",-1)])],512),[[Pn,R.value]]),Oe(l("select",{class:"select w-filter","onUpdate:modelValue":fe[1]||(fe[1]=De=>F.value=De)},[...fe[12]||(fe[12]=[l("option",{value:"all"},"全部报销",-1),l("option",{value:"pending"},"待报销",-1),l("option",{value:"done"},"已报销",-1)])],512),[[Pn,F.value]])]),l("div",b_,[l("div",w_,[fe[14]||(fe[14]=l("div",{class:"muted"},"本月收入(元)",-1)),l("div",__,z(Pe($.value.income)),1)]),l("div",k_,[fe[15]||(fe[15]=l("div",{class:"muted"},"本月支出(元)",-1)),l("div",x_,z(Pe($.value.expense)),1)]),l("div",C_,[fe[16]||(fe[16]=l("div",{class:"muted"},"本月结余(元)",-1)),l("div",{class:tt(["stat-num num",{"amt-income":$.value.balance>=0,"amt-expense":$.value.balance<0}])},z(Pe($.value.balance)),3)]),l("div",$_,[fe[17]||(fe[17]=l("div",{class:"muted"},"待报销(元)",-1)),l("div",S_,z(Pe($.value.pending)),1)])]),l("div",E_,[fe[24]||(fe[24]=l("div",{class:"sec-head"},[l("span",{class:"sec-title"},"新增一笔"),l("span",{class:"muted form-hint"},"金额必填,回车快速添加")],-1)),l("div",T_,[l("div",A_,[fe[18]||(fe[18]=l("label",null,"类型",-1)),l("div",P_,[l("button",{class:tt(["seg-btn",{active:o.value==="expense"}]),onClick:fe[2]||(fe[2]=De=>o.value="expense")},"支出",2),l("button",{class:tt(["seg-btn",{active:o.value==="income"}]),onClick:fe[3]||(fe[3]=De=>o.value="income")},"收入",2)])]),l("div",O_,[fe[19]||(fe[19]=l("label",null,"金额(元,必填)",-1)),Oe(l("input",{class:tt(["input",{invalid:h.value}]),"onUpdate:modelValue":fe[4]||(fe[4]=De=>i.value=De),type:"number",min:"0",step:"0.01",placeholder:"0.00",onKeydown:Et(_e,["enter"])},null,34),[[Fe,i.value]])]),l("div",M_,[fe[20]||(fe[20]=l("label",null,"日期",-1)),Oe(l("input",{class:"input",type:"date","onUpdate:modelValue":fe[5]||(fe[5]=De=>f.value=De)},null,512),[[Fe,f.value]])]),l("div",I_,[fe[21]||(fe[21]=l("label",null,"分类",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":fe[6]||(fe[6]=De=>c.value=De)},[(E(!0),A(Ke,null,at(o.value==="expense"?U.value:J.value,De=>(E(),A("option",{key:De,value:De},z(De),9,j_))),128))],512),[[Pn,c.value]])]),o.value==="expense"?(E(),A("div",D_,[fe[22]||(fe[22]=l("label",null,"报销",-1)),l("button",{class:tt(["toggle-btn",{on:y.value}]),onClick:fe[7]||(fe[7]=De=>y.value=!y.value)},z(y.value?"需要报销":"无需报销"),3)])):we("",!0),l("div",L_,[fe[23]||(fe[23]=l("label",null,"备注",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":fe[8]||(fe[8]=De=>v.value=De),placeholder:"选填,如:客户现场午餐",onKeydown:Et(_e,["enter"])},null,544),[[Fe,v.value]])])]),h.value?(E(),A("div",K_,z(h.value),1)):we("",!0),l("div",R_,[l("button",{class:"btn btn-sm",disabled:!We.value,onClick:Xe},"重置",8,N_),l("button",{class:"btn btn-primary btn-sm",disabled:C.value,onClick:_e},"添加记录",8,F_)])]),Ie.value.length?(E(),A("div",V_,[fe[25]||(fe[25]=l("div",{class:"sec-title"},"本月支出分类",-1)),(E(!0),A(Ke,null,at(Ie.value,De=>(E(),A("div",{key:De.name,class:"bar-row"},[l("span",B_,z(De.name),1),l("span",U_,[l("span",{class:"bar-fill",style:as({width:De.percent+"%"})},null,4)]),l("span",q_,z(Pe(De.amount))+" 元 · "+z(De.percent)+"%",1)]))),128))])):we("",!0),w.value?(E(),A("div",H_,[l("div",W_,z(w.value),1),fe[26]||(fe[26]=l("div",{class:"muted loc-note"},"请将上方完整错误文字发送给开发者",-1))])):we("",!0),l("div",z_,[l("table",G_,[fe[28]||(fe[28]=l("thead",null,[l("tr",null,[l("th",null,"日期"),l("th",null,"分类"),l("th",null,"金额(元)"),l("th",null,"备注"),l("th",null,"报销"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[(E(!0),A(Ke,null,at(ee.value,De=>(E(),A("tr",{key:De.id},[l("td",Y_,z(De.date),1),l("td",J_,[l("span",X_,z(De.category),1)]),l("td",{class:tt(["num",De.type==="income"?"amt-income":"amt-expense"]),"data-label":"金额"},z(ke(De)),3),l("td",Q_,z(De.note||"--"),1),l("td",Z_,[De.type!=="expense"||De.reimbursable!==1?(E(),A("span",e1,"--")):De.reimbursed===1?(E(),A("span",t1,"已报销")):(E(),A("span",n1,"待报销"))]),l("td",s1,[l("div",r1,[De.type==="expense"&&De.reimbursable===1&&De.reimbursed!==1?(E(),A("button",{key:0,class:"btn btn-xs",onClick:rt=>Ae(De)},"标记已报销",8,o1)):we("",!0),l("button",{class:"btn btn-xs",onClick:rt=>pe(De)},"编辑",8,a1),l("button",{class:"btn btn-xs",onClick:rt=>se.value=De},"删除",8,i1)])])]))),128)),!ee.value.length&&!r.value?(E(),A("tr",l1,[...fe[27]||(fe[27]=[l("td",{colspan:"6",class:"empty muted"},"本月暂无账目",-1)])])):we("",!0)])])]),l("div",u1,"本月 "+z(n.value.length)+" 条 · 当前筛选 "+z(ee.value.length)+" 条",1),Me(m_,{open:O.value,title:(B.value,"编辑账目"),initial:te.value,onCancel:fe[9]||(fe[9]=De=>O.value=!1),onSave:Ne},null,8,["open","title","initial"]),Me(qn,{open:!!se.value,title:"删除确认",message:se.value?"将删除 "+se.value.date+" 的账目("+se.value.category+" "+Pe(se.value.amount)+" 元)。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:fe[10]||(fe[10]=De=>se.value=null),onConfirm:dt},null,8,["open","message"])]))}}),d1=Ut(c1,[["__scopeId","data-v-2660d908"]]),f1={class:"memo-page"},p1={class:"card memo-list"},v1={class:"pane-head"},m1={class:"pane-title"},h1={class:"memo-scroll"},y1=["onClick"],g1={class:"memo-item-title"},b1={class:"muted memo-item-sub"},w1={class:"muted num memo-item-time"},_1={key:0,class:"muted empty"},k1={class:"card memo-editor"},x1={class:"editor-foot"},C1={class:"muted foot-info"},$1=["disabled"],S1=["disabled"],E1={key:1,class:"empty muted editor-empty"},T1=Ft({__name:"MemoView",setup(e){const t=P([]),n=P(null),r=P(!1),o=P(""),i=P(""),c=P(null),f=P(null);async function v(){if(t.value=await xh(),n.value&&n.value.id){const J=t.value.find(Y=>Y.id===n.value.id);J&&(n.value=J)}}an(async()=>{await v(),t.value.length&&w(t.value[0]),window.addEventListener("keydown",y)}),Wn(()=>window.removeEventListener("keydown",y)),wt(Vi,async J=>{if(!J)return;t.value.length||await v();const Y=t.value.find(ne=>ne.id===J);Vi.value=null,Y&&C(Y)},{immediate:!0});function y(J){(J.ctrlKey||J.metaKey)&&J.key.toLowerCase()==="s"&&r.value&&h.value&&(J.preventDefault(),se())}const h=it(()=>{if(!r.value)return!1;const J=n.value?n.value.title:"",Y=n.value?n.value.content:"";return o.value!==J||i.value!==Y});function w(J){n.value=J,r.value=!0,o.value=J.title,i.value=J.content}function C(J){if(!(r.value&&n.value&&n.value.id===J.id)){if(h.value){f.value={type:"select",memo:J};return}w(J)}}function O(){if(h.value){f.value={type:"new"};return}B()}function B(){n.value=null,r.value=!0,o.value="",i.value=""}function te(){n.value?w(n.value):B()}async function se(){if(!o.value.trim()&&!i.value.trim()){He("标题与内容不能都为空");return}if(n.value&&n.value.id)await $h(n.value.id,o.value,i.value),He("备忘已保存");else{const J=await Ch(o.value,i.value);n.value=J,o.value=J.title,i.value=J.content,He("备忘已创建")}await v()}function ae(){n.value&&n.value.id&&(c.value=n.value)}async function re(){c.value&&c.value.id&&(await Sh(c.value.id),He("备忘已删除")),c.value=null,await v(),B()}function V(){const J=f.value;f.value=null,J&&(J.type==="select"?w(J.memo):B())}function T(J){return(J.content||"").replace(/\s+/g," ").slice(0,30)}function U(J){return J.replace("T"," ").slice(0,16)}return(J,Y)=>(E(),A("div",f1,[l("aside",p1,[l("div",v1,[l("span",m1,"备忘录("+z(t.value.length)+")",1),l("button",{class:"btn btn-primary btn-sm",onClick:O},"新建")]),l("div",h1,[(E(!0),A(Ke,null,at(t.value,ne=>(E(),A("div",{key:ne.id,class:tt(["memo-item",{active:r.value&&n.value&&n.value.id===ne.id}]),onClick:$=>C(ne)},[l("div",g1,z(ne.title||"无标题"),1),l("div",b1,z(T(ne)||"空"),1),l("div",w1,z(U(ne.updated_at)),1)],10,y1))),128)),t.value.length?we("",!0):(E(),A("div",_1,"暂无备忘"))])]),l("section",k1,[r.value?(E(),A(Ke,{key:0},[Oe(l("input",{class:"input title-input","onUpdate:modelValue":Y[0]||(Y[0]=ne=>o.value=ne),placeholder:"标题"},null,512),[[Fe,o.value]]),Oe(l("textarea",{class:"textarea content-textarea","onUpdate:modelValue":Y[1]||(Y[1]=ne=>i.value=ne),placeholder:"内容"},null,512),[[Fe,i.value]]),l("div",x1,[l("span",C1,[h.value?(E(),A(Ke,{key:0},[Pt("有未保存修改")],64)):n.value&&n.value.id?(E(),A(Ke,{key:1},[Pt("更新于 "+z(U(n.value.updated_at)),1)],64)):(E(),A(Ke,{key:2},[Pt("新备忘")],64))]),Y[4]||(Y[4]=l("span",{class:"flex1"},null,-1)),n.value&&n.value.id?(E(),A("button",{key:0,class:"btn btn-sm",onClick:ae},"删除")):we("",!0),l("button",{class:"btn btn-sm",disabled:!h.value,onClick:te},"放弃修改",8,$1),l("button",{class:"btn btn-primary btn-sm",disabled:!h.value,onClick:se},"保存",8,S1)])],64)):(E(),A("div",E1,"选择左侧备忘,或点击右上角新建"))]),Me(qn,{open:!!c.value,title:"删除确认",message:c.value?"将删除备忘「"+(c.value.title||"无标题")+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:Y[2]||(Y[2]=ne=>c.value=null),onConfirm:re},null,8,["open","message"]),Me(qn,{open:!!f.value,title:"未保存提示",message:"当前备忘有未保存的修改,继续操作将丢失这些修改。","confirm-text":"放弃修改并继续",onCancel:Y[3]||(Y[3]=ne=>f.value=null),onConfirm:V},null,8,["open"])]))}}),A1=Ut(T1,[["__scopeId","data-v-74d60dba"]]),P1=["aria-label"],O1={class:"dialog-head"},M1={class:"dialog-title"},I1={class:"dialog-body"},j1={class:"form-grid"},D1={class:"field span2"},L1={class:"field span2"},K1={class:"field span2"},R1={class:"pwd-row"},N1={class:"field span2"},F1={key:0,class:"form-error"},V1={class:"dialog-btns"},B1=Ft({__name:"CredentialDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,r=t,o=P(""),i=P(""),c=P(""),f=P(""),v=P(""),y=P(null);function h(O){n.open&&O.key==="Escape"&&r("cancel")}wt(()=>n.open,async O=>{var B;O?(o.value=n.initial.system,i.value=n.initial.account,c.value=n.initial.password,f.value=n.initial.remark,v.value="",window.addEventListener("keydown",h),await ir(),(B=y.value)==null||B.focus()):window.removeEventListener("keydown",h)}),Wn(()=>window.removeEventListener("keydown",h));function w(){const O="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",B="!@#$%^&*",te=crypto.getRandomValues(new Uint8Array(14));let se="";for(let ae=0;ae(E(),At(cs,{to:"body"},[Me(lr,{name:"modal"},{default:vs(()=>[e.open?(E(),A("div",{key:0,class:"mask",onClick:B[6]||(B[6]=en(te=>r("cancel"),["self"]))},[l("div",{class:"dialog",role:"dialog","aria-label":e.title},[l("div",O1,[l("span",M1,z(e.title),1),l("button",{class:"icon-btn",title:"关闭",onClick:B[0]||(B[0]=te=>r("cancel"))},[Me(et,{name:"close",size:16})])]),l("div",I1,[l("div",j1,[l("div",D1,[B[7]||(B[7]=l("label",null,"系统名称(必填)",-1)),Oe(l("input",{ref_key:"systemInput",ref:y,class:"input","onUpdate:modelValue":B[1]||(B[1]=te=>o.value=te),placeholder:"如:企业邮箱 / OA / VPN"},null,512),[[Fe,o.value]])]),l("div",L1,[B[8]||(B[8]=l("label",null,"账号(必填)",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":B[2]||(B[2]=te=>i.value=te),placeholder:"用户名、工号或邮箱"},null,512),[[Fe,i.value]])]),l("div",K1,[B[9]||(B[9]=l("label",null,"密码(必填)",-1)),l("div",R1,[Oe(l("input",{class:"input","onUpdate:modelValue":B[3]||(B[3]=te=>c.value=te),placeholder:"输入或点击生成"},null,512),[[Fe,c.value]]),l("button",{class:"btn btn-sm",onClick:w},"生成")])]),l("div",N1,[B[10]||(B[10]=l("label",null,"备注",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":B[4]||(B[4]=te=>f.value=te),placeholder:"用途、到期时间、负责人等(选填)"},null,512),[[Fe,f.value]])])]),v.value?(E(),A("div",F1,z(v.value),1)):we("",!0)]),l("div",V1,[l("button",{class:"btn btn-sm",onClick:B[5]||(B[5]=te=>r("cancel"))},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:C},"保存")])],8,P1)])):we("",!0)]),_:1})]))}}),U1=Ut(B1,[["__scopeId","data-v-f383b0a6"]]),q1={class:"vault-page"},H1={key:0,class:"empty muted"},W1={key:1,class:"card lock-card"},z1={class:"lock-badge"},G1={key:0,class:"form-error"},Y1=["disabled"],J1={key:0,class:"form-error"},X1=["disabled"],Q1={class:"vault-toolbar"},Z1={class:"search-wrap"},e0={class:"card table-card"},t0={class:"cred-table"},n0={class:"td-system"},s0=["onClick"],r0={class:"pwd-cell"},o0={class:"num pwd-text"},a0=["onClick"],i0=["onClick"],l0={class:"td-remark"},u0={class:"td-ops"},c0={class:"ops"},d0=["onClick"],f0=["onClick"],p0={key:0},v0={class:"muted vault-note num"},m0={class:"dialog pwd-dialog"},h0={class:"dialog-head"},y0={class:"dialog-body"},g0={class:"vp-field"},b0={class:"vp-field"},w0={class:"vp-field"},_0={key:0,class:"form-error"},k0={class:"dialog-btns"},x0=5*60*1e3,C0=Ft({__name:"VaultView",setup(e){const t=P(null),n=P(cm()),r=P(!1),o=P(""),i=P(""),c=P(""),f=P(""),v=P(""),y=P([]),h=P(""),w=P({}),C=P(!1),O=P(null),B=P({system:"",account:"",password:"",remark:""}),te=P(null),se=P(!1),ae=P(""),re=P(""),V=P(""),T=P("");async function U(){y.value=await mm(),w.value={}}let J=null;function Y(){J!==null&&window.clearTimeout(J),J=window.setTimeout(()=>{n.value&&(sa(),n.value=!1,y.value=[],w.value={},He("长时间未操作,密码库已自动锁定"))},x0)}function ne(){n.value&&Y()}an(async()=>{t.value=await dd(),window.addEventListener("click",ne),window.addEventListener("keydown",ne),n.value&&Y()}),Wn(()=>{window.removeEventListener("click",ne),window.removeEventListener("keydown",ne),J!==null&&window.clearTimeout(J)});const $=it(()=>{const Ae=h.value.trim().toLowerCase();return Ae?y.value.filter(pe=>(pe.system+" "+pe.account+" "+(pe.remark||"")).toLowerCase().includes(Ae)):y.value});async function R(){if(!r.value){if(c.value="",!o.value){c.value="请输入主密码";return}if(o.value.length<6){c.value="主密码至少 6 位";return}if(o.value!==i.value){c.value="两次输入的主密码不一致";return}r.value=!0;try{await dm(o.value),o.value="",i.value="",n.value=!0,Y(),await U(),He("主密码已设置,密码库已解锁")}catch(Ae){c.value=Ae instanceof Error?Ae.message:"设置失败"}r.value=!1}}async function F(){if(!r.value){if(v.value="",!f.value){v.value="请输入主密码";return}r.value=!0;try{await fm(f.value),f.value="",n.value=!0,Y(),await U()}catch(Ae){v.value=Ae instanceof Error?Ae.message:"解锁失败"}r.value=!1}}function ee(){sa(),n.value=!1,y.value=[],w.value={},J!==null&&window.clearTimeout(J),He("密码库已锁定")}async function Ie(Ae){const pe=Ae.id;if(w.value[pe]){w.value[pe]=!1;return}try{Ae.passwordPlain=await mi(pe),w.value[pe]=!0}catch(Ne){He(Ne instanceof Error?Ne.message:"解密失败")}}async function Pe(Ae){try{const pe=await mi(Ae.id);await Wi(pe),He("密码已复制")}catch(pe){He(pe instanceof Error?pe.message:"复制失败")}}async function ke(Ae){await Wi(Ae.account),He("账号已复制")}function Re(){O.value=null,B.value={system:"",account:"",password:"",remark:""},C.value=!0}async function xe(Ae){try{const pe=await mi(Ae.id);O.value=Ae.id,B.value={system:Ae.system,account:Ae.account,password:pe,remark:Ae.remark||""},C.value=!0}catch(pe){He(pe instanceof Error?pe.message:"解密失败")}}async function me(Ae){const pe=O.value??void 0;await hm(Ae,pe),C.value=!1,await U(),He(pe?"账号已更新":"账号已添加")}async function _e(){te.value&&te.value.id&&(await ym(te.value.id),He("账号已删除")),te.value=null,await U()}function We(){ae.value="",re.value="",V.value="",T.value="",se.value=!0}async function Xe(){T.value="";try{const Ae=await gm(ae.value,re.value);se.value=!1,ae.value="",re.value="",V.value="",He("主密码已修改,"+Ae+" 条账号密码已重新加密")}catch(Ae){T.value=Ae instanceof Error?Ae.message:"修改失败"}}return(Ae,pe)=>(E(),A("div",q1,[t.value===null?(E(),A("div",H1,"加载中")):n.value?(E(),A(Ke,{key:2},[l("div",Q1,[l("div",Z1,[Me(et,{name:"search",size:14,class:"search-icon"}),Oe(l("input",{class:"input","onUpdate:modelValue":pe[3]||(pe[3]=Ne=>h.value=Ne),placeholder:"搜索系统名称、账号或备注"},null,512),[[Fe,h.value]])]),pe[16]||(pe[16]=l("span",{class:"flex1"},null,-1)),l("button",{class:"btn btn-sm",onClick:We},"修改主密码"),l("button",{class:"btn btn-sm",onClick:ee},"锁定"),l("button",{class:"btn btn-primary btn-sm",onClick:Re},"新增账号")]),l("div",e0,[l("table",t0,[pe[18]||(pe[18]=l("thead",null,[l("tr",null,[l("th",null,"系统名称"),l("th",null,"账号"),l("th",null,"密码"),l("th",null,"备注"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[(E(!0),A(Ke,null,at($.value,Ne=>(E(),A("tr",{key:Ne.id},[l("td",n0,z(Ne.system),1),l("td",null,[l("span",{class:"copyable",title:"点击复制账号",onClick:dt=>ke(Ne)},z(Ne.account),9,s0)]),l("td",null,[l("div",r0,[l("span",o0,z(w.value[Ne.id]?Ne.passwordPlain:"........"),1),l("button",{class:"btn btn-xs",onClick:dt=>Ie(Ne)},z(w.value[Ne.id]?"隐藏":"显示"),9,a0),l("button",{class:"btn btn-xs",onClick:dt=>Pe(Ne)},"复制",8,i0)])]),l("td",l0,z(Ne.remark||"--"),1),l("td",u0,[l("div",c0,[l("button",{class:"btn btn-xs",onClick:dt=>xe(Ne)},"编辑",8,d0),l("button",{class:"btn btn-xs",onClick:dt=>te.value=Ne},"删除",8,f0)])])]))),128)),$.value.length?we("",!0):(E(),A("tr",p0,[...pe[17]||(pe[17]=[l("td",{colspan:"5",class:"empty muted"},"暂无账号,点击右上角新增",-1)])]))])])]),l("div",v0,"共 "+z(y.value.length)+" 条账号记录 · 密码以 AES-256-GCM 加密,服务器仅存密文",1)],64)):(E(),A("div",W1,[l("div",z1,[Me(et,{name:"lock",size:26})]),t.value===!1?(E(),A(Ke,{key:0},[pe[12]||(pe[12]=l("div",{class:"lock-title"},"设置主密码",-1)),pe[13]||(pe[13]=l("div",{class:"muted lock-tip"},"主密码用于加密保存在本机的账号密码,遗忘后无法找回,请务必牢记",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[0]||(pe[0]=Ne=>o.value=Ne),placeholder:"设置主密码(至少 6 位)",onKeydown:Et(R,["enter"])},null,544),[[Fe,o.value]]),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[1]||(pe[1]=Ne=>i.value=Ne),placeholder:"再次输入主密码",onKeydown:Et(R,["enter"])},null,544),[[Fe,i.value]]),c.value?(E(),A("div",G1,z(c.value),1)):we("",!0),l("button",{class:"btn btn-primary lock-btn",disabled:r.value,onClick:R},"完成设置并解锁",8,Y1)],64)):(E(),A(Ke,{key:1},[pe[14]||(pe[14]=l("div",{class:"lock-title"},"密码库已锁定",-1)),pe[15]||(pe[15]=l("div",{class:"muted lock-tip"},"输入主密码解锁后查看与复制密码",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[2]||(pe[2]=Ne=>f.value=Ne),placeholder:"主密码",onKeydown:Et(F,["enter"])},null,544),[[Fe,f.value]]),v.value?(E(),A("div",J1,z(v.value),1)):we("",!0),l("button",{class:"btn btn-primary lock-btn",disabled:r.value,onClick:F},"解锁",8,X1)],64))])),Me(U1,{open:C.value,title:O.value?"编辑账号":"新增账号",initial:B.value,onCancel:pe[4]||(pe[4]=Ne=>C.value=!1),onSave:me},null,8,["open","title","initial"]),Me(qn,{open:!!te.value,title:"删除确认",message:te.value?"将删除系统「"+te.value.system+"」的账号记录。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:pe[5]||(pe[5]=Ne=>te.value=null),onConfirm:_e},null,8,["open","message"]),(E(),At(cs,{to:"body"},[Me(lr,{name:"modal"},{default:vs(()=>[se.value?(E(),A("div",{key:0,class:"mask",onClick:pe[11]||(pe[11]=en(Ne=>se.value=!1,["self"]))},[l("div",m0,[l("div",h0,[pe[19]||(pe[19]=l("span",{class:"dialog-title"},"修改主密码",-1)),l("button",{class:"icon-btn",title:"关闭",onClick:pe[6]||(pe[6]=Ne=>se.value=!1)},[Me(et,{name:"close",size:16})])]),l("div",y0,[l("div",g0,[pe[20]||(pe[20]=l("label",null,"旧主密码",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[7]||(pe[7]=Ne=>ae.value=Ne)},null,512),[[Fe,ae.value]])]),l("div",b0,[pe[21]||(pe[21]=l("label",null,"新主密码(至少 6 位)",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[8]||(pe[8]=Ne=>re.value=Ne)},null,512),[[Fe,re.value]])]),l("div",w0,[pe[22]||(pe[22]=l("label",null,"确认新主密码",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":pe[9]||(pe[9]=Ne=>V.value=Ne)},null,512),[[Fe,V.value]])]),T.value?(E(),A("div",_0,z(T.value),1)):we("",!0),pe[23]||(pe[23]=l("div",{class:"muted vp-tip"},"确认后所有账号密码将使用新主密码重新加密",-1))]),l("div",k0,[l("button",{class:"btn btn-sm",onClick:pe[10]||(pe[10]=Ne=>se.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",onClick:Xe},"确认修改")])])])):we("",!0)]),_:1})]))]))}}),$0=Ut(C0,[["__scopeId","data-v-c2db283d"]]);function S0(e){return'"'+(e==null?"":String(e)).replace(/"/g,'""')+'"'}async function bi(e,t){const r="\uFEFF"+t.map(f=>f.map(S0).join(",")).join(`\r -`);if(ar.isNativePlatform()){const{downloadText:f}=await Od(async()=>{const{downloadText:v}=await Promise.resolve().then(()=>fw);return{downloadText:v}},void 0,import.meta.url);return f(e,r)}const o=new Blob([r],{type:"text/csv;charset=utf-8"}),i=URL.createObjectURL(o),c=document.createElement("a");return c.href=i,c.download=e,c.click(),window.setTimeout(()=>URL.revokeObjectURL(i),1e4),""}const E0={class:"settings"},T0={class:"card section"},A0={class:"muted acc-line"},P0={class:"ai-grid"},O0={class:"rule-item"},M0={class:"rule-item"},I0={class:"rule-item"},j0={key:0,class:"form-error"},D0={class:"rule-save"},L0={class:"card section"},K0={class:"rule-grid"},R0={class:"rule-item"},N0={class:"rule-item"},F0={class:"rule-item"},V0={class:"rule-item"},B0={class:"rule-item"},U0={class:"card section"},q0={class:"proj-add"},H0={key:0,class:"muted proj-tip"},W0=["onKeydown"],z0=["onClick"],G0=["onClick"],Y0=["onClick"],J0={key:1,class:"muted"},X0={class:"card section"},Q0={class:"card section"},Z0={class:"muted acc-line"},ek={class:"rule-save"},tk=["disabled"],nk={key:0,class:"muted acc-line"},sk={key:1,class:"form-error"},rk={key:2,class:"form-error"},ok={class:"card section"},ak={class:"ai-grid"},ik={class:"rule-item"},lk={class:"rule-item"},uk={class:"rule-item"},ck={class:"card section"},dk={class:"cat-block"},fk={class:"cat-head"},pk={class:"cat-chips"},vk=["onClick"],mk=["onClick"],hk={class:"cat-block"},yk={class:"cat-head"},gk={class:"cat-chips"},bk=["onClick"],wk=["onClick"],_k={class:"cat-block"},kk={class:"cat-head"},xk={class:"cat-chips"},Ck=["onClick"],$k=["onClick"],Sk={class:"card section"},Ek={class:"seg"},Tk={class:"exp-dates"},Ak={class:"muted loc-note"},Pk={class:"card section"},Ok={class:"backup-row"},Mk={key:0,class:"import-error"},Ik=Ft({__name:"SettingsView",setup(e){var le;const t=P({work_start:"09:00",work_end:"18:00",grace_minutes:10,lunch_minutes:60,remind_weekly:"friday"}),n=P([]),r=P(""),o=P(""),i=P(""),c=P(""),f=P(""),v=P(""),y=P(null),h=P(""),w=P([]),C=P([]),O=P([]);async function B(){w.value=await Jr(),C.value=await Wr("expense"),O.value=await Wr("income")}async function te(S){const x=window.prompt("新分类名称");if(!x||!x.trim())return;const Z=S==="log"?w.value:S==="expense"?C.value:O.value,Te=x.trim();if(Z.includes(Te)){He("分类已存在");return}const Ue=[...Z,Te];S==="log"?(w.value=Ue,await yi(Ue)):S==="expense"?(C.value=Ue,await Es("expense",Ue)):(O.value=Ue,await Es("income",Ue)),He("分类已添加")}async function se(S,x,Z){const Te=window.prompt("修改分类名称",Z);if(!Te||!Te.trim()||Te.trim()===Z)return;const Je=(S==="log"?w.value:S==="expense"?C.value:O.value).map((ct,Ge)=>Ge===x?Te.trim():ct);S==="log"?(w.value=Je,await yi(Je)):S==="expense"?(C.value=Je,await Es("expense",Je)):(O.value=Je,await Es("income",Je)),He("分类已更新(历史记录自动跟随显示)")}async function ae(S,x){const Z=S==="log"?w.value:S==="expense"?C.value:O.value;if(Z.length<=1){He("至少保留一个分类");return}if(!window.confirm("删除分类「"+Z[x]+"」?历史记录不受影响。"))return;const Te=Z.filter((Ue,Je)=>Je!==x);S==="log"?(w.value=Te,await yi(Te)):S==="expense"?(C.value=Te,await Es("expense",Te)):(O.value=Te,await Es("income",Te)),He("分类已删除")}const re=P("day"),V=P(bt()),T=P(bt());function U(){if(bt(),re.value==="day")return{start:V.value,end:V.value,label:V.value};if(re.value==="week"){const S=Qs(V.value);return{start:S,end:on(S,6),label:S+" ~ "+on(S,6)}}if(re.value==="month"){const S=V.value.slice(0,4),x=V.value.slice(5,7),Z=new Date(Number(S),Number(x),0).getDate();return{start:S+"-"+x+"-01",end:S+"-"+x+"-"+Z,label:S+"-"+x}}return{start:V.value,end:T.value,label:V.value+" ~ "+T.value}}async function J(){const{start:S,end:x,label:Z}=U(),Te=await Promise.all([Hr(S,x),nr(!0)]),Ue=Te[0],Je=Te[1],ct=new Map(Je.map(gt=>[gt.id,gt.name])),Ge=[["日期","分类","项目","内容","耗时(分钟)","成果","待跟进","收获","备注"]];for(const gt of Ue)Ge.push([gt.date,categoryLabel(gt.category),gt.project_id&&ct.get(gt.project_id)||"",gt.content,gt.minutes==null?"":gt.minutes,gt.is_milestone?"是":"",gt.needs_followup?"是":"",gt.takeaway||"",gt.remark||""]);const Lt="工作详情_"+Z.replace(/[~s]/g,"_")+".csv",Kt=await bi(Lt,Ge);He(Kt?"已导出:"+Kt:"已导出到系统下载目录("+Ue.length+" 条)")}const Y=P(null),ne=P(null),$=P(""),R=P(((le=Ur())==null?void 0:le.username)||""),F=P(""),ee=P(""),Ie=P(""),Pe=P(""),ke=P(!1),Re="0.3.1",xe=P(""),me=P(""),_e=P(""),We=P(""),Xe=P(!1),Ae=P("");async function pe(){var S;xe.value=((S=bn())==null?void 0:S.username)||"",Ae.value=await Nm(),We.value=Zs.value}wt(Zs,S=>{We.value=S});async function Ne(){_e.value="";try{await gd(),He("云端绑定已重建")}catch(S){_e.value=S instanceof Error?S.message:"绑定失败"}}async function dt(){if(!Xe.value){_e.value="",We.value=Zs.value,Xe.value=!0;try{const S=await Bi();Ae.value=S.at,me.value="推送 "+S.pushed+" 条 · 拉取 "+S.pulled+" 条 · 删除 "+S.removed+" 条",We.value="",He("同步完成")}catch(S){_e.value=S instanceof Error?S.message:"同步失败"}Xe.value=!1}}async function je(){if(Pe.value="",ee.value!==Ie.value){Pe.value="两次输入的新密码不一致";return}try{await Im(F.value,ee.value),F.value="",ee.value="",Ie.value="",He("登录密码已修改")}catch(S){Pe.value=S instanceof Error?S.message:"修改失败"}}async function fe(){await jm(),window.location.reload()}async function De(){t.value=await Ks(),n.value=await nr(!0),i.value=(await ml()).join(` -`),c.value=await Ct("ai_base_url",""),f.value=await Ct("ai_api_key",""),v.value=await Ct("ai_model",""),await pe(),await B()}async function rt(){await Dt("ai_base_url",c.value.trim()),await Dt("ai_api_key",f.value.trim()),await Dt("ai_model",v.value.trim()),He("AI 配置已保存")}async function Ve(){const S=bt(),x=await Promise.all([Hr("2000-01-01",S),nr(!0)]),Z=x[0],Te=x[1],Ue=new Map(Te.map(Ge=>[Ge.id,Ge.name])),Je=[["日期","分类","项目","内容","耗时(分钟)","成果","待跟进","收获","备注"]];for(const Ge of Z)Je.push([Ge.date,categoryLabel(Ge.category),Ge.project_id&&Ue.get(Ge.project_id)||"",Ge.content,Ge.minutes==null?"":Ge.minutes,Ge.is_milestone?"是":"",Ge.needs_followup?"是":"",Ge.takeaway||"",Ge.remark||""]);const ct=await bi("工作记录_"+S.replace(/-/g,"")+".csv",Je);He(ct?"CSV 已导出到:"+ct:"CSV 已导出到系统下载目录")}async function b(){const S=bt(),x=await Promise.all([Ks(),Ca("2000-01-01",S)]),Z=x[0],Te=x[1],Ue=["周日","周一","周二","周三","周四","周五","周六"],Je=[["日期","星期","状态","上班时间","下班时间","地点","类型","说明"]];for(const Ge of Te){const Lt=Xr(Ge,Ge.date,Z,Ge.date===S);Je.push([Ge.date,Ue[Rs(Ge.date).getDay()],Lt.label,Ge.clock_in_at?Un(Ge.clock_in_at):"",Ge.clock_out_at?Un(Ge.clock_out_at):"",Ge.location||"",Ge.kind==="makeup"?"补卡":Ge.kind==="leave"?"休假":"正常",Ge.note||""])}const ct=await bi("考勤记录_"+S.replace(/-/g,"")+".csv",Je);He(ct?"CSV 已导出到:"+ct:"CSV 已导出到系统下载目录")}an(De);async function _(){await Dt("work_start",t.value.work_start),await Dt("work_end",t.value.work_end),await Dt("grace_minutes",String(t.value.grace_minutes)),await Dt("lunch_minutes",String(t.value.lunch_minutes)),await Dt("remind_weekly",t.value.remind_weekly),He("打卡规则已保存")}async function X(){await Cd(i.value.split(` -`)),He("常用地点已保存")}async function de(){const S=r.value.trim();if(S){try{await nh(S),o.value="",r.value=""}catch{o.value="项目名已存在"}await De()}}function H(S){y.value=S.id,h.value=S.name}async function ie(S){const x=h.value.trim();if(x)try{await sh(S.id,x),o.value=""}catch{o.value="项目名已存在"}y.value=null,await De()}async function Se(S){await rh(S.id,S.archived!==1),await De()}async function Ee(){try{const S=await jh(),x=await gl("实习日志备份_"+bt().replace(/-/g,"")+".json",S);He(x?"备份已导出到:"+x:"备份已导出到系统下载目录")}catch(S){He("导出失败:"+(S instanceof Error?S.message:String(S)))}}function ge(S){const x=S.target,Z=x.files&&x.files[0];if($.value="",!Z)return;const Te=Z.name;Z.text().then(Ue=>{ne.value={name:Te,text:Ue}}),x.value=""}async function ce(){if(ne.value)try{await Dh(ne.value.text),ne.value=null,$.value="",await De(),He("数据导入完成")}catch(S){ne.value=null,$.value=S instanceof Error?S.message:"导入失败"}}return(S,x)=>(E(),A("div",E0,[l("div",T0,[x[32]||(x[32]=l("div",{class:"section-title"},"账号与隐私",-1)),l("div",A0,"v"+z(cn(Re))+" · 当前账号 "+z(R.value)+" · 登录密码仅存 PBKDF2 哈希",1),l("div",P0,[l("div",O0,[x[29]||(x[29]=l("label",null,"旧登录密码",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":x[0]||(x[0]=Z=>F.value=Z)},null,512),[[Fe,F.value]])]),l("div",M0,[x[30]||(x[30]=l("label",null,"新登录密码(至少 6 位)",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":x[1]||(x[1]=Z=>ee.value=Z)},null,512),[[Fe,ee.value]])]),l("div",I0,[x[31]||(x[31]=l("label",null,"确认新登录密码",-1)),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":x[2]||(x[2]=Z=>Ie.value=Z)},null,512),[[Fe,Ie.value]])])]),Pe.value?(E(),A("div",j0,z(Pe.value),1)):we("",!0),l("div",D0,[l("button",{class:"btn btn-primary btn-sm",onClick:je},"修改登录密码"),l("button",{class:"btn btn-sm btn-danger",onClick:x[3]||(x[3]=Z=>ke.value=!0)},"删除此用户及全部数据")])]),l("div",L0,[x[39]||(x[39]=l("div",{class:"section-title"},"打卡规则",-1)),l("div",K0,[l("div",R0,[x[33]||(x[33]=l("label",null,"上班时间",-1)),Oe(l("input",{type:"time",class:"input","onUpdate:modelValue":x[4]||(x[4]=Z=>t.value.work_start=Z)},null,512),[[Fe,t.value.work_start]])]),l("div",N0,[x[34]||(x[34]=l("label",null,"下班时间",-1)),Oe(l("input",{type:"time",class:"input","onUpdate:modelValue":x[5]||(x[5]=Z=>t.value.work_end=Z)},null,512),[[Fe,t.value.work_end]])]),l("div",F0,[x[35]||(x[35]=l("label",null,"迟到宽限(分钟)",-1)),Oe(l("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":x[6]||(x[6]=Z=>t.value.grace_minutes=Z)},null,512),[[Fe,t.value.grace_minutes,void 0,{number:!0}]])]),l("div",V0,[x[36]||(x[36]=l("label",null,"午休扣除(分钟)",-1)),Oe(l("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":x[7]||(x[7]=Z=>t.value.lunch_minutes=Z)},null,512),[[Fe,t.value.lunch_minutes,void 0,{number:!0}]])]),l("div",B0,[x[38]||(x[38]=l("label",null,"周记提醒",-1)),Oe(l("select",{class:"select","onUpdate:modelValue":x[8]||(x[8]=Z=>t.value.remind_weekly=Z)},[...x[37]||(x[37]=[l("option",{value:"friday"},"每周五提醒",-1),l("option",{value:"off"},"关闭",-1)])],512),[[Pn,t.value.remind_weekly]])])]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:_},"保存规则")])]),l("div",U0,[x[40]||(x[40]=l("div",{class:"section-title"},"项目管理",-1)),l("div",q0,[Oe(l("input",{class:"input","onUpdate:modelValue":x[9]||(x[9]=Z=>r.value=Z),placeholder:"新项目名称",onKeydown:Et(de,["enter"])},null,544),[[Fe,r.value]]),l("button",{class:"btn btn-sm",onClick:de},"添加")]),o.value?(E(),A("div",H0,z(o.value),1)):we("",!0),(E(!0),A(Ke,null,at(n.value,Z=>(E(),A("div",{key:Z.id,class:"proj-row"},[y.value===Z.id?(E(),A(Ke,{key:0},[Oe(l("input",{class:"input","onUpdate:modelValue":x[10]||(x[10]=Te=>h.value=Te),onKeydown:Et(Te=>ie(Z),["enter"])},null,40,W0),[[Fe,h.value]]),l("button",{class:"btn btn-sm",onClick:Te=>ie(Z)},"保存",8,z0),l("button",{class:"btn btn-sm",onClick:x[11]||(x[11]=Te=>y.value=null)},"取消")],64)):(E(),A(Ke,{key:1},[l("span",{class:tt(["proj-name",{archived:Z.archived===1}])},z(Z.name),3),l("button",{class:"icon-btn",title:"重命名",onClick:Te=>H(Z)},[Me(et,{name:"edit",size:14})],8,G0),l("button",{class:"btn btn-sm",onClick:Te=>Se(Z)},z(Z.archived===1?"恢复":"归档"),9,Y0)],64))]))),128)),n.value.length?we("",!0):(E(),A("div",J0,"暂无项目,先添加一个"))]),l("div",X0,[x[42]||(x[42]=l("div",{class:"section-title"},"常用地点",-1)),Oe(l("textarea",{class:"textarea","onUpdate:modelValue":x[12]||(x[12]=Z=>i.value=Z),placeholder:"每行一个地点,如:公司、客户现场、出差、居家办公"},null,512),[[Fe,i.value]]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:X},"保存地点"),x[41]||(x[41]=l("span",{class:"muted loc-note"},"打卡时可直接输入新地点,保存后自动加入列表",-1))])]),l("div",Q0,[x[43]||(x[43]=l("div",{class:"section-title"},"多端数据同步",-1)),l("div",Z0,"云端账号:"+z(xe.value||"未绑定")+" · 数据存于服务器,其他端变更秒级自动刷新",1),l("div",ek,[l("button",{class:"btn btn-primary btn-sm",disabled:Xe.value,onClick:dt},z(Xe.value?"同步中":"立即同步"),9,tk),l("button",{class:"btn btn-sm",onClick:Ne},"重新校验连接")]),me.value?(E(),A("div",nk,"上次同步:"+z(Ae.value||"--")+" · "+z(me.value),1)):we("",!0),_e.value?(E(),A("div",sk,z(_e.value),1)):we("",!0),We.value?(E(),A("div",rk,"最近自动同步失败:"+z(We.value)+"(可点「立即同步」重试)",1)):we("",!0)]),l("div",ok,[x[48]||(x[48]=l("div",{class:"section-title"},"AI 润色配置(可选)",-1)),l("div",ak,[l("div",ik,[x[44]||(x[44]=l("label",null,"接口地址(OpenAI 兼容,到 /v1 为止)",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":x[13]||(x[13]=Z=>c.value=Z),placeholder:"https://api.example.com/v1"},null,512),[[Fe,c.value]])]),l("div",lk,[x[45]||(x[45]=l("label",null,"API Key",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":x[14]||(x[14]=Z=>f.value=Z),placeholder:"sk-..."},null,512),[[Fe,f.value]])]),l("div",uk,[x[46]||(x[46]=l("label",null,"模型名称",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":x[15]||(x[15]=Z=>v.value=Z),placeholder:"如:deepseek-chat"},null,512),[[Fe,v.value]])])]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:rt},"保存 AI 配置"),x[47]||(x[47]=l("span",{class:"muted loc-note"},"配置仅保存在本机;总结页「AI 润色」需此处先配置",-1))])]),l("div",ck,[x[52]||(x[52]=l("div",{class:"section-title"},"工作分类",-1)),l("div",dk,[l("div",fk,[x[49]||(x[49]=l("span",{class:"muted"},"工作记录分类",-1)),l("button",{class:"btn btn-xs",onClick:x[16]||(x[16]=Z=>te("log"))},"添加")]),l("div",pk,[(E(!0),A(Ke,null,at(w.value,(Z,Te)=>(E(),A("span",{key:Z+Te,class:"cat-chip"},[Pt(z(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Ue=>se("log",Te,Z)},"改",8,vk),l("button",{class:"chip-btn",title:"删除",onClick:Ue=>ae("log",Te)},"删",8,mk)]))),128))])]),l("div",hk,[l("div",yk,[x[50]||(x[50]=l("span",{class:"muted"},"记账支出分类",-1)),l("button",{class:"btn btn-xs",onClick:x[17]||(x[17]=Z=>te("expense"))},"添加")]),l("div",gk,[(E(!0),A(Ke,null,at(C.value,(Z,Te)=>(E(),A("span",{key:Z+Te,class:"cat-chip"},[Pt(z(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Ue=>se("expense",Te,Z)},"改",8,bk),l("button",{class:"chip-btn",title:"删除",onClick:Ue=>ae("expense",Te)},"删",8,wk)]))),128))])]),l("div",_k,[l("div",kk,[x[51]||(x[51]=l("span",{class:"muted"},"记账收入分类",-1)),l("button",{class:"btn btn-xs",onClick:x[18]||(x[18]=Z=>te("income"))},"添加")]),l("div",xk,[(E(!0),A(Ke,null,at(O.value,(Z,Te)=>(E(),A("span",{key:Z+Te,class:"cat-chip"},[Pt(z(Z)+" ",1),l("button",{class:"chip-btn",title:"修改",onClick:Ue=>se("income",Te,Z)},"改",8,Ck),l("button",{class:"chip-btn",title:"删除",onClick:Ue=>ae("income",Te)},"删",8,$k)]))),128))])])]),l("div",Sk,[x[54]||(x[54]=l("div",{class:"section-title"},"工作详情导出",-1)),l("div",Ek,[l("button",{class:tt(["seg-btn",{active:re.value==="day"}]),onClick:x[19]||(x[19]=Z=>re.value="day")},"当日",2),l("button",{class:tt(["seg-btn",{active:re.value==="week"}]),onClick:x[20]||(x[20]=Z=>re.value="week")},"当周",2),l("button",{class:tt(["seg-btn",{active:re.value==="month"}]),onClick:x[21]||(x[21]=Z=>re.value="month")},"当月",2),l("button",{class:tt(["seg-btn",{active:re.value==="custom"}]),onClick:x[22]||(x[22]=Z=>re.value="custom")},"自定义",2)]),l("div",Tk,[re.value==="custom"?(E(),A(Ke,{key:0},[Oe(l("input",{class:"input",type:"date","onUpdate:modelValue":x[23]||(x[23]=Z=>V.value=Z)},null,512),[[Fe,V.value]]),x[53]||(x[53]=l("span",{class:"muted"},"至",-1)),Oe(l("input",{class:"input",type:"date","onUpdate:modelValue":x[24]||(x[24]=Z=>T.value=Z)},null,512),[[Fe,T.value]])],64)):(E(),A(Ke,{key:1},[Oe(l("input",{class:"input",type:"date","onUpdate:modelValue":x[25]||(x[25]=Z=>V.value=Z)},null,512),[[Fe,V.value]]),l("span",Ak,z(re.value==="day"?"导出该日":re.value==="week"?"导出该日期所在一周":"导出该日期所在月份"),1)],64))]),l("div",{class:"rule-save"},[l("button",{class:"btn btn-primary btn-sm",onClick:J},"导出 CSV")])]),l("div",Pk,[x[55]||(x[55]=l("div",{class:"section-title"},"数据备份",-1)),l("div",Ok,[l("button",{class:"btn btn-sm",onClick:Ee},"导出 JSON 备份"),l("button",{class:"btn btn-sm",onClick:x[26]||(x[26]=Z=>{var Te;return(Te=Y.value)==null?void 0:Te.click()})},"导入 JSON 备份"),l("button",{class:"btn btn-sm",onClick:Ve},"导出工作记录 CSV"),l("button",{class:"btn btn-sm",onClick:b},"导出考勤 CSV"),l("input",{ref_key:"fileInput",ref:Y,type:"file",accept:"application/json,.json",style:{display:"none"},onChange:ge},null,544)]),$.value?(E(),A("div",Mk,z($.value),1)):we("",!0),x[56]||(x[56]=l("div",{class:"muted backup-note"},"数据保存在云端服务器;导出的 JSON 备份用于跨设备迁移或灾后恢复。",-1))]),Me(qn,{open:!!ne.value,title:"导入确认",message:ne.value?"将从文件「"+ne.value.name+"」导入备份。现有全部数据将被覆盖,且不可恢复,请先确认已导出当前备份。":"","confirm-text":"覆盖导入",danger:"",onCancel:x[27]||(x[27]=Z=>ne.value=null),onConfirm:ce},null,8,["open","message"]),Me(qn,{open:ke.value,title:"删除用户确认",message:"将永久删除云端账号「"+R.value+"」及其服务器上的全部数据:工作日志、考勤、备忘录、账号密码库都将被清除,任何设备都无法再取回,且不可恢复。请确认。","confirm-text":"永久删除",danger:"",onCancel:x[28]||(x[28]=Z=>ke.value=!1),onConfirm:fe},null,8,["open","message"])]))}}),jk=Ut(Ik,[["__scopeId","data-v-e3f1f671"]]),Dk={class:"admin-page"},Lk={class:"card sec"},Kk={class:"toolbar"},Rk={key:0,class:"form-error"},Nk={class:"card table-card admin-table-card"},Fk={class:"admin-table"},Vk={class:"td-name","data-label":"用户名"},Bk={"data-label":"角色"},Uk={key:0,class:"role-badge"},qk={key:1,class:"muted"},Hk={class:"muted num","data-label":"创建时间"},Wk={class:"muted num","data-label":"数据量"},zk={class:"td-ops"},Gk={class:"ops"},Yk=["onClick"],Jk=["disabled","onClick"],Xk={key:0},Qk={key:0,class:"muted load-line"},Zk={class:"dialog create-dialog",role:"dialog","aria-label":"新增用户"},ex={class:"dialog-head"},tx={class:"dialog-body"},nx={class:"form-row"},sx={class:"form-row"},rx={class:"form-row"},ox={key:0,class:"form-error"},ax={class:"dialog-btns"},ix=["disabled"],lx={class:"dialog create-dialog",role:"dialog","aria-label":"重置密码"},ux={class:"dialog-head"},cx={class:"dialog-title"},dx={class:"dialog-body"},fx={class:"form-row"},px={key:0,class:"form-error"},vx={class:"dialog-btns"},mx=["disabled"],hx=Ft({__name:"UserAdminView",setup(e){const t=P([]),n=P(""),r=P(!0),o=P("");async function i($,R){const F=await Ns();let ee=xa();if(!ee){const Pe=bn(),ke=await fetch(F+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:Pe==null?void 0:Pe.username,password:Pe==null?void 0:Pe.password})});if(ke.ok){const Re=await ke.json();ee=String(Re.token||""),Br(ee)}}const Ie=await fetch(F+$,{method:R?"POST":"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+ee},body:R?JSON.stringify(R):void 0});if(Ie.status===401&&bn()){const Pe=bn(),ke=await fetch(F+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:Pe==null?void 0:Pe.username,password:Pe==null?void 0:Pe.password})});if(ke.ok){const Re=await ke.json();ee=String(Re.token||""),Br(ee);const xe=await fetch(F+$,{method:R?"POST":"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+ee},body:R?JSON.stringify(R):void 0});return{ok:xe.ok,status:xe.status,data:await xe.json().catch(()=>({}))}}}return{ok:Ie.ok,status:Ie.status,data:await Ie.json().catch(()=>({}))}}async function c(){r.value=!0,o.value="";const $=await i("/api/admin/users");if(!$.ok){r.value=!1,o.value=$.data&&$.data.error||"加载失败 "+$.status;return}t.value=$.data.users||[],n.value=$.data.me||"",r.value=!1}function f($){return $<=0?"--":$<1024?$+" B":$<1024*1024?($/1024).toFixed(1)+" KB":($/1024/1024).toFixed(2)+" MB"}function v($){return($||"").slice(0,10)}const y=P(!1),h=P(""),w=P(""),C=P(""),O=P(""),B=P(!1);function te(){y.value=!0,O.value="",h.value="",w.value="",C.value=""}async function se(){const $=h.value.trim();if(w.value!==C.value){O.value="两次输入的密码不一致";return}if(w.value.length<6){O.value="密码至少 6 位";return}B.value=!0;const R=await i("/api/admin/users/create",{username:$,password:w.value});if(B.value=!1,!R.ok){O.value=R.data&&R.data.error||"创建失败 "+R.status;return}He("用户「"+$+"」已创建"),y.value=!1,await c()}const ae=P(null),re=P(""),V=P(""),T=P(!1);function U($){ae.value=$,re.value="",V.value=""}async function J(){if(!ae.value)return;if(re.value.length<6){V.value="密码至少 6 位";return}T.value=!0;const $=await i("/api/admin/users/password",{userId:ae.value.id,newPassword:re.value});if(T.value=!1,!$.ok){V.value=$.data&&$.data.error||"重置失败 "+$.status;return}He("已重置「"+ae.value.username+"」的登录密码"),ae.value=null}const Y=P(null);async function ne(){if(!Y.value)return;const $=await i("/api/admin/users/delete",{userId:Y.value.id});if(!$.ok){Y.value=null,He($.data&&$.data.error||"删除失败");return}He("已删除账号「"+Y.value.username+"」及其全部云端数据"),Y.value=null,await c()}return an(c),($,R)=>(E(),A("div",Dk,[l("div",Lk,[l("div",Kk,[R[12]||(R[12]=l("div",{class:"head-wrap"},[l("div",{class:"sec-title"},"用户管理"),l("div",{class:"muted head-sub"},"云端账号统一管理 · 管理员:xionglin")],-1)),l("button",{class:"btn btn-primary btn-sm",onClick:te},[Me(et,{name:"plus",size:14}),R[11]||(R[11]=Pt(" 新增用户 ",-1))])]),o.value?(E(),A("div",Rk,z(o.value),1)):we("",!0)]),l("div",Nk,[l("table",Fk,[R[14]||(R[14]=l("thead",null,[l("tr",null,[l("th",null,"用户名"),l("th",null,"角色"),l("th",null,"创建时间"),l("th",null,"数据量"),l("th",{class:"th-ops"},"操作")])],-1)),l("tbody",null,[(E(!0),A(Ke,null,at(t.value,F=>(E(),A("tr",{key:F.id},[l("td",Vk,z(F.username),1),l("td",Bk,[F.role==="admin"?(E(),A("span",Uk,"管理员")):(E(),A("span",qk,"普通用户"))]),l("td",Hk,z(v(F.created_at)),1),l("td",Wk,z(f(F.data_bytes)),1),l("td",zk,[l("div",Gk,[l("button",{class:"btn btn-xs",onClick:ee=>U(F)},"重置密码",8,Yk),l("button",{class:"btn btn-xs btn-danger",disabled:F.id===n.value,onClick:ee=>Y.value=F},"删除",8,Jk)])])]))),128)),!r.value&&!t.value.length?(E(),A("tr",Xk,[...R[13]||(R[13]=[l("td",{colspan:"5",class:"empty muted"},"加载结果为空",-1)])])):we("",!0)])]),r.value?(E(),A("div",Qk,"加载中")):we("",!0)]),R[20]||(R[20]=l("div",{class:"muted admin-note"},"重置密码立即生效;删除账号将移除其全部云端数据,不可恢复。自己的账号不能删除。",-1)),(E(),At(cs,{to:"body"},[y.value?(E(),A("div",{key:0,class:"fixed-mask",onClick:R[5]||(R[5]=en(F=>y.value=!1,["self"]))},[l("div",Zk,[l("div",ex,[R[15]||(R[15]=l("span",{class:"dialog-title"},"新增用户",-1)),l("button",{class:"icon-btn",onClick:R[0]||(R[0]=F=>y.value=!1)},[Me(et,{name:"close",size:16})])]),l("div",tx,[l("div",nx,[R[16]||(R[16]=l("label",null,"用户名(2 到 20 个字符)",-1)),Oe(l("input",{class:"input","onUpdate:modelValue":R[1]||(R[1]=F=>h.value=F),placeholder:"如:xiaowang"},null,512),[[Fe,h.value]])]),l("div",sx,[R[17]||(R[17]=l("label",null,"初始登录密码(至少 6 位)",-1)),Oe(l("input",{class:"input",type:"password","onUpdate:modelValue":R[2]||(R[2]=F=>w.value=F),placeholder:"转发给使用者,登录后可自行修改"},null,512),[[Fe,w.value]])]),l("div",rx,[R[18]||(R[18]=l("label",null,"确认密码",-1)),Oe(l("input",{class:"input",type:"password","onUpdate:modelValue":R[3]||(R[3]=F=>C.value=F),onKeydown:Et(se,["enter"])},null,544),[[Fe,C.value]])]),O.value?(E(),A("div",ox,z(O.value),1)):we("",!0)]),l("div",ax,[l("button",{class:"btn btn-sm",onClick:R[4]||(R[4]=F=>y.value=!1)},"取消"),l("button",{class:"btn btn-primary btn-sm",disabled:B.value||!h.value.trim(),onClick:se},z(B.value?"创建中":"创建"),9,ix)])])])):we("",!0)])),(E(),At(cs,{to:"body"},[ae.value?(E(),A("div",{key:0,class:"fixed-mask",onClick:R[9]||(R[9]=en(F=>ae.value=null,["self"]))},[l("div",lx,[l("div",ux,[l("span",cx,"重置「"+z(ae.value.username)+"」的登录密码",1),l("button",{class:"icon-btn",onClick:R[6]||(R[6]=F=>ae.value=null)},[Me(et,{name:"close",size:16})])]),l("div",dx,[l("div",fx,[R[19]||(R[19]=l("label",null,"新登录密码(至少 6 位)",-1)),Oe(l("input",{class:"input",type:"password","onUpdate:modelValue":R[7]||(R[7]=F=>re.value=F),onKeydown:Et(J,["enter"])},null,544),[[Fe,re.value]])]),V.value?(E(),A("div",px,z(V.value),1)):we("",!0)]),l("div",vx,[l("button",{class:"btn btn-sm",onClick:R[8]||(R[8]=F=>ae.value=null)},"取消"),l("button",{class:"btn btn-primary btn-sm",disabled:T.value,onClick:J},z(T.value?"提交中":"重置"),9,mx)])])])):we("",!0)])),Me(qn,{open:!!Y.value,title:"删除用户确认",message:Y.value?"将永久删除云端账号「"+Y.value.username+"」及其服务器上的全部数据,不可恢复。请确认。":"","confirm-text":"永久删除",danger:"",onCancel:R[10]||(R[10]=F=>Y.value=null),onConfirm:ne},null,8,["open","message"])]))}}),yx=Ut(hx,[["__scopeId","data-v-06be07ff"]]),gx={class:"login-page"},bx={class:"card login-card"},wx={class:"login-brand"},_x={class:"brand-icon"},kx={class:"seg"},xx=["placeholder"],Cx={key:1,class:"form-error"},$x=["disabled"],Sx=Ft({__name:"LoginView",emits:["login"],setup(e,{emit:t}){const n=t,r=P("login"),o=P(""),i=P(""),c=P(""),f=P(""),v=P(!1);function y(w){r.value=w,f.value="",c.value=""}async function h(){if(!v.value){f.value="",v.value=!0;try{let w;if(r.value==="login")w=await Tm(o.value,i.value);else{if(i.value.length<6){f.value="登录密码至少 6 位",v.value=!1;return}if(i.value!==c.value){f.value="两次输入的密码不一致",v.value=!1;return}w=await Am(o.value,i.value)}n("login",w)}catch(w){f.value=w instanceof Error?w.message:"操作失败"}v.value=!1}}return(w,C)=>(E(),A("div",gx,[l("div",bx,[l("div",wx,[l("div",_x,[Me(et,{name:"calendar",size:22})]),C[5]||(C[5]=l("div",{class:"login-title"},"实习工作日志",-1)),C[6]||(C[6]=l("div",{class:"muted login-sub"},"打卡 · 记录 · 总结 · 备忘录 · 密码库",-1)),C[7]||(C[7]=l("div",{class:"muted login-sub"},"数据保存在云端服务器,所有设备登录同一账号即可实时同步",-1))]),l("div",kx,[l("button",{class:tt(["seg-btn",{active:r.value==="login"}]),onClick:C[0]||(C[0]=O=>y("login"))},"登录",2),l("button",{class:tt(["seg-btn",{active:r.value==="create"}]),onClick:C[1]||(C[1]=O=>y("create"))},"创建用户",2)]),Oe(l("input",{class:"input","onUpdate:modelValue":C[2]||(C[2]=O=>o.value=O),placeholder:"用户名(2 到 20 个字符)",onKeydown:Et(h,["enter"])},null,544),[[Fe,o.value]]),Oe(l("input",{type:"password",class:"input","onUpdate:modelValue":C[3]||(C[3]=O=>i.value=O),placeholder:r.value==="login"?"登录密码":"设置登录密码(至少 6 位)",onKeydown:Et(h,["enter"])},null,40,xx),[[Fe,i.value]]),r.value==="create"?Oe((E(),A("input",{key:0,type:"password",class:"input","onUpdate:modelValue":C[4]||(C[4]=O=>c.value=O),placeholder:"再次输入密码",onKeydown:Et(h,["enter"])},null,544)),[[Fe,c.value]]):we("",!0),f.value?(E(),A("div",Cx,z(f.value),1)):we("",!0),l("button",{class:"btn btn-primary login-btn",disabled:v.value,onClick:h},z(r.value==="login"?"登录":"创建并进入"),9,$x),C[8]||(C[8]=l("div",{class:"muted login-note"}," 登录密码仅服务器保存哈希;本机保存加密的自动登录凭据,登录后无需重复输入 ",-1))])]))}}),Ex=Ut(Sx,[["__scopeId","data-v-bf714afa"]]),Tx={key:1,class:"app"},Ax={class:"side"},Px={key:0,class:"nav-sep"},Ox=["data-tip","onClick"],Mx={class:"main"},Ix={class:"topbar"},jx={class:"title"},Dx={class:"gsearch"},Lx={key:0,class:"gs-panel"},Kx={key:0,class:"gs-group muted"},Rx=["onMousedown"],Nx={class:"tag"},Fx={class:"gs-text"},Vx={class:"muted num gs-date"},Bx={key:1,class:"gs-group muted"},Ux=["onMousedown"],qx={class:"gs-text"},Hx={class:"muted gs-sub"},Wx={key:1,class:"gs-empty muted"},zx={class:"topbar-actions"},Gx={class:"user-chip num mobile-hide"},Yx=["disabled"],Jx={class:"num"},Xx={class:"content"},Qx={class:"content-inner"},Zx={class:"tabbar"},eC=["onClick"],tC={class:"sheet-user num"},nC=["onClick"],sC={class:"sheet-name"},rC={class:"msw"},oC={class:"msw-bar"},aC={class:"msw-results"},iC={key:0,class:"gs-group muted"},lC=["onMousedown"],uC={class:"tag"},cC={class:"gs-text"},dC={class:"muted num gs-date"},fC={key:1,class:"gs-group muted"},pC=["onMousedown"],vC={class:"gs-text"},mC={class:"muted gs-sub"},hC={key:1,class:"gs-empty muted"},yC={class:"toast-wrap"},gC=Ft({__name:"App",setup(e){const t=oy(),n=P(Ur());async function r(b){n.value=b,oa(b.userId),location.hash="#/calendar",U.value="calendar",await Ne(),await Ve(),c();try{await gd(),await tr()}catch{}He("欢迎,"+b.username);const _=sessionStorage.getItem("dsh_migrate_toast");_&&(sessionStorage.removeItem("dsh_migrate_toast"),He("已迁移原有数据 "+_+" 条"))}async function o(){Re.value=!1,Pe.value=!1,qm(),i!==null&&(window.clearInterval(i),i=null),await Om(),n.value=null,U.value="calendar",location.hash="#/calendar",He("已退出登录")}let i=null;function c(){Um(),i!==null&&window.clearInterval(i),i=window.setInterval(()=>{tr()},60*1e3),tr()}const f=P(null),v=P(""),y=P(!1),h=P({logs:[],memos:[]});let w=null;const C=it(()=>!!(h.value.logs.length||h.value.memos.length));function O(){w&&window.clearTimeout(w);const b=v.value;w=window.setTimeout(async()=>{const _=b.trim();if(!_){h.value={logs:[],memos:[]};return}const X=await Promise.all([Eh(_,8),Th(_,4)]);h.value={logs:X[0],memos:X[1]}},200)}function B(){v.value="",h.value={logs:[],memos:[]},y.value=!1}function te(b){Fi.value=b.date,J("calendar"),B()}function se(b){Vi.value=b.id,J("memo"),B()}function ae(){window.setTimeout(()=>{y.value=!1},150)}function re(b){var _;(b.ctrlKey||b.metaKey)&&b.key.toLowerCase()==="k"&&(b.preventDefault(),(_=f.value)==null||_.focus())}const V=[{key:"calendar",name:"日历",icon:"calendar",group:"记录"},{key:"today",name:"详情",icon:"edit",group:"记录"},{key:"plan",name:"计划",icon:"plan",group:"记录"},{key:"ledger",name:"记账",icon:"wallet",group:"工具"},{key:"memo",name:"备忘录",icon:"memo",group:"工具"},{key:"stats",name:"统计",icon:"chart",group:"分析"},{key:"report",name:"总结",icon:"export",group:"分析"},{key:"vault",name:"密码库",icon:"lock",group:"系统"},{key:"settings",name:"设置",icon:"settings",group:"系统"},{key:"admin",name:"用户管理",icon:"shield",group:"系统"}];function T(){var _;const b=(location.hash||"").replace("#/","");return!V.some(X=>X.key===b)||b==="admin"&&(((_=Ur())==null?void 0:_.username)||"")!=="xionglin"?"calendar":b}const U=P(T());window.addEventListener("hashchange",()=>{U.value=T()});function J(b){location.hash="#/"+b}const Y=it(()=>V.find(b=>b.key===U.value)||V[0]),ne=it(()=>{var b;return(((b=n.value)==null?void 0:b.username)||"")==="xionglin"}),$=it(()=>ne.value?V:V.filter(b=>b.key!=="admin")),R=it(()=>{const b=V.filter(_=>!ee.includes(_.key));return ne.value?b:b.filter(_=>_.key!=="admin")}),F=it(()=>R.value.some(b=>b.key===U.value));wt([ne,U],()=>{U.value==="admin"&&!ne.value&&J("calendar")},{immediate:!0});const ee=["calendar","today","plan","ledger"],Ie=V.filter(b=>ee.includes(b.key)),Pe=P(!1);function ke(b){Pe.value=!1,J(b)}const Re=P(!1),xe=P(null);function me(){Re.value=!0,window.setTimeout(()=>{var b;return(b=xe.value)==null?void 0:b.focus()},60)}function _e(b){te(b),Re.value=!1}function We(b){se(b),Re.value=!1}const Xe=P(bt()),Ae=P(void 0),pe=P(!1);async function Ne(){if(Ae.value=await wn(Xe.value),pe.value=!1,new Date().getHours()<4){const _=await wn(on(Xe.value,-1));pe.value=!!(_&&_.clock_in_at&&!_.clock_out_at)}}const dt=it(()=>{const b=Ae.value;return b&&b.clock_in_at&&!b.clock_out_at?!0:pe.value&&!(b&&b.clock_in_at)}),je=it(()=>{const b=Ae.value;return!!(b&&b.clock_in_at&&b.clock_out_at)}),fe=it(()=>{const b=Ae.value;return dt.value?"下班打卡":je.value?"已打卡 "+Un(b==null?void 0:b.clock_in_at)+" - "+Un(b==null?void 0:b.clock_out_at):"上班打卡"});async function De(){if(dt.value)try{await ah()}catch{}else await $d(Xe.value);await Ne(),rs()}wt(ur,()=>{n.value&&Ne()});const rt=P(!1);async function Ve(){if((await Ks()).remind_weekly==="off"){rt.value=!1;return}const _=new Date().getDay();if(_===5||_===6||_===0){const X=await hl(Qs(Xe.value));rt.value=!X||!X.highlights&&!X.challenges&&!X.plan_next}else rt.value=!1}return an(async()=>{window.addEventListener("keydown",re),n.value&&(oa(n.value.userId),await Ne(),await Ve(),c())}),(b,_)=>{var X,de;return n.value?(E(),A("div",Tx,[l("nav",Ax,[(E(!0),A(Ke,null,at($.value,(H,ie)=>(E(),A(Ke,{key:H.key},[ie>0&&H.group!==$.value[ie-1].group?(E(),A("div",Px)):we("",!0),l("button",{class:tt(["nav-btn",{active:U.value===H.key}]),"data-tip":H.name,onClick:Se=>J(H.key)},[Me(et,{name:H.icon,size:18},null,8,["name"])],10,Ox)],64))),128))]),l("div",Mx,[l("header",Ix,[l("span",jx,z(Y.value.name),1),l("button",{class:"mob-search-btn",title:"搜索",onClick:me},[Me(et,{name:"search",size:16})]),l("div",Dx,[Me(et,{name:"search",size:14,class:"gs-icon"}),Oe(l("input",{ref_key:"gsInput",ref:f,class:"input gs-input","onUpdate:modelValue":_[0]||(_[0]=H=>v.value=H),placeholder:"搜索工作记录与备忘录(Ctrl+K)",onInput:O,onFocus:_[1]||(_[1]=H=>y.value=!0),onBlur:ae,onKeydown:Et(B,["esc"])},null,544),[[Fe,v.value]]),y.value&&v.value.trim()?(E(),A("div",Lx,[C.value?(E(),A(Ke,{key:0},[h.value.logs.length?(E(),A("div",Kx,"工作记录")):we("",!0),(E(!0),A(Ke,null,at(h.value.logs,H=>(E(),A("div",{key:"l"+H.id,class:"gs-item",onMousedown:en(ie=>te(H),["prevent"])},[l("span",Nx,z(cn(Li)(H.category)),1),l("span",Fx,z(H.content),1),l("span",Vx,z(H.date),1)],40,Rx))),128)),h.value.memos.length?(E(),A("div",Bx,"备忘录")):we("",!0),(E(!0),A(Ke,null,at(h.value.memos,H=>(E(),A("div",{key:"m"+H.id,class:"gs-item",onMousedown:en(ie=>se(H),["prevent"])},[l("span",qx,z(H.title||"无标题"),1),l("span",Hx,z(H.content),1)],40,Ux))),128))],64)):(E(),A("div",Wx,"无匹配结果"))])):we("",!0)]),_[12]||(_[12]=l("span",{class:"flex1"},null,-1)),l("div",zx,[rt.value?(E(),A("button",{key:0,class:"week-tip",onClick:_[2]||(_[2]=H=>J("report"))},[..._[11]||(_[11]=[l("span",{class:"dot",style:{background:"var(--warn)"}},null,-1),Pt(" 填写本周周记 ",-1)])])):we("",!0),l("span",Gx,z((X=n.value)==null?void 0:X.username),1),l("button",{class:"btn btn-sm mobile-hide",onClick:o},"退出"),l("button",{class:"btn btn-primary btn-sm",disabled:je.value,onClick:De},[Me(et,{name:je.value?"check-circle":"clock",size:14},null,8,["name"]),l("span",Jx,z(fe.value),1)],8,Yx)])]),l("main",Xx,[l("div",Qx,[U.value==="calendar"?(E(),At(Tg,{key:0})):U.value==="today"?(E(),At(jg,{key:1})):U.value==="plan"?(E(),At(bb,{key:2})):U.value==="stats"?(E(),At(Jb,{key:3})):U.value==="report"?(E(),At(Yw,{key:4})):U.value==="ledger"?(E(),At(d1,{key:5})):U.value==="memo"?(E(),At(A1,{key:6})):U.value==="vault"?(E(),At($0,{key:7})):U.value==="admin"?(E(),At(yx,{key:8})):(E(),At(jk,{key:9}))])]),l("nav",Zx,[(E(!0),A(Ke,null,at(cn(Ie),H=>(E(),A("button",{key:H.key,class:tt(["tab-btn",{active:U.value===H.key}]),onClick:ie=>J(H.key)},[Me(et,{name:H.icon,size:20},null,8,["name"]),l("span",null,z(H.name),1)],10,eC))),128)),l("button",{class:tt(["tab-btn",{active:F.value}]),onClick:_[3]||(_[3]=H=>Pe.value=!0)},[Me(et,{name:"more",size:20}),_[13]||(_[13]=l("span",null,"更多",-1))],2)]),Pe.value?(E(),A("div",{key:0,class:"sheet-mask",onClick:_[6]||(_[6]=H=>Pe.value=!1)},[l("div",{class:"more-sheet",onClick:_[5]||(_[5]=en(()=>{},["stop"]))},[l("div",tC,z((de=n.value)==null?void 0:de.username),1),(E(!0),A(Ke,null,at(R.value,H=>(E(),A("button",{key:H.key,class:"sheet-row",onClick:ie=>ke(H.key)},[Me(et,{name:H.icon,size:18},null,8,["name"]),l("span",sC,z(H.name),1),Me(et,{name:"chevron-right",size:14,class:"sheet-go"})],8,nC))),128)),_[15]||(_[15]=l("div",{class:"sheet-divider"},null,-1)),l("button",{class:"sheet-row sheet-danger",onClick:_[4]||(_[4]=H=>{Pe.value=!1,o()})},[Me(et,{name:"close",size:18}),_[14]||(_[14]=l("span",{class:"sheet-name"},"退出登录",-1))])])])):we("",!0),Re.value?(E(),A("div",{key:1,class:"msw-mask",onClick:_[10]||(_[10]=en(H=>Re.value=!1,["self"]))},[l("div",rC,[l("div",oC,[Me(et,{name:"search",size:16,class:"msw-icon"}),Oe(l("input",{ref_key:"msInput",ref:xe,class:"msw-input","onUpdate:modelValue":_[7]||(_[7]=H=>v.value=H),placeholder:"搜索工作记录与备忘录",onInput:O,onKeydown:_[8]||(_[8]=Et(H=>Re.value=!1,["esc"]))},null,544),[[Fe,v.value]]),l("button",{class:"icon-btn",onClick:_[9]||(_[9]=H=>{B(),Re.value=!1})},[Me(et,{name:"close",size:16})])]),l("div",aC,[C.value?(E(),A(Ke,{key:0},[h.value.logs.length?(E(),A("div",iC,"工作记录")):we("",!0),(E(!0),A(Ke,null,at(h.value.logs,H=>(E(),A("div",{key:"l"+H.id,class:"msw-item",onMousedown:en(ie=>_e(H),["prevent"])},[l("span",uC,z(cn(Li)(H.category)),1),l("span",cC,z(H.content),1),l("span",dC,z(H.date),1)],40,lC))),128)),h.value.memos.length?(E(),A("div",fC,"备忘录")):we("",!0),(E(!0),A(Ke,null,at(h.value.memos,H=>(E(),A("div",{key:"m"+H.id,class:"msw-item",onMousedown:en(ie=>We(H),["prevent"])},[l("span",vC,z(H.title||"无标题"),1),l("span",mC,z(H.content),1)],40,pC))),128))],64)):v.value.trim()?(E(),A("div",hC,"无匹配结果")):we("",!0)])])])):we("",!0)]),l("div",yC,[Me(Tv,{name:"toast"},{default:vs(()=>[(E(!0),A(Ke,null,at(cn(t),H=>(E(),A("div",{key:H.id,class:"toast"},z(H.text),1))),128))]),_:1})])])):(E(),At(Ex,{key:0,onLogin:r}))}}}),bC=Ut(gC,[["__scopeId","data-v-c88c3788"]]);function Fo(e,t){try{let n=document.getElementById("fatal-overlay");n||(n=document.createElement("div"),n.id="fatal-overlay",n.style.cssText="position:fixed;inset:0;z-index:99999;background:#FFFFFF;color:#1D2129;padding:20px;overflow:auto;font:13px/1.7 -apple-system,PingFang SC,Microsoft YaHei,sans-serif;",n.addEventListener("click",i=>{i.target===n&&n.parentElement&&n.parentElement.removeChild(n)}),document.body.appendChild(n));const r=document.createElement("div");r.style.cssText="border:1px solid #E5484D;border-radius:8px;padding:12px;margin-bottom:12px;word-break:break-all;white-space:pre-wrap;",r.textContent=e+` -`+t;const o=document.createElement("button");o.textContent="重新加载",o.style.cssText="margin:-4px 0 12px;padding:6px 16px;border:1px solid #E5484D;border-radius:6px;background:#FFFFFF;color:#E5484D;font-size:13px;cursor:pointer;",o.addEventListener("click",()=>{try{location.reload()}catch{}}),n.appendChild(r),n.appendChild(o)}catch{}}async function wC(){const e=await Pm();e&&oa(e.userId);const t=Uv(bC);t.config.errorHandler=(n,r,o)=>{const i=n;Fo("应用内部错误(点击空白处关闭,请将以下内容发送给开发者)",i&&(i.stack||i.message)||String(n)+` -触发位置: `+o)},window.addEventListener("unhandledrejection",n=>{const r=n.reason;Fo("未处理的异步错误(点击空白处关闭)",r&&(r.stack||r.message)||String(n.reason))}),window.addEventListener("error",n=>{n.message&&n.message!=="ResizeObserver loop limit exceeded"&&Fo("运行错误(点击空白处关闭)",n.message)}),t.mount("#app"),"serviceWorker"in navigator&&location.protocol.startsWith("http")&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(()=>{})})}wC().catch(e=>{Fo("无法启动:连接同步服务器失败",e&&(e.stack||e.message)||String(e))});export{jd as W,Od as _,cw as b,Id as r}; diff --git a/intern-log/dist/assets/index-MT694d7P.css b/intern-log/dist/assets/index-MT694d7P.css deleted file mode 100644 index cd13240..0000000 --- a/intern-log/dist/assets/index-MT694d7P.css +++ /dev/null @@ -1 +0,0 @@ -.mask[data-v-f27041d4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:100}.dialog[data-v-f27041d4]{width:380px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);padding:20px}.dialog-title[data-v-f27041d4]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-msg[data-v-f27041d4]{margin-top:8px;color:var(--text-2);font-size:13px;line-height:1.7;word-break:break-all}.dialog-btns[data-v-f27041d4]{margin-top:20px;display:flex;justify-content:flex-end;gap:8px}.btn-danger-solid[data-v-f27041d4]{background:var(--danger);border-color:var(--danger);color:#fff}.btn-danger-solid[data-v-f27041d4]:hover{background:#d13a3f}.modal-enter-active[data-v-f27041d4],.modal-leave-active[data-v-f27041d4]{transition:opacity .15s ease}.modal-enter-from[data-v-f27041d4],.modal-leave-to[data-v-f27041d4]{opacity:0}.mask[data-v-aaf87f80]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-aaf87f80]{width:560px;max-width:calc(100vw - 32px);max-height:85vh;background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);display:flex;flex-direction:column}.dialog-head[data-v-aaf87f80]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex:none}.dialog-title[data-v-aaf87f80]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-sub[data-v-aaf87f80]{font-size:12px;margin-top:2px}.dialog-body[data-v-aaf87f80]{padding:16px 20px;overflow:auto}.dialog-btns[data-v-aaf87f80]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border);flex:none}.form-grid[data-v-aaf87f80]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-aaf87f80]{grid-column:span 2}.field label[data-v-aaf87f80]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-aaf87f80]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-aaf87f80],.input.invalid[data-v-aaf87f80]:focus{border-color:var(--danger)}.toggle-btn[data-v-aaf87f80]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-aaf87f80]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-aaf87f80]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.toggle-btn.onwarn[data-v-aaf87f80]{color:var(--warn);border-color:var(--warn)}.modal-enter-active[data-v-aaf87f80],.modal-leave-active[data-v-aaf87f80]{transition:opacity .15s ease}.modal-enter-from[data-v-aaf87f80],.modal-leave-to[data-v-aaf87f80]{opacity:0}.dp-head[data-v-de6fe794]{margin-bottom:12px}.dp-date[data-v-de6fe794]{font-size:14px;font-weight:600}.sec[data-v-de6fe794]{padding:14px 16px;margin-bottom:12px}.sec-title[data-v-de6fe794]{font-size:13px;font-weight:600;margin-bottom:10px;color:var(--text-1)}.sec-head[data-v-de6fe794]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-de6fe794]{margin-bottom:0}.form-hint[data-v-de6fe794]{font-size:12px}.att-grid[data-v-de6fe794]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.att-cell label[data-v-de6fe794],.field label[data-v-de6fe794]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.att-val[data-v-de6fe794]{display:flex;align-items:center;gap:6px;min-height:32px;font-size:13px}.status-val[data-v-de6fe794]{min-height:32px}.val-empty[data-v-de6fe794]{color:var(--text-3)}.edit-row[data-v-de6fe794]{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.time-input[data-v-de6fe794]{width:104px}.att-note[data-v-de6fe794]{margin-top:10px;font-size:12px}.att-actions[data-v-de6fe794]{display:flex;gap:8px;margin-top:12px}.form-grid[data-v-de6fe794]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-de6fe794]{grid-column:span 2}.form-footer[data-v-de6fe794]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.form-error[data-v-de6fe794]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-de6fe794]{border-color:var(--danger)}.input.invalid[data-v-de6fe794]:focus{border-color:var(--danger)}.list-sec[data-v-de6fe794]{margin-bottom:4px}.item[data-v-de6fe794]{border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:6px;background:var(--bg-page)}.item-main[data-v-de6fe794]{display:flex;align-items:center;gap:8px;min-height:26px;flex-wrap:wrap}.item-content[data-v-de6fe794]{cursor:text;word-break:break-all}.item-meta[data-v-de6fe794]{font-size:12px}.item-sub[data-v-de6fe794]{margin-top:6px;padding-top:6px;border-top:1px dashed var(--border);font-size:12px;display:flex;flex-direction:column;gap:2px}.empty[data-v-de6fe794]{text-align:center;padding:24px 0}.dp-foot[data-v-de6fe794]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.att-grid[data-v-de6fe794],.form-grid[data-v-de6fe794]{grid-template-columns:1fr}.field.span2[data-v-de6fe794]{grid-column:auto}}.cal-toolbar[data-v-2404dfbe]{display:flex;align-items:center;gap:10px;margin-bottom:12px}.cal-title[data-v-2404dfbe]{font-size:14px;font-weight:600;min-width:96px;text-align:center}.cal-head[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-week[data-v-2404dfbe]{text-align:center;padding:6px 0;font-size:12px;border-right:1px solid var(--border);border-bottom:1px solid var(--border)}.cal-grid[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-cell[data-v-2404dfbe]{min-height:92px;padding:6px 8px;text-align:left;background:var(--bg-page);border:none;border-right:1px solid var(--border);border-bottom:1px solid var(--border);cursor:pointer;display:block;font-size:13px}.cal-cell[data-v-2404dfbe]:hover{background:var(--bg-subtle)}.cal-cell.blank[data-v-2404dfbe]{cursor:default}.cal-cell.blank[data-v-2404dfbe]:hover{background:var(--bg-page)}.cal-cell.selected[data-v-2404dfbe]{background:var(--accent-bg)}.daynum.today[data-v-2404dfbe]{color:var(--accent);font-weight:600}.cal-cell.weekend .daynum[data-v-2404dfbe]{color:var(--text-3)}.cal-marks[data-v-2404dfbe]{display:flex;align-items:center;gap:4px;margin-top:8px;height:14px}.mark-log[data-v-2404dfbe]{color:var(--text-3)}.mark-star[data-v-2404dfbe]{color:var(--accent)}.drawer[data-v-2404dfbe]{position:fixed;top:0;right:0;bottom:0;width:min(420px,100%);background:var(--bg-page);border-left:1px solid var(--border);box-shadow:var(--shadow-float);z-index:20;display:flex;flex-direction:column}.drawer-head[data-v-2404dfbe]{height:48px;flex:none;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--border)}.drawer-title[data-v-2404dfbe]{font-weight:600}.drawer-body[data-v-2404dfbe]{flex:1;overflow:auto;padding:16px}.drawer-enter-active[data-v-2404dfbe],.drawer-leave-active[data-v-2404dfbe]{transition:opacity .15s ease}.drawer-enter-from[data-v-2404dfbe],.drawer-leave-to[data-v-2404dfbe]{opacity:0}@media (max-width: 720px){.cal-cell[data-v-2404dfbe]{min-height:60px;padding:4px 5px}.cal-title[data-v-2404dfbe]{min-width:76px;font-size:13px}.cal-marks[data-v-2404dfbe]{gap:3px;margin-top:4px;height:12px}.drawer[data-v-2404dfbe]{width:100%}}.detail-toolbar[data-v-76243d98]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.date-title[data-v-76243d98]{font-size:14px;font-weight:600;min-width:170px;text-align:center}.date-title.is-today[data-v-76243d98]{color:var(--accent)}.w-date[data-v-76243d98]{width:150px}@media (max-width: 720px){.detail-toolbar[data-v-76243d98]{gap:8px}.date-title[data-v-76243d98]{min-width:0;flex:1;text-align:left}.w-date[data-v-76243d98]{flex:1;min-width:120px;width:auto}}.plan-page[data-v-dd89fae2]{display:flex;flex-direction:column;gap:10px;max-width:760px}.plan-head[data-v-dd89fae2]{padding:12px 16px}.nav-row[data-v-dd89fae2]{display:flex;align-items:center;gap:8px}.date-box[data-v-dd89fae2]{min-width:150px;text-align:center}.date-main[data-v-dd89fae2]{font-weight:600;font-size:14px}.date-sub[data-v-dd89fae2]{font-size:11px;margin-left:6px}.sum-line[data-v-dd89fae2]{font-size:12px;margin-top:8px}.timer-live[data-v-dd89fae2]{color:var(--accent);font-weight:600}.flex1[data-v-dd89fae2]{flex:1}.plan-item[data-v-dd89fae2]{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}.plan-item.done[data-v-dd89fae2]{opacity:.62}.plan-item.skip[data-v-dd89fae2]{opacity:.5}.plan-item.running[data-v-dd89fae2]{border-left:3px solid var(--accent)}.pi-time[data-v-dd89fae2]{font-size:13px;font-weight:600;min-width:92px;padding-top:2px}.pi-main[data-v-dd89fae2]{flex:1;min-width:0}.pi-title[data-v-dd89fae2]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.pi-text[data-v-dd89fae2]{font-size:14px;font-weight:500;word-break:break-all}.pi-text.strike[data-v-dd89fae2]{text-decoration:line-through}.state-done[data-v-dd89fae2]{color:var(--ok, #2e9e5b);font-size:12px}.state-skip[data-v-dd89fae2]{color:var(--text-3);font-size:12px}.pi-note[data-v-dd89fae2],.pi-meta[data-v-dd89fae2]{font-size:12px;margin-top:3px}.pi-ops[data-v-dd89fae2]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.timer-on[data-v-dd89fae2]{color:var(--accent);border-color:var(--accent)}.empty[data-v-dd89fae2]{text-align:center;padding:26px 16px}.fixed-mask[data-v-dd89fae2]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;background:#1d212959;display:flex;align-items:center;justify-content:center;padding:16px}.dialog[data-v-dd89fae2]{background:var(--bg-page);border-radius:12px;width:420px;max-width:100%}.dialog-head[data-v-dd89fae2]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 0}.dialog-title[data-v-dd89fae2]{font-weight:600;font-size:14px}.dialog-body[data-v-dd89fae2]{padding:6px 16px 4px}.dialog-btns[data-v-dd89fae2]{display:flex;justify-content:flex-end;gap:10px;padding:12px 16px 16px}.form-row[data-v-dd89fae2]{display:flex;flex-direction:column;gap:5px;margin-top:10px}.form-row label[data-v-dd89fae2]{font-size:12px;color:var(--text-2)}.form-row.two[data-v-dd89fae2]{flex-direction:row;gap:10px}.form-row.two>div[data-v-dd89fae2]{flex:1;display:flex;flex-direction:column;gap:5px}@media (max-width: 720px){.plan-item[data-v-dd89fae2]{flex-wrap:wrap}.pi-ops[data-v-dd89fae2]{width:100%;justify-content:flex-start}}.cards[data-v-f8410651]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card[data-v-f8410651]{padding:14px 16px}.stat-num[data-v-f8410651]{font-size:20px;font-weight:600;margin-top:4px}.section[data-v-f8410651]{padding:14px 16px;margin-top:12px}.section-title[data-v-f8410651]{font-weight:600;margin-bottom:10px;font-size:13px}.heat[data-v-f8410651]{display:flex;gap:3px;overflow-x:auto;padding-bottom:4px}.heat-col[data-v-f8410651]{display:flex;flex-direction:column;gap:3px}.heat-cell[data-v-f8410651]{width:12px;height:12px;border-radius:2px;display:inline-block}.lv0[data-v-f8410651]{background:var(--bg-subtle);border:1px solid var(--border)}.lv1[data-v-f8410651]{background:#d8ecdf}.lv2[data-v-f8410651]{background:#a9d8bc}.lv3[data-v-f8410651]{background:#6fbf92}.lv4[data-v-f8410651]{background:var(--ok)}.heat-legend[data-v-f8410651]{display:flex;align-items:center;gap:3px;margin-top:8px;font-size:12px}.two-col[data-v-f8410651]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.bar-row[data-v-f8410651]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-f8410651]{width:72px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-f8410651]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-f8410651]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-f8410651]{font-size:12px;width:92px;flex:none}.loc-label[data-v-f8410651]{width:110px;text-align:left}@media (max-width: 720px){.cards[data-v-f8410651]{grid-template-columns:repeat(2,1fr)}.two-col[data-v-f8410651]{grid-template-columns:1fr}}.report-toolbar[data-v-43f9c59b]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.ai-error[data-v-43f9c59b]{color:var(--danger);font-size:12px;margin:0 0 8px}.seg[data-v-43f9c59b]{display:inline-flex;border:1px solid var(--border-strong);border-radius:6px;overflow:hidden}.seg-btn[data-v-43f9c59b]{height:28px;padding:0 12px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;border-right:1px solid var(--border)}.seg-btn[data-v-43f9c59b]:last-child{border-right:none}.seg-btn[data-v-43f9c59b]:hover{background:var(--bg-hover)}.seg-btn.active[data-v-43f9c59b]{background:var(--accent-bg);color:var(--accent)}.w-date[data-v-43f9c59b]{width:140px}.report-grid[data-v-43f9c59b]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:12px;align-items:start}.section[data-v-43f9c59b]{padding:14px 16px}.section-title[data-v-43f9c59b]{font-weight:600;margin-bottom:8px;font-size:13px}.section+.section[data-v-43f9c59b]{margin-top:12px}.note-label[data-v-43f9c59b]{display:block;font-size:12px;margin:8px 0 4px}.note-saved[data-v-43f9c59b]{font-size:12px;margin-top:6px}.md-editor[data-v-43f9c59b]{min-height:420px;line-height:1.7}.sum-row[data-v-43f9c59b]{display:flex;justify-content:space-between;padding:3px 0;font-size:12px}.section-sub[data-v-43f9c59b]{font-weight:600;margin:10px 0 4px;font-size:12px}.sum-item[data-v-43f9c59b]{font-size:12px;padding:2px 0;word-break:break-all}.sum-empty[data-v-43f9c59b]{font-size:12px}@media (max-width: 960px){.report-grid[data-v-43f9c59b]{grid-template-columns:1fr}}.mask[data-v-9f38206c]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-9f38206c]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-9f38206c]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-9f38206c]{font-size:14px;font-weight:600;color:var(--text-1)}.add-cat[data-v-9f38206c]{display:flex;gap:6px;margin-top:6px}.add-cat-input[data-v-9f38206c]{flex:1;height:28px;font-size:12px}.dialog-body[data-v-9f38206c]{padding:16px 20px}.dialog-btns[data-v-9f38206c]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-9f38206c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-9f38206c]{grid-column:span 2}.field label[data-v-9f38206c]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.seg[data-v-9f38206c]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-9f38206c]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-9f38206c]{border-left:1px solid var(--border)}.seg-btn.active[data-v-9f38206c]{background:var(--accent-bg);color:var(--accent)}.form-error[data-v-9f38206c]{color:var(--danger);font-size:12px;margin-top:8px}.input.invalid[data-v-9f38206c],.input.invalid[data-v-9f38206c]:focus{border-color:var(--danger)}.modal-enter-active[data-v-9f38206c],.modal-leave-active[data-v-9f38206c]{transition:opacity .15s ease}.modal-enter-from[data-v-9f38206c],.modal-leave-to[data-v-9f38206c]{opacity:0}.ledger-toolbar[data-v-2660d908]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.month-title[data-v-2660d908]{font-size:14px;font-weight:600;min-width:88px;text-align:center}.w-filter[data-v-2660d908]{width:110px;flex:none}.cards[data-v-2660d908]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.stat-card[data-v-2660d908]{padding:14px 16px}.stat-num[data-v-2660d908]{font-size:20px;font-weight:600;margin-top:4px}.amt-income[data-v-2660d908]{color:var(--ok)}.amt-expense[data-v-2660d908]{color:var(--text-1)}.amt-warn[data-v-2660d908]{color:var(--warn)}.sec[data-v-2660d908]{padding:14px 16px;margin-top:12px}.sec-title[data-v-2660d908]{font-size:13px;font-weight:600;margin-bottom:10px}.sec-head[data-v-2660d908]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-2660d908]{margin-bottom:0}.form-hint[data-v-2660d908]{font-size:12px}.form-grid[data-v-2660d908]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-2660d908]{grid-column:span 2}.field label[data-v-2660d908]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-2660d908]{color:var(--danger);font-size:12px;margin-top:8px}.form-footer[data-v-2660d908]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.seg[data-v-2660d908]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-2660d908]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-2660d908]{border-left:1px solid var(--border)}.seg-btn.active[data-v-2660d908]{background:var(--accent-bg);color:var(--accent)}.toggle-btn[data-v-2660d908]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-2660d908]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-2660d908]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.bar-row[data-v-2660d908]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-2660d908]{width:56px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-2660d908]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-2660d908]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-2660d908]{font-size:12px;width:110px;flex:none}.table-card[data-v-2660d908]{overflow-x:auto}.tx-table[data-v-2660d908]{width:100%;border-collapse:collapse;font-size:13px}.tx-table th[data-v-2660d908]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.tx-table td[data-v-2660d908]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.tx-table tbody tr[data-v-2660d908]:hover{background:var(--bg-subtle)}.tx-table tbody tr:last-child td[data-v-2660d908]{border-bottom:none}.td-note[data-v-2660d908]{color:var(--text-2)}.tx-pending[data-v-2660d908]{color:var(--warn);font-size:12px}.tx-done[data-v-2660d908]{color:var(--ok);font-size:12px}.th-ops[data-v-2660d908]{width:220px}.ops[data-v-2660d908]{display:flex;gap:4px;flex-wrap:wrap}.empty[data-v-2660d908]{text-align:center;padding:24px 0}.vault-note[data-v-2660d908]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.form-grid[data-v-2660d908]{grid-template-columns:1fr}.field.span2[data-v-2660d908]{grid-column:auto}.ledger-toolbar .w-filter[data-v-2660d908]{flex:1;min-width:0;width:auto}}.memo-page[data-v-74d60dba]{display:grid;grid-template-columns:280px minmax(0,1fr);gap:12px;align-items:stretch}.memo-list[data-v-74d60dba]{display:flex;flex-direction:column;max-height:calc(100vh - 140px)}.pane-head[data-v-74d60dba]{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;border-bottom:1px solid var(--border);flex:none}.pane-title[data-v-74d60dba]{font-size:13px;font-weight:600}.memo-scroll[data-v-74d60dba]{overflow:auto;padding:6px}.memo-item[data-v-74d60dba]{padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer;margin-bottom:2px}.memo-item[data-v-74d60dba]:hover{background:var(--bg-hover)}.memo-item.active[data-v-74d60dba]{background:var(--accent-bg)}.memo-item.active .memo-item-title[data-v-74d60dba]{color:var(--accent)}.memo-item-title[data-v-74d60dba]{font-size:13px;font-weight:500;word-break:break-all}.memo-item-sub[data-v-74d60dba]{font-size:12px;margin-top:2px;word-break:break-all}.memo-item-time[data-v-74d60dba]{font-size:11px;margin-top:2px}.memo-editor[data-v-74d60dba]{padding:16px;min-height:420px;display:flex;flex-direction:column}.title-input[data-v-74d60dba]{font-size:14px;font-weight:500;margin-bottom:10px}.content-textarea[data-v-74d60dba]{flex:1;min-height:340px;line-height:1.8}.editor-foot[data-v-74d60dba]{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}.foot-info[data-v-74d60dba]{font-size:12px}.editor-empty[data-v-74d60dba]{display:flex;align-items:center;justify-content:center;flex:1;padding:60px 0}@media (max-width: 800px){.memo-page[data-v-74d60dba]{grid-template-columns:1fr}.memo-list[data-v-74d60dba]{max-height:240px}.content-textarea[data-v-74d60dba]{min-height:240px}}.mask[data-v-f383b0a6]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-f383b0a6]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-f383b0a6]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-f383b0a6]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-f383b0a6]{padding:16px 20px}.dialog-btns[data-v-f383b0a6]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-f383b0a6]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-f383b0a6]{grid-column:span 2}.field label[data-v-f383b0a6]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.pwd-row[data-v-f383b0a6]{display:flex;gap:8px}.pwd-row .input[data-v-f383b0a6]{flex:1}.form-error[data-v-f383b0a6]{color:var(--danger);font-size:12px;margin-top:8px}.modal-enter-active[data-v-f383b0a6],.modal-leave-active[data-v-f383b0a6]{transition:opacity .15s ease}.modal-enter-from[data-v-f383b0a6],.modal-leave-to[data-v-f383b0a6]{opacity:0}.lock-card[data-v-c2db283d]{max-width:380px;margin:60px auto 0;padding:28px 24px;text-align:center;display:flex;flex-direction:column;gap:10px}.lock-badge[data-v-c2db283d]{width:52px;height:52px;margin:0 auto;border-radius:50%;background:var(--bg-subtle);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-2)}.lock-title[data-v-c2db283d]{font-size:14px;font-weight:600}.lock-tip[data-v-c2db283d]{font-size:12px;line-height:1.7}.lock-btn[data-v-c2db283d]{margin-top:4px}.form-error[data-v-c2db283d]{color:var(--danger);font-size:12px}.empty[data-v-c2db283d]{text-align:center;padding:24px 0}.vault-toolbar[data-v-c2db283d]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.search-wrap[data-v-c2db283d]{position:relative;width:280px;max-width:100%}.search-wrap .input[data-v-c2db283d]{padding-left:30px}.search-icon[data-v-c2db283d]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.table-card[data-v-c2db283d]{overflow-x:auto}.cred-table[data-v-c2db283d]{width:100%;border-collapse:collapse;font-size:13px}.cred-table th[data-v-c2db283d]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.cred-table td[data-v-c2db283d]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.cred-table tbody tr[data-v-c2db283d]:hover{background:var(--bg-subtle)}.cred-table tbody tr:last-child td[data-v-c2db283d]{border-bottom:none}.td-system[data-v-c2db283d]{font-weight:500}.th-ops[data-v-c2db283d]{width:150px}.pwd-cell[data-v-c2db283d]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.pwd-text[data-v-c2db283d]{letter-spacing:1px}.copyable[data-v-c2db283d]{cursor:pointer}.copyable[data-v-c2db283d]:hover{color:var(--accent)}.ops[data-v-c2db283d]{display:flex;gap:4px;flex-wrap:wrap}.vault-note[data-v-c2db283d]{margin-top:10px;font-size:12px;text-align:right}.mask[data-v-c2db283d]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-c2db283d]{width:440px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-c2db283d]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-c2db283d]{font-size:14px;font-weight:600}.dialog-body[data-v-c2db283d]{padding:16px 20px}.dialog-btns[data-v-c2db283d]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.vp-field[data-v-c2db283d]{margin-bottom:10px}.vp-field label[data-v-c2db283d]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.vp-tip[data-v-c2db283d]{font-size:12px;margin-top:8px}.modal-enter-active[data-v-c2db283d],.modal-leave-active[data-v-c2db283d]{transition:opacity .15s ease}.modal-enter-from[data-v-c2db283d],.modal-leave-to[data-v-c2db283d]{opacity:0}.settings[data-v-e3f1f671]{display:flex;flex-direction:column;gap:12px;max-width:640px}.acc-line[data-v-e3f1f671]{font-size:12px;margin-bottom:10px;line-height:1.7}.section[data-v-e3f1f671]{padding:14px 16px}.section-title[data-v-e3f1f671]{font-weight:600;margin-bottom:10px;font-size:13px}.rule-grid[data-v-e3f1f671]{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}.rule-item label[data-v-e3f1f671]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.rule-save[data-v-e3f1f671]{display:flex;align-items:center;gap:10px;margin-top:12px}.proj-add[data-v-e3f1f671]{display:flex;gap:8px}.proj-tip[data-v-e3f1f671]{font-size:12px;margin-top:6px}.proj-row[data-v-e3f1f671]{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.proj-row[data-v-e3f1f671]:last-child{border-bottom:none}.proj-name[data-v-e3f1f671]{flex:1;word-break:break-all}.proj-name.archived[data-v-e3f1f671]{color:var(--text-3);text-decoration:line-through}.loc-note[data-v-e3f1f671]{font-size:12px}.ai-grid[data-v-e3f1f671]{display:flex;flex-direction:column;gap:10px}.backup-row[data-v-e3f1f671]{display:flex;gap:8px}.cat-block[data-v-e3f1f671]{margin-top:10px}.cat-head[data-v-e3f1f671]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;font-size:12px}.cat-chips[data-v-e3f1f671]{display:flex;flex-wrap:wrap;gap:6px}.cat-chip[data-v-e3f1f671]{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px}.chip-btn[data-v-e3f1f671]{border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:11px;padding:0 1px}.chip-btn[data-v-e3f1f671]:hover{color:var(--accent)}.exp-dates[data-v-e3f1f671]{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}.exp-dates .input[data-v-e3f1f671]{width:150px}.seg[data-v-e3f1f671]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-e3f1f671]{border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;padding:5px 12px}.seg-btn.active[data-v-e3f1f671]{background:var(--accent-bg);color:var(--accent)}.import-error[data-v-e3f1f671]{color:var(--danger);font-size:12px;margin-top:8px}.backup-note[data-v-e3f1f671]{font-size:12px;margin-top:10px}.admin-page[data-v-06be07ff]{display:flex;flex-direction:column;gap:12px;max-width:860px}.toolbar[data-v-06be07ff]{display:flex;align-items:center;gap:12px}.head-wrap[data-v-06be07ff]{flex:1;min-width:0}.sec-title[data-v-06be07ff]{font-weight:600;font-size:13px}.head-sub[data-v-06be07ff]{font-size:12px;margin-top:2px}.sec[data-v-06be07ff]{padding:14px 16px}.admin-table-card[data-v-06be07ff]{overflow-x:auto}.admin-table[data-v-06be07ff]{width:100%;border-collapse:collapse;font-size:13px}.admin-table th[data-v-06be07ff]{text-align:left;font-weight:500;color:var(--text-3);font-size:12px;padding:8px 12px;border-bottom:1px solid var(--border)}.admin-table td[data-v-06be07ff]{padding:9px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.admin-table td[data-v-06be07ff]:last-child{border-bottom:none}.td-name[data-v-06be07ff]{font-weight:500}.role-badge[data-v-06be07ff]{display:inline-flex;align-items:center;border:1px solid var(--accent);color:var(--accent);border-radius:999px;font-size:12px;line-height:16px;padding:1px 8px}.load-line[data-v-06be07ff]{padding:12px;font-size:12px}.admin-note[data-v-06be07ff]{font-size:12px;padding:0 2px}.ops[data-v-06be07ff]{display:inline-flex;gap:6px}.form-row[data-v-06be07ff]{display:flex;flex-direction:column;gap:5px;margin-top:10px}.form-row label[data-v-06be07ff]{font-size:12px;color:var(--text-2)}.fixed-mask[data-v-06be07ff]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;background:#1d212959;display:flex;align-items:center;justify-content:center;padding:16px}.dialog[data-v-06be07ff]{background:var(--bg-page);border-radius:12px;width:420px;max-width:100%}.dialog-head[data-v-06be07ff]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 0}.dialog-title[data-v-06be07ff]{font-weight:600;font-size:14px}.dialog-body[data-v-06be07ff]{padding:6px 16px 4px}.dialog-btns[data-v-06be07ff]{display:flex;justify-content:flex-end;gap:10px;padding:12px 16px 16px}.btn-danger[data-v-06be07ff]{color:var(--danger)}.empty[data-v-06be07ff]{text-align:center}@media (max-width: 720px){.toolbar[data-v-06be07ff]{flex-wrap:wrap;row-gap:8px}.admin-table td[data-v-06be07ff],.admin-table th[data-v-06be07ff]{white-space:normal}}.login-page[data-v-bf714afa]{min-height:100vh;background:var(--bg-subtle);display:flex;align-items:center;justify-content:center;padding:20px}.login-card[data-v-bf714afa]{width:400px;max-width:100%;padding:28px 26px;display:flex;flex-direction:column;gap:12px;background:var(--bg-page)}.login-brand[data-v-bf714afa]{text-align:center;margin-bottom:6px}.brand-icon[data-v-bf714afa]{width:46px;height:46px;margin:0 auto 10px;border-radius:var(--radius-md);background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center}.login-title[data-v-bf714afa]{font-size:18px;font-weight:600;color:var(--text-1)}.login-sub[data-v-bf714afa]{font-size:12px;margin-top:4px;line-height:1.7}.seg[data-v-bf714afa]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-bf714afa]{flex:1;height:30px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-bf714afa]{border-left:1px solid var(--border)}.seg-btn.active[data-v-bf714afa]{background:var(--accent-bg);color:var(--accent)}.mig-row[data-v-bf714afa]{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;line-height:1.6}.mig-row input[data-v-bf714afa]{margin-top:3px}.form-error[data-v-bf714afa]{color:var(--danger);font-size:12px}.login-btn[data-v-bf714afa]{margin-top:2px}.login-note[data-v-bf714afa]{font-size:12px;text-align:center;line-height:1.7}.app[data-v-c88c3788]{display:flex;height:100vh;height:100dvh;overflow:hidden}.side[data-v-c88c3788]{width:56px;flex:none;border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;padding-top:10px;gap:4px;background:var(--bg-page)}.nav-btn[data-v-c88c3788]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--text-3);cursor:pointer;border:none;background:transparent;position:relative}.nav-btn[data-v-c88c3788]:hover{background:var(--bg-hover);color:var(--text-1)}.nav-btn.active[data-v-c88c3788]{background:var(--accent-bg);color:var(--accent)}.nav-btn[data-v-c88c3788]:after{content:attr(data-tip);position:absolute;left:46px;top:50%;transform:translateY(-50%);background:var(--text-1);color:#fff;font-size:12px;line-height:1.4;padding:2px 8px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s}.nav-btn[data-v-c88c3788]:hover:after{opacity:1}.nav-sep[data-v-c88c3788]{width:26px;height:1px;flex:none;background:var(--border);margin:5px 0}[data-v-c88c3788]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.main[data-v-c88c3788]{flex:1;display:flex;flex-direction:column;min-width:0}.topbar[data-v-c88c3788]{height:56px;flex:none;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;padding:0 20px}.title[data-v-c88c3788]{font-size:14px;font-weight:600}.topbar-actions[data-v-c88c3788]{display:flex;align-items:center;gap:8px}.gsearch[data-v-c88c3788]{position:relative;width:300px;max-width:38vw}.gs-icon[data-v-c88c3788]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.gs-input[data-v-c88c3788]{height:30px;padding-left:30px}.gs-panel[data-v-c88c3788]{position:absolute;top:36px;left:0;right:0;background:var(--bg-page);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-float);z-index:50;max-height:420px;overflow:auto;padding:6px}.gs-group[data-v-c88c3788]{font-size:12px;padding:6px 8px 2px}.gs-item[data-v-c88c3788]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer}.gs-item[data-v-c88c3788]:hover{background:var(--bg-hover)}.gs-text[data-v-c88c3788],.gs-sub[data-v-c88c3788]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gs-text[data-v-c88c3788]{font-size:13px}.gs-sub[data-v-c88c3788]{font-size:12px}.gs-date[data-v-c88c3788]{font-size:12px;flex:none}.gs-empty[data-v-c88c3788]{padding:10px;font-size:12px;text-align:center}.user-chip[data-v-c88c3788]{font-size:12px;color:var(--text-2);padding:0 4px}.week-tip[data-v-c88c3788]{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--warn);color:var(--warn);background:var(--bg-page);border-radius:999px;height:26px;padding:0 10px;font-size:12px;cursor:pointer}.week-tip[data-v-c88c3788]:hover{background:var(--bg-subtle)}.content[data-v-c88c3788]{flex:1;overflow:auto}.content-inner[data-v-c88c3788]{max-width:1200px;margin:0 auto;padding:20px}.toast-wrap[data-v-c88c3788]{position:fixed;top:68px;right:20px;z-index:60;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}.toast[data-v-c88c3788]{background:var(--bg-page);border:1px solid var(--border);box-shadow:var(--shadow-float);border-radius:var(--radius-sm);padding:8px 14px;font-size:13px;color:var(--text-1)}.toast-enter-from[data-v-c88c3788],.toast-leave-to[data-v-c88c3788]{opacity:0;transform:translateY(-4px)}.toast-enter-active[data-v-c88c3788],.toast-leave-active[data-v-c88c3788]{transition:all .15s ease}.mob-search-btn[data-v-c88c3788]{display:none;width:30px;height:30px;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-2);cursor:pointer;align-items:center;justify-content:center}.mobile-hide[data-v-c88c3788]{display:initial}.tabbar[data-v-c88c3788]{display:none;position:fixed;left:0;right:0;bottom:0;z-index:30;background:var(--bg-page);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom)}.tab-btn[data-v-c88c3788]{flex:1;height:46px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:11px}.tab-btn.active[data-v-c88c3788]{color:var(--accent)}.sheet-mask[data-v-c88c3788]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:#1d212959}.more-sheet[data-v-c88c3788]{position:absolute;left:0;right:0;bottom:0;background:var(--bg-page);border-radius:14px 14px 0 0;padding:10px 14px calc(14px + env(safe-area-inset-bottom));display:flex;flex-direction:column}.sheet-user[data-v-c88c3788]{font-size:12px;color:var(--text-3);padding:4px 6px 10px;border-bottom:1px solid var(--border);margin-bottom:4px}.sheet-row[data-v-c88c3788]{display:flex;align-items:center;gap:12px;height:46px;border:none;background:transparent;color:var(--text-1);font-size:14px;cursor:pointer;border-radius:var(--radius-sm);text-align:left;padding:0 6px}.sheet-row[data-v-c88c3788]:hover,.sheet-row[data-v-c88c3788]:active{background:var(--bg-hover)}.sheet-name[data-v-c88c3788]{flex:1}.sheet-go[data-v-c88c3788]{color:var(--text-3)}.sheet-divider[data-v-c88c3788]{height:1px;background:var(--border);margin:6px 0}.sheet-danger[data-v-c88c3788]{color:var(--danger)}.msw-mask[data-v-c88c3788]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:var(--bg-page)}.msw[data-v-c88c3788]{height:100%;display:flex;flex-direction:column}.msw-bar[data-v-c88c3788]{height:52px;flex:none;display:flex;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid var(--border)}.msw-icon[data-v-c88c3788]{color:var(--text-3)}.msw-input[data-v-c88c3788]{flex:1;height:34px;border:none;outline:none;font-size:14px;background:transparent;color:var(--text-1)}.msw-results[data-v-c88c3788]{flex:1;overflow:auto;padding:10px 4px calc(20px + env(safe-area-inset-bottom))}.msw-item[data-v-c88c3788]{display:flex;align-items:center;gap:8px;padding:10px;border-radius:var(--radius-sm);cursor:pointer}.msw-item[data-v-c88c3788]:hover,.msw-item[data-v-c88c3788]:active{background:var(--bg-hover)}@media (max-width: 720px){.app[data-v-c88c3788]{display:block;height:100dvh}.side[data-v-c88c3788]{display:none}.main[data-v-c88c3788]{display:flex;flex-direction:column;height:100dvh;min-width:0}.topbar[data-v-c88c3788]{height:50px;min-height:50px;padding:0 10px;gap:6px}.title[data-v-c88c3788]{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gsearch[data-v-c88c3788],.gsearch .gs-panel[data-v-c88c3788]{display:none}.mob-search-btn[data-v-c88c3788]{display:flex}.topbar-actions[data-v-c88c3788]{margin-left:auto;gap:6px}.mobile-hide[data-v-c88c3788]{display:none!important}.week-tip[data-v-c88c3788]{height:28px;max-width:118px;padding:0 8px;white-space:nowrap;overflow:hidden}.topbar-actions .btn[data-v-c88c3788]{padding:0 10px}.topbar-actions .btn .num[data-v-c88c3788]{font-size:12px}.tabbar[data-v-c88c3788]{display:flex}.content[data-v-c88c3788]{flex:1;min-height:0}.content-inner[data-v-c88c3788]{max-width:none;padding:12px 12px calc(66px + env(safe-area-inset-bottom))}.card[data-v-c88c3788]{border-radius:var(--radius-md)}input.input[data-v-c88c3788],select.select[data-v-c88c3788],textarea.textarea[data-v-c88c3788]{width:100%;box-sizing:border-box}.btn[data-v-c88c3788]{touch-action:manipulation}.topbar-actions .btn-primary[data-v-c88c3788]{height:32px}.toast-wrap[data-v-c88c3788]{top:6px;right:10px;left:10px;align-items:flex-start}}:root{--bg-page: #FFFFFF;--bg-subtle: #F7F8FA;--bg-hover: #F2F3F5;--border: #EBEDF0;--border-strong: #DCDEE3;--text-1: #1D2129;--text-2: #4E5969;--text-3: #86909C;--accent: #3370FF;--accent-bg: #F0F5FF;--ok: #23A757;--warn: #E8842C;--danger: #E5484D;--dot-empty: #C9CDD4;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--shadow-float: 0 4px 16px rgba(29, 33, 41, .08)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg-page);color:var(--text-1);font-family:-apple-system,PingFang SC,Microsoft YaHei,system-ui,sans-serif;font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}.num{font-variant-numeric:tabular-nums}.flex1{flex:1}.muted{color:var(--text-3)}.muted2{color:var(--text-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px;height:32px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--bg-page);color:var(--text-1);cursor:pointer;white-space:nowrap}.btn:hover{background:var(--bg-hover)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn-primary:hover{background:#2b5fd9}.btn-danger{color:var(--danger);border-color:var(--danger)}.btn-sm{height:26px;padding:0 10px;font-size:12px}.btn-xs{height:22px;padding:0 8px;font-size:12px}.input,.select,.textarea{height:32px;padding:0 10px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-page);outline:none;width:100%}.textarea{height:auto;min-height:56px;padding:8px 10px;resize:vertical}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent)}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-page)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-3);cursor:pointer}.icon-btn:hover{background:var(--bg-hover);color:var(--text-1)}.icon-btn.active{color:var(--accent)}.icon-btn.active-warn{color:var(--warn)}.tag{display:inline-block;padding:0 8px;height:22px;line-height:20px;border-radius:4px;font-size:12px;background:var(--bg-subtle);color:var(--text-2);border:1px solid var(--border);white-space:nowrap}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;flex:none}.dot.normal{background:var(--ok)}.dot.late,.dot.early,.dot.incomplete{background:var(--warn)}.dot.absent{background:var(--danger)}.dot.none,.dot.leave{background:var(--dot-empty)}@media (max-width: 720px){input,select,textarea{font-size:16px!important}input[type=checkbox]{font-size:initial}}.dot.rest{background:var(--border)}.icon{display:inline-flex;align-items:center;justify-content:center;flex:none}.icon svg{width:100%;height:100%;display:block}@media (max-width: 720px){.card{border-radius:12px}input.input,select.select,textarea.textarea{width:100%;box-sizing:border-box}.btn{touch-action:manipulation}.dialog{width:calc(100vw - 20px)!important;max-width:calc(100vw - 20px)!important;max-height:86vh;max-height:86dvh;overflow:auto}.dialog-body{padding:14px!important}.form-grid{grid-template-columns:1fr!important}.dialog-btns{gap:8px}.dialog-btns .btn{flex:1}.drawer{top:auto!important;left:0!important;width:100%!important;height:min(86vh,86dvh)!important;border-left:none!important;border-top:1px solid var(--border);border-radius:14px 14px 0 0!important}.drawer-enter-active,.drawer-leave-active{transition:transform .2s ease,opacity .2s ease}.drawer-enter-from,.drawer-leave-to{transform:translateY(28px);opacity:0}.drawer-head{border-radius:14px 14px 0 0}.drawer-body{padding:12px!important}.tx-table{min-width:0!important}.tx-table thead{display:none!important}.tx-table tr{display:block;padding:10px 12px;border-bottom:1px solid var(--border);background:transparent}.tx-table tbody tr:last-child{border-bottom:none}.tx-table td{display:flex!important;align-items:center;justify-content:space-between;gap:12px;padding:3px 0!important;border:none!important;white-space:normal!important}.tx-table td:before{content:attr(data-label);color:var(--text-3);font-size:12px;flex:none}.tx-table td.ops-cell:before{content:none}.tx-table td.ops-cell{justify-content:flex-end}.tx-table td.empty{justify-content:center}.tx-table td.empty:before{content:none!important}.table-card,.tx-card{overflow-x:auto}.cred-table{min-width:560px!important}.th-ops{width:auto!important}.vault-toolbar{flex-wrap:wrap;row-gap:8px}.vault-toolbar .search-wrap{width:100%;max-width:none!important}.vault-toolbar .flex1{display:none}.vault-toolbar .btn{flex:none}.cal-toolbar{margin-bottom:8px}.cal-cell{min-height:54px!important;padding:4px 5px!important}.cal-marks{margin-top:3px!important;height:12px!important;gap:3px!important}.section,.sec{padding:12px!important}.rule-grid{grid-template-columns:1fr!important}} diff --git a/intern-log/dist/assets/index-ieoBMDLY.css b/intern-log/dist/assets/index-ieoBMDLY.css new file mode 100644 index 0000000..9d0668b --- /dev/null +++ b/intern-log/dist/assets/index-ieoBMDLY.css @@ -0,0 +1 @@ +.mask[data-v-f27041d4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:100}.dialog[data-v-f27041d4]{width:380px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);padding:20px}.dialog-title[data-v-f27041d4]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-msg[data-v-f27041d4]{margin-top:8px;color:var(--text-2);font-size:13px;line-height:1.7;word-break:break-all}.dialog-btns[data-v-f27041d4]{margin-top:20px;display:flex;justify-content:flex-end;gap:8px}.btn-danger-solid[data-v-f27041d4]{background:var(--danger);border-color:var(--danger);color:#fff}.btn-danger-solid[data-v-f27041d4]:hover{background:#d13a3f}.modal-enter-active[data-v-f27041d4],.modal-leave-active[data-v-f27041d4]{transition:opacity .15s ease}.modal-enter-from[data-v-f27041d4],.modal-leave-to[data-v-f27041d4]{opacity:0}.mask[data-v-bd00bec4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-bd00bec4]{width:560px;max-width:calc(100vw - 32px);max-height:85vh;background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);display:flex;flex-direction:column}.dialog-head[data-v-bd00bec4]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex:none}.dialog-title[data-v-bd00bec4]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-sub[data-v-bd00bec4]{font-size:12px;margin-top:2px}.dialog-body[data-v-bd00bec4]{padding:16px 20px;overflow:auto}.dialog-btns[data-v-bd00bec4]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border);flex:none}.form-grid[data-v-bd00bec4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-bd00bec4]{grid-column:span 2}.field label[data-v-bd00bec4]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-bd00bec4]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-bd00bec4],.input.invalid[data-v-bd00bec4]:focus{border-color:var(--danger)}.toggle-btn[data-v-bd00bec4]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-bd00bec4]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-bd00bec4]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.toggle-btn.onwarn[data-v-bd00bec4]{color:var(--warn);border-color:var(--warn)}.modal-enter-active[data-v-bd00bec4],.modal-leave-active[data-v-bd00bec4]{transition:opacity .15s ease}.modal-enter-from[data-v-bd00bec4],.modal-leave-to[data-v-bd00bec4]{opacity:0}.dp-head[data-v-4b7234c4]{margin-bottom:12px}.dp-date[data-v-4b7234c4]{font-size:14px;font-weight:600}.sec[data-v-4b7234c4]{padding:14px 16px;margin-bottom:12px}.sec-title[data-v-4b7234c4]{font-size:13px;font-weight:600;margin-bottom:10px;color:var(--text-1)}.sec-head[data-v-4b7234c4]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-4b7234c4]{margin-bottom:0}.form-hint[data-v-4b7234c4]{font-size:12px}.att-grid[data-v-4b7234c4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.att-cell label[data-v-4b7234c4],.field label[data-v-4b7234c4]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.att-val[data-v-4b7234c4]{display:flex;align-items:center;gap:6px;min-height:32px;font-size:13px}.status-val[data-v-4b7234c4]{min-height:32px}.val-empty[data-v-4b7234c4]{color:var(--text-3)}.edit-row[data-v-4b7234c4]{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.time-input[data-v-4b7234c4]{width:104px}.att-note[data-v-4b7234c4]{margin-top:10px;font-size:12px}.att-actions[data-v-4b7234c4]{display:flex;gap:8px;margin-top:12px}.form-grid[data-v-4b7234c4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-4b7234c4]{grid-column:span 2}.form-footer[data-v-4b7234c4]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.form-error[data-v-4b7234c4]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-4b7234c4]{border-color:var(--danger)}.input.invalid[data-v-4b7234c4]:focus{border-color:var(--danger)}.list-sec[data-v-4b7234c4]{margin-bottom:4px}.item[data-v-4b7234c4]{border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:6px;background:var(--bg-page)}.item-main[data-v-4b7234c4]{display:flex;align-items:center;gap:8px;min-height:26px;flex-wrap:wrap}.item-content[data-v-4b7234c4]{cursor:text;word-break:break-all}.item-meta[data-v-4b7234c4]{font-size:12px}.item-sub[data-v-4b7234c4]{margin-top:6px;padding-top:6px;border-top:1px dashed var(--border);font-size:12px;display:flex;flex-direction:column;gap:2px}.empty[data-v-4b7234c4]{text-align:center;padding:24px 0}.dp-foot[data-v-4b7234c4]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.att-grid[data-v-4b7234c4],.form-grid[data-v-4b7234c4]{grid-template-columns:1fr}.field.span2[data-v-4b7234c4]{grid-column:auto}}.cal-toolbar[data-v-2404dfbe]{display:flex;align-items:center;gap:10px;margin-bottom:12px}.cal-title[data-v-2404dfbe]{font-size:14px;font-weight:600;min-width:96px;text-align:center}.cal-head[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-week[data-v-2404dfbe]{text-align:center;padding:6px 0;font-size:12px;border-right:1px solid var(--border);border-bottom:1px solid var(--border)}.cal-grid[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-cell[data-v-2404dfbe]{min-height:92px;padding:6px 8px;text-align:left;background:var(--bg-page);border:none;border-right:1px solid var(--border);border-bottom:1px solid var(--border);cursor:pointer;display:block;font-size:13px}.cal-cell[data-v-2404dfbe]:hover{background:var(--bg-subtle)}.cal-cell.blank[data-v-2404dfbe]{cursor:default}.cal-cell.blank[data-v-2404dfbe]:hover{background:var(--bg-page)}.cal-cell.selected[data-v-2404dfbe]{background:var(--accent-bg)}.daynum.today[data-v-2404dfbe]{color:var(--accent);font-weight:600}.cal-cell.weekend .daynum[data-v-2404dfbe]{color:var(--text-3)}.cal-marks[data-v-2404dfbe]{display:flex;align-items:center;gap:4px;margin-top:8px;height:14px}.mark-log[data-v-2404dfbe]{color:var(--text-3)}.mark-star[data-v-2404dfbe]{color:var(--accent)}.drawer[data-v-2404dfbe]{position:fixed;top:0;right:0;bottom:0;width:min(420px,100%);background:var(--bg-page);border-left:1px solid var(--border);box-shadow:var(--shadow-float);z-index:20;display:flex;flex-direction:column}.drawer-head[data-v-2404dfbe]{height:48px;flex:none;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--border)}.drawer-title[data-v-2404dfbe]{font-weight:600}.drawer-body[data-v-2404dfbe]{flex:1;overflow:auto;padding:16px}.drawer-enter-active[data-v-2404dfbe],.drawer-leave-active[data-v-2404dfbe]{transition:opacity .15s ease}.drawer-enter-from[data-v-2404dfbe],.drawer-leave-to[data-v-2404dfbe]{opacity:0}@media (max-width: 720px){.cal-cell[data-v-2404dfbe]{min-height:60px;padding:4px 5px}.cal-title[data-v-2404dfbe]{min-width:76px;font-size:13px}.cal-marks[data-v-2404dfbe]{gap:3px;margin-top:4px;height:12px}.drawer[data-v-2404dfbe]{width:100%}}.detail-toolbar[data-v-799fe8de]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.date-title[data-v-799fe8de]{font-size:14px;font-weight:600;min-width:170px;text-align:center}.date-title.is-today[data-v-799fe8de]{color:var(--accent)}.w-date[data-v-799fe8de]{width:150px}.export-row[data-v-799fe8de]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-page)}.exp-label[data-v-799fe8de]{font-size:12px}.seg[data-v-799fe8de]{display:inline-flex;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-799fe8de]{border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;padding:4px 10px}.seg-btn.active[data-v-799fe8de]{background:var(--accent-bg);color:var(--accent)}.w-exp[data-v-799fe8de]{width:140px}@media (max-width: 720px){.detail-toolbar[data-v-799fe8de]{gap:8px}.date-title[data-v-799fe8de]{min-width:0;flex:1;text-align:left}.w-date[data-v-799fe8de]{flex:1;min-width:120px;width:auto}}.plan-page[data-v-c917531a]{display:flex;flex-direction:column;gap:10px;max-width:760px}.plan-head[data-v-c917531a]{padding:12px 16px}.nav-row[data-v-c917531a]{display:flex;align-items:center;gap:8px}.date-box[data-v-c917531a]{min-width:150px;text-align:center}.date-main[data-v-c917531a]{font-weight:600;font-size:14px}.date-sub[data-v-c917531a]{font-size:11px;margin-left:6px}.sum-line[data-v-c917531a]{font-size:12px;margin-top:8px}.timer-live[data-v-c917531a]{color:var(--accent);font-weight:600}.flex1[data-v-c917531a]{flex:1}.plan-item[data-v-c917531a]{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}.plan-item.done[data-v-c917531a]{opacity:.62}.plan-item.skip[data-v-c917531a]{opacity:.5}.plan-item.running[data-v-c917531a]{border-left:3px solid var(--accent)}.pi-time[data-v-c917531a]{font-size:13px;font-weight:600;min-width:92px;padding-top:2px}.pi-main[data-v-c917531a]{flex:1;min-width:0}.pi-title[data-v-c917531a]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.pi-text[data-v-c917531a]{font-size:14px;font-weight:500;word-break:break-all}.pi-text.strike[data-v-c917531a]{text-decoration:line-through}.state-done[data-v-c917531a]{color:var(--ok, #2e9e5b);font-size:12px}.state-skip[data-v-c917531a]{color:var(--text-3);font-size:12px}.pi-note[data-v-c917531a],.pi-meta[data-v-c917531a]{font-size:12px;margin-top:3px}.pi-ops[data-v-c917531a]{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.timer-on[data-v-c917531a]{color:var(--accent);border-color:var(--accent)}.empty[data-v-c917531a]{text-align:center;padding:26px 16px}.fixed-mask[data-v-c917531a]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;background:#1d212959;display:flex;align-items:center;justify-content:center;padding:16px}.dialog[data-v-c917531a]{background:var(--bg-page);border-radius:12px;width:420px;max-width:100%}.dialog-head[data-v-c917531a]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 0}.dialog-title[data-v-c917531a]{font-weight:600;font-size:14px}.dialog-body[data-v-c917531a]{padding:6px 16px 4px}.dialog-btns[data-v-c917531a]{display:flex;justify-content:flex-end;gap:10px;padding:12px 16px 16px}.form-row[data-v-c917531a]{display:flex;flex-direction:column;gap:5px;margin-top:10px}.form-row label[data-v-c917531a]{font-size:12px;color:var(--text-2)}.form-row.two[data-v-c917531a]{flex-direction:row;gap:10px}.form-row.two>div[data-v-c917531a]{flex:1;display:flex;flex-direction:column;gap:5px}@media (max-width: 720px){.plan-item[data-v-c917531a]{flex-wrap:wrap}.pi-ops[data-v-c917531a]{width:100%;justify-content:flex-start}}.cards[data-v-f8410651]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card[data-v-f8410651]{padding:14px 16px}.stat-num[data-v-f8410651]{font-size:20px;font-weight:600;margin-top:4px}.section[data-v-f8410651]{padding:14px 16px;margin-top:12px}.section-title[data-v-f8410651]{font-weight:600;margin-bottom:10px;font-size:13px}.heat[data-v-f8410651]{display:flex;gap:3px;overflow-x:auto;padding-bottom:4px}.heat-col[data-v-f8410651]{display:flex;flex-direction:column;gap:3px}.heat-cell[data-v-f8410651]{width:12px;height:12px;border-radius:2px;display:inline-block}.lv0[data-v-f8410651]{background:var(--bg-subtle);border:1px solid var(--border)}.lv1[data-v-f8410651]{background:#d8ecdf}.lv2[data-v-f8410651]{background:#a9d8bc}.lv3[data-v-f8410651]{background:#6fbf92}.lv4[data-v-f8410651]{background:var(--ok)}.heat-legend[data-v-f8410651]{display:flex;align-items:center;gap:3px;margin-top:8px;font-size:12px}.two-col[data-v-f8410651]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.bar-row[data-v-f8410651]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-f8410651]{width:72px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-f8410651]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-f8410651]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-f8410651]{font-size:12px;width:92px;flex:none}.loc-label[data-v-f8410651]{width:110px;text-align:left}@media (max-width: 720px){.cards[data-v-f8410651]{grid-template-columns:repeat(2,1fr)}.two-col[data-v-f8410651]{grid-template-columns:1fr}}.report-toolbar[data-v-43f9c59b]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.ai-error[data-v-43f9c59b]{color:var(--danger);font-size:12px;margin:0 0 8px}.seg[data-v-43f9c59b]{display:inline-flex;border:1px solid var(--border-strong);border-radius:6px;overflow:hidden}.seg-btn[data-v-43f9c59b]{height:28px;padding:0 12px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;border-right:1px solid var(--border)}.seg-btn[data-v-43f9c59b]:last-child{border-right:none}.seg-btn[data-v-43f9c59b]:hover{background:var(--bg-hover)}.seg-btn.active[data-v-43f9c59b]{background:var(--accent-bg);color:var(--accent)}.w-date[data-v-43f9c59b]{width:140px}.report-grid[data-v-43f9c59b]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:12px;align-items:start}.section[data-v-43f9c59b]{padding:14px 16px}.section-title[data-v-43f9c59b]{font-weight:600;margin-bottom:8px;font-size:13px}.section+.section[data-v-43f9c59b]{margin-top:12px}.note-label[data-v-43f9c59b]{display:block;font-size:12px;margin:8px 0 4px}.note-saved[data-v-43f9c59b]{font-size:12px;margin-top:6px}.md-editor[data-v-43f9c59b]{min-height:420px;line-height:1.7}.sum-row[data-v-43f9c59b]{display:flex;justify-content:space-between;padding:3px 0;font-size:12px}.section-sub[data-v-43f9c59b]{font-weight:600;margin:10px 0 4px;font-size:12px}.sum-item[data-v-43f9c59b]{font-size:12px;padding:2px 0;word-break:break-all}.sum-empty[data-v-43f9c59b]{font-size:12px}@media (max-width: 960px){.report-grid[data-v-43f9c59b]{grid-template-columns:1fr}}.mask[data-v-9f38206c]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-9f38206c]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-9f38206c]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-9f38206c]{font-size:14px;font-weight:600;color:var(--text-1)}.add-cat[data-v-9f38206c]{display:flex;gap:6px;margin-top:6px}.add-cat-input[data-v-9f38206c]{flex:1;height:28px;font-size:12px}.dialog-body[data-v-9f38206c]{padding:16px 20px}.dialog-btns[data-v-9f38206c]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-9f38206c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-9f38206c]{grid-column:span 2}.field label[data-v-9f38206c]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.seg[data-v-9f38206c]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-9f38206c]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-9f38206c]{border-left:1px solid var(--border)}.seg-btn.active[data-v-9f38206c]{background:var(--accent-bg);color:var(--accent)}.form-error[data-v-9f38206c]{color:var(--danger);font-size:12px;margin-top:8px}.input.invalid[data-v-9f38206c],.input.invalid[data-v-9f38206c]:focus{border-color:var(--danger)}.modal-enter-active[data-v-9f38206c],.modal-leave-active[data-v-9f38206c]{transition:opacity .15s ease}.modal-enter-from[data-v-9f38206c],.modal-leave-to[data-v-9f38206c]{opacity:0}.ledger-toolbar[data-v-e8759c3f]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.month-title[data-v-e8759c3f]{font-size:14px;font-weight:600;min-width:88px;text-align:center}.w-filter[data-v-e8759c3f]{width:110px;flex:none}.cards[data-v-e8759c3f]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.stat-card[data-v-e8759c3f]{padding:14px 16px}.stat-num[data-v-e8759c3f]{font-size:20px;font-weight:600;margin-top:4px}.amt-income[data-v-e8759c3f]{color:var(--ok)}.amt-expense[data-v-e8759c3f]{color:var(--text-1)}.amt-warn[data-v-e8759c3f]{color:var(--warn)}.sec[data-v-e8759c3f]{padding:14px 16px;margin-top:12px}.sec-title[data-v-e8759c3f]{font-size:13px;font-weight:600;margin-bottom:10px}.sec-head[data-v-e8759c3f]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-e8759c3f]{margin-bottom:0}.form-hint[data-v-e8759c3f]{font-size:12px}.form-grid[data-v-e8759c3f]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-e8759c3f]{grid-column:span 2}.field label[data-v-e8759c3f]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-e8759c3f]{color:var(--danger);font-size:12px;margin-top:8px}.form-footer[data-v-e8759c3f]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.seg[data-v-e8759c3f]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-e8759c3f]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-e8759c3f]{border-left:1px solid var(--border)}.seg-btn.active[data-v-e8759c3f]{background:var(--accent-bg);color:var(--accent)}.toggle-btn[data-v-e8759c3f]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-e8759c3f]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-e8759c3f]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.bar-row[data-v-e8759c3f]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-e8759c3f]{width:56px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-e8759c3f]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-e8759c3f]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-e8759c3f]{font-size:12px;width:110px;flex:none}.table-card[data-v-e8759c3f]{overflow-x:auto}.tx-table[data-v-e8759c3f]{width:100%;border-collapse:collapse;font-size:13px}.tx-table th[data-v-e8759c3f]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.tx-table td[data-v-e8759c3f]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.tx-table tbody tr[data-v-e8759c3f]:hover{background:var(--bg-subtle)}.tx-table tbody tr:last-child td[data-v-e8759c3f]{border-bottom:none}.td-note[data-v-e8759c3f]{color:var(--text-2)}.tx-pending[data-v-e8759c3f]{color:var(--warn);font-size:12px}.tx-done[data-v-e8759c3f]{color:var(--ok);font-size:12px}.th-ops[data-v-e8759c3f]{width:220px}.ops[data-v-e8759c3f]{display:flex;gap:4px;flex-wrap:wrap}.empty[data-v-e8759c3f]{text-align:center;padding:24px 0}.vault-note[data-v-e8759c3f]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.form-grid[data-v-e8759c3f]{grid-template-columns:1fr}.field.span2[data-v-e8759c3f]{grid-column:auto}.ledger-toolbar .w-filter[data-v-e8759c3f]{flex:1;min-width:0;width:auto}}.memo-page[data-v-74d60dba]{display:grid;grid-template-columns:280px minmax(0,1fr);gap:12px;align-items:stretch}.memo-list[data-v-74d60dba]{display:flex;flex-direction:column;max-height:calc(100vh - 140px)}.pane-head[data-v-74d60dba]{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;border-bottom:1px solid var(--border);flex:none}.pane-title[data-v-74d60dba]{font-size:13px;font-weight:600}.memo-scroll[data-v-74d60dba]{overflow:auto;padding:6px}.memo-item[data-v-74d60dba]{padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer;margin-bottom:2px}.memo-item[data-v-74d60dba]:hover{background:var(--bg-hover)}.memo-item.active[data-v-74d60dba]{background:var(--accent-bg)}.memo-item.active .memo-item-title[data-v-74d60dba]{color:var(--accent)}.memo-item-title[data-v-74d60dba]{font-size:13px;font-weight:500;word-break:break-all}.memo-item-sub[data-v-74d60dba]{font-size:12px;margin-top:2px;word-break:break-all}.memo-item-time[data-v-74d60dba]{font-size:11px;margin-top:2px}.memo-editor[data-v-74d60dba]{padding:16px;min-height:420px;display:flex;flex-direction:column}.title-input[data-v-74d60dba]{font-size:14px;font-weight:500;margin-bottom:10px}.content-textarea[data-v-74d60dba]{flex:1;min-height:340px;line-height:1.8}.editor-foot[data-v-74d60dba]{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}.foot-info[data-v-74d60dba]{font-size:12px}.editor-empty[data-v-74d60dba]{display:flex;align-items:center;justify-content:center;flex:1;padding:60px 0}@media (max-width: 800px){.memo-page[data-v-74d60dba]{grid-template-columns:1fr}.memo-list[data-v-74d60dba]{max-height:240px}.content-textarea[data-v-74d60dba]{min-height:240px}}.mask[data-v-f383b0a6]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-f383b0a6]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-f383b0a6]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-f383b0a6]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-f383b0a6]{padding:16px 20px}.dialog-btns[data-v-f383b0a6]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-f383b0a6]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-f383b0a6]{grid-column:span 2}.field label[data-v-f383b0a6]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.pwd-row[data-v-f383b0a6]{display:flex;gap:8px}.pwd-row .input[data-v-f383b0a6]{flex:1}.form-error[data-v-f383b0a6]{color:var(--danger);font-size:12px;margin-top:8px}.modal-enter-active[data-v-f383b0a6],.modal-leave-active[data-v-f383b0a6]{transition:opacity .15s ease}.modal-enter-from[data-v-f383b0a6],.modal-leave-to[data-v-f383b0a6]{opacity:0}.lock-card[data-v-c2db283d]{max-width:380px;margin:60px auto 0;padding:28px 24px;text-align:center;display:flex;flex-direction:column;gap:10px}.lock-badge[data-v-c2db283d]{width:52px;height:52px;margin:0 auto;border-radius:50%;background:var(--bg-subtle);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-2)}.lock-title[data-v-c2db283d]{font-size:14px;font-weight:600}.lock-tip[data-v-c2db283d]{font-size:12px;line-height:1.7}.lock-btn[data-v-c2db283d]{margin-top:4px}.form-error[data-v-c2db283d]{color:var(--danger);font-size:12px}.empty[data-v-c2db283d]{text-align:center;padding:24px 0}.vault-toolbar[data-v-c2db283d]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.search-wrap[data-v-c2db283d]{position:relative;width:280px;max-width:100%}.search-wrap .input[data-v-c2db283d]{padding-left:30px}.search-icon[data-v-c2db283d]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.table-card[data-v-c2db283d]{overflow-x:auto}.cred-table[data-v-c2db283d]{width:100%;border-collapse:collapse;font-size:13px}.cred-table th[data-v-c2db283d]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.cred-table td[data-v-c2db283d]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.cred-table tbody tr[data-v-c2db283d]:hover{background:var(--bg-subtle)}.cred-table tbody tr:last-child td[data-v-c2db283d]{border-bottom:none}.td-system[data-v-c2db283d]{font-weight:500}.th-ops[data-v-c2db283d]{width:150px}.pwd-cell[data-v-c2db283d]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.pwd-text[data-v-c2db283d]{letter-spacing:1px}.copyable[data-v-c2db283d]{cursor:pointer}.copyable[data-v-c2db283d]:hover{color:var(--accent)}.ops[data-v-c2db283d]{display:flex;gap:4px;flex-wrap:wrap}.vault-note[data-v-c2db283d]{margin-top:10px;font-size:12px;text-align:right}.mask[data-v-c2db283d]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-c2db283d]{width:440px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-c2db283d]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-c2db283d]{font-size:14px;font-weight:600}.dialog-body[data-v-c2db283d]{padding:16px 20px}.dialog-btns[data-v-c2db283d]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.vp-field[data-v-c2db283d]{margin-bottom:10px}.vp-field label[data-v-c2db283d]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.vp-tip[data-v-c2db283d]{font-size:12px;margin-top:8px}.modal-enter-active[data-v-c2db283d],.modal-leave-active[data-v-c2db283d]{transition:opacity .15s ease}.modal-enter-from[data-v-c2db283d],.modal-leave-to[data-v-c2db283d]{opacity:0}.settings[data-v-d8d0f782]{display:flex;flex-direction:column;gap:12px;max-width:640px}.acc-line[data-v-d8d0f782]{font-size:12px;margin-bottom:10px;line-height:1.7}.section[data-v-d8d0f782]{padding:14px 16px}.section-title[data-v-d8d0f782]{font-weight:600;margin-bottom:10px;font-size:13px}.rule-grid[data-v-d8d0f782]{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}.rule-item label[data-v-d8d0f782]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.rule-save[data-v-d8d0f782]{display:flex;align-items:center;gap:10px;margin-top:12px}.proj-add[data-v-d8d0f782]{display:flex;gap:8px}.proj-tip[data-v-d8d0f782]{font-size:12px;margin-top:6px}.proj-row[data-v-d8d0f782]{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.proj-row[data-v-d8d0f782]:last-child{border-bottom:none}.proj-name[data-v-d8d0f782]{flex:1;word-break:break-all}.proj-name.archived[data-v-d8d0f782]{color:var(--text-3);text-decoration:line-through}.loc-note[data-v-d8d0f782]{font-size:12px}.ai-grid[data-v-d8d0f782]{display:flex;flex-direction:column;gap:10px}.backup-row[data-v-d8d0f782]{display:flex;gap:8px}.cat-block[data-v-d8d0f782]{margin-top:10px}.cat-head[data-v-d8d0f782]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;font-size:12px}.cat-chips[data-v-d8d0f782]{display:flex;flex-wrap:wrap;gap:6px}.cat-chip[data-v-d8d0f782]{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px}.chip-btn[data-v-d8d0f782]{border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:11px;padding:0 1px}.chip-btn[data-v-d8d0f782]:hover{color:var(--accent)}.exp-dates[data-v-d8d0f782]{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}.exp-dates .input[data-v-d8d0f782]{width:150px}.seg[data-v-d8d0f782]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-d8d0f782]{border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;padding:5px 12px}.seg-btn.active[data-v-d8d0f782]{background:var(--accent-bg);color:var(--accent)}.import-error[data-v-d8d0f782]{color:var(--danger);font-size:12px;margin-top:8px}.backup-note[data-v-d8d0f782]{font-size:12px;margin-top:10px}.admin-page[data-v-06be07ff]{display:flex;flex-direction:column;gap:12px;max-width:860px}.toolbar[data-v-06be07ff]{display:flex;align-items:center;gap:12px}.head-wrap[data-v-06be07ff]{flex:1;min-width:0}.sec-title[data-v-06be07ff]{font-weight:600;font-size:13px}.head-sub[data-v-06be07ff]{font-size:12px;margin-top:2px}.sec[data-v-06be07ff]{padding:14px 16px}.admin-table-card[data-v-06be07ff]{overflow-x:auto}.admin-table[data-v-06be07ff]{width:100%;border-collapse:collapse;font-size:13px}.admin-table th[data-v-06be07ff]{text-align:left;font-weight:500;color:var(--text-3);font-size:12px;padding:8px 12px;border-bottom:1px solid var(--border)}.admin-table td[data-v-06be07ff]{padding:9px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.admin-table td[data-v-06be07ff]:last-child{border-bottom:none}.td-name[data-v-06be07ff]{font-weight:500}.role-badge[data-v-06be07ff]{display:inline-flex;align-items:center;border:1px solid var(--accent);color:var(--accent);border-radius:999px;font-size:12px;line-height:16px;padding:1px 8px}.load-line[data-v-06be07ff]{padding:12px;font-size:12px}.admin-note[data-v-06be07ff]{font-size:12px;padding:0 2px}.ops[data-v-06be07ff]{display:inline-flex;gap:6px}.form-row[data-v-06be07ff]{display:flex;flex-direction:column;gap:5px;margin-top:10px}.form-row label[data-v-06be07ff]{font-size:12px;color:var(--text-2)}.fixed-mask[data-v-06be07ff]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;background:#1d212959;display:flex;align-items:center;justify-content:center;padding:16px}.dialog[data-v-06be07ff]{background:var(--bg-page);border-radius:12px;width:420px;max-width:100%}.dialog-head[data-v-06be07ff]{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 0}.dialog-title[data-v-06be07ff]{font-weight:600;font-size:14px}.dialog-body[data-v-06be07ff]{padding:6px 16px 4px}.dialog-btns[data-v-06be07ff]{display:flex;justify-content:flex-end;gap:10px;padding:12px 16px 16px}.btn-danger[data-v-06be07ff]{color:var(--danger)}.empty[data-v-06be07ff]{text-align:center}@media (max-width: 720px){.toolbar[data-v-06be07ff]{flex-wrap:wrap;row-gap:8px}.admin-table td[data-v-06be07ff],.admin-table th[data-v-06be07ff]{white-space:normal}}.login-page[data-v-bf714afa]{min-height:100vh;background:var(--bg-subtle);display:flex;align-items:center;justify-content:center;padding:20px}.login-card[data-v-bf714afa]{width:400px;max-width:100%;padding:28px 26px;display:flex;flex-direction:column;gap:12px;background:var(--bg-page)}.login-brand[data-v-bf714afa]{text-align:center;margin-bottom:6px}.brand-icon[data-v-bf714afa]{width:46px;height:46px;margin:0 auto 10px;border-radius:var(--radius-md);background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center}.login-title[data-v-bf714afa]{font-size:18px;font-weight:600;color:var(--text-1)}.login-sub[data-v-bf714afa]{font-size:12px;margin-top:4px;line-height:1.7}.seg[data-v-bf714afa]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-bf714afa]{flex:1;height:30px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-bf714afa]{border-left:1px solid var(--border)}.seg-btn.active[data-v-bf714afa]{background:var(--accent-bg);color:var(--accent)}.mig-row[data-v-bf714afa]{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;line-height:1.6}.mig-row input[data-v-bf714afa]{margin-top:3px}.form-error[data-v-bf714afa]{color:var(--danger);font-size:12px}.login-btn[data-v-bf714afa]{margin-top:2px}.login-note[data-v-bf714afa]{font-size:12px;text-align:center;line-height:1.7}.app[data-v-c88c3788]{display:flex;height:100vh;height:100dvh;overflow:hidden}.side[data-v-c88c3788]{width:56px;flex:none;border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;padding-top:10px;gap:4px;background:var(--bg-page)}.nav-btn[data-v-c88c3788]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--text-3);cursor:pointer;border:none;background:transparent;position:relative}.nav-btn[data-v-c88c3788]:hover{background:var(--bg-hover);color:var(--text-1)}.nav-btn.active[data-v-c88c3788]{background:var(--accent-bg);color:var(--accent)}.nav-btn[data-v-c88c3788]:after{content:attr(data-tip);position:absolute;left:46px;top:50%;transform:translateY(-50%);background:var(--text-1);color:#fff;font-size:12px;line-height:1.4;padding:2px 8px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s}.nav-btn[data-v-c88c3788]:hover:after{opacity:1}.nav-sep[data-v-c88c3788]{width:26px;height:1px;flex:none;background:var(--border);margin:5px 0}[data-v-c88c3788]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.main[data-v-c88c3788]{flex:1;display:flex;flex-direction:column;min-width:0}.topbar[data-v-c88c3788]{height:56px;flex:none;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;padding:0 20px}.title[data-v-c88c3788]{font-size:14px;font-weight:600}.topbar-actions[data-v-c88c3788]{display:flex;align-items:center;gap:8px}.gsearch[data-v-c88c3788]{position:relative;width:300px;max-width:38vw}.gs-icon[data-v-c88c3788]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.gs-input[data-v-c88c3788]{height:30px;padding-left:30px}.gs-panel[data-v-c88c3788]{position:absolute;top:36px;left:0;right:0;background:var(--bg-page);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-float);z-index:50;max-height:420px;overflow:auto;padding:6px}.gs-group[data-v-c88c3788]{font-size:12px;padding:6px 8px 2px}.gs-item[data-v-c88c3788]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer}.gs-item[data-v-c88c3788]:hover{background:var(--bg-hover)}.gs-text[data-v-c88c3788],.gs-sub[data-v-c88c3788]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gs-text[data-v-c88c3788]{font-size:13px}.gs-sub[data-v-c88c3788]{font-size:12px}.gs-date[data-v-c88c3788]{font-size:12px;flex:none}.gs-empty[data-v-c88c3788]{padding:10px;font-size:12px;text-align:center}.user-chip[data-v-c88c3788]{font-size:12px;color:var(--text-2);padding:0 4px}.week-tip[data-v-c88c3788]{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--warn);color:var(--warn);background:var(--bg-page);border-radius:999px;height:26px;padding:0 10px;font-size:12px;cursor:pointer}.week-tip[data-v-c88c3788]:hover{background:var(--bg-subtle)}.content[data-v-c88c3788]{flex:1;overflow:auto}.content-inner[data-v-c88c3788]{max-width:1200px;margin:0 auto;padding:20px}.toast-wrap[data-v-c88c3788]{position:fixed;top:68px;right:20px;z-index:60;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}.toast[data-v-c88c3788]{background:var(--bg-page);border:1px solid var(--border);box-shadow:var(--shadow-float);border-radius:var(--radius-sm);padding:8px 14px;font-size:13px;color:var(--text-1)}.toast-enter-from[data-v-c88c3788],.toast-leave-to[data-v-c88c3788]{opacity:0;transform:translateY(-4px)}.toast-enter-active[data-v-c88c3788],.toast-leave-active[data-v-c88c3788]{transition:all .15s ease}.mob-search-btn[data-v-c88c3788]{display:none;width:30px;height:30px;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-2);cursor:pointer;align-items:center;justify-content:center}.mobile-hide[data-v-c88c3788]{display:initial}.tabbar[data-v-c88c3788]{display:none;position:fixed;left:0;right:0;bottom:0;z-index:30;background:var(--bg-page);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom)}.tab-btn[data-v-c88c3788]{flex:1;height:46px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:11px}.tab-btn.active[data-v-c88c3788]{color:var(--accent)}.sheet-mask[data-v-c88c3788]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:#1d212959}.more-sheet[data-v-c88c3788]{position:absolute;left:0;right:0;bottom:0;background:var(--bg-page);border-radius:14px 14px 0 0;padding:10px 14px calc(14px + env(safe-area-inset-bottom));display:flex;flex-direction:column}.sheet-user[data-v-c88c3788]{font-size:12px;color:var(--text-3);padding:4px 6px 10px;border-bottom:1px solid var(--border);margin-bottom:4px}.sheet-row[data-v-c88c3788]{display:flex;align-items:center;gap:12px;height:46px;border:none;background:transparent;color:var(--text-1);font-size:14px;cursor:pointer;border-radius:var(--radius-sm);text-align:left;padding:0 6px}.sheet-row[data-v-c88c3788]:hover,.sheet-row[data-v-c88c3788]:active{background:var(--bg-hover)}.sheet-name[data-v-c88c3788]{flex:1}.sheet-go[data-v-c88c3788]{color:var(--text-3)}.sheet-divider[data-v-c88c3788]{height:1px;background:var(--border);margin:6px 0}.sheet-danger[data-v-c88c3788]{color:var(--danger)}.msw-mask[data-v-c88c3788]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:var(--bg-page)}.msw[data-v-c88c3788]{height:100%;display:flex;flex-direction:column}.msw-bar[data-v-c88c3788]{height:52px;flex:none;display:flex;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid var(--border)}.msw-icon[data-v-c88c3788]{color:var(--text-3)}.msw-input[data-v-c88c3788]{flex:1;height:34px;border:none;outline:none;font-size:14px;background:transparent;color:var(--text-1)}.msw-results[data-v-c88c3788]{flex:1;overflow:auto;padding:10px 4px calc(20px + env(safe-area-inset-bottom))}.msw-item[data-v-c88c3788]{display:flex;align-items:center;gap:8px;padding:10px;border-radius:var(--radius-sm);cursor:pointer}.msw-item[data-v-c88c3788]:hover,.msw-item[data-v-c88c3788]:active{background:var(--bg-hover)}@media (max-width: 720px){.app[data-v-c88c3788]{display:block;height:100dvh}.side[data-v-c88c3788]{display:none}.main[data-v-c88c3788]{display:flex;flex-direction:column;height:100dvh;min-width:0}.topbar[data-v-c88c3788]{height:50px;min-height:50px;padding:0 10px;gap:6px}.title[data-v-c88c3788]{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gsearch[data-v-c88c3788],.gsearch .gs-panel[data-v-c88c3788]{display:none}.mob-search-btn[data-v-c88c3788]{display:flex}.topbar-actions[data-v-c88c3788]{margin-left:auto;gap:6px}.mobile-hide[data-v-c88c3788]{display:none!important}.week-tip[data-v-c88c3788]{height:28px;max-width:118px;padding:0 8px;white-space:nowrap;overflow:hidden}.topbar-actions .btn[data-v-c88c3788]{padding:0 10px}.topbar-actions .btn .num[data-v-c88c3788]{font-size:12px}.tabbar[data-v-c88c3788]{display:flex}.content[data-v-c88c3788]{flex:1;min-height:0}.content-inner[data-v-c88c3788]{max-width:none;padding:12px 12px calc(66px + env(safe-area-inset-bottom))}.card[data-v-c88c3788]{border-radius:var(--radius-md)}input.input[data-v-c88c3788],select.select[data-v-c88c3788],textarea.textarea[data-v-c88c3788]{width:100%;box-sizing:border-box}.btn[data-v-c88c3788]{touch-action:manipulation}.topbar-actions .btn-primary[data-v-c88c3788]{height:32px}.toast-wrap[data-v-c88c3788]{top:6px;right:10px;left:10px;align-items:flex-start}}:root{--bg-page: #FFFFFF;--bg-subtle: #F7F8FA;--bg-hover: #F2F3F5;--border: #EBEDF0;--border-strong: #DCDEE3;--text-1: #1D2129;--text-2: #4E5969;--text-3: #86909C;--accent: #3370FF;--accent-bg: #F0F5FF;--ok: #23A757;--warn: #E8842C;--danger: #E5484D;--dot-empty: #C9CDD4;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--shadow-float: 0 4px 16px rgba(29, 33, 41, .08)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg-page);color:var(--text-1);font-family:-apple-system,PingFang SC,Microsoft YaHei,system-ui,sans-serif;font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}.num{font-variant-numeric:tabular-nums}.flex1{flex:1}.muted{color:var(--text-3)}.muted2{color:var(--text-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px;height:32px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--bg-page);color:var(--text-1);cursor:pointer;white-space:nowrap}.btn:hover{background:var(--bg-hover)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn-primary:hover{background:#2b5fd9}.btn-danger{color:var(--danger);border-color:var(--danger)}.btn-sm{height:26px;padding:0 10px;font-size:12px}.btn-xs{height:22px;padding:0 8px;font-size:12px}.input,.select,.textarea{height:32px;padding:0 10px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-page);outline:none;width:100%}.textarea{height:auto;min-height:56px;padding:8px 10px;resize:vertical}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent)}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-page)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-3);cursor:pointer}.icon-btn:hover{background:var(--bg-hover);color:var(--text-1)}.icon-btn.active{color:var(--accent)}.icon-btn.active-warn{color:var(--warn)}.tag{display:inline-block;padding:0 8px;height:22px;line-height:20px;border-radius:4px;font-size:12px;background:var(--bg-subtle);color:var(--text-2);border:1px solid var(--border);white-space:nowrap}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;flex:none}.dot.normal{background:var(--ok)}.dot.late,.dot.early,.dot.incomplete{background:var(--warn)}.dot.absent{background:var(--danger)}.dot.none,.dot.leave{background:var(--dot-empty)}@media (max-width: 720px){input,select,textarea{font-size:16px!important}input[type=checkbox]{font-size:initial}}.dot.rest{background:var(--border)}.icon{display:inline-flex;align-items:center;justify-content:center;flex:none}.icon svg{width:100%;height:100%;display:block}@media (max-width: 720px){.card{border-radius:12px}input.input,select.select,textarea.textarea{width:100%;box-sizing:border-box}.btn{touch-action:manipulation}.dialog{width:calc(100vw - 20px)!important;max-width:calc(100vw - 20px)!important;max-height:86vh;max-height:86dvh;overflow:auto}.dialog-body{padding:14px!important}.form-grid{grid-template-columns:1fr!important}.dialog-btns{gap:8px}.dialog-btns .btn{flex:1}.drawer{top:auto!important;left:0!important;width:100%!important;height:min(86vh,86dvh)!important;border-left:none!important;border-top:1px solid var(--border);border-radius:14px 14px 0 0!important}.drawer-enter-active,.drawer-leave-active{transition:transform .2s ease,opacity .2s ease}.drawer-enter-from,.drawer-leave-to{transform:translateY(28px);opacity:0}.drawer-head{border-radius:14px 14px 0 0}.drawer-body{padding:12px!important}.tx-table{min-width:0!important}.tx-table thead{display:none!important}.tx-table tr{display:block;padding:10px 12px;border-bottom:1px solid var(--border);background:transparent}.tx-table tbody tr:last-child{border-bottom:none}.tx-table td{display:flex!important;align-items:center;justify-content:space-between;gap:12px;padding:3px 0!important;border:none!important;white-space:normal!important}.tx-table td:before{content:attr(data-label);color:var(--text-3);font-size:12px;flex:none}.tx-table td.ops-cell:before{content:none}.tx-table td.ops-cell{justify-content:flex-end}.tx-table td.empty{justify-content:center}.tx-table td.empty:before{content:none!important}.table-card,.tx-card{overflow-x:auto}.cred-table{min-width:560px!important}.th-ops{width:auto!important}.vault-toolbar{flex-wrap:wrap;row-gap:8px}.vault-toolbar .search-wrap{width:100%;max-width:none!important}.vault-toolbar .flex1{display:none}.vault-toolbar .btn{flex:none}.cal-toolbar{margin-bottom:8px}.cal-cell{min-height:54px!important;padding:4px 5px!important}.cal-marks{margin-top:3px!important;height:12px!important;gap:3px!important}.section,.sec{padding:12px!important}.rule-grid{grid-template-columns:1fr!important}} diff --git a/intern-log/dist/assets/web-Eue2aiSv.js b/intern-log/dist/assets/web-e9jKyg3_.js similarity index 98% rename from intern-log/dist/assets/web-Eue2aiSv.js rename to intern-log/dist/assets/web-e9jKyg3_.js index a8fbe5d..ee68217 100644 --- a/intern-log/dist/assets/web-Eue2aiSv.js +++ b/intern-log/dist/assets/web-e9jKyg3_.js @@ -1 +1 @@ -import{W as P,b as x}from"./index-IuJhwbTi.js";import{Encoding as E}from"./index-NiysaoXd.js";function m(w){const e=w.split("/").filter(t=>t!=="."),r=[];return e.forEach(t=>{t===".."&&r.length>0&&r[r.length-1]!==".."?r.pop():r.push(t)}),r.join("/")}function R(w,e){w=m(w),e=m(e);const r=w.split("/"),t=e.split("/");return w!==e&&r.every((i,n)=>i===t[n])}class g extends P{constructor(){super(...arguments),this.DB_VERSION=1,this.DB_NAME="Disc",this._writeCmds=["add","put","delete"],this.downloadFile=async e=>{var r,t;const i=x(e,e.webFetchExtra),n=await fetch(e.url,i);let s;if(!e.progress)s=await n.blob();else if(!(n!=null&&n.body))s=new Blob;else{const c=n.body.getReader();let o=0;const d=[],h=n.headers.get("content-type"),y=parseInt(n.headers.get("content-length")||"0",10);for(;;){const{done:f,value:p}=await c.read();if(f)break;d.push(p),o+=(p==null?void 0:p.length)||0;const b={url:e.url,bytes:o,contentLength:y};this.notifyListeners("progress",b)}const u=new Uint8Array(o);let l=0;for(const f of d)typeof f>"u"||(u.set(f,l),l+=f.length);s=new Blob([u.buffer],{type:h||void 0})}return{path:(await this.writeFile({path:e.path,directory:(r=e.directory)!==null&&r!==void 0?r:void 0,recursive:(t=e.recursive)!==null&&t!==void 0?t:!1,data:s})).uri,blob:s}}}async initDb(){if(this._db!==void 0)return this._db;if(!("indexedDB"in window))throw this.unavailable("This browser doesn't support IndexedDB");return new Promise((e,r)=>{const t=indexedDB.open(this.DB_NAME,this.DB_VERSION);t.onupgradeneeded=g.doUpgrade,t.onsuccess=()=>{this._db=t.result,e(t.result)},t.onerror=()=>r(t.error),t.onblocked=()=>{console.warn("db blocked")}})}static doUpgrade(e){const t=e.target.result;switch(e.oldVersion){case 0:case 1:default:t.objectStoreNames.contains("FileStorage")&&t.deleteObjectStore("FileStorage"),t.createObjectStore("FileStorage",{keyPath:"path"}).createIndex("by_folder","folder")}}async dbRequest(e,r){const t=this._writeCmds.indexOf(e)!==-1?"readwrite":"readonly";return this.initDb().then(i=>new Promise((n,s)=>{const o=i.transaction(["FileStorage"],t).objectStore("FileStorage")[e](...r);o.onsuccess=()=>n(o.result),o.onerror=()=>s(o.error)}))}async dbIndexRequest(e,r,t){const i=this._writeCmds.indexOf(r)!==-1?"readwrite":"readonly";return this.initDb().then(n=>new Promise((s,a)=>{const h=n.transaction(["FileStorage"],i).objectStore("FileStorage").index(e)[r](...t);h.onsuccess=()=>s(h.result),h.onerror=()=>a(h.error)}))}getPath(e,r){const t=r!==void 0?r.replace(/^[/]+|[/]+$/g,""):"";let i="";return e!==void 0&&(i+="/"+e),r!==""&&(i+="/"+t),i}async clear(){(await this.initDb()).transaction(["FileStorage"],"readwrite").objectStore("FileStorage").clear()}async readFile(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(t===void 0)throw Error("File does not exist.");return{data:t.content?t.content:""}}async writeFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=e.recursive,s=await this.dbRequest("get",[r]);if(s&&s.type==="directory")throw Error("The supplied path is a directory.");const a=r.substr(0,r.lastIndexOf("/"));if(await this.dbRequest("get",[a])===void 0){const h=a.indexOf("/",1);if(h!==-1){const y=a.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:n})}}if(!i&&!(t instanceof Blob)&&(t=t.indexOf(",")>=0?t.split(",")[1]:t,!this.isBase64String(t)))throw Error("The supplied data is not valid base64 content.");const o=Date.now(),d={path:r,folder:a,type:"file",size:t instanceof Blob?t.size:t.length,ctime:o,mtime:o,content:t};return await this.dbRequest("put",[d]),{uri:d.path}}async appendFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=r.substr(0,r.lastIndexOf("/")),s=Date.now();let a=s;const c=await this.dbRequest("get",[r]);if(c&&c.type==="directory")throw Error("The supplied path is a directory.");if(await this.dbRequest("get",[n])===void 0){const h=n.indexOf("/",1);if(h!==-1){const y=n.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:!0})}}if(!i&&!this.isBase64String(t))throw Error("The supplied data is not valid base64 content.");if(c!==void 0){if(c.content instanceof Blob)throw Error("The occupied entry contains a Blob object which cannot be appended to.");c.content!==void 0&&!i?t=btoa(atob(c.content)+atob(t)):t=c.content+t,a=c.ctime}const d={path:r,folder:n,type:"file",size:t.length,ctime:a,mtime:s,content:t};await this.dbRequest("put",[d])}async deleteFile(e){const r=this.getPath(e.directory,e.path);if(await this.dbRequest("get",[r])===void 0)throw Error("File does not exist.");if((await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)])).length!==0)throw Error("Folder is not empty.");await this.dbRequest("delete",[r])}async mkdir(e){const r=this.getPath(e.directory,e.path),t=e.recursive,i=r.substr(0,r.lastIndexOf("/")),n=(r.match(/\//g)||[]).length,s=await this.dbRequest("get",[i]),a=await this.dbRequest("get",[r]);if(n===1)throw Error("Cannot create Root directory");if(a!==void 0)throw Error("Current directory does already exist.");if(!t&&n!==2&&s===void 0)throw Error("Parent directory must exist");if(t&&n!==2&&s===void 0){const d=i.substr(i.indexOf("/",1));await this.mkdir({path:d,directory:e.directory,recursive:t})}const c=Date.now(),o={path:r,folder:i,type:"directory",size:0,ctime:c,mtime:c};await this.dbRequest("put",[o])}async rmdir(e){const{path:r,directory:t,recursive:i}=e,n=this.getPath(t,r),s=await this.dbRequest("get",[n]);if(s===void 0)throw Error("Folder does not exist.");if(s.type!=="directory")throw Error("Requested path is not a directory");const a=await this.readdir({path:r,directory:t});if(a.files.length!==0&&!i)throw Error("Folder is not empty");for(const c of a.files){const o=`${r}/${c.name}`;(await this.stat({path:o,directory:t})).type==="file"?await this.deleteFile({path:o,directory:t}):await this.rmdir({path:o,directory:t,recursive:i})}await this.dbRequest("delete",[n])}async readdir(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(e.path!==""&&t===void 0)throw Error("Folder does not exist.");const i=await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)]);return{files:await Promise.all(i.map(async s=>{let a=await this.dbRequest("get",[s]);return a===void 0&&(a=await this.dbRequest("get",[s+"/"])),{name:s.substring(r.length+1),type:a.type,size:a.size,ctime:a.ctime,mtime:a.mtime,uri:a.path}}))}}async getUri(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);return t===void 0&&(t=await this.dbRequest("get",[r+"/"])),{uri:(t==null?void 0:t.path)||r}}async stat(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);if(t===void 0&&(t=await this.dbRequest("get",[r+"/"])),t===void 0)throw Error("Entry does not exist.");return{type:t.type,size:t.size,ctime:t.ctime,mtime:t.mtime,uri:t.path}}async rename(e){await this._copy(e,!0)}async copy(e){return this._copy(e,!1)}async requestPermissions(){return{publicStorage:"granted"}}async checkPermissions(){return{publicStorage:"granted"}}async _copy(e,r=!1){let{toDirectory:t}=e;const{to:i,from:n,directory:s}=e;if(!i||!n)throw Error("Both to and from must be provided");t||(t=s);const a=this.getPath(s,n),c=this.getPath(t,i);if(a===c)return{uri:c};if(R(a,c))throw Error("To path cannot contain the from path");let o;try{o=await this.stat({path:i,directory:t})}catch{const l=i.split("/");l.pop();const f=l.join("/");if(l.length>0&&(await this.stat({path:f,directory:t})).type!=="directory")throw new Error("Parent directory of the to path is a file")}if(o&&o.type==="directory")throw new Error("Cannot overwrite a directory with a file");const d=await this.stat({path:n,directory:s}),h=async(u,l,f)=>{const p=this.getPath(t,u),b=await this.dbRequest("get",[p]);b.ctime=l,b.mtime=f,await this.dbRequest("put",[b])},y=d.ctime?d.ctime:Date.now();switch(d.type){case"file":{const u=await this.readFile({path:n,directory:s});r&&await this.deleteFile({path:n,directory:s});let l;!(u.data instanceof Blob)&&!this.isBase64String(u.data)&&(l=E.UTF8);const f=await this.writeFile({path:i,directory:t,data:u.data,encoding:l});return r&&await h(i,y,d.mtime),f}case"directory":{if(o)throw Error("Cannot move a directory over an existing object");try{await this.mkdir({path:i,directory:t,recursive:!1}),r&&await h(i,y,d.mtime)}catch{}const u=(await this.readdir({path:n,directory:s})).files;for(const l of u)await this._copy({from:`${n}/${l.name}`,to:`${i}/${l.name}`,directory:s,toDirectory:t},r);r&&await this.rmdir({path:n,directory:s})}}return{uri:c}}isBase64String(e){try{return btoa(atob(e))==e}catch{return!1}}}g._debug=!0;export{g as FilesystemWeb}; +import{W as P,b as x}from"./index-DLDMtYxl.js";import{Encoding as E}from"./index-CJCBehez.js";function m(w){const e=w.split("/").filter(t=>t!=="."),r=[];return e.forEach(t=>{t===".."&&r.length>0&&r[r.length-1]!==".."?r.pop():r.push(t)}),r.join("/")}function R(w,e){w=m(w),e=m(e);const r=w.split("/"),t=e.split("/");return w!==e&&r.every((i,n)=>i===t[n])}class g extends P{constructor(){super(...arguments),this.DB_VERSION=1,this.DB_NAME="Disc",this._writeCmds=["add","put","delete"],this.downloadFile=async e=>{var r,t;const i=x(e,e.webFetchExtra),n=await fetch(e.url,i);let s;if(!e.progress)s=await n.blob();else if(!(n!=null&&n.body))s=new Blob;else{const c=n.body.getReader();let o=0;const d=[],h=n.headers.get("content-type"),y=parseInt(n.headers.get("content-length")||"0",10);for(;;){const{done:f,value:p}=await c.read();if(f)break;d.push(p),o+=(p==null?void 0:p.length)||0;const b={url:e.url,bytes:o,contentLength:y};this.notifyListeners("progress",b)}const u=new Uint8Array(o);let l=0;for(const f of d)typeof f>"u"||(u.set(f,l),l+=f.length);s=new Blob([u.buffer],{type:h||void 0})}return{path:(await this.writeFile({path:e.path,directory:(r=e.directory)!==null&&r!==void 0?r:void 0,recursive:(t=e.recursive)!==null&&t!==void 0?t:!1,data:s})).uri,blob:s}}}async initDb(){if(this._db!==void 0)return this._db;if(!("indexedDB"in window))throw this.unavailable("This browser doesn't support IndexedDB");return new Promise((e,r)=>{const t=indexedDB.open(this.DB_NAME,this.DB_VERSION);t.onupgradeneeded=g.doUpgrade,t.onsuccess=()=>{this._db=t.result,e(t.result)},t.onerror=()=>r(t.error),t.onblocked=()=>{console.warn("db blocked")}})}static doUpgrade(e){const t=e.target.result;switch(e.oldVersion){case 0:case 1:default:t.objectStoreNames.contains("FileStorage")&&t.deleteObjectStore("FileStorage"),t.createObjectStore("FileStorage",{keyPath:"path"}).createIndex("by_folder","folder")}}async dbRequest(e,r){const t=this._writeCmds.indexOf(e)!==-1?"readwrite":"readonly";return this.initDb().then(i=>new Promise((n,s)=>{const o=i.transaction(["FileStorage"],t).objectStore("FileStorage")[e](...r);o.onsuccess=()=>n(o.result),o.onerror=()=>s(o.error)}))}async dbIndexRequest(e,r,t){const i=this._writeCmds.indexOf(r)!==-1?"readwrite":"readonly";return this.initDb().then(n=>new Promise((s,a)=>{const h=n.transaction(["FileStorage"],i).objectStore("FileStorage").index(e)[r](...t);h.onsuccess=()=>s(h.result),h.onerror=()=>a(h.error)}))}getPath(e,r){const t=r!==void 0?r.replace(/^[/]+|[/]+$/g,""):"";let i="";return e!==void 0&&(i+="/"+e),r!==""&&(i+="/"+t),i}async clear(){(await this.initDb()).transaction(["FileStorage"],"readwrite").objectStore("FileStorage").clear()}async readFile(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(t===void 0)throw Error("File does not exist.");return{data:t.content?t.content:""}}async writeFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=e.recursive,s=await this.dbRequest("get",[r]);if(s&&s.type==="directory")throw Error("The supplied path is a directory.");const a=r.substr(0,r.lastIndexOf("/"));if(await this.dbRequest("get",[a])===void 0){const h=a.indexOf("/",1);if(h!==-1){const y=a.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:n})}}if(!i&&!(t instanceof Blob)&&(t=t.indexOf(",")>=0?t.split(",")[1]:t,!this.isBase64String(t)))throw Error("The supplied data is not valid base64 content.");const o=Date.now(),d={path:r,folder:a,type:"file",size:t instanceof Blob?t.size:t.length,ctime:o,mtime:o,content:t};return await this.dbRequest("put",[d]),{uri:d.path}}async appendFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=r.substr(0,r.lastIndexOf("/")),s=Date.now();let a=s;const c=await this.dbRequest("get",[r]);if(c&&c.type==="directory")throw Error("The supplied path is a directory.");if(await this.dbRequest("get",[n])===void 0){const h=n.indexOf("/",1);if(h!==-1){const y=n.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:!0})}}if(!i&&!this.isBase64String(t))throw Error("The supplied data is not valid base64 content.");if(c!==void 0){if(c.content instanceof Blob)throw Error("The occupied entry contains a Blob object which cannot be appended to.");c.content!==void 0&&!i?t=btoa(atob(c.content)+atob(t)):t=c.content+t,a=c.ctime}const d={path:r,folder:n,type:"file",size:t.length,ctime:a,mtime:s,content:t};await this.dbRequest("put",[d])}async deleteFile(e){const r=this.getPath(e.directory,e.path);if(await this.dbRequest("get",[r])===void 0)throw Error("File does not exist.");if((await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)])).length!==0)throw Error("Folder is not empty.");await this.dbRequest("delete",[r])}async mkdir(e){const r=this.getPath(e.directory,e.path),t=e.recursive,i=r.substr(0,r.lastIndexOf("/")),n=(r.match(/\//g)||[]).length,s=await this.dbRequest("get",[i]),a=await this.dbRequest("get",[r]);if(n===1)throw Error("Cannot create Root directory");if(a!==void 0)throw Error("Current directory does already exist.");if(!t&&n!==2&&s===void 0)throw Error("Parent directory must exist");if(t&&n!==2&&s===void 0){const d=i.substr(i.indexOf("/",1));await this.mkdir({path:d,directory:e.directory,recursive:t})}const c=Date.now(),o={path:r,folder:i,type:"directory",size:0,ctime:c,mtime:c};await this.dbRequest("put",[o])}async rmdir(e){const{path:r,directory:t,recursive:i}=e,n=this.getPath(t,r),s=await this.dbRequest("get",[n]);if(s===void 0)throw Error("Folder does not exist.");if(s.type!=="directory")throw Error("Requested path is not a directory");const a=await this.readdir({path:r,directory:t});if(a.files.length!==0&&!i)throw Error("Folder is not empty");for(const c of a.files){const o=`${r}/${c.name}`;(await this.stat({path:o,directory:t})).type==="file"?await this.deleteFile({path:o,directory:t}):await this.rmdir({path:o,directory:t,recursive:i})}await this.dbRequest("delete",[n])}async readdir(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(e.path!==""&&t===void 0)throw Error("Folder does not exist.");const i=await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)]);return{files:await Promise.all(i.map(async s=>{let a=await this.dbRequest("get",[s]);return a===void 0&&(a=await this.dbRequest("get",[s+"/"])),{name:s.substring(r.length+1),type:a.type,size:a.size,ctime:a.ctime,mtime:a.mtime,uri:a.path}}))}}async getUri(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);return t===void 0&&(t=await this.dbRequest("get",[r+"/"])),{uri:(t==null?void 0:t.path)||r}}async stat(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);if(t===void 0&&(t=await this.dbRequest("get",[r+"/"])),t===void 0)throw Error("Entry does not exist.");return{type:t.type,size:t.size,ctime:t.ctime,mtime:t.mtime,uri:t.path}}async rename(e){await this._copy(e,!0)}async copy(e){return this._copy(e,!1)}async requestPermissions(){return{publicStorage:"granted"}}async checkPermissions(){return{publicStorage:"granted"}}async _copy(e,r=!1){let{toDirectory:t}=e;const{to:i,from:n,directory:s}=e;if(!i||!n)throw Error("Both to and from must be provided");t||(t=s);const a=this.getPath(s,n),c=this.getPath(t,i);if(a===c)return{uri:c};if(R(a,c))throw Error("To path cannot contain the from path");let o;try{o=await this.stat({path:i,directory:t})}catch{const l=i.split("/");l.pop();const f=l.join("/");if(l.length>0&&(await this.stat({path:f,directory:t})).type!=="directory")throw new Error("Parent directory of the to path is a file")}if(o&&o.type==="directory")throw new Error("Cannot overwrite a directory with a file");const d=await this.stat({path:n,directory:s}),h=async(u,l,f)=>{const p=this.getPath(t,u),b=await this.dbRequest("get",[p]);b.ctime=l,b.mtime=f,await this.dbRequest("put",[b])},y=d.ctime?d.ctime:Date.now();switch(d.type){case"file":{const u=await this.readFile({path:n,directory:s});r&&await this.deleteFile({path:n,directory:s});let l;!(u.data instanceof Blob)&&!this.isBase64String(u.data)&&(l=E.UTF8);const f=await this.writeFile({path:i,directory:t,data:u.data,encoding:l});return r&&await h(i,y,d.mtime),f}case"directory":{if(o)throw Error("Cannot move a directory over an existing object");try{await this.mkdir({path:i,directory:t,recursive:!1}),r&&await h(i,y,d.mtime)}catch{}const u=(await this.readdir({path:n,directory:s})).files;for(const l of u)await this._copy({from:`${n}/${l.name}`,to:`${i}/${l.name}`,directory:s,toDirectory:t},r);r&&await this.rmdir({path:n,directory:s})}}return{uri:c}}isBase64String(e){try{return btoa(atob(e))==e}catch{return!1}}}g._debug=!0;export{g as FilesystemWeb}; diff --git a/intern-log/dist/index.html b/intern-log/dist/index.html index cbd4c4f..049bab3 100644 --- a/intern-log/dist/index.html +++ b/intern-log/dist/index.html @@ -8,8 +8,8 @@ 实习工作日志 - - + +
diff --git a/intern-log/package.json b/intern-log/package.json index 4e11151..1972592 100644 --- a/intern-log/package.json +++ b/intern-log/package.json @@ -1,7 +1,7 @@ { "name": "intern-log", "private": true, - "version": "0.4.0", + "version": "0.5.0", "type": "module", "scripts": { "dev": "vite", diff --git a/intern-log/repro/goal-smoke.ts b/intern-log/repro/goal-smoke.ts new file mode 100644 index 0000000..a06380c --- /dev/null +++ b/intern-log/repro/goal-smoke.ts @@ -0,0 +1,38 @@ +import 'fake-indexeddb/auto' +const BASE = 'http://127.0.0.1:3780' +const store = new Map() +;(globalThis as any).localStorage = { + getItem: (k: string) => (store.has(k) ? store.get(k) : null), + setItem: (k: string, v: string) => { store.set(k, String(v)) }, + removeItem: (k: string) => { store.delete(k) } +} +store.set('dsh_cloud_creds', JSON.stringify({ username: 'goal_smoke', password: 'goal123' })) +store.set('dsh_sync_base', BASE) + +async function main() { + const reg = await fetch(BASE + '/api/auth/register', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: 'goal_smoke', password: 'goal123' }) + }).catch(() => null) + const schema = await import('../src/db/schema') + const engine = await import('../src/sync/engine') + schema.bindDatabase(new schema.WorklogDB('gs_a')) + const a = schema.db + // 设备 A:建 goal + plan(goal_id 指向本地 goal) + const gid = await a.goal.add({ title: '产品文档学习', kind: '学习', start_date: '2026-10-16', end_date: '2026-10-18', note: null, uuid: '', created_at: '2026-10-16T08:00:00', updated_at: '2026-10-16T08:00:00' } as never) + await a.plan.add({ date: '2026-10-16', start_time: '08:00', end_time: '09:00', title: '产品文档学习', kind: '学习', note: null, status: 'todo', actual_minutes: 0, timer_started_at: null, goal_id: gid, uuid: '', created_at: '2026-10-16T08:00:00', updated_at: '2026-10-16T08:00:00' } as never) + const rA = await engine.runSync({ baseUrl: BASE, username: 'goal_smoke', password: 'goal123' }) + console.log('A push:', JSON.stringify({ p: rA.pushed, e: rA.errors })) + // 设备 B:空库拉取 + schema.bindDatabase(new schema.WorklogDB('gs_b')) + await engine.runSync({ baseUrl: BASE, username: 'goal_smoke', password: 'goal123' }) + const b = schema.db + const goals = await b.goal.toArray() + const plans = await b.plan.toArray() + const okGoal = goals.length === 1 + const okFk = plans.length === 1 && plans[0].goal_id === goals[0].id && plans[0].title === '产品文档学习' + console.log((okGoal ? 'PASS' : 'FAIL') + ' B 拉到长期计划') + console.log((okFk ? 'PASS' : 'FAIL') + ' plan.goal_id 正确水合到本地 goal(' + JSON.stringify({ goalId: plans[0] && plans[0].goal_id, localGoalId: goals[0] && goals[0].id }) + ')') + process.exit(okGoal && okFk ? 0 : 1) +} +main().catch(e => { console.error('FAILED:', (e && (e.stack || e.message)) || e); process.exit(1) }) diff --git a/intern-log/src/components/log/DayPanel.vue b/intern-log/src/components/log/DayPanel.vue index 56a9bb1..49764f1 100644 --- a/intern-log/src/components/log/DayPanel.vue +++ b/intern-log/src/components/log/DayPanel.vue @@ -161,61 +161,15 @@ async function saveMakeupForm() { showToast('补卡已保存') } -// ---- 新增工作记录 ---- -const content = ref('') -const contentError = ref('') -watch(content, () => { - if (contentError.value) contentError.value = '' -}) -const projectId = ref(null) -const category = ref('dev') -const minutesVal = ref(null) -const takeawayVal = ref('') -const remarkVal = ref('') -const submitting = ref(false) -const formDirty = computed(() => !!(content.value.trim() || minutesVal.value || takeawayVal.value.trim() || remarkVal.value.trim())) - -onMounted(async () => { - const lp = await getLastPick() - projectId.value = lp.project_id - category.value = lp.category -}) - -function resetForm() { - content.value = '' - minutesVal.value = null - takeawayVal.value = '' - remarkVal.value = '' - contentError.value = '' -} - -async function submit() { - const text = content.value.trim() - if (!text) { - contentError.value = '请填写工作内容' - return - } - if (submitting.value) return - submitting.value = true - await addLogItem(props.date, { - content: text, - project_id: projectId.value, - category: category.value, - minutes: minutesVal.value && minutesVal.value > 0 ? minutesVal.value : null, - takeaway: takeawayVal.value.trim() || null, - remark: remarkVal.value.trim() || null - }) - resetForm() - await load() - showToast('记录已添加') - submitting.value = false -} // ---- 条目操作 ---- const editTarget = ref(null) function openEdit(it: LogItem) { editTarget.value = it } +function openAdd() { + editTarget.value = null +} async function onEditSave(payload: { id: number content: string @@ -227,21 +181,22 @@ async function onEditSave(payload: { is_milestone: number needs_followup: number }) { - const id = payload.id - const patch = { - content: payload.content, - project_id: payload.project_id, - category: payload.category, - minutes: payload.minutes, - takeaway: payload.takeaway, - remark: payload.remark, - is_milestone: payload.is_milestone, - needs_followup: payload.needs_followup + if (payload.id) { + await updateLogItem(payload.id, { + content: payload.content, project_id: payload.project_id, category: payload.category, + minutes: payload.minutes, takeaway: payload.takeaway, remark: payload.remark, + is_milestone: payload.is_milestone, needs_followup: payload.needs_followup + }) + showToast('记录已更新') + } else { + await addLogItem(props.date, { + content: payload.content, project_id: payload.project_id, category: payload.category, + minutes: payload.minutes, takeaway: payload.takeaway, remark: payload.remark + }) + showToast('记录已添加') } - await updateLogItem(id, patch) editTarget.value = null await load() - showToast('修改已保存') } async function toggleMilestone(it: LogItem) { await updateLogItem(it.id as number, { is_milestone: it.is_milestone ? 0 : 1 }) @@ -381,54 +336,11 @@ async function confirmDelete() { -
-
- 新增工作记录 - 内容必填,其余选填 -
-
-
- - -
{{ contentError }}
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
-
工作记录({{ items.length }})
+
+ 工作记录({{ items.length }}) + +
暂无记录
diff --git a/intern-log/src/components/log/EditLogDialog.vue b/intern-log/src/components/log/EditLogDialog.vue index 8942271..a7a0210 100644 --- a/intern-log/src/components/log/EditLogDialog.vue +++ b/intern-log/src/components/log/EditLogDialog.vue @@ -89,7 +89,7 @@ function save() { return } if (!props.item || !props.item.id) { - emit('cancel') + emit('save', { id: 0, content: text, project_id: formProjectId.value, category: formCategory.value, minutes: formMinutes.value && formMinutes.value > 0 ? formMinutes.value : null, takeaway: formTakeaway.value.trim() || null, remark: formRemark.value.trim() || null, is_milestone: formMilestone.value, needs_followup: formFollowup.value }) return } emit('save', { diff --git a/intern-log/src/db/repo.ts b/intern-log/src/db/repo.ts index 973bbf3..7992d81 100644 --- a/intern-log/src/db/repo.ts +++ b/intern-log/src/db/repo.ts @@ -1,7 +1,7 @@ // 数据仓库:全部业务数据只有服务器一份权威副本,本地 Dexie 是实时缓存。 // 约定:每个写函数修改本地缓存后立即调用 commit() —— 推送差异给服务器, // 并以服务器返回的权威快照重建缓存;断网时抛出错误(纯在线模式)。 -import { db, DEFAULT_LOCATIONS, SCHEMA_VERSION, type Attendance, type Credential, type LogItem, type Memo, type PlanItem, type Project, type Transaction, type WeeklyNote, type WorkLog } from './schema' +import { db, DEFAULT_LOCATIONS, SCHEMA_VERSION, type Attendance, type Credential, type LogItem, type Memo, type Goal, type PlanItem, type Project, type Transaction, type WeeklyNote, type WorkLog } from './schema' import { addDays, nowLocalISO, toDateStr } from '../lib/date' import { flushAfterWrite } from '../sync/engine' @@ -438,6 +438,108 @@ export async function stopPlanTimer(id: number): Promise { await commit() } +// ---------- 长期计划(目标) ---------- + +export interface GoalInput { + title: string + kind: string + start_date: string + end_date: string + note: string +} + +const MAX_MATERIALIZE_DAYS = 366 + +function eachDate(start: string, end: string): string[] { + const out: string[] = [] + let cur = start + let guard = 0 + while (cur <= end && guard < MAX_MATERIALIZE_DAYS) { + out.push(cur) + cur = addDays(cur, 1) + guard++ + } + return out +} + +export async function getGoalProgress(): Promise<{ goalId: number; done: number; total: number }[]> { + const goals = await db.goal.toArray() + const out: { goalId: number; done: number; total: number }[] = [] + for (const g of goals) { + const items = await db.plan.where('goal_id').equals(g.id as number).toArray() + out.push({ goalId: g.id as number, done: items.filter(i => i.status === 'done').length, total: items.length }) + } + return out +} + +export async function listGoals(): Promise { + const rows = await db.goal.toArray() + return rows.sort((a, b) => (a.start_date < b.start_date ? -1 : 1)) +} + +// 新建长期计划并物化每一天的任务(落实每日打卡与计时) +export async function addGoal(input: GoalInput): Promise { + const now = nowLocalISO() + const gid = await db.goal.add({ + title: input.title.trim(), + kind: input.kind.trim() || '其他', + start_date: input.start_date, + end_date: input.end_date, + note: input.note || null, + uuid: '', + created_at: now, + updated_at: now + } as never) + const goal = await db.goal.get(gid) + const dates = eachDate(input.start_date, input.end_date) + for (const d of dates) { + await db.plan.add({ + date: d, + start_time: '08:00', + end_time: '09:00', + title: input.title.trim(), + kind: input.kind.trim() || '其他', + note: input.note || null, + status: 'todo', + actual_minutes: 0, + timer_started_at: null, + goal_id: gid, + uuid: '', + created_at: now, + updated_at: now + } as never) + } + void goal + await commit() +} + +// 编辑目标:标题/类别级联到其每日任务(已完成项不改动) +export async function updateGoal(id: number, patch: Partial): Promise { + const goal = await db.goal.get(id) + if (!goal) return + const next = { ...patch, updated_at: nowLocalISO() } + await db.goal.update(id, next) + const items = await db.plan.where('goal_id').equals(id).toArray() + for (const it of items) { + if (it.status === 'done') continue + await db.plan.update(it.id as number, { + ...(patch.title !== undefined ? { title: patch.title.trim() } : {}), + ...(patch.kind !== undefined ? { kind: patch.kind } : {}), + ...(patch.note !== undefined ? { note: patch.note || null } : {}), + updated_at: nowLocalISO() + }) + } + await commit() +} + +// 删除目标:连同其每日任务一起删除(前端二次确认) +export async function deleteGoal(id: number): Promise { + const items = await db.plan.where('goal_id').equals(id).toArray() + for (const it of items) await db.plan.delete(it.id as number) + await db.goal.delete(id) + await commit() +} + // ---------- 备忘录 ---------- export async function listMemos(): Promise { @@ -536,7 +638,8 @@ export async function exportAll(): Promise { db.memo.toArray(), db.credential.toArray(), db.table('transaction').toArray(), - db.plan.toArray() + db.plan.toArray(), + db.goal.toArray() ]) return JSON.stringify({ schema_version: SCHEMA_VERSION, @@ -551,7 +654,8 @@ export async function exportAll(): Promise { memo: tables[6], credential: tables[7], transaction: tables[8], - plan: tables[9] + plan: tables[9], + goal: tables[10] } }, null, 2) } @@ -570,11 +674,12 @@ export async function importAll(jsonText: string): Promise { const dl = db.table('log_item') const dt = db.table('transaction') const dp = db.plan - await db.transaction('rw', [db.project, db.work_log, dl, db.attendance, db.weekly_note, db.setting, db.memo, db.credential, dt, dp], async () => { + const dg = db.goal + await db.transaction('rw', [db.project, db.work_log, dl, db.attendance, db.weekly_note, db.setting, db.memo, db.credential, dt, dg, dp], async () => { await Promise.all([ db.project.clear(), db.work_log.clear(), dl.clear(), db.attendance.clear(), db.weekly_note.clear(), db.setting.clear(), - db.memo.clear(), db.credential.clear(), dt.clear(), dp.clear() + db.memo.clear(), db.credential.clear(), dt.clear(), dg.clear(), dp.clear() ]) if (d.project && d.project.length) await db.project.bulkAdd(d.project as never[]) if (d.work_log && d.work_log.length) await db.work_log.bulkAdd(d.work_log as never[]) @@ -585,6 +690,7 @@ export async function importAll(jsonText: string): Promise { if (d.memo && d.memo.length) await db.memo.bulkAdd(d.memo as never[]) if (d.credential && d.credential.length) await db.credential.bulkAdd(d.credential as never[]) if (d.transaction && d.transaction.length) await dt.bulkAdd(d.transaction as never[]) + if (d.goal && d.goal.length) await dg.bulkAdd(d.goal as never[]) if (d.plan && d.plan.length) await dp.bulkAdd(d.plan as never[]) }) // 导入即推送:以导入内容覆盖服务器(缺失行自动生成墓碑清除),随后以快照回读 diff --git a/intern-log/src/db/schema.ts b/intern-log/src/db/schema.ts index 26ecb94..1ff4c75 100644 --- a/intern-log/src/db/schema.ts +++ b/intern-log/src/db/schema.ts @@ -48,6 +48,18 @@ export interface WeeklyNote { created_at: string } +export interface Goal { + id?: number + title: string // 长期计划,如:学完产品文档 / 本月健身 20 次 + kind: string + start_date: string // YYYY-MM-DD + end_date: string + note: string | null + uuid: string + created_at: string + updated_at: string +} + export interface PlanItem { id?: number date: string // YYYY-MM-DD @@ -59,6 +71,7 @@ export interface PlanItem { status: string // todo | done | skip actual_minutes: number // 计时时钟累计的实际投入分钟 timer_started_at: string | null + goal_id: number | null // 来源长期计划(本地 id) uuid: string created_at: string updated_at: string @@ -124,6 +137,7 @@ export class WorklogDB extends Dexie { sync_mirror!: Table tombstone!: Table plan!: Table + goal!: Table constructor(dbName = 'intern_worklog') { super(dbName) @@ -163,6 +177,10 @@ export class WorklogDB extends Dexie { if (item.category && map[item.category]) item.category = map[item.category] }) }) + this.version(6).stores({ + plan: '++id, date, status, goal_id', + goal: '++id, start_date' + }) } } @@ -178,7 +196,7 @@ export function unbindDatabase(): void { db = undefined } -export const SCHEMA_VERSION = 5 +export const SCHEMA_VERSION = 6 export const EXPENSE_CATEGORIES: string[] = ['餐饮', '交通', '住房', '通讯', '学习', '娱乐', '其他'] export const INCOME_CATEGORIES: string[] = ['工资', '报销', '其他'] diff --git a/intern-log/src/sync/engine.ts b/intern-log/src/sync/engine.ts index 37e1a28..c1e1c7e 100644 --- a/intern-log/src/sync/engine.ts +++ b/intern-log/src/sync/engine.ts @@ -13,7 +13,7 @@ import { DEFAULT_SYNC_BASE, getSyncBase as baseOf, getToken, setToken, setSyncBa // 最近一次自动同步的错误(设置页展示用) export const syncLastError = ref('') -const TABLES = ['project', 'work_log', 'log_item', 'attendance', 'weekly_note', 'setting', 'memo', 'credential', 'transaction', 'plan'] +const TABLES = ['project', 'work_log', 'log_item', 'attendance', 'weekly_note', 'setting', 'memo', 'credential', 'goal', 'transaction', 'plan'] // 本地临时性键不参与同步,也不能从服务端写回本地缓存 const EXCLUDE_SETTING_KEYS = new Set(['sync_cursor', 'sync_last_time', 'sync_token', 'last_project', 'last_category']) @@ -175,6 +175,7 @@ export async function flushAfterWrite(): Promise { interface RefMaps { workLog: Map project: Map + goal: Map } function normalizeRow(t: string, row: AnyRow, refs: RefMaps): AnyRow { @@ -191,15 +192,22 @@ function normalizeRow(t: string, row: AnyRow, refs: RefMaps): AnyRow { const pj = row.project_id ? refs.project.get(row.project_id) : null if (pj && pj.uuid) clean.puuid = pj.uuid } + if (t === 'plan') { + delete clean.goal_id + const g = row.goal_id ? refs.goal.get(row.goal_id) : null + if (g && g.uuid) clean.guuid = g.uuid + } return clean } async function buildRefMaps(): Promise { const wlRows = await db.work_log.toArray() const pjRows = await db.project.toArray() + const gRows = await db.goal.toArray() return { workLog: new Map(wlRows.map(r => [r.id as number, r])), - project: new Map(pjRows.map(p => [p.id as number, p])) + project: new Map(pjRows.map(p => [p.id as number, p])), + goal: new Map(gRows.map(r => [r.id as number, r])) } } @@ -398,6 +406,7 @@ async function applySnapshot( let removed = 0 const wlIds: { [uuid: string]: number } = {} const pjIds: { [uuid: string]: number } = {} + const goalIds: { [uuid: string]: number } = {} for (const t of TABLES) { const table = db.table(t) @@ -431,6 +440,15 @@ async function applySnapshot( srow.project_id = srow.puuid ? (pjIds[srow.puuid] ?? null) : null delete srow.puuid } + if (t === 'plan') { + if (srow.guuid) { + const gid = goalIds[srow.guuid] + srow.goal_id = gid ?? null + delete srow.guuid + } else { + srow.goal_id = null + } + } let id: any = pkOf(t, srow0) if (t === 'setting') id = srow0.key else { @@ -445,6 +463,7 @@ async function applySnapshot( hydrated.push(rowOut) if (t === 'work_log') wlIds[srow0.uuid] = id if (t === 'project') pjIds[srow0.uuid] = id + if (t === 'goal') goalIds[srow0.uuid] = id } void importance const outRows = hydrated.concat(inflight) diff --git a/intern-log/src/views/LedgerView.vue b/intern-log/src/views/LedgerView.vue index ae82918..4fd6f8e 100644 --- a/intern-log/src/views/LedgerView.vue +++ b/intern-log/src/views/LedgerView.vue @@ -61,13 +61,9 @@ const incomeCats = ref([]) async function loadCats() { expenseCats.value = await getLedgerCategories('expense') incomeCats.value = await getLedgerCategories('income') - if (fType.value === 'expense' && !expenseCats.value.includes(fCategory.value)) fCategory.value = expenseCats.value[0] || '' - if (fType.value === 'income' && !incomeCats.value.includes(fCategory.value)) fCategory.value = incomeCats.value[0] || '' } loadCats() -watch(fType, t => { - fCategory.value = t === 'expense' ? (expenseCats.value[0] || '') : (incomeCats.value[0] || '') -}) + const sorted = computed(() => rows.value.slice().sort((a, b) => (a.date === b.date ? (b.id as number) - (a.id as number) : (a.date < b.date ? 1 : -1))) @@ -192,12 +188,24 @@ function openEdit(row: Transaction) { } dialogOpen.value = true } +function openCreate() { + editingId.value = null + dialogInitial.value = { type: 'expense', category: (expenseCats.value[0] || ''), amountYuan: '', date: todayStr(), note: '', reimbursable: 0, reimbursed: 0 } + dialogOpen.value = true +} + async function onDialogSave(payload: { type: string; category: string; amount: number; date: string; note: string; reimbursable: number; reimbursed: number }) { - const id = editingId.value as number - await updateTransaction(id, payload) + if (editingId.value) { + await updateTransaction(editingId.value, payload) + dialogOpen.value = false + await load() + showToast('账目已更新') + return + } + await addTransaction({ type: payload.type, category: payload.category, amount: payload.amount, date: payload.date, note: payload.note, reimbursable: payload.reimbursable, reimbursed: payload.reimbursed }) dialogOpen.value = false await load() - showToast('账目已更新') + showToast('已记一笔') } async function confirmDelete() { if (deleteTarget.value && deleteTarget.value.id) await deleteTransaction(deleteTarget.value.id) @@ -225,6 +233,7 @@ async function confirmDelete() { +
@@ -234,51 +243,6 @@ async function confirmDelete() {
待报销(元)
{{ yuan(summary.pending) }}
-
-
- 新增一笔 - 金额必填,回车快速添加 -
-
-
- -
- - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
{{ fError }}
- -
-
本月支出分类
@@ -333,7 +297,7 @@ async function confirmDelete() { import { computed, onMounted, onUnmounted, ref, watch } from 'vue' import Icon from '../components/Icon.vue' +import ConfirmDialog from '../components/ConfirmDialog.vue' import { addPlan, deletePlan, listPlansByDate, setPlanStatus, - startPlanTimer, stopPlanTimer, updatePlan, type PlanItem + startPlanTimer, stopPlanTimer, updatePlan, type PlanItem, + addGoal, updateGoal, deleteGoal, listGoals, getGoalProgress, type Goal } from '../db/repo' import { addDays, parseDateStr, todayStr, toDateStr, formatDateCN } from '../lib/date' import { attendanceChanged } from '../lib/bus' import { showToast } from '../lib/toast' +// ---- 长期计划 ---- +const goals = ref([]) +const goalProg = ref>({}) +const goalOpen = ref(false) +const goalEditing = ref(null) +const gTitle = ref('') +const gKind = ref('学习') +const gStart = ref(todayStr()) +const gEnd = ref(addDays(todayStr(), 6)) +const gNote = ref('') +const gError = ref('') +const delGoal = ref(null) + +function openGoalCreate() { + goalEditing.value = null + gTitle.value = '' + gKind.value = '学习' + gStart.value = todayStr() + gEnd.value = addDays(todayStr(), 6) + gNote.value = '' + gError.value = '' + goalOpen.value = true +} +function openGoalEdit(g: Goal) { + goalEditing.value = g + gTitle.value = g.title + gKind.value = g.kind + gStart.value = g.start_date + gEnd.value = g.end_date + gNote.value = g.note || '' + gError.value = '' + goalOpen.value = true +} +async function submitGoal() { + if (!gTitle.value.trim()) { gError.value = '请填写计划名称'; return } + if (gEnd.value < gStart.value) { gError.value = '结束日期不能早于开始日期'; return } + if (goalEditing.value) { + await updateGoal(goalEditing.value.id as number, { + title: gTitle.value.trim(), kind: gKind.value, note: gNote.value + }) + showToast('长期计划已更新') + } else { + await addGoal({ title: gTitle.value, kind: gKind.value, start_date: gStart.value, end_date: gEnd.value, note: gNote.value }) + showToast('长期计划已创建,已生成每日任务') + } + goalOpen.value = false + await load() +} +async function removeGoal() { + if (!delGoal.value) return + await deleteGoal(delGoal.value.id as number) + showToast('已删除长期计划及其每日任务') + delGoal.value = null + await load() +} + const date = ref(todayStr()) const items = ref([]) const loading = ref(true) @@ -20,7 +78,16 @@ const isToday = computed(() => date.value === todayStr()) async function load() { loading.value = true - items.value = await listPlansByDate(date.value) + const [plans, gs, prog] = await Promise.all([ + listPlansByDate(date.value), + listGoals(), + getGoalProgress() + ]) + items.value = plans + goals.value = gs + const map: Record = {} + for (const p of prog) map[String(p.goalId)] = { done: p.done, total: p.total } + goalProg.value = map loading.value = false } watch(date, load) @@ -165,6 +232,34 @@ function weekday(s: string): string {
+
+
+ 长期计划 + +
+
暂无长期计划。可以创建一个跨越多天的目标(如「产品文档学习」),系统会自动生成每天的打卡任务。
+
+
+
+ {{ g.kind }} + {{ g.title }} + {{ g.start_date.slice(5) }} ~ {{ g.end_date.slice(5) }} +
+
+ +
+
+ {{ goalProg[String(g.id)] ? goalProg[String(g.id)].done + '/' + goalProg[String(g.id)].total + ' 天已完成' : '0/' + (goalProg[String(g.id)] ? goalProg[String(g.id)].total : 0) + ' 天' }} + +
+
+
+ + +
+
+
+
今天还没有计划,点右上角「添加计划」开始规划:学习、健身、自律…… @@ -180,6 +275,7 @@ function weekday(s: string): string {
{{ p.kind }} + 长期 {{ p.title }} 已完成 已跳过 @@ -248,6 +344,57 @@ function weekday(s: string): string {
+ +
+ +
+
+ +
diff --git a/intern-log/src/views/SettingsView.vue b/intern-log/src/views/SettingsView.vue index 16b81b8..8db4654 100644 --- a/intern-log/src/views/SettingsView.vue +++ b/intern-log/src/views/SettingsView.vue @@ -11,7 +11,7 @@ import { type Project } from '../db/schema' import { getLogCategories, setLogCategories, getLedgerCategories, setLedgerCategories } from '../db/categories' import { downloadText, } from '../lib/download' import { downloadCsv } from '../lib/csv' -import { addDays, hhmm, parseDateStr, todayStr, weekStart } from '../lib/date' +import { hhmm, parseDateStr, todayStr } from '../lib/date' import { computeDay } from '../domain/attendance' import { changeLoginPassword, deleteCurrentUser, getSession } from '../db/auth' import { ensureCloudBinding, getSyncLastTime, isSyncConfigured, syncWithStoredConfig, syncLastError, type SyncResult } from '../sync/engine' @@ -72,41 +72,6 @@ async function removeCat(kind: 'log' | 'expense' | 'income', index: number) { showToast('分类已删除') } -// ---- 工作详情范围导出 ---- -const expRange = ref<'day' | 'week' | 'month' | 'custom'>('day') -const expStart = ref(todayStr()) -const expEnd = ref(todayStr()) -function rangeStartEnd(): { start: string; end: string; label: string } { - const t = todayStr() - if (expRange.value === 'day') return { start: expStart.value, end: expStart.value, label: expStart.value } - if (expRange.value === 'week') { const ws = weekStart(expStart.value); return { start: ws, end: addDays(ws, 6), label: ws + ' ~ ' + addDays(ws, 6) } } - if (expRange.value === 'month') { const y = expStart.value.slice(0, 4); const m = expStart.value.slice(5, 7); const last = new Date(Number(y), Number(m), 0).getDate(); return { start: y + '-' + m + '-01', end: y + '-' + m + '-' + last, label: y + '-' + m } } - return { start: expStart.value, end: expEnd.value, label: expStart.value + ' ~ ' + expEnd.value } -} -async function doExportRange() { - const { start, end, label } = rangeStartEnd() - const found = await Promise.all([listLogItemsBetween(start, end), listProjects(true)]) - const items = found[0] - const projects = found[1] - const pmap = new Map(projects.map(p => [p.id as number, p.name])) - const rows: (string | number | null)[][] = [['日期', '分类', '项目', '内容', '耗时(分钟)', '成果', '待跟进', '收获', '备注']] - for (const it of items) { - rows.push([ - it.date, - categoryLabel(it.category), - it.project_id ? (pmap.get(it.project_id) || '') : '', - it.content, - it.minutes == null ? '' : it.minutes, - it.is_milestone ? '是' : '', - it.needs_followup ? '是' : '', - it.takeaway || '', - it.remark || '' - ]) - } - const file = '工作详情_' + label.replace(/[~s]/g, '_') + '.csv' - const p = await downloadCsv(file, rows) - showToast(p ? '已导出:' + p : '已导出到系统下载目录(' + items.length + ' 条)') -} const fileInput = ref(null) const pendingImport = ref<{ name: string; text: string } | null>(null) const importError = ref('') @@ -490,30 +455,6 @@ async function doImport() {
-
-
工作详情导出
-
- - - - -
-
- - -
-
- -
-
-
数据备份
diff --git a/intern-log/src/views/TodayView.vue b/intern-log/src/views/TodayView.vue index 175ca64..f8d57a8 100644 --- a/intern-log/src/views/TodayView.vue +++ b/intern-log/src/views/TodayView.vue @@ -2,7 +2,12 @@ import { computed, ref } from 'vue' import Icon from '../components/Icon.vue' import DayPanel from '../components/log/DayPanel.vue' -import { addDays, formatDateCN, todayStr } from '../lib/date' +import { listLogItemsBetween, listAttendanceBetween, listProjects, getWorkRule } from '../db/repo' +import { computeDay } from '../domain/attendance' +import { addDays, formatDateCN, hhmm, todayStr, weekStart } from '../lib/date' +import { downloadText } from '../lib/download' +import { showToast } from '../lib/toast' +import { categoryLabel } from '../db/schema' // 详情视图:自由切换日期,对任意一天进行详细查看与修改 const date = ref(todayStr()) @@ -11,6 +16,73 @@ const isToday = computed(() => date.value === todayStr()) function prevDay() { date.value = addDays(date.value, -1) } function nextDay() { date.value = addDays(date.value, 1) } function goToday() { date.value = todayStr() } + +// ---- 工作详情导出(Markdown) ---- +const expRange = ref<'day' | 'week' | 'month' | 'custom'>('day') +const expStart = ref(todayStr()) +const expEnd = ref(todayStr()) +const exporting = ref(false) +function rangeStartEnd(): { start: string; end: string; label: string } { + if (expRange.value === 'day') return { start: expStart.value, end: expStart.value, label: expStart.value } + if (expRange.value === 'week') { + const ws = weekStart(expStart.value) + return { start: ws, end: addDays(ws, 6), label: ws + '_' + addDays(ws, 6) } + } + if (expRange.value === 'month') { + const y = expStart.value.slice(0, 4) + const m = expStart.value.slice(5, 7) + const last = new Date(Number(y), Number(m), 0).getDate() + return { start: y + '-' + m + '-01', end: y + '-' + m + '-' + last, label: y + '-' + m } + } + return { start: expStart.value, end: expEnd.value, label: expStart.value + '_' + expEnd.value } +} +async function doExportMd() { + if (exporting.value) return + exporting.value = true + try { + const { start, end, label } = rangeStartEnd() + const [rule, atts, items, projects] = await Promise.all([ + getWorkRule(), + listAttendanceBetween(start, end), + listLogItemsBetween(start, end), + listProjects(true) + ]) + const pname = new Map(projects.map(p => [p.id as number, p.name])) + const lines: string[] = ['# 工作详情 ' + label, ''] + const wd = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] + let cur = start + let guard = 0 + while (cur <= end && guard < 400) { + const dayItems = items.filter(i => i.date === cur) + const att = atts.find(a => a.date === cur) + if (att || dayItems.length) { + lines.push('## ' + cur + ' ' + wd[new Date(cur + 'T00:00:00').getDay()], '') + if (att && (att.clock_in_at || att.kind === 'makeup')) { + const info = computeDay(att, cur, rule, cur === todayStr()) + const seg = [hhmm(att.clock_in_at), '–', hhmm(att.clock_out_at), '·', info.label] + if (att.location) seg.push('· 地点:' + att.location) + lines.push('考勤:' + seg.join(' '), '') + } + for (const it of dayItems) { + const proj = it.project_id ? (pname.get(it.project_id) || '') : '' + const head = '- 【' + categoryLabel(it.category) + '】' + it.content + (it.minutes ? '(' + it.minutes + ' 分钟)' : '') + (proj ? ' @' + proj : '') + lines.push(head) + if (it.takeaway) lines.push(' - 收获:' + it.takeaway) + if (it.needs_followup === 1 && it.remark) lines.push(' - 待跟进:' + it.remark) + else if (it.remark) lines.push(' - 备注:' + it.remark) + } + lines.push('') + } + cur = addDays(cur, 1) + guard++ + } + await downloadText('工作详情_' + label + '.md', lines.join('\n')) + showToast('已导出 Markdown') + } finally { + exporting.value = false + } +} + function onDateInput(e: Event) { const v = (e.target as HTMLInputElement).value if (v) date.value = v @@ -26,6 +98,18 @@ function onDateInput(e: Event) {
+
+ 导出工作详情 +
+ + + + +
+ + + +
@@ -42,6 +126,18 @@ function onDateInput(e: Event) { .date-title.is-today { color: var(--accent); } .w-date { width: 150px; } +.export-row { + display: flex; align-items: center; gap: 8px; flex-wrap: wrap; + margin-bottom: 12px; padding: 8px 12px; + border: 1px solid var(--border); border-radius: var(--radius-md); + background: var(--bg-page); +} +.exp-label { font-size: 12px; } +.seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; } +.seg-btn { border: none; background: var(--bg-page); color: var(--text-2); cursor: pointer; font-size: 12px; padding: 4px 10px; } +.seg-btn.active { background: var(--accent-bg); color: var(--accent); } +.w-exp { width: 140px; } + @media (max-width: 720px) { .detail-toolbar { gap: 8px; } .date-title { min-width: 0; flex: 1; text-align: left; } diff --git a/server/index.js b/server/index.js index 852c331..8745bcc 100644 --- a/server/index.js +++ b/server/index.js @@ -12,7 +12,7 @@ const PORT = Number(process.env.PORT || 3780) const TOKEN_TTL_MS = 30 * 24 * 60 * 60 * 1000 // 30 天 const ITER = 150000 -const TABLES = ['project', 'work_log', 'log_item', 'attendance', 'weekly_note', 'setting', 'memo', 'credential', 'transaction', 'plan'] +const TABLES = ['project', 'work_log', 'log_item', 'attendance', 'weekly_note', 'setting', 'memo', 'credential', 'goal', 'transaction', 'plan'] // 自然键:同一逻辑记录在两台设备上独立创建时的去重依据 const NATURAL_KEYS = {