e.__isTeleport,Nl=Symbol("_leaveCb");function yo(e){let t=e[0];if(e.length>1){for(const l of e)if(l.type!==lt){t=l;break}}return t}function Un(e){if(!hs(e))return Ml(e.type)&&e.children?yo(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:l}=e;if(l){if(t&16)return l[0];if(t&32&&H(l.default))return l.default()}}function ps(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const l=e.component.subTree;ps(Ml(l.type)&&Un(l)||l,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bn(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Es(e,t){let l;return!!((l=Object.getOwnPropertyDescriptor(e,t))&&!l.configurable)}const ml=new WeakMap;function Nt(e,t,l,n,i=!1){if(R(e)){e.forEach((F,ie)=>Nt(F,t&&(R(t)?t[ie]:t),l,n,i));return}if(Ht(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Nt(e,t,l,n.component.subTree);return}const o=n.shapeFlag&4?$l(n.component):n.el,r=i?null:o,{i:a,r:c}=e,p=t&&t.r,f=a.refs===te?a.refs={}:a.refs,b=a.setupState,S=Z(b),T=b===te?cn:F=>Es(f,F)?!1:Y(S,F),W=(F,ie)=>!(ie&&Es(f,ie));if(p!=null&&p!==c){if(Rs(t),ae(p))f[p]=null,T(p)&&(b[p]=null);else if(he(p)){const F=t;W(p,F.k)&&(p.value=null),F.k&&(f[F.k]=null)}}if(H(c))Jt(c,a,12,[r,f]);else{const F=ae(c),ie=he(c);if(F||ie){const J=()=>{if(e.f){const V=F?T(c)?b[c]:f[c]:W()||!e.k?c.value:f[e.k];if(i)R(V)&&ts(V,o);else if(R(V))V.includes(o)||V.push(o);else if(F)f[c]=[o],T(c)&&(b[c]=f[c]);else{const z=[o];W(c,e.k)&&(c.value=z),e.k&&(f[e.k]=z)}}else F?(f[c]=r,T(c)&&(b[c]=r)):ie&&(W(c,e.k)&&(c.value=r),e.k&&(f[e.k]=r))};if(r){const V=()=>{J(),ml.delete(e)};V.id=-1,ml.set(e,V),_e(V,l)}else Rs(e),J()}}}function Rs(e){const t=ml.get(e);t&&(t.flags|=8,ml.delete(e))}Cl().requestIdleCallback;Cl().cancelIdleCallback;const Ht=e=>!!e.type.__asyncLoader,hs=e=>e.type.__isKeepAlive;function _o(e,t){Wn(e,"a",t)}function xo(e,t){Wn(e,"da",t)}function Wn(e,t,l=ye){const n=e.__wdc||(e.__wdc=()=>{let i=l;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(jl(t,n,l),l){let i=l.parent;for(;i&&i.parent;)hs(i.parent.vnode)&&wo(n,t,l,i),i=i.parent}}function wo(e,t,l,n){const i=jl(t,e,n,!0);ms(()=>{ts(n[t],i)},l)}function jl(e,t,l=ye,n=!1){if(l){const i=l[e]||(l[e]=[]),o=t.__weh||(t.__weh=(...r)=>{et();const a=Xt(l),c=Oe(t,l,e,r);return a(),tt(),c});return n?i.unshift(o):i.push(o),o}}const st=e=>(t,l=ye)=>{(!zt||e==="sp")&&jl(e,(...n)=>t(...n),l)},ko=st("bm"),zn=st("m"),Co=st("bu"),So=st("u"),To=st("bum"),ms=st("um"),Mo=st("sp"),jo=st("rtg"),Ao=st("rtc");function Po(e,t=ye){jl("ec",e,t)}const $o=Symbol.for("v-ndc");function $e(e,t,l,n){let i;const o=l,r=R(e);if(r||ae(e)){const a=r&&rt(e);let c=!1,p=!1;a&&(c=!je(e),p=Be(e),e=Sl(e)),i=new Array(e.length);for(let f=0,b=e.length;ft(a,c,void 0,o));else{const a=Object.keys(e);i=new Array(a.length);for(let c=0,p=a.length;c e?bi(e)?$l(e):Yl(e.parent):null,Lt=me(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=>Yl(e.parent),$root:e=>Yl(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Yn(e),$forceUpdate:e=>e.f||(e.f=()=>{fs(e.update)}),$nextTick:e=>e.n||(e.n=Dn.bind(e.proxy)),$watch:e=>go.bind(e)}),Hl=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),qo={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:l,setupState:n,data:i,props:o,accessCache:r,type:a,appContext:c}=e;if(t[0]!=="$"){const S=r[t];if(S!==void 0)switch(S){case 1:return n[t];case 2:return i[t];case 4:return l[t];case 3:return o[t]}else{if(Hl(n,t))return r[t]=1,n[t];if(i!==te&&Y(i,t))return r[t]=2,i[t];if(Y(o,t))return r[t]=3,o[t];if(l!==te&&Y(l,t))return r[t]=4,l[t];Gl&&(r[t]=0)}}const p=Lt[t];let f,b;if(p)return t==="$attrs"&&pe(e.attrs,"get",""),p(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(l!==te&&Y(l,t))return r[t]=4,l[t];if(b=c.config.globalProperties,Y(b,t))return b[t]},set({_:e},t,l){const{data:n,setupState:i,ctx:o}=e;return Hl(i,t)?(i[t]=l,!0):n!==te&&Y(n,t)?(n[t]=l,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=l,!0)},has({_:{data:e,setupState:t,accessCache:l,ctx:n,appContext:i,props:o,type:r}},a){let c;return!!(l[a]||e!==te&&a[0]!=="$"&&Y(e,a)||Hl(t,a)||Y(o,a)||Y(n,a)||Y(Lt,a)||Y(i.config.globalProperties,a)||(c=r.__cssModules)&&c[a])},defineProperty(e,t,l){return l.get!=null?e._.accessCache[t]=0:Y(l,"value")&&this.set(e,t,l.value,null),Reflect.defineProperty(e,t,l)}};function Ds(e){return R(e)?e.reduce((t,l)=>(t[l]=null,t),{}):e}let Gl=!0;function Io(e){const t=Yn(e),l=e.proxy,n=e.ctx;Gl=!1,t.beforeCreate&&Fs(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:r,watch:a,provide:c,inject:p,created:f,beforeMount:b,mounted:S,beforeUpdate:T,updated:W,activated:F,deactivated:ie,beforeDestroy:J,beforeUnmount:V,destroyed:z,unmounted:O,render:D,renderTracked:x,renderTriggered:A,errorCaptured:I,serverPrefetch:ce,expose:xe,inheritAttrs:dt,components:Qt,directives:el,filters:ql}=t;if(p&&Oo(p,n,null),r)for(const oe in r){const le=r[oe];H(le)&&(n[oe]=le.bind(l))}if(i){const oe=i.call(l,l);Q(oe)&&(e.data=cs(oe))}if(Gl=!0,o)for(const oe in o){const le=o[oe],ft=H(le)?le.bind(l,l):H(le.get)?le.get.bind(l,l):Ke,tl=!H(le)&&H(le.set)?le.set.bind(l):Ke,pt=ot({get:ft,set:tl});Object.defineProperty(n,oe,{enumerable:!0,configurable:!0,get:()=>pt.value,set:Pe=>pt.value=Pe})}if(a)for(const oe in a)Zn(a[oe],n,l,oe);if(c){const oe=H(c)?c.call(l):c;Reflect.ownKeys(oe).forEach(le=>{ho(le,oe[le])})}f&&Fs(f,e,"c");function be(oe,le){R(le)?le.forEach(ft=>oe(ft.bind(l))):le&&oe(le.bind(l))}if(be(ko,b),be(zn,S),be(Co,T),be(So,W),be(_o,F),be(xo,ie),be(Po,I),be(Ao,x),be(jo,A),be(To,V),be(ms,O),be(Mo,ce),R(xe))if(xe.length){const oe=e.exposed||(e.exposed={});xe.forEach(le=>{Object.defineProperty(oe,le,{get:()=>l[le],set:ft=>l[le]=ft,enumerable:!0})})}else e.exposed||(e.exposed={});D&&e.render===Ke&&(e.render=D),dt!=null&&(e.inheritAttrs=dt),Qt&&(e.components=Qt),el&&(e.directives=el),ce&&Bn(e)}function Oo(e,t,l=Ke){R(e)&&(e=Jl(e));for(const n in e){const i=e[n];let o;Q(i)?"default"in i?o=cl(i.from||n,i.default,!0):o=cl(i.from||n):o=cl(i),he(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function Fs(e,t,l){Oe(R(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,l)}function Zn(e,t,l,n){let i=n.includes(".")?Kn(l,n):()=>l[n];if(ae(e)){const o=t[e];H(o)&&Ct(i,o)}else if(H(e))Ct(i,e.bind(l));else if(Q(e))if(R(e))e.forEach(o=>Zn(o,t,l,n));else{const o=H(e.handler)?e.handler.bind(l):t[e.handler];H(o)&&Ct(i,o,e)}}function Yn(e){const t=e.type,{mixins:l,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let c;return a?c=a:!i.length&&!l&&!n?c=t:(c={},i.length&&i.forEach(p=>bl(c,p,r,!0)),bl(c,t,r)),Q(t)&&o.set(t,c),c}function bl(e,t,l,n=!1){const{mixins:i,extends:o}=t;o&&bl(e,o,l,!0),i&&i.forEach(r=>bl(e,r,l,!0));for(const r in t)if(!(n&&r==="expose")){const a=Eo[r]||l&&l[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Eo={data:Ns,props:Hs,emits:Hs,methods:Ot,computed:Ot,beforeCreate:ge,created:ge,beforeMount:ge,mounted:ge,beforeUpdate:ge,updated:ge,beforeDestroy:ge,beforeUnmount:ge,destroyed:ge,unmounted:ge,activated:ge,deactivated:ge,errorCaptured:ge,serverPrefetch:ge,components:Ot,directives:Ot,watch:Do,provide:Ns,inject:Ro};function Ns(e,t){return t?e?function(){return me(H(e)?e.call(this,this):e,H(t)?t.call(this,this):t)}:t:e}function Ro(e,t){return Ot(Jl(e),Jl(t))}function Jl(e){if(R(e)){const t={};for(let l=0;lt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${qe(t)}Modifiers`]||e[`${_t(t)}Modifiers`];function Lo(e,t,...l){if(e.isUnmounted)return;const n=e.vnode.props||te;let i=l;const o=t.startsWith("update:"),r=o&&Ho(n,t.slice(7));r&&(r.trim&&(i=l.map(f=>ae(f)?f.trim():f)),r.number&&(i=i.map(mn)));let a,c=n[a=Ol(t)]||n[a=Ol(qe(t))];!c&&o&&(c=n[a=Ol(_t(t))]),c&&Oe(c,e,6,i);const p=n[a+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Oe(p,e,6,i)}}const Vo=new WeakMap;function Jn(e,t,l=!1){const n=l?Vo:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},a=!1;if(!H(e)){const c=p=>{const f=Jn(p,t,!0);f&&(a=!0,me(r,f))};!l&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!a?(Q(e)&&n.set(e,null),null):(R(o)?o.forEach(c=>r[c]=null):me(r,o),Q(e)&&n.set(e,r),r)}function Al(e,t){return!e||!xl(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,_t(t))||Y(e,t))}function Ls(e){const{type:t,vnode:l,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:a,emit:c,render:p,renderCache:f,props:b,data:S,setupState:T,ctx:W,inheritAttrs:F}=e,ie=hl(e);let J,V;try{if(l.shapeFlag&4){const O=i||n,D=O;J=Le(p.call(D,O,f,b,T,S,W)),V=a}else{const O=t;J=Le(O.length>1?O(b,{attrs:a,slots:r,emit:c}):O(b,null)),V=t.props?a:Ko(a)}}catch(O){yt.length=0,Tl(O,e,1),J=L(lt)}let z=J;if(V&&F!==!1){const O=Object.keys(V),{shapeFlag:D}=z;O.length&&D&7&&(o&&O.some(wl)&&(V=Uo(V,o)),z=Mt(z,V,!1,!0))}if(l.dirs&&(z=Mt(z,null,!1,!0),z.dirs=z.dirs?z.dirs.concat(l.dirs):l.dirs),l.transition){const O=Ml(z.type)&&Un(z)||z;ps(O,l.transition)}return J=z,hl(ie),J}const Ko=e=>{let t;for(const l in e)(l==="class"||l==="style"||xl(l))&&((t||(t={}))[l]=e[l]);return t},Uo=(e,t)=>{const l={};for(const n in e)(!wl(n)||!(n.slice(9)in t))&&(l[n]=e[n]);return l};function Bo(e,t,l){const{props:n,children:i,component:o}=e,{props:r,children:a,patchFlag:c}=t,p=o.emitsOptions;if(t.dirs||t.transition)return!0;if(l&&c>=0){if(c&1024)return!0;if(c&16)return n?Vs(n,r,p):!!r;if(c&8){const f=t.dynamicProps;for(let b=0;bObject.create(Qn),ti=e=>Object.getPrototypeOf(e)===Qn;function zo(e,t,l,n=!1){const i={},o=ei();e.propsDefaults=Object.create(null),li(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);l?e.props=n?i:to(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Zo(e,t,l,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,a=Z(i),[c]=e.propsOptions;let p=!1;if((n||r>0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let b=0;b{c=!0;const[S,T]=si(b,t,!0);me(r,S),T&&a.push(...T)};!l&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Q(e)&&n.set(e,gt),gt;if(R(o))for(let f=0;fe==="_"||e==="_ctx"||e==="$stable",gs=e=>R(e)?e.map(Le):[Le(e)],Go=(e,t,l)=>{if(t._n)return t;const n=po((...i)=>gs(t(...i)),l);return n._c=!1,n},ni=(e,t,l)=>{const n=e._ctx;for(const i in e){if(bs(i))continue;const o=e[i];if(H(o))t[i]=Go(i,o,n);else if(o!=null){const r=gs(o);t[i]=()=>r}}},ii=(e,t)=>{const l=gs(t);e.slots.default=()=>l},oi=(e,t,l)=>{for(const n in t)(l||!bs(n))&&(e[n]=t[n])},Jo=(e,t,l)=>{const n=e.slots=ei();if(e.vnode.shapeFlag&32){const i=t._;i?(oi(n,t,l),l&&hn(n,"_",i,!0)):ni(t,n)}else t&&ii(e,t)},Xo=(e,t,l)=>{const{vnode:n,slots:i}=e;let o=!0,r=te;if(n.shapeFlag&32){const a=t._;a?l&&a===1?o=!1:oi(i,t,l):(o=!t.$stable,ni(t,i)),r=t}else t&&(ii(e,t),r={default:1});if(o)for(const a in i)!bs(a)&&r[a]==null&&delete i[a]},_e=sa;function Qo(e){return ea(e)}function ea(e,t){const l=Cl();l.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:a,createComment:c,setText:p,setElementText:f,parentNode:b,nextSibling:S,setScopeId:T=Ke,insertStaticContent:W}=e,F=(u,d,m,_=null,g=null,y=null,C=void 0,k=null,w=!!d.dynamicChildren)=>{if(u===d)return;u&&!qt(u,d)&&(_=ll(u),Pe(u,g,y,!0),u=null),d.patchFlag===-2&&(w=!1,d.dynamicChildren=null),d.dynamicChildren&&u&&u.dynamicChildren&&u.dynamicChildren.hasOnce&&(d.dynamicChildren===gt&&(d.dynamicChildren=[]),d.dynamicChildren.hasOnce=!0);const{type:v,ref:E,shapeFlag:M}=d;switch(v){case Pl:ie(u,d,m,_);break;case lt:J(u,d,m,_);break;case ul:u==null&&V(d,m,_,C);break;case G:Qt(u,d,m,_,g,y,C,k,w);break;default:M&1?D(u,d,m,_,g,y,C,k,w):M&6?el(u,d,m,_,g,y,C,k,w):(M&64||M&128)&&v.process(u,d,m,_,g,y,C,k,w,At)}E!=null&&g?Nt(E,u&&u.ref,y,d||u,!d):E==null&&u&&u.ref!=null&&Nt(u.ref,null,y,u,!0)},ie=(u,d,m,_)=>{if(u==null)n(d.el=a(d.children),m,_);else{const g=d.el=u.el;d.children!==u.children&&p(g,d.children)}},J=(u,d,m,_)=>{u==null?n(d.el=c(d.children||""),m,_):d.el=u.el},V=(u,d,m,_)=>{[u.el,u.anchor]=W(u.children,d,m,_,u.el,u.anchor)},z=({el:u,anchor:d},m,_)=>{let g;for(;u&&u!==d;)g=S(u),n(u,m,_),u=g;n(d,m,_)},O=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=S(u),i(u),u=m;i(d)},D=(u,d,m,_,g,y,C,k,w)=>{if(d.type==="svg"?C="svg":d.type==="math"&&(C="mathml"),u==null)x(d,m,_,g,y,C,k,w);else{const v=u.el&&u.el._isVueCE?u.el:null;try{v&&v._beginPatch(),ce(u,d,g,y,C,k,w)}finally{v&&v._endPatch()}}},x=(u,d,m,_,g,y,C,k)=>{let w,v;const{props:E,shapeFlag:M,transition:q,dirs:N}=u;if(w=u.el=r(u.type,y,E&&E.is,E),M&8?f(w,u.children):M&16&&I(u.children,w,null,_,g,Ll(u,y),C,k),N&&ht(u,null,_,"created"),A(w,u,u.scopeId,C,_),E){for(const ee in E)ee!=="value"&&!Rt(ee)&&o(w,ee,null,E[ee],y,_);"value"in E&&o(w,"value",null,E.value,y),(v=E.onVnodeBeforeMount)&&Fe(v,_,u)}N&&ht(u,null,_,"beforeMount");const K=ta(g,q);K&&q.beforeEnter(w),n(w,d,m),((v=E&&E.onVnodeMounted)||K||N)&&_e(()=>{v&&Fe(v,_,u),K&&q.enter(w),N&&ht(u,null,_,"mounted")},g)},A=(u,d,m,_,g)=>{if(m&&T(u,m),_)for(let y=0;y<_.length;y++)T(u,_[y]);if(g){let y=g.subTree;if(d===y||ui(y.type)&&(y.ssContent===d||y.ssFallback===d)){const C=g.vnode;A(u,C,C.scopeId,C.slotScopeIds,g.parent)}}},I=(u,d,m,_,g,y,C,k,w=0)=>{for(let v=w;v{const k=d.el=u.el;let{patchFlag:w,dynamicChildren:v,dirs:E}=d;w|=u.patchFlag&16;const M=u.props||te,q=d.props||te;let N;if(m&&mt(m,!1),(N=q.onVnodeBeforeUpdate)&&Fe(N,m,d,u),E&&ht(d,u,m,"beforeUpdate"),m&&mt(m,!0),v&&(!u.dynamicChildren||u.dynamicChildren.length!==v.length)&&(w=0,C=!1,v=null),(M.innerHTML&&q.innerHTML==null||M.textContent&&q.textContent==null)&&f(k,""),v?xe(u.dynamicChildren,v,k,m,_,Ll(d,g),y):C||le(u,d,k,null,m,_,Ll(d,g),y,!1),w>0){if(w&16)dt(k,M,q,m,g);else if(w&2&&M.class!==q.class&&o(k,"class",null,q.class,g),w&4&&o(k,"style",M.style,q.style,g),w&8){const K=d.dynamicProps;for(let ee=0;ee{N&&Fe(N,m,d,u),E&&ht(d,u,m,"updated")},_)},xe=(u,d,m,_,g,y,C)=>{for(let k=0;k{if(d!==m){if(d!==te)for(const y in d)!Rt(y)&&!(y in m)&&o(u,y,d[y],null,g,_);for(const y in m){if(Rt(y))continue;const C=m[y],k=d[y];C!==k&&y!=="value"&&o(u,y,k,C,g,_)}"value"in m&&o(u,"value",d.value,m.value,g)}},Qt=(u,d,m,_,g,y,C,k,w)=>{const v=d.el=u?u.el:a(""),E=d.anchor=u?u.anchor:a("");let{patchFlag:M,dynamicChildren:q,slotScopeIds:N}=d;N&&(k=k?k.concat(N):N),u==null?(n(v,m,_),n(E,m,_),I(d.children||[],m,E,g,y,C,k,w)):M>0&&M&64&&q&&u.dynamicChildren&&u.dynamicChildren.length===q.length?(xe(u.dynamicChildren,q,m,g,y,C,k),(d.key!=null||g&&d===g.subTree)&&ai(u,d,!0)):le(u,d,m,E,g,y,C,k,w)},el=(u,d,m,_,g,y,C,k,w)=>{d.slotScopeIds=k,u==null?d.shapeFlag&512?g.ctx.activate(d,m,_,C,w):ql(d,m,_,g,y,C,w):ws(u,d,w)},ql=(u,d,m,_,g,y,C)=>{const k=u.component=ra(u,_,g);if(hs(u)&&(k.ctx.renderer=At),ua(k,!1,C),k.asyncDep){if(g&&g.registerDep(k,be,C),!u.el){const w=k.subTree=L(lt);J(null,w,d,m),u.placeholder=w.el}}else be(k,u,d,m,g,y,C)},ws=(u,d,m)=>{const _=d.component=u.component;if(Bo(u,d,m))if(_.asyncDep&&!_.asyncResolved){d.el=u.el,oe(_,d,m);return}else _.next=d,_.update();else d.el=u.el,_.vnode=d},be=(u,d,m,_,g,y,C)=>{const k=()=>{if(u.isMounted){let{next:M,bu:q,u:N,parent:K,vnode:ee}=u;{const Re=ri(u);if(Re){M&&(M.el=ee.el,oe(u,M,C)),Re.asyncDep.then(()=>{_e(()=>{u.isUnmounted||v()},g)});return}}let X=M,re;mt(u,!1),M?(M.el=ee.el,oe(u,M,C)):M=ee,q&&rl(q),(re=M.props&&M.props.onVnodeBeforeUpdate)&&Fe(re,K,M,ee),mt(u,!0);const ue=Ls(u),Ee=u.subTree;u.subTree=ue,F(Ee,ue,b(Ee.el),ll(Ee),u,g,y),M.el=ue.el,X===null&&Wo(u,ue.el),N&&_e(N,g),(re=M.props&&M.props.onVnodeUpdated)&&_e(()=>Fe(re,K,M,ee),g)}else{let M;const{el:q,props:N}=d,{bm:K,m:ee,parent:X,root:re,type:ue}=u,Ee=Ht(d);mt(u,!1),K&&rl(K),!Ee&&(M=N&&N.onVnodeBeforeMount)&&Fe(M,X,d),mt(u,!0);{re.ce&&re.ce._hasShadowRoot()&&re.ce._injectChildStyle(ue,u.parent?u.parent.type:void 0);const Re=u.subTree=Ls(u);F(null,Re,m,_,u,g,y),d.el=Re.el}if(ee&&_e(ee,g),!Ee&&(M=N&&N.onVnodeMounted)){const Re=d;_e(()=>Fe(M,X,Re),g)}(d.shapeFlag&256||X&&Ht(X.vnode)&&X.vnode.shapeFlag&256)&&u.a&&_e(u.a,g),u.isMounted=!0,d=m=_=null}};u.scope.on();const w=u.effect=new yn(k);u.scope.off();const v=u.update=w.run.bind(w),E=u.job=w.runIfDirty.bind(w);E.i=u,E.id=u.uid,w.scheduler=()=>fs(E),mt(u,!0),v()},oe=(u,d,m)=>{d.component=u;const _=u.vnode.props;u.vnode=d,u.next=null,Zo(u,d.props,_,m),Xo(u,d.children,m),et(),Os(u),tt()},le=(u,d,m,_,g,y,C,k,w=!1)=>{const v=u&&u.children,E=u?u.shapeFlag:0,M=d.children,{patchFlag:q,shapeFlag:N}=d;if(q>0){if(q&128){tl(v,M,m,_,g,y,C,k,w);return}else if(q&256){ft(v,M,m,_,g,y,C,k,w);return}}N&8?(E&16&&jt(v,g,y),M!==v&&f(m,M)):E&16?N&16?tl(v,M,m,_,g,y,C,k,w):jt(v,g,y,!0):(E&8&&f(m,""),N&16&&I(M,m,_,g,y,C,k,w))},ft=(u,d,m,_,g,y,C,k,w)=>{u=u||gt,d=d||gt;const v=u.length,E=d.length,M=Math.min(v,E);let q;for(q=0;qE?jt(u,g,y,!0,!1,M):I(d,m,_,g,y,C,k,w,M)},tl=(u,d,m,_,g,y,C,k,w)=>{let v=0;const E=d.length;let M=u.length-1,q=E-1;for(;v<=M&&v<=q;){const N=u[v],K=d[v]=w?Ze(d[v]):Le(d[v]);if(qt(N,K))F(N,K,m,null,g,y,C,k,w);else break;v++}for(;v<=M&&v<=q;){const N=u[M],K=d[q]=w?Ze(d[q]):Le(d[q]);if(qt(N,K))F(N,K,m,null,g,y,C,k,w);else break;M--,q--}if(v>M){if(v<=q){const N=q+1,K=Nq)for(;v<=M;)Pe(u[v],g,y,!0),v++;else{const N=v,K=v,ee=new Map;for(v=K;v<=q;v++){const we=d[v]=w?Ze(d[v]):Le(d[v]);we.key!=null&&ee.set(we.key,v)}let X,re=0;const ue=q-K+1;let Ee=!1,Re=0;const Pt=new Array(ue);for(v=0;v=ue){Pe(we,g,y,!0);continue}let De;if(we.key!=null)De=ee.get(we.key);else for(X=K;X<=q;X++)if(Pt[X-K]===0&&qt(we,d[X])){De=X;break}De===void 0?Pe(we,g,y,!0):(Pt[De-K]=v+1,De>=Re?Re=De:Ee=!0,F(we,d[De],m,null,g,y,C,k,w),re++)}const Ss=Ee?la(Pt):gt;for(X=Ss.length-1,v=ue-1;v>=0;v--){const we=K+v,De=d[we],Ts=d[we+1],Ms=we+1{const{el:y,type:C,transition:k,children:w,shapeFlag:v}=u;if(v&6){pt(u.component.subTree,d,m,_);return}if(v&128){u.suspense.move(d,m,_);return}if(v&64){C.move(u,d,m,At);return}if(C===G){n(y,d,m);for(let M=0;Mk.enter(y),g));else{const{leave:M,delayLeave:q,afterLeave:N}=k,K=()=>{u.ctx.isUnmounted?i(y):n(y,d,m)},ee=()=>{const X=y._isLeaving||!!y[Nl];y._isLeaving&&y[Nl](!0),k.persisted&&!X?K():M(y,()=>{K(),N&&N()})};q?q(y,K,ee):ee()}else n(y,d,m)},Pe=(u,d,m,_=!1,g=!1)=>{const{type:y,props:C,ref:k,children:w,dynamicChildren:v,shapeFlag:E,patchFlag:M,dirs:q,cacheIndex:N,memo:K}=u;if((M===-2||v&&v.hasOnce)&&(g=!1),k!=null&&(et(),Nt(k,null,m,u,!0),tt()),N!=null&&(!u.ctx||u.ctx===d)&&(d.renderCache[N]=void 0),E&256){d.ctx.deactivate(u);return}const ee=E&1&&q,X=!Ht(u);let re;if(X&&(re=C&&C.onVnodeBeforeUnmount)&&Fe(re,d,u),E&6)ki(u.component,m,_);else{if(E&128){u.suspense.unmount(m,_);return}ee&&ht(u,null,d,"beforeUnmount"),E&64?u.type.remove(u,d,m,At,_):v&&!v.hasOnce&&(y!==G||M>0&&M&64)?jt(v,d,m,!1,!0):(y===G&&M&384||!g&&E&16)&&jt(w,d,m),_&&ks(u)}const ue=K!=null&&N==null;(X&&(re=C&&C.onVnodeUnmounted)||ee||ue)&&_e(()=>{re&&Fe(re,d,u),ee&&ht(u,null,d,"unmounted"),ue&&(u.el=null)},m)},ks=u=>{const{type:d,el:m,anchor:_,transition:g}=u;if(d===G){wi(m,_);return}if(d===ul){O(u),g&&!g.persisted&&g.afterLeave&&g.afterLeave();return}const y=()=>{i(m),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(u.shapeFlag&1&&g&&!g.persisted){const{leave:C,delayLeave:k}=g,w=()=>C(m,y);k?k(u.el,y,w):w()}else y()},wi=(u,d)=>{let m;for(;u!==d;)m=S(u),i(u),u=m;i(d)},ki=(u,d,m)=>{const{bum:_,scope:g,job:y,subTree:C,um:k,m:w,a:v}=u;Us(w),Us(v),_&&rl(_),g.stop(),y?(y.flags|=8,Pe(C,u,d,m)):u.vnode.el&&C&&(C.transition=u.vnode.transition,Pe(C,u,d,m)),k&&_e(k,d),_e(()=>{u.isUnmounted=!0},d)},jt=(u,d,m,_=!1,g=!1,y=0)=>{for(let C=y;C{if(u.shapeFlag&6)return ll(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=S(u.anchor||u.el),m=d&&d[vo];return m?S(m):d};let Il=!1;const Cs=(u,d,m)=>{let _;u==null?d._vnode&&(Pe(d._vnode,null,null,!0),_=d._vnode.component):F(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Il||(Il=!0,Os(_),Nn(),Il=!1)},At={p:F,um:Pe,m:pt,r:ks,mt:ql,mc:I,pc:le,pbc:xe,n:ll,o:e};return{render:Cs,hydrate:void 0,createApp:No(Cs)}}function Ll({type:e,props:t},l){return l==="svg"&&e==="foreignObject"||l==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:l}function mt({effect:e,job:t},l){l?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ta(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ai(e,t,l=!1){const n=e.children,i=t.children;if(R(n)&&R(i))for(let o=0;o>1,e[l[a]]0&&(t[n]=l[o-1]),l[o]=n)}}for(o=l.length,r=l[o-1];o-- >0;)l[o]=r,r=t[r];return l}function ri(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ri(t)}function Us(e){if(e)for(let t=0;te.__isSuspense;function sa(e,t){t&&t.pendingBranch?R(e)?t.effects.push(...e):t.effects.push(e):fo(e)}const G=Symbol.for("v-fgt"),Pl=Symbol.for("v-txt"),lt=Symbol.for("v-cmt"),ul=Symbol.for("v-stc"),yt=[];let Ce=null;function P(e=!1){yt.push(Ce=e?null:[])}function di(){yt.pop(),Ce=yt[yt.length-1]||null}let Bt=1;function Bs(e,t=!1){Bt+=e,e<0&&Ce&&t&&(Ce.hasOnce=!0)}function fi(e){return e.dynamicChildren=Bt>0?Ce||gt:null,di(),Bt>0&&Ce&&Ce.push(e),e}function $(e,t,l,n,i,o){return fi(s(e,t,l,n,i,o,!0))}function vs(e,t,l,n,i){return fi(L(e,t,l,n,i,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function qt(e,t){return e.type===t.type&&e.key===t.key}const hi=({key:e})=>e??null,dl=({ref:e,ref_key:t,ref_for:l})=>(typeof e=="number"&&(e=""+e),e!=null?ae(e)||he(e)||H(e)?{i:Me,r:e,k:t,f:!!l}:e:null);function s(e,t=null,l=null,n=0,i=null,o=e===G?0:1,r=!1,a=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&hi(t),ref:t&&dl(t),scopeId:Ln,slotScopeIds:null,children:l,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:o,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Me};return a?(gl(c,l),o&128&&e.normalize(c)):l&&(c.shapeFlag|=ae(l)?8:16),Bt>0&&!r&&Ce&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Ce.push(c),c}const L=na;function na(e,t=null,l=null,n=0,i=null,o=!1){if((!e||e===$o)&&(e=lt),pi(e)){const a=Mt(e,t,!0);return l&&gl(a,l),Bt>0&&!o&&Ce&&(a.shapeFlag&6?Ce[Ce.indexOf(e)]=a:Ce.push(a)),a.patchFlag=-2,a}if(ha(e)&&(e=e.__vccOpts),t){t=ia(t);let{class:a,style:c}=t;a&&!ae(a)&&(t.class=ct(a)),Q(c)&&(ds(c)&&!R(c)&&(c=me({},c)),t.style=Gt(c))}const r=ae(e)?1:ui(e)?128:Ml(e)?64:Q(e)?4:H(e)?2:0;return s(e,t,l,n,i,r,o,!0)}function ia(e){return e?ds(e)||ti(e)?me({},e):e:null}function Mt(e,t,l=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:a,transition:c}=e,p=t?mi(i||{},t):i,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:p,key:p&&hi(p),ref:t&&t.ref?l&&o?R(o)?o.concat(dl(t)):[o,dl(t)]:dl(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==G?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Mt(e.ssContent),ssFallback:e.ssFallback&&Mt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&n&&ps(f,c.clone(f)),f}function h(e=" ",t=0){return L(Pl,null,e,t)}function ke(e,t){const l=L(ul,null,e);return l.staticCount=t,l}function B(e="",t=!1){return t?(P(),vs(lt,null,e)):L(lt,null,e)}function Le(e){return e==null||typeof e=="boolean"?L(lt):R(e)?L(G,null,e.slice()):pi(e)?Ze(e):L(Pl,null,String(e))}function Ze(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Mt(e)}function gl(e,t){let l=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(R(t))l=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),gl(e,i()),i._c&&(i._d=!0));return}else{l=32;const i=t._;!i&&!ti(t)?t._ctx=Me:i===3&&Me&&(Me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(H(t)){if(n&65){gl(e,{default:t});return}t={default:t,_ctx:Me},l=32}else t=String(t),n&64?(l=16,t=[h(t)]):l=8;e.children=t,e.shapeFlag|=l}function mi(...e){const t={};for(let l=0;lye||Me;let vl,Wt;{const e=Cl(),t=(l,n)=>{let i;return(i=e[l])||(i=e[l]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};vl=t("__VUE_INSTANCE_SETTERS__",l=>ye=l),Wt=t("__VUE_SSR_SETTERS__",l=>zt=l)}const Xt=e=>{const t=ye;return vl(e),e.scope.on(),()=>{e.scope.off(),vl(t)}},Ws=()=>{ye&&ye.scope.off(),vl(null)};function bi(e){return e.vnode.shapeFlag&4}let zt=!1;function ua(e,t=!1,l=!1){t&&Wt(t);const{props:n,children:i}=e.vnode,o=bi(e);zo(e,n,o,t),Jo(e,i,l||t);const r=o?da(e,t):void 0;return t&&Wt(!1),r}function da(e,t){const l=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,qo);const{setup:n}=l;if(n){et();const i=e.setupContext=n.length>1?pa(e):null,o=Xt(e),r=Jt(n,e,0,[e.props,i]),a=un(r);if(tt(),o(),(a||e.sp)&&!Ht(e)&&Bn(e),a){if(r.then(Ws,Ws),t)return r.then(c=>{Wt(!0);try{zs(e,c,t)}finally{Wt(!1)}}).catch(c=>{Tl(c,e,0)});e.asyncDep=r}else zs(e,r)}else gi(e)}function zs(e,t,l){H(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=En(t)),gi(e)}function gi(e,t,l){const n=e.type;e.render||(e.render=n.render||Ke);{const i=Xt(e);et();try{Io(e)}finally{tt(),i()}}}const fa={get(e,t){return pe(e,"get",""),e[t]}};function pa(e){const t=l=>{e.exposed=l||{}};return{attrs:new Proxy(e.attrs,fa),slots:e.slots,emit:e.emit,expose:t}}function $l(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(En(lo(e.exposed)),{get(t,l){if(l in t)return t[l];if(l in Lt)return Lt[l](e)},has(t,l){return l in t||l in Lt}})):e.proxy}function ha(e){return H(e)&&"__vccOpts"in e}const ot=(e,t)=>oo(e,t,zt),ma="3.5.43";let Ql;const Zs=typeof window<"u"&&window.trustedTypes;if(Zs)try{Ql=Zs.createPolicy("vue",{createHTML:e=>e})}catch{}const vi=Ql?e=>Ql.createHTML(e):e=>e,ba="http://www.w3.org/2000/svg",ga="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Ys=ze&&ze.createElement("template"),va={insert:(e,t,l)=>{t.insertBefore(e,l||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,l,n)=>{const i=t==="svg"?ze.createElementNS(ba,e):t==="mathml"?ze.createElementNS(ga,e):l?ze.createElement(e,{is:l}):ze.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,l,n,i,o){const r=l?l.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),l),!(i===o||!(i=i.nextSibling)););else{Ys.innerHTML=vi(n==="svg"?`${e} `:n==="mathml"?`${e} `:e);const a=Ys.content;if(n==="svg"||n==="mathml"){const c=a.firstChild;for(;c.firstChild;)a.appendChild(c.firstChild);a.removeChild(c)}t.insertBefore(a,l)}return[r?r.nextSibling:t.firstChild,l?l.previousSibling:t.lastChild]}},ya=Symbol("_vtc");function _a(e,t,l){const n=e[ya];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):l?e.setAttribute("class",t):e.className=t}const yl=Symbol("_vod"),yi=Symbol("_vsh"),ol={name:"show",beforeMount(e,{value:t},{transition:l}){e[yl]=e.style.display==="none"?"":e.style.display,l&&t?l.beforeEnter(e):It(e,t)},mounted(e,{value:t},{transition:l}){l&&t&&l.enter(e)},updated(e,{value:t,oldValue:l},{transition:n}){!t!=!l&&(n?t?(n.beforeEnter(e),It(e,!0),n.enter(e)):n.leave(e,()=>{It(e,!1)}):It(e,t))},beforeUnmount(e,{value:t}){It(e,t)}};function It(e,t){e.style.display=t?e[yl]:"none",e[yi]=!t}const xa=Symbol(""),wa=/(?:^|;)\s*display\s*:/;function ka(e,t,l){const n=e.style,i=ae(l);let o=!1;if(l&&!i){if(t)if(ae(t))for(const r of t.split(";")){const a=r.slice(0,r.indexOf(":")).trim();l[a]==null&&Et(n,a,"")}else for(const r in t)l[r]==null&&Et(n,r,"");for(const r in l){r==="display"&&(o=!0);const a=l[r];a!=null?Sa(e,r,!ae(t)&&t?t[r]:void 0,a)||Et(n,r,a):Et(n,r,"")}}else if(i){if(t!==l){const r=n[xa];r&&(l+=";"+r),n.cssText=l,o=wa.test(l)}}else t&&e.removeAttribute("style");yl in e&&(e[yl]=o?n.display:"",e[yi]&&(n.display="none"))}const al=/\s*!important$/;function Et(e,t,l){if(R(l))l.forEach(n=>Et(e,t,n));else if(l==null&&(l=""),t.startsWith("--"))al.test(l)?e.setProperty(t,l.replace(al,""),"important"):e.setProperty(t,l);else{const n=Ca(e,t);al.test(l)?e.setProperty(_t(n),l.replace(al,""),"important"):e[n]=l}}const Gs=["Webkit","Moz","ms"],Vl={};function Ca(e,t){const l=Vl[t];if(l)return l;let n=qe(t);if(n!=="filter"&&n in e)return Vl[t]=n;n=pn(n);for(let i=0;iKl||($a.then(()=>Kl=0),Kl=Date.now());function Ia(e,t){const l=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=l.attached)return;const i=l.value;if(R(i)){const o=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{o.call(n),n._stopped=!0};const r=i.slice(),a=[n];for(let c=0;ce.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Oa=(e,t,l,n,i,o)=>{const r=i==="svg";t==="class"?_a(e,n,r):t==="style"?ka(e,l,n):xl(t)?wl(t)||Ma(e,t,l,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ea(e,t,n,r))?(Qs(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Xs(e,t,n,r,o,t!=="value")):e._isVueCE&&(Ra(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(n)))?Qs(e,qe(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Xs(e,t,n,r))};function Ea(e,t,l,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&tn(t)&&H(l));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 i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return tn(t)&&ae(l)?!1:t in e}function Ra(e,t){const l=e._def.props;if(!l)return!1;const n=qe(t);return Array.isArray(l)?l.some(i=>qe(i)===n):Object.keys(l).some(i=>qe(i)===n)}const _l=e=>{const t=e.props["onUpdate:modelValue"]||!1;return R(t)?l=>rl(t,l):t},Tt=Symbol("_assign"),ln={deep:!0,created(e,t,l){e[Tt]=_l(l),ys(e,"change",()=>{const n=e._modelValue,i=Zt(e),o=e.checked,r=e[Tt];if(R(n)){const a=ss(n,i),c=a!==-1;if(o&&!c)r(n.concat(i));else if(!o&&c){const p=[...n];p.splice(a,1),r(p)}}else if(Xe(n)){const a=new Set(n);o?a.add(i):a.delete(i),r(a)}else r(_i(e,o))})},mounted:sn,beforeUpdate(e,t,l){e[Tt]=_l(l),sn(e,t,l)}};function sn(e,{value:t,oldValue:l},n){e._modelValue=t;let i;if(R(t))i=ss(t,n.props.value)>-1;else if(Xe(t))i=t.has(n.props.value);else{if(t===l)return;i=Qe(t,_i(e,!0))}e.checked!==i&&(e.checked=i)}const nn={deep:!0,created(e,{value:t,modifiers:{number:l}},n){e._modelValue=t,ys(e,"change",()=>{const i=Array.prototype.filter.call(e.options,c=>c.selected).map(c=>l?mn(Zt(c)):Zt(c)),o=e.multiple,r=o?Xe(e._modelValue)?new Set(i):i:i[0],a=e._pendingValue=[o,o?R(r)?i.slice():i:r];try{e[Tt](r)}finally{Dn(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[Tt]=_l(n)},mounted(e,{value:t}){on(e,t)},beforeUpdate(e,{value:t},l){e._modelValue=t,e[Tt]=_l(l)},updated(e,{value:t}){const l=e._pendingValue;e._pendingValue=void 0,(!l||l[0]!==e.multiple||!Da(t,l[1],l[0]))&&on(e,t)}};function Da(e,t,l){if(!l||R(e))return Qe(e,t);if(Xe(e)){if(e.size!==t.length)return!1;for(const n of t)if(!e.has(n))return!1;return!0}return!1}function on(e,t){const l=e.multiple,n=R(t);if(!(l&&!n&&!Xe(t))){for(let i=0,o=e.options.length;iString(p)===String(a)):r.selected=ss(t,a)>-1}else r.selected=t.has(a);else if(Qe(Zt(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!l&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Zt(e){return"_value"in e?e._value:e.value}function _i(e,t){const l=t?"_trueValue":"_falseValue";return l in e?e[l]:t}const Fa=["ctrl","shift","alt","meta"],Na={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)=>Fa.some(l=>e[`${l}Key`]&&!t.includes(l))},Ha=(e,t)=>{if(!e)return e;const l=e._withMods||(e._withMods={}),n=t.join(".");return l[n]||(l[n]=((i,...o)=>{for(let r=0;r{const t=Va().createApp(...e),{mount:l}=t;return t.mount=n=>{const i=Ba(n);if(!i)return;const o=t._component;!H(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=l(i,!1,Ua(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function Ua(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ba(e){return ae(e)?document.querySelector(e):e}const Wa={class:"app-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.65","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},za=["d"],fe={__name:"AppIcon",props:{name:{type:String,default:"grid"}},setup(e){const t={home:"m3 10 9-7 9 7v10H3Z M9 20v-7h6v7",journal:"M5 3h14v18H5Z M8 7h8 M8 11h8 M8 15h5",grid:"M3 3h7v7H3Z M14 3h7v7h-7Z M3 14h7v7H3Z M14 14h7v7h-7Z",devices:"M3 4h18v12H3Z M8 20h8 M12 16v4",tree:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",users:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M22 21v-2a4 4 0 0 0-3-3.8 M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8 M17 3a4 4 0 0 1 0 8",settings:"M9 3h6l1 4 4 1v8l-4 1-1 4H9l-1-4-4-1V8l4-1Z M15 12a3 3 0 1 0-6 0 3 3 0 0 0 6 0",database:"M3 6c0-5 18-5 18 0s-18 5-18 0V18c0 5 18 5 18 0V6 M3 12c0 5 18 5 18 0",network:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",arrow:"M5 12h14 M14 7l5 5-5 5",router:"M3 13h18v8H3Z M6 13V5 M18 13V5 M7 17h.01 M11 17h.01 M15 17h3",camera:"M3 6h12v12H3Z M15 10l6-4v12l-6-4"};return(l,n)=>(P(),$("svg",Wa,[s("path",{d:t[e.name]||t.grid},null,8,za)]))}},Za={class:"sidebar"},Ya={class:"nav flex-column",id:"main-navigation","aria-label":"主导航"},Ga={"data-page":"households",class:"active"},Ja={id:"scope-navigation",hidden:""},Xa={"data-page":"journal"},Qa={"data-page":"overview"},er={"data-page":"objects"},tr={"data-page":"heritage"},lr={"data-page":"users","data-admin":""},sr={"data-page":"settings"},nr={"data-page":"storage"},ir={__name:"AppSidebar",setup(e){return(t,l)=>(P(),$("aside",Za,[l[17]||(l[17]=ke('赵府 智能数字管家 ☰ 菜单 家宅 · 起居
',3)),s("nav",Ya,[s("button",Ga,[L(fe,{name:"home"}),l[0]||(l[0]=h()),l[1]||(l[1]=s("span",null,"我的家庭与场所",-1))]),s("div",Ja,[l[12]||(l[12]=s("div",{id:"scope-nav-name",class:"nav-label"},null,-1)),s("button",Xa,[L(fe,{name:"journal"}),l[2]||(l[2]=h()),l[3]||(l[3]=s("span",null,"记事与阅历",-1))]),s("button",Qa,[L(fe,{name:"grid"}),l[4]||(l[4]=h()),l[5]||(l[5]=s("span",null,"场所总览",-1))]),s("button",er,[L(fe,{name:"devices"}),l[6]||(l[6]=h()),l[7]||(l[7]=s("span",null,"区域与设备",-1))]),s("button",tr,[L(fe,{name:"tree"}),l[8]||(l[8]=h()),l[9]||(l[9]=s("span",null,"家庭传承",-1))]),s("button",lr,[L(fe,{name:"users"}),l[10]||(l[10]=h()),l[11]||(l[11]=s("span",null,"成员与权限",-1))])]),s("button",sr,[L(fe,{name:"settings"}),l[13]||(l[13]=h()),l[14]||(l[14]=s("span",null,"设置中心",-1))]),s("button",nr,[L(fe,{name:"database"}),l[15]||(l[15]=h()),l[16]||(l[16]=s("span",null,"平台存储与审计",-1))])]),l[18]||(l[18]=ke(' 独立部署 · 数据自有
按空间组织画面 让每一段记录有处可寻
修改我的密码 退出登录 ',4))]))}},xi=(e,t)=>{const l=e.__vccOpts||e;for(const[n,i]of t)l[n]=i;return l},or={};function ar(e,t){return P(),$("header",null,[...t[0]||(t[0]=[ke('赵氏家宅 · 起居有序
我的家庭与场所 从一个空间,看到每一个位置。
',2)])])}const rr=xi(or,[["render",ar]]),ne=In({state:{households:[],sites:[],cameras:[]},admin:!1,loggedIn:!1,page:"households",session:0,device:null}),Je=In({devices:[],groups:[],rows:[]});window.ZhaoVue={enabled:!0,accept(e){ne.value=e},setDevices(e){Je.value=e},clear(){Je.value={devices:[],groups:[],rows:[]}}};const Te=()=>window.ZhaoVue,_s=e=>({lan:"局域网",tailscale:"Tailscale",public:"公网",unknown:"接入待确认"})[e]||"接入待确认",cr={id:"page-households",class:"page"},ur={class:"section-head"},dr={class:"count-pill"},fr=["hidden"],pr={class:"home-toolbar"},hr={class:"btn-group",role:"group","aria-label":"场所显示方式"},mr=["aria-pressed"],br=["aria-pressed"],gr={class:"home-layout-controls"},vr=["disabled"],yr=["value"],_r=["disabled"],xr=["value"],wr={class:"inline-check"},kr=["disabled"],Cr={class:"inline-check"},Sr=["disabled"],Tr=["disabled"],Mr=["disabled"],jr={id:"home-layout-status",role:"status",class:"small text-secondary"},Ar={key:0,class:"group-title"},Pr={class:"home-card-grid"},$r=["draggable","onDragstart","onDrop"],qr={class:"home-cover"},Ir=["src","alt"],Or={class:"home-cover-content"},Er={class:"site-heading"},Rr={class:"badge"},Dr=["data-edit-household"],Fr={class:"home-location"},Nr={class:"card-body"},Hr={key:0,class:"home-order-actions"},Lr=["disabled","aria-label","onClick"],Vr=["disabled","aria-label","onClick"],Kr={class:"home-summary"},Ur={class:"home-numbers"},Br={class:"compact-details"},Wr={class:"home-card-actions"},zr=["onClick"],Zr=["data-leadership"],Yr={key:0,class:"empty"},Gr={id:"home-global-topology",class:"network-overview"},Jr={class:"network-platform"},Xr={class:"platform-place-grid"},Qr=["onClick"],ec={class:"badge"},tc={class:"home-pagination"},lc={id:"home-page-info"},sc=["disabled"],nc=["disabled"],ic={__name:"HomeExplorer",setup(e){const t=Se({revision:0,columns:2,rows:2,groupCity:!1,order:[]}),l=Se(!1),n=Se(!1),i=Se(0),o=Se(!1),r=Se("cards"),a=Se(""),c=Se("");let p="";Ct(ne,D=>{const x=D.user?.id+":"+D.session;p!==x&&(p=x,l.value=!1,n.value=!1,i.value=0,o.value=!1,r.value="cards",a.value="",c.value=""),!l.value&&!n.value&&(t.value={revision:0,columns:2,rows:2,groupCity:!1,order:[],...D.state.householdLayout})},{immediate:!0});const f=ot(()=>{const D=ne.value.state.households||[],x=new Map(D.map(A=>[A.id,A]));return[...new Set([...t.value.order,...D.map(A=>A.id)])].filter(A=>x.has(A)).map(A=>x.get(A))}),b=ot(()=>t.value.columns*t.value.rows),S=ot(()=>Math.max(1,Math.ceil(f.value.length/b.value)));Ct(S,D=>i.value=Math.min(i.value,D-1));const T=ot(()=>{const D=f.value.slice(i.value*b.value,(i.value+1)*b.value);if(!t.value.groupCity)return[{name:"",items:D}];const x=new Map;for(const A of D){const I=[A.geography?.country||A.country,A.province,A.city||"地区待填写"].filter(Boolean).join(" / ");x.has(I)||x.set(I,[]),x.get(I).push(A)}return[...x].map(([A,I])=>({name:A,items:I}))}),W=D=>({home:"家庭",office:"办公场所",factory:"工厂"})[D.kind||"home"]||"场所",F=D=>Te().address?.(D)||[D.province,D.city,D.district].filter(Boolean).join(" · ")||"地区待填写";function ie(){l.value=!0,i.value=0,t.value.groupCity&&(o.value=!1),c.value="布局已调整,保存后下次登录会沿用。"}function J(D,x,A){if(n.value)return;const I=f.value.map(dt=>dt.id),ce=I.indexOf(D),xe=A?I.indexOf(A):ce+x;ce<0||xe<0||xe>=I.length||ce===xe||(I.splice(ce,1),I.splice(xe,0,D),t.value.order=I,l.value=!0,i.value=Math.floor(xe/b.value))}function V(){l.value=!1,t.value={...ne.value.state.householdLayout},i.value=0,c.value=""}async function z(){const D=p;n.value=!0;try{const x=await Te().saveLayout({...t.value});if(D!==p)return;t.value=x,l.value=!1,c.value="布局与卡片顺序已保存"}catch(x){!x.stale&&D===p&&(c.value=x.message)}finally{D===p&&(n.value=!1)}}async function O(D,x=!1){await Te().enterHome(D.id,x)}return(D,x)=>(P(),$("section",cr,[s("div",ur,[s("div",null,[s("h2",null,[x[10]||(x[10]=h(" 我的空间 ",-1)),s("span",dr,j(f.value.length),1)]),x[11]||(x[11]=s("p",{class:"description mb-0"}," 家庭、办公与工厂,各自管理成员、区域和设备。 ",-1))]),s("button",{id:"new-household",class:"btn btn-primary",hidden:!U(ne).platformAdmin}," + 新建家庭或场所 ",8,fr)]),s("div",pr,[s("div",hr,[s("button",{id:"home-card-view",class:ct(["btn btn-outline-secondary",{active:r.value==="cards"}]),"aria-pressed":r.value==="cards",onClick:x[0]||(x[0]=A=>r.value="cards")},[L(fe,{name:"grid"}),x[12]||(x[12]=h(" 卡片",-1))],10,mr),s("button",{id:"home-topology-view",class:ct(["btn btn-outline-secondary",{active:r.value==="topology"}]),"aria-pressed":r.value==="topology",onClick:x[1]||(x[1]=A=>r.value="topology")},[L(fe,{name:"network"}),x[13]||(x[13]=h(" 整体拓扑 ",-1))],10,br)]),nt(s("div",gr,[s("label",null,[x[14]||(x[14]=h("每页 ",-1)),nt(s("select",{id:"home-columns","onUpdate:modelValue":x[2]||(x[2]=A=>t.value.columns=A),class:"form-select",disabled:n.value,onChange:ie},[(P(),$(G,null,$e(4,A=>s("option",{key:A,value:A},j(A)+" 列",9,yr)),64))],40,vr),[[nn,t.value.columns,void 0,{number:!0}]])]),x[17]||(x[17]=s("span",null,"×",-1)),nt(s("select",{id:"home-rows","onUpdate:modelValue":x[3]||(x[3]=A=>t.value.rows=A),"aria-label":"每页行数",class:"form-select",disabled:n.value,onChange:ie},[(P(),$(G,null,$e(4,A=>s("option",{key:A,value:A},j(A)+" 行",9,xr)),64))],40,_r),[[nn,t.value.rows,void 0,{number:!0}]]),s("label",wr,[nt(s("input",{id:"home-group-city","onUpdate:modelValue":x[4]||(x[4]=A=>t.value.groupCity=A),type:"checkbox",class:"form-check-input",disabled:n.value,onChange:ie},null,40,kr),[[ln,t.value.groupCity]]),x[15]||(x[15]=h("按城市分组",-1))]),s("label",Cr,[nt(s("input",{id:"home-arrange","onUpdate:modelValue":x[5]||(x[5]=A=>o.value=A),type:"checkbox",class:"form-check-input",disabled:t.value.groupCity||n.value},null,8,Sr),[[ln,o.value]]),x[16]||(x[16]=h("调整顺序",-1))]),s("button",{id:"home-layout-save",class:"btn btn-primary",disabled:!l.value||n.value,onClick:z},j(n.value?"保存中…":"保存布局"),9,Tr),s("button",{id:"home-layout-reset",class:"btn btn-outline-secondary",disabled:!l.value||n.value,onClick:V}," 撤销 ",8,Mr)],512),[[ol,r.value==="cards"]])]),s("p",jr,j(c.value||"布局仅影响你的账号;手机端自动适配为单列。"),1),nt(s("div",{id:"household-list",style:Gt({"--home-columns":t.value.columns})},[(P(!0),$(G,null,$e(T.value,A=>(P(),$("section",{key:A.name,class:"home-city-group"},[A.name?(P(),$("h3",Ar,j(A.name),1)):B("",!0),s("div",Pr,[(P(!0),$(G,null,$e(A.items,I=>(P(),$("article",{key:I.id,class:"card home-card",draggable:o.value&&!n.value,onDragstart:ce=>{a.value=I.id,ce.dataTransfer.setData("text/plain",I.id)},onDragend:x[6]||(x[6]=ce=>a.value=""),onDragover:x[7]||(x[7]=ce=>o.value&&a.value&&ce.preventDefault()),onDrop:Ha(ce=>{o.value&&a.value&&J(a.value,0,I.id),a.value=""},["prevent"])},[s("div",qr,[I.coverUrl?(P(),$("img",{key:0,src:I.coverUrl,alt:I.name+"封面",loading:"lazy"},null,8,Ir)):B("",!0),x[18]||(x[18]=s("div",{class:"cover-shade"},null,-1)),s("div",Or,[s("div",Er,[s("span",Rr,[h(j(W(I)),1),I.id===U(ne).state.familyId?(P(),$(G,{key:0},[h(" · 当前")],64)):B("",!0)]),U(ne).admin?(P(),$("button",{key:0,class:"btn btn-sm cover-edit","data-edit-household":I.id}," 编辑 ",8,Dr)):B("",!0)]),s("div",null,[s("h3",null,j(I.name),1),s("p",Fr,j(F(I)),1)])])]),s("div",Nr,[o.value?(P(),$("div",Hr,[x[19]||(x[19]=s("span",null,"拖动排序",-1)),s("button",{class:"btn btn-sm btn-outline-secondary",disabled:f.value[0]?.id===I.id||n.value,"aria-label":I.name+"前移",onClick:ce=>J(I.id,-1)}," ←",8,Lr),s("button",{class:"btn btn-sm btn-outline-secondary",disabled:f.value.at(-1)?.id===I.id||n.value,"aria-label":I.name+"后移",onClick:ce=>J(I.id,1)}," → ",8,Vr)])):B("",!0),s("p",Kr,j(I.note||"成员、空间与设备,独立管理。"),1),s("div",Ur,[s("span",null,[s("b",null,j(I.deviceCount||0),1),x[20]||(x[20]=h("设备",-1))]),s("span",null,[s("b",null,j(I.sites||0),1),x[21]||(x[21]=h("区域",-1))]),s("span",null,[s("b",null,j(I.members||0),1),x[22]||(x[22]=h("成员",-1))])]),s("dl",Br,[s("div",null,[s("dt",null,j(I.kind==="office"||I.kind==="factory"?"主要负责人":"一家之主"),1),s("dd",null,j(I.ownerName||"待指定"),1)]),s("div",null,[x[23]||(x[23]=s("dt",null,"备用负责人",-1)),s("dd",null,j(I.successorName||"待指定"),1)])]),s("div",Wr,[s("button",{class:"btn btn-primary",onClick:ce=>O(I)},[x[24]||(x[24]=h(" 进入空间 ",-1)),L(fe,{name:"arrow"})],8,zr),I.canAssignOwner?(P(),$("button",{key:0,class:"btn btn-link","data-leadership":I.id}," 负责人安排 ",8,Zr)):B("",!0)])])],40,$r))),128))])]))),128)),f.value.length?B("",!0):(P(),$("div",Yr," 登录后查看已授权的家庭与场所。 "))],4),[[ol,r.value==="cards"]]),nt(s("div",Gr,[s("div",Jr,[L(fe,{name:"network"}),s("div",null,[s("h3",null,j(U(ne).brandName||"赵府")+" · 数字管家",1),s("p",null,j(f.value.length)+" 个已授权空间",1)])]),x[26]||(x[26]=s("p",{class:"description"}," 平台与场所的管理关系;进入场所查看内部设备及网络。 ",-1)),s("div",Xr,[(P(!0),$(G,null,$e(f.value,A=>(P(),$("button",{key:A.id,class:"card platform-place-node",onClick:I=>O(A,!0)},[s("span",ec,j(W(A)),1),s("h3",null,j(A.name),1),s("p",null,j(F(A)),1),s("span",null,j(A.deviceCount||0)+" 台设备",1),s("small",null,j((A.networkAccesses||[]).map(U(_s)).join(" · ")||"网络待登记"),1),x[25]||(x[25]=s("span",{class:"network-open"},"查看网络拓扑 →",-1))],8,Qr))),128))])],512),[[ol,r.value==="topology"]]),nt(s("div",tc,[s("span",lc,"第 "+j(i.value+1)+" / "+j(S.value)+" 页 · 每页最多 "+j(b.value)+" 张",1),s("button",{id:"home-prev",class:"btn btn-outline-secondary",disabled:!i.value,onClick:x[8]||(x[8]=A=>i.value--)}," 上一页",8,sc),s("button",{id:"home-next",class:"btn btn-outline-secondary",disabled:i.value>=S.value-1,onClick:x[9]||(x[9]=A=>i.value++)}," 下一页 ",8,nc)],512),[[ol,r.value==="cards"]])]))}},oc={key:0,class:"network-status-block"},ac={class:"network-status-title"},rc=["disabled"],cc={key:0,class:"text-danger small",role:"status"},uc={key:0,class:"small text-secondary"},dc={key:1,class:"small text-secondary"},fc={key:2,class:"small text-secondary"},pc={class:"management-links"},hc=["href"],mc={key:0},bc={class:"network-check-time"},xs={__name:"NetworkStatus",props:{device:{type:Object,required:!0},active:{type:Boolean,default:!0}},setup(e){const t=e,l=Se(null),n=Se(!1),i=Se("");let o=0,r;const a=ot(()=>[t.device.id,t.device.source,t.device.managementHost,t.device.tailscaleHost,t.device.networkCidr,ne.value.state.familyId,ne.value.session,ne.value.admin,t.active].join("|"));async function c(){const b=o;if(!(n.value||!ne.value.admin||!t.active)){n.value=!0,i.value="";try{const S=await Te().api("/api/devices/network?source="+encodeURIComponent(t.device.source)+"&id="+encodeURIComponent(t.device.id));b===o&&(l.value=S)}catch(S){b===o&&!S.stale&&(i.value=S.message)}finally{b===o&&(n.value=!1,r=setTimeout(c,35e3))}}}Ct(a,()=>{o++,clearTimeout(r),n.value=!1,l.value=null,i.value="",ne.value.admin&&t.active&&c()},{immediate:!0}),ms(()=>{o++,clearTimeout(r)});const p=ot(()=>l.value?l.value.targets.some(b=>b.reachable)?"网络可达":"未连通":"等待检查");function f(){clearTimeout(r),c()}return(b,S)=>U(ne).admin?(P(),$("div",oc,[s("div",ac,[s("span",null,[s("i",{class:ct(["status-dot",{online:l.value?.targets.some(T=>T.reachable)}])},null,2),h(j(n.value?"正在检查…":p.value),1)]),s("button",{class:"btn btn-sm btn-link",disabled:n.value,onClick:f},"检查网络",8,rc)]),i.value?(P(),$("p",cc,j(i.value),1)):B("",!0),l.value?(P(),$(G,{key:1},[(P(!0),$(G,null,$e(l.value.targets,T=>(P(),$("div",{key:T.kind,class:"network-target"},[s("span",null,j(T.kind==="tailscale"?"Tailscale":"设备地址"),1),s("code",null,j(T.host),1),s("span",{class:ct(T.reachable?"text-success":"text-secondary")},j(T.reachable?"服务可达":"未响应"),3)]))),128)),l.value.targets.length?B("",!0):(P(),$("p",uc,"请编辑设备档案,填写 IP 或域名。")),l.value.tailscale?.available?(P(),$("p",dc,[h("Tailscale 节点"+j(l.value.tailscale.online?"在线":"离线"),1),l.value.tailscale.subnet?(P(),$(G,{key:0},[h(" · "+j(l.value.tailscale.subnetAvailable?"已发布":"未检测到")+" "+j(l.value.tailscale.subnet)+" 路由",1)],64)):B("",!0)])):l.value.tailscale?(P(),$("p",fc,j(l.value.tailscale.note),1)):B("",!0),s("div",pc,[(P(!0),$(G,null,$e(l.value.links,T=>(P(),$("a",{key:T.kind,href:T.url,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline-secondary"},[h("打开管理后台 · "+j(T.kind==="tailscale"?"Tailscale":"局域网")+" ↗",1),T.verified?B("",!0):(P(),$("span",mc,"(待连通)"))],8,hc))),128))]),s("small",bc,"检查于 "+j(new Date(l.value.checkedAt*1e3).toLocaleTimeString("zh-CN"))+" · 从服务器探测,打开后台需当前浏览器也能到达。",1)],64)):B("",!0)])):B("",!0)}},gc={id:"asset-list"},vc={class:"group-title"},yc={class:"count-pill"},_c={class:"device-card-grid"},xc={class:"card-body"},wc={class:"device-card-heading"},kc={class:"device-symbol"},Cc={class:"flex-grow-1"},Sc={class:"small text-secondary"},Tc=["onClick"],Mc={class:"device-location"},jc={class:"compact-details"},Ac={class:"font-monospace"},Pc={key:0},$c={key:0,class:"device-tags"},qc={class:"card-footer device-card-actions"},Ic=["onClick"],Oc=["onClick"],Ec=["onClick"],Rc={key:0,class:"empty"},Dc={__name:"DeviceCollection",setup(e){const t=i=>(ne.value.state.cameras||[]).filter(o=>i.source==="camera"?o.assetId===i.id:o.recorderId===i.id||o.archiveRecorderId===i.id),l=i=>({["data-"+(i.source==="camera"?"edit-asset":i.source==="recorder"?"edit-recorder":"edit-device")]:i.id}),n=i=>/路由|网关|服务器/.test(i.deviceType)||/gl\.inet/i.test(i.brand||"");return(i,o)=>(P(),$("div",gc,[(P(!0),$(G,null,$e(U(Je).groups,r=>(P(),$("section",{key:r.key,class:"device-group"},[s("h3",vc,[h(j(r.labels.join(" / ")||"全部设备")+" ",1),s("span",yc,j(r.items.length),1)]),s("div",_c,[(P(!0),$(G,null,$e(r.items,a=>(P(),$("article",{key:a.source+a.id,class:"card device-card"},[s("div",xc,[s("div",wc,[s("div",kc,[L(fe,{name:a.source==="camera"?"camera":n(a)?"router":"devices"},null,8,["name"])]),s("div",Cc,[s("span",Sc,j(a.deviceType),1),s("h3",null,[s("button",{class:"device-title",onClick:c=>U(Te)().enterDevice(a.source,a.id)},j(a.name),9,Tc)])]),U(ne).admin?(P(),$("button",mi({key:0,class:"btn btn-sm btn-outline-secondary"},{ref_for:!0},l(a))," 编辑 ",16)):B("",!0)]),s("p",Mc,[h(j(U(Te)().location?.(a.siteId)||"区域待填写"),1),a.point?(P(),$(G,{key:0},[h(" · "+j(a.point),1)],64)):B("",!0)]),s("dl",jc,[s("div",null,[o[0]||(o[0]=s("dt",null,"品牌型号",-1)),s("dd",null,j([a.brand,a.model].filter(Boolean).join(" / ")||"未填写"),1)]),s("div",null,[o[1]||(o[1]=s("dt",null,"设备地址",-1)),s("dd",Ac,j(a.networkHosts.join(" / ")||"未填写"),1)]),s("div",null,[o[2]||(o[2]=s("dt",null,"网络",-1)),s("dd",null,j(U(_s)(a.networkAccess)),1)]),s("div",null,[o[3]||(o[3]=s("dt",null,"所有人 / 负责人",-1)),s("dd",null,j(a.ownerName||"待指定")+" / "+j(a.managerName||"待指定"),1)]),a.source!=="device"?(P(),$("div",Pc,[o[4]||(o[4]=s("dt",null,"镜头通道",-1)),s("dd",null,j(t(a).length)+" 个已配置",1)])):B("",!0)]),a.tags?.length?(P(),$("div",$c,[(P(!0),$(G,null,$e(a.tags,c=>(P(),$("span",{key:c},j(c),1))),128))])):B("",!0),n(a)?(P(),vs(xs,{key:1,device:a,active:U(ne).page==="objects"&&U(Je).mode==="cards"},null,8,["device","active"])):B("",!0)]),s("div",qc,[s("button",{class:"btn btn-sm btn-outline-secondary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"device")}," 设备详情",8,Ic),a.source!=="device"?(P(),$(G,{key:0},[U(ne).admin?(P(),$("button",{key:0,class:"btn btn-sm btn-outline-secondary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"cameras")}," 配置镜头",8,Oc)):B("",!0),t(a).length?(P(),$("button",{key:1,class:"btn btn-sm btn-primary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"live")}," 实时画面 ",8,Ec)):B("",!0)],64)):B("",!0)])]))),128))])]))),128)),U(Je).devices.length?B("",!0):(P(),$("div",Rc,[L(fe,{name:"devices"}),o[5]||(o[5]=s("h3",null,"当前范围没有设备",-1)),o[6]||(o[6]=s("p",null,"调整筛选条件,或添加摄像机、路由器、灯等设备。",-1))]))]))}},Fc={id:"device-topology",hidden:""},Nc={class:"panel network-map"},Hc={class:"network-platform"},Lc={class:"topology-nodes"},Vc={class:"card-body"},Kc={class:"device-card-heading"},Uc={class:"flex-grow-1"},Bc={class:"small text-secondary"},Wc=["onClick"],zc=["onClick"],Zc={class:"device-location"},Yc={class:"network-facts"},Gc={key:0},Jc={key:1},Xc={key:2},Qc={key:3},eu={key:0,class:"empty"},tu={__name:"NetworkMap",setup(e){const t=ot(()=>(ne.value.state.households||[]).find(l=>l.id===ne.value.state.familyId));return(l,n)=>(P(),$("div",Fc,[s("section",Nc,[s("div",Hc,[L(fe,{name:"network"}),s("div",null,[s("h3",null,j(t.value?.name||"当前场所"),1),s("p",null,j(U(Je).devices.length)+" 台设备 · 随设备档案自动更新",1)])]),n[7]||(n[7]=s("p",{class:"description"}," 连线来自已确认的上级设备关系。上级未填写时单独列出;不代表已自动发现所有交换机或布线。 ",-1)),s("div",Lc,[(P(!0),$(G,null,$e(U(Je).rows,i=>(P(),$("article",{key:i.device.id,class:ct(["network-node card",{nested:i.depth>0}]),style:Gt({"--depth":Math.min(i.depth,5)})},[s("div",Vc,[s("div",Kc,[L(fe,{name:i.device.source==="camera"?"camera":"router"},null,8,["name"]),s("div",Uc,[s("span",Bc,j(i.device.deviceType)+" · "+j(U(_s)(i.device.networkAccess)),1),s("h3",null,[s("button",{class:"device-title",onClick:o=>U(Te)().enterDevice(i.device.source,i.device.id)},j(i.device.name),9,Wc)])]),s("button",{class:"btn btn-sm btn-outline-secondary",onClick:o=>U(Te)().enterDevice(i.device.source,i.device.id,"device")}," 详情 → ",8,zc)]),s("p",Zc,[h(j(U(Te)().location?.(i.device.siteId)||"未指定区域")+" ",1),i.device.point?(P(),$(G,{key:0},[h(" · "+j(i.device.point),1)],64)):B("",!0)]),s("div",Yc,[s("span",null,[n[0]||(n[0]=h("IP ",-1)),s("b",null,j(i.device.networkHosts.join(" / ")||"待填写"),1)]),i.device.tailscaleHost?(P(),$("span",Gc,[n[1]||(n[1]=h("Tailscale ",-1)),s("b",null,j(i.device.tailscaleHost),1)])):B("",!0),i.device.networkCidr?(P(),$("span",Jc,[n[2]||(n[2]=h("网段 ",-1)),s("b",null,j(i.device.networkCidr),1)])):B("",!0),s("span",null,[n[3]||(n[3]=h("上级 ",-1)),s("b",null,j(i.parentName||"待确认 / 直接接入"),1)]),s("span",null,[n[4]||(n[4]=h("连接 ",-1)),s("b",null,j({wired:"网线",wifi:"Wi-Fi"}[i.device.connectionType]||"待确认"),1)]),i.via.length?(P(),$("span",Xc,[n[5]||(n[5]=h("取流经录像机 ",-1)),s("b",null,j(i.via.join("、")),1)])):B("",!0),i.archiveVia.length?(P(),$("span",Qc,[n[6]||(n[6]=h("录像归档 ",-1)),s("b",null,j(i.archiveVia.join("、")),1)])):B("",!0)]),/路由|网关|服务器/.test(i.device.deviceType)?(P(),vs(xs,{key:0,device:i.device,active:U(ne).page==="objects"&&U(Je).mode==="topology"},null,8,["device","active"])):B("",!0)])],6))),128)),U(Je).rows.length?B("",!0):(P(),$("p",eu," 当前范围尚未登记设备。 "))])])]))}},lu={key:0,class:"panel"},su={__name:"DeviceNetworkPanel",setup(e){return(t,l)=>U(ne).admin&&U(ne).device&&U(ne).page==="device"?(P(),$("section",lu,[l[0]||(l[0]=s("h3",null,"网络状态与管理入口",-1)),L(xs,{device:U(ne).device},null,8,["device"]),l[1]||(l[1]=s("p",{class:"description mb-0"},"只检查已登记的设备地址。常用端口未响应不一定表示断电;Tailscale 节点在线也不代表下级网段可达。",-1))])):B("",!0)}},nu={id:"page-device",class:"page",hidden:""},iu={id:"page-objects",class:"page",hidden:""},ou={__name:"Workspace",setup(e){return(t,l)=>(P(),$(G,null,[l[4]||(l[4]=s("div",{id:"household-context",class:"household-context",hidden:""},[s("label",null,[h("当前归属 "),s("select",{id:"household-filter","aria-label":"当前归属"})]),s("span",{id:"household-context-note"}),s("button",{id:"scope-back",class:"quiet"},"返回场所")],-1)),l[5]||(l[5]=s("div",{id:"device-context",class:"device-context",hidden:""},[s("p",{id:"device-breadcrumb"}),s("div",{role:"group","aria-label":"设备功能"},[s("button",{class:"quiet","data-device-tab":"device"},"设备档案"),s("button",{class:"quiet","data-device-tab":"live"},"实时画面"),s("button",{class:"quiet","data-device-tab":"playback"},"录像回放"),s("button",{class:"quiet","data-device-tab":"cameras"},"镜头与设置")])],-1)),l[6]||(l[6]=ke('
空间范围 全部空间 可选择任意区域,包含其下级区域 ↻ 刷新状态
',3)),l[7]||(l[7]=s("section",{id:"page-settings",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,"把这里布置成你习惯的样子"),s("button",{id:"settings-reload",class:"quiet"},"重新读取设置")]),s("p",{id:"settings-error",role:"status"}),s("div",{class:"settings-sections",role:"group","aria-label":"设置分类"},[s("button",{class:"quiet","data-settings-section":"preferences","aria-pressed":"true"},"我的偏好"),s("button",{class:"quiet","data-settings-section":"baidu","data-platform-setting":"",hidden:""},"网盘连接"),s("button",{class:"quiet","data-settings-section":"brand","data-platform-setting":"",hidden:""},"品牌与外观"),s("button",{class:"quiet","data-settings-section":"backup","data-platform-setting":"",hidden:""},"数据库备份")]),s("form",{id:"preferences-form",class:"panel"},[s("h3",null,"我的偏好"),s("p",{class:"description"},"只影响当前账号,保存后换电脑或手机登录也会沿用。切换选项可以预览,离开未保存的预览会撤销。"),s("div",{id:"personal-choices",class:"form-grid"}),s("p",{id:"preferences-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{type:"submit"},"保存我的偏好"),s("button",{type:"button",id:"personal-follow",class:"quiet"},"全部跟随平台"),s("button",{type:"button",id:"personal-cancel",class:"quiet"},"撤销预览")])]),s("section",{id:"baidu-admin",class:"panel",hidden:""},[s("div",{class:"section-head"},[s("h3",null,"百度网盘 · 统一存储"),s("span",{class:"badge"},"仅超级管理员配置")]),s("p",{class:"description"},"连接一个网盘账号,统一保存封面、Logo、图标及各用户上传的照片、视频和语音。系统按用户、家庭和记事可见范围授权;网盘账号持有人本身可以管理网盘中的文件。服务器仅转发分片,不保存媒体原文件。"),s("details",{id:"baidu-storage-guide"},[s("summary",null,"文件存在哪里?"),s("ul",null,[s("li",null,"家庭与场所:按家庭或场所保存封面。"),s("li",null,"平台外观:保存 Logo 和图标。"),s("li",null,"个人记事:按家庭、用户分组,再分照片、视频、语音。"),s("li",null,"数据库备份:单独存放;新备份上传并校验成功后,清理超过一个自然月的旧云备份。")]),s("p",{class:"description"},"文字、权限和文件引用保存在本机数据库;个人媒体原文件保存在百度网盘。封面和品牌图片仅做有限的内存缓存。更换封面、移除附件或删除记事不会删除网盘原文件。")]),s("form",{id:"baidu-config"},[s("div",{class:"form-grid"},[s("label",null,[h("AppKey"),s("input",{name:"appKey",autocomplete:"off",maxlength:"150",required:""})]),s("label",null,[h("SecretKey"),s("input",{name:"secretKey",type:"password",autocomplete:"new-password",maxlength:"150"})]),s("label",null,[h("百度后台应用名称"),s("input",{name:"appFolder",value:"智家",required:"",maxlength:"40"})]),s("label",null,[h("OAuth 回调地址"),s("input",{name:"redirectUri",type:"url",placeholder:"https://你的域名/api/baidu/callback",required:"",maxlength:"400"})])]),s("p",{class:"description"},"回调地址须与百度后台完全一致。SecretKey 留空保持已保存值,SignKey 不需要填写。当前开发者应用仅限个人场景,适用范围以百度后台为准。"),s("p",{id:"baidu-config-status",role:"status"}),s("button",{type:"submit"},"保存网盘应用配置")]),s("hr"),s("p",{id:"baidu-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{id:"baidu-connect"},"连接/重新授权百度网盘"),s("button",{id:"baidu-disconnect",class:"quiet"},"解除本机连接")]),s("p",{class:"description"},"解除连接不会删除云端文件。临时媒体地址由后台按需获取,令牌不发送给浏览器。网盘授权凭据单独保存在服务器受限目录,不包含在数据库备份或公开源码中。")]),s("div",{id:"settings-private",hidden:""},[s("form",{id:"brand-form",class:"panel"},[s("h3",null,"发布与品牌配置"),s("p",{class:"description"},"仅超级管理员可修改。名称、Logo、浏览器图标及登录文案会公开显示;适用于整套系统。已有个人偏好优先于平台默认。"),s("div",{class:"form-grid"},[s("label",null,[h("系统名称"),s("input",{name:"name",required:"",maxlength:"40"})]),s("label",null,[h("系统副标题"),s("input",{name:"subtitle",required:"",maxlength:"60"})]),s("label",{class:"full"},[h("页首题词"),s("input",{name:"motto",maxlength:"100"})]),s("label",null,[h("登录标题"),s("input",{name:"loginTitle",required:"",maxlength:"40"})]),s("label",null,[h("登录说明"),s("input",{name:"loginNote",maxlength:"160"})]),s("label",{class:"full"},[h("页脚说明"),s("input",{name:"footer",maxlength:"120"})])]),s("div",{class:"brand-image-grid"},[s("div",null,[s("img",{id:"brand-logo-preview",alt:"Logo 预览",src:"/zhao-icon.png"}),s("label",null,[h("更换系统 Logo"),s("input",{id:"brand-logo-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"brand-logo-reset",class:"quiet"},"使用默认 Logo")]),s("div",null,[s("img",{id:"brand-icon-preview",alt:"浏览器图标预览",src:"/zhao-icon.png"}),s("label",null,[h("更换浏览器图标"),s("input",{id:"brand-icon-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"brand-icon-reset",class:"quiet"},"使用默认图标")])]),s("p",{class:"description"},"支持 PNG、JPEG、WebP,原图最多 5 MB;上传时自动缩小,图片随系统数据库保存。"),s("h3",null,"新账号与跟随平台账号的默认外观"),s("div",{id:"brand-defaults",class:"form-grid"}),s("p",{id:"brand-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{type:"submit"},"保存发布配置"),s("button",{type:"button",id:"brand-export",class:"quiet"},"导出发布配置"),s("label",{class:"config-import"},[h("导入配置到表单"),s("input",{id:"brand-import",type:"file",accept:"application/json,.json"})])]),s("p",{class:"description"},"导入后先核对再保存。导出的配置只含品牌与默认外观,不含账号、设备凭据、家庭资料和网络备份目录。")]),s("section",{id:"backup-panel",class:"panel"},[s("h3",null,"数据库备份"),s("p",{class:"description"},"整台服务的数据库包含所有家庭、账号、设备连接配置和网盘文件引用,因此仅超级管理员可操作。网盘中的照片、视频、语音及录像文件不包含在新数据库副本中;旧版备份可能仍含历史内嵌图片。恢复后所有账号需要重新登录。"),s("form",{id:"backup-form"},[s("div",{class:"form-grid"},[s("label",{class:"check full"},[s("input",{name:"enabled",type:"checkbox"}),h("启用每日定时备份")]),s("label",{class:"check full"},[s("input",{name:"baidu",type:"checkbox"}),h("同时上传到已连接的百度网盘")]),s("label",null,[h("每日时间(北京时间)"),s("input",{name:"time",type:"time",required:"",value:"03:00"})]),s("label",null,[h("本机/挂载目录保留份数"),s("input",{name:"keep",type:"number",min:"1",max:"90",required:"",value:"14"})]),s("label",{class:"full"},[h("网络备份目录(可留空)"),s("input",{name:"networkPath",maxlength:"500",placeholder:"/var/lib/zhaovision/network-backup"})])]),s("p",{class:"description"},"填写本服务器已挂载的网络盘目录。使用百度接口备份只需勾选上方选项;此路径用于其他已挂载的网络存储,不能填网页地址或分享链接。写入网络目录成功不等于已确认百度云端同步完成。"),s("p",{class:"description"},"默认部署允许写入 /var/lib/zhaovision 下的目录。挂载和目录权限须由主机管理员配置;本页不会保存网盘登录密码。保留份数只清理本机和挂载目录中本系统生成的旧备份,百度网盘保留最近一个自然月;新备份上传并校验成功后才清理本应用的过期副本。"),s("p",{id:"backup-local-path",class:"description"}),s("p",{id:"backup-save-status",role:"status"}),s("button",{type:"submit"},"保存备份设置")]),s("div",{class:"section-head"},[s("h3",null,"备份记录"),s("button",{id:"backup-run"},"立即备份数据库")]),s("p",{id:"backup-result",role:"status"}),s("div",{id:"backup-history"})])])],-1)),l[8]||(l[8]=s("section",{id:"page-journal",class:"page",hidden:""},[s("div",{class:"scope-intro"},[s("span",{class:"eyebrow"},"岁月有迹 · 日常成章"),s("h2",null,"把生活,写成自己的来时路"),s("p",null,"与家人分享近况,也为自己留下一份阅历。")]),s("form",{id:"journal-form",class:"panel journal-compose"},[s("input",{type:"hidden",name:"id"}),s("input",{type:"hidden",name:"revision",value:"0"}),s("input",{type:"hidden",name:"clientId"}),s("label",null,[h("此刻想记下什么?"),s("textarea",{name:"text",rows:"4",maxlength:"5000",placeholder:"今天的心情、一段往事,或一个值得记住的时刻…"})]),s("div",{class:"form-grid"},[s("label",null,[h("记事日期"),s("input",{name:"occurredOn",type:"date",required:""})]),s("label",null,[h("阅历分类"),s("select",{name:"category"},[s("option",null,"日常"),s("option",null,"成长"),s("option",null,"家庭"),s("option",null,"旅行"),s("option",null,"工作"),s("option",null,"其他")])]),s("label",null,[h("谁可以看到"),s("select",{name:"visibility"},[s("option",{value:"private"},"仅自己可见"),s("option",{value:"household"},"当前家庭/场所成员")])])]),s("div",{class:"journal-add-media"},[s("label",{class:"quiet"},[h("+ 照片、视频或语音"),s("input",{id:"journal-files",disabled:"",type:"file",accept:"image/jpeg,image/png,image/webp,video/mp4,video/quicktime,video/webm,audio/mpeg,audio/mp4,audio/aac,audio/wav,audio/ogg,audio/webm,.m4a"})]),s("button",{id:"journal-record",disabled:"",type:"button",class:"quiet"},"● 直接录音"),s("button",{id:"journal-stop-record",type:"button",hidden:""},"结束录音并上传"),s("button",{id:"journal-cancel-upload",type:"button",class:"quiet",hidden:""},"暂停上传")]),s("p",{id:"journal-cloud-note",class:"description"}),s("p",{class:"description"},"每条最多 9 个附件,单个文件最多 256 MB;一次上传一个文件。录音须通过 HTTPS 并允许麦克风,最长 5 分钟。上传完成后默认选中。保存后清空本次输入;再次使用可展开“我的附件库”。"),s("div",{id:"journal-upload-list",class:"journal-upload-grid"}),s("details",{id:"journal-library",class:"journal-library"},[s("summary",null,[h("我的附件库("),s("span",{id:"journal-library-count"},"0"),h(")")]),s("p",{class:"description"},"已上传的附件可预览、删除或再次用于记事。"),s("div",{id:"journal-library-list",class:"journal-upload-grid"})]),s("details",{id:"journal-trash",class:"journal-trash",hidden:""},[s("summary",null,[h("已删除附件("),s("span",{id:"journal-trash-count"},"0"),h(")")]),s("p",{class:"description"},"删除仅整理附件库,已发布的记事与网盘原文件保留。恢复后可再次使用。"),s("div",{id:"journal-trash-list"})]),s("p",{id:"journal-status",role:"status","aria-live":"polite"}),s("div",{class:"device-actions"},[s("button",{id:"journal-save",type:"submit"},"保存记事"),s("button",{id:"journal-new",type:"button",class:"quiet"},"另写一条")])]),s("form",{id:"journal-filter",class:"panel journal-filters"},[s("label",null,[h("查看方式"),s("select",{id:"journal-mode"},[s("option",{value:"feed"},"家庭/场所动态"),s("option",{value:"mine"},"我的个人阅历"),s("option",{value:"person"},"某个人的阅历")])]),s("label",{id:"journal-person-label",hidden:""},[h("人物"),s("select",{id:"journal-person"})]),s("label",null,[h("分类"),s("select",{id:"journal-category"},[s("option",{value:""},"全部分类"),s("option",null,"日常"),s("option",null,"成长"),s("option",null,"家庭"),s("option",null,"旅行"),s("option",null,"工作"),s("option",null,"其他")])]),s("label",null,[h("关键词"),s("input",{id:"journal-search",type:"search",maxlength:"120",placeholder:"在文字中查找"})]),s("label",null,[h("开始日期"),s("input",{id:"journal-from",type:"date"})]),s("label",null,[h("结束日期"),s("input",{id:"journal-to",type:"date"})]),s("button",{type:"submit"},"查询阅历"),s("button",{id:"journal-filter-clear",type:"button",class:"quiet"},"清除筛选")]),s("p",{class:"description"},"个人阅历保留同一条记事的文字、附件和互动;查看他人时只展示其分享给当前家庭/场所的内容。删除记事或移出附件列表不会删除网盘原文件。"),s("div",{class:"section-head"},[s("p",{id:"journal-query-status",role:"status"}),s("div",null,[s("button",{id:"journal-prev",class:"quiet"},"上一页"),s("button",{id:"journal-next",class:"quiet"},"下一页")])]),s("div",{id:"journal-list",class:"journal-feed"})],-1)),l[9]||(l[9]=s("section",{id:"page-overview",class:"page",hidden:""},[s("div",{id:"scope-overview"})],-1)),s("section",nu,[L(su),l[0]||(l[0]=s("div",{id:"device-detail"},null,-1))]),l[10]||(l[10]=s("section",{id:"page-heritage",class:"page",hidden:""},[s("div",{id:"heritage-home"})],-1)),l[11]||(l[11]=s("section",{id:"page-live",class:"page"},[s("div",{class:"section-head"},[s("h2",{id:"live-heading"},"本场所监控墙"),s("div",null,[s("label",null,[h("清晰度 "),s("select",{id:"quality"},[s("option",{value:"hd"},"主码流"),s("option",{value:"compat"},"子码流")])])])]),s("p",{id:"wall-context",class:"description"},"这里汇总当前场所内已授权的镜头;点击摄像头详情可进入单台设备。"),s("p",{class:"description",id:"quality-note"},"主码流画面更清晰,最高 1920×1080;子码流更流畅,最高 768×432,适合网络较慢时使用。"),s("div",{class:"wall-toolbar"},[s("label",null,[h("分屏 "),s("select",{id:"wall-layout"},[s("option",{value:"auto"},"自适应"),s("option",{value:"1"},"1 画面"),s("option",{value:"2"},"2 画面"),s("option",{value:"4"},"4 画面"),s("option",{value:"6"},"6 画面"),s("option",{value:"9"},"9 画面"),s("option",{value:"16"},"16 画面")])]),s("label",{class:"check"},[s("input",{id:"wall-arrange",type:"checkbox"}),h("调整顺序")]),s("div",{class:"wall-paging"},[s("button",{id:"wall-prev",class:"quiet","aria-label":"上一组画面"},"‹"),s("span",{id:"wall-page"}),s("button",{id:"wall-next",class:"quiet","aria-label":"下一组画面"},"›")]),s("span",{id:"wall-clock"}),s("button",{id:"wall-fullscreen"},"全屏监控")]),s("div",{id:"live-grid",class:"live-grid"}),s("section",{id:"ptz-panel",class:"ptz-panel",hidden:""},[s("div",null,[s("strong",{id:"ptz-title"},"云台"),s("p",{id:"ptz-status",role:"status"})]),s("div",{class:"ptz-pad"},[s("button",{"data-ptz-action":"up","aria-label":"云台向上"},"↑"),s("button",{"data-ptz-action":"left","aria-label":"云台向左"},"←"),s("button",{"data-ptz-action":"stop"},"停止"),s("button",{"data-ptz-action":"right","aria-label":"云台向右"},"→"),s("button",{"data-ptz-action":"down","aria-label":"云台向下"},"↓")]),s("div",{id:"ptz-presets"},[s("div",{class:"section-head"},[s("strong",null,[h("常用位置 "),s("small",{id:"preset-count"})]),s("button",{id:"preset-reload",class:"quiet"},"重新读取")]),s("p",{id:"preset-status",role:"status"}),s("div",{id:"preset-list"}),s("p",{class:"description"},"调整位置后可另存为新预置位。本版不覆盖已有位置,避免设备固件拒绝或误改。"),s("form",{id:"preset-form",hidden:""},[s("label",null,[h("当前位置名称"),s("input",{id:"preset-name",required:"",maxlength:"40",placeholder:"例如:大门、院子"})]),s("button",{type:"submit"},"保存当前位置")]),s("div",{id:"preset-confirmation",hidden:""},[s("p",{id:"preset-confirm-text"}),s("button",{id:"preset-confirm-yes"},"确认"),s("button",{id:"preset-confirm-cancel",class:"quiet"},"取消")])]),s("button",{id:"ptz-close",class:"quiet"},"收起云台")])],-1)),l[12]||(l[12]=s("section",{id:"page-playback",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,[h("回到那一刻 "),s("small",null,"光阴")])]),s("div",{class:"panel playback-controls"},[s("label",null,[h("镜头 / 通道"),s("select",{id:"play-camera"})]),s("label",null,[h("录像来源"),s("select",{id:"archive-source"},[s("option",{value:"recorder"},"录像机原有录像(待接入)"),s("option",{value:"local"},"小电脑本机录像")])]),s("label",null,[h("日期"),s("input",{id:"play-date",type:"date"})]),s("button",{id:"query-recordings"},"查找录像"),s("span",{id:"play-info"},"选择日期,查看实际录像时段")]),s("div",{class:"video-panel"},[s("video",{id:"play-video",controls:"",playsinline:""}),s("div",{id:"play-empty",class:"video-empty"},"选择一个有录像的时间段")]),s("div",{class:"panel"},[s("div",{class:"timeline-head"},[s("strong",null,"当日时间轴"),s("span",null,[s("i",{class:"legend"}),h(" 有录像的时段 · 点击定位")])]),s("canvas",{id:"timeline",height:"76","aria-label":"录像时间轴"}),s("div",{class:"time-labels"},[s("span",null,"00:00"),s("span",null,"06:00"),s("span",null,"12:00"),s("span",null,"18:00"),s("span",null,"24:00")]),s("div",{class:"seek-row"},[s("label",null,[h("定位时间 "),s("input",{id:"seek-time",type:"time",step:"1",value:"12:00:00"})]),s("button",{id:"seek-button",class:"secondary"},"定位播放"),s("a",{id:"download",class:"button secondary",hidden:""},"下载原始片段")])]),s("div",{class:"panel"},[s("div",{class:"playback-tools"},[s("label",{class:"check"},[s("input",{id:"play-autonext",type:"checkbox",checked:""}),h("自动续播下一时段(跳过空档)")]),s("button",{id:"play-snapshot",class:"quiet"},"回放截图"),s("span",{id:"play-position",role:"status"})]),s("details",{class:"clip-editor"},[s("summary",null,"选取并下载指定片段"),s("form",{id:"clip-form"},[s("div",{class:"form-grid"},[s("label",null,[h("开始时间"),s("input",{id:"clip-start",type:"datetime-local",step:"1",required:""})]),s("label",null,[h("结束时间"),s("input",{id:"clip-end",type:"datetime-local",step:"1",required:""})])]),s("div",{class:"playback-tools"},[s("button",{type:"button",class:"quiet","data-clip-mark":"start"},"当前位置作起点"),s("button",{type:"button",class:"quiet","data-clip-mark":"end"},"当前位置作终点"),s("button",{type:"submit"},"生成下载链接"),s("a",{id:"clip-download",class:"button secondary",hidden:""},"下载所选片段")]),s("p",{id:"clip-status",role:"status",class:"description"}),s("p",{class:"description"},"每段最多一小时,不可跨越无录像时段。下载保留原始编码,剪辑边界可能受设备关键帧影响。")])])]),s("div",{id:"recording-list",class:"recording-list"})],-1)),l[13]||(l[13]=ke('',1)),s("section",iu,[l[1]||(l[1]=ke('一物一档 设备 · 归属 管理区域 + 摄像机 + 录像机 + 其他设备
同一设备可同时记录类型、区域、所有人、负责人和标签。分组顺序可自由组合,例如“灯 → 卧室”或“负责人 → 类型 → 区域”。人员归属不自动授予访问权限。
',2)),l[2]||(l[2]=s("div",{class:"panel device-view-controls"},[s("div",{class:"device-search-row"},[s("label",null,[h("设备类型"),s("select",{id:"device-type"},[s("option",{value:""},"所有类型")])]),s("label",null,[h("搜索设备或人员"),s("input",{id:"device-search",type:"search",placeholder:"例如:卧室 灯;也可查 IP、品牌、型号、人员"})]),s("button",{id:"device-clear",type:"button",class:"quiet",hidden:""},"清除设备筛选")]),s("div",{class:"device-actions view-presets",role:"group","aria-label":"设备分组方式"},[s("button",{type:"button",class:"quiet","data-group-preset":"space,type"},"按区域查看"),s("button",{type:"button",class:"quiet","data-group-preset":"type,space"},"按类型查看"),s("button",{type:"button",class:"quiet","data-group-preset":"manager,type,space"},"按负责人查看")]),s("details",{class:"group-custom"},[s("summary",null,"自定义分组顺序"),s("p",{class:"description"},"依次分组(前面的维度优先,区域按你定义的完整层级展示)"),s("div",{id:"device-group-order",class:"device-group-order"}),s("div",{class:"device-actions"},[s("button",{id:"device-group-add",class:"quiet"},"+ 增加分组维度"),s("button",{"data-admin":"",id:"device-view-save",class:"secondary"},"保存为本归属的默认视图")])]),s("p",{id:"device-count",class:"description"})],-1)),l[3]||(l[3]=s("div",{class:"device-actions",role:"group","aria-label":"设备展示方式"},[s("button",{id:"devices-card-view",class:"quiet","aria-pressed":"true"},"设备卡片"),s("button",{id:"devices-topology-view",class:"quiet","aria-pressed":"false"},"网络拓扑")],-1)),L(Dc),L(tu)]),l[14]||(l[14]=ke('
录像机 存影 + 添加录像机
统一保存录像机地址与账号,镜头通道关联录像机。实时取流使用 RTSP;读取录像机已有历史录像,需要该型号的回放接口适配。
区域与空间 自定层级 + 新建空间
在当前家庭或场所下自行划分区域,不限定层级数量。例如“一楼 → 卧室”或“厂区 → 车间 → 产线”。名称和区域类别均由你定义,地址信息按需填写。
录像与存储 留存 运行状态 开启摄像头的“持续录像”后,服务会保存主码流。预览默认使用主码流高清画面(最高 1920×1080、15 帧/秒),也可切换子码流流畅画面(最高 768×432、10 帧/秒)。本机录像保留设备原始编码。
最近操作
',3)),l[15]||(l[15]=s("section",{id:"page-heritage-records",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",{id:"heritage-records-title"},"文化与家风"),s("div",null,[s("button",{class:"quiet","data-page":"heritage"},"返回家庭传承"),s("button",{id:"heritage-new"},"+ 新建档案")])]),s("div",{class:"panel heritage-controls"},[s("label",null,[h("查找档案"),s("input",{id:"heritage-search",type:"search",placeholder:"名称、内容、相关人员"})]),s("label",{class:"check"},[s("input",{id:"heritage-archived",type:"checkbox"}),h("包含归档资料")]),s("button",{id:"heritage-reload",class:"quiet"},"重新载入")]),s("p",{id:"heritage-error",class:"form-error",role:"status"}),s("div",{id:"heritage-list",class:"site-grid"}),s("aside",{id:"heritage-detail",class:"panel",hidden:""})],-1)),l[16]||(l[16]=s("section",{id:"page-family",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,[h("家族的来处与延续 "),s("small",null,"世系 · 传承")]),s("div",null,[s("button",{id:"family-reload",class:"quiet"},"重新载入"),s("button",{id:"family-export",class:"quiet"},"导出家谱"),s("button",{id:"new-person"},"+ 录入人物")])]),s("p",{class:"description"},"从祖辈到后辈,一张图看全家。点击人物查看档案,暖金色卡片是当前账号关联的本人。"),s("div",{class:"panel family-toolbar"},[s("label",null,[h("关系参照人物"),s("select",{id:"family-reference"})]),s("label",null,[h("查找人物"),s("input",{id:"family-search",type:"search",placeholder:"姓名、别名或籍贯"})]),s("button",{id:"family-find",class:"quiet",hidden:""},"定位搜索结果"),s("label",{class:"check"},[s("input",{id:"family-archived",type:"checkbox"}),h("显示归档人物")]),s("span",{id:"family-count"})]),s("div",{id:"family-error",class:"form-error",role:"status"}),s("div",{id:"family-workspace",class:"family-workspace"},[s("section",{id:"family-canvas-panel",class:"family-canvas-panel","aria-label":"全家关系图"},[s("div",{class:"family-map-heading"},[s("div",null,[s("span",{class:"eyebrow"},"枝叶相连 · 世代相承"),s("h2",{id:"family-view-title"},"全家关系图")]),s("div",{class:"family-view-tabs",role:"group","aria-label":"家谱显示方式"},[s("button",{id:"family-view-tree",class:"quiet","aria-pressed":"true"},"关系图"),s("button",{id:"family-view-list",class:"quiet","aria-pressed":"false"},"人物名册"),s("button",{id:"family-view-timeline",class:"quiet","aria-pressed":"false"},"家族时间线")])]),s("div",{id:"family-map-controls",class:"family-map-controls"},[s("div",{class:"family-zoom-controls"},[s("button",{id:"family-zoom-out",class:"quiet","aria-label":"缩小家谱"},"−"),s("output",{id:"family-zoom-value","aria-live":"polite"},"100%"),s("button",{id:"family-zoom-in",class:"quiet","aria-label":"放大家谱"},"+"),s("button",{id:"family-fit",class:"quiet"},"查看全谱")]),s("button",{id:"family-locate-self",class:"quiet"},"◎ 定位本人"),s("button",{id:"family-fullscreen",class:"quiet"},"全屏家谱")]),s("div",{id:"family-tree",class:"family-map-viewport",tabindex:"0",role:"region","aria-label":"家谱关系图,可拖动空白处或使用滚动条浏览"}),s("div",{id:"family-people",class:"family-people family-register",hidden:""}),s("section",{id:"family-events",hidden:"","aria-label":"家族重大记事"},[s("div",{class:"family-event-intro"},[s("div",null,[s("h3",null,"把值得记住的事,留给后来的人"),s("p",{class:"description"},"按事情发生的日期排列,可关联多位亲人,并附上详细记载或报道链接。")]),s("button",{id:"family-new-event"},"+ 写一则记事")]),s("div",{class:"family-event-filters"},[s("label",null,[h("关联人物"),s("select",{id:"family-event-person"},[s("option",{value:""},"全家")])]),s("label",null,[h("年份"),s("select",{id:"family-event-year"},[s("option",{value:""},"所有年份")])]),s("label",null,[h("排列"),s("select",{id:"family-event-order"},[s("option",{value:"desc"},"从近到远"),s("option",{value:"asc"},"从远到近")])]),s("label",null,[h("搜索记事"),s("input",{id:"family-event-search",type:"search",placeholder:"标题、摘要或正文"})]),s("label",{class:"check"},[s("input",{id:"family-event-relatives",type:"checkbox"}),h("包括此人的父母、配偶和子女")]),s("label",{id:"family-event-state-label"},[h("状态"),s("select",{id:"family-event-state"},[s("option",{value:"published"},"已发布"),s("option",{value:"draft"},"草稿箱"),s("option",{value:"archived"},"已归档"),s("option",{value:"all"},"全部")])]),s("button",{id:"family-event-clear",class:"quiet"},"清除筛选")]),s("p",{id:"family-event-count",class:"description",role:"status"}),s("div",{id:"family-timeline",class:"family-timeline"})]),s("div",{id:"family-map-footer",class:"family-map-footer"},[s("div",{class:"family-map-legend"},[s("span",null,[s("i",{class:"legend-self"}),h("本人")]),s("span",null,[s("i",{class:"legend-selected"}),h("正在查看")]),s("span",null,[s("i",{class:"legend-parent"}),h("父母 → 子女")]),s("span",null,[s("i",{class:"legend-spouse"}),h("配偶")]),s("span",null,[s("i",{class:"legend-adoptive"}),h("收养 / 继亲")])]),s("p",{id:"family-map-note",class:"description",role:"status"}),s("span",{class:"description"},"拖动空白处移动 · 点击人物查看档案 · 关系称谓按参照人物计算")])]),s("aside",{id:"family-detail",class:"panel family-inspector","aria-label":"人物档案"})])],-1)),L(ic),l[17]||(l[17]=ke('
账号与人物关系 ACCOUNTS + 新建账号 这里只管理当前家庭或场所的账号。新账号默认没有摄像头或家谱访问权限;可按需授权。亲属称呼与管理权限分别设置,无需为每位家谱人物创建账号。
',2))],64))}},au={};function ru(e,t){return P(),$(G,null,[t[0]||(t[0]=ke('关闭
档案名称 * 相关日期 讲述人 / 整理人 相关内容与来历 资料 / 报道链接 关联已有设备不关联设备 所有人 / 共有说明 保管人 意向接收人 交接意愿与说明 归档(保留资料,可恢复)
这里只保存资料和意愿;不会据此转移财产或授予任何账号权限。链接内容保存在原位置,本系统保存链接和文字记录。
空间档案 关闭 空间名称 * 上级区域 区域类别 用途家庭 办公场所 工厂 其他 所属家庭 / 单位
街道 / 乡镇 小区 / 园区 / 村 楼栋 单元 楼层 门牌号 详细地址 备注
镜头通道配置 关闭 账号和密码只保存在本机受限数据目录。RTSP 服务响应代表设备可达,实际码流接通后才显示在线。路径预设需要与设备型号、通道一致。
摄像头对象 关闭
录像机配置 关闭 驱动在当前版本提供路径模板。录像机历史录像检索、回放及通道自动导入,需要型号确认后接入,当前尚未实现。
',7)),t[1]||(t[1]=s("dialog",{id:"leadership-dialog"},[s("form",{id:"leadership-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"负责人安排与交接"),s("button",{type:"button",class:"quiet","data-close":"leadership-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("p",{class:"description"},"先建立至少两位家庭 / 场所管理员,再指定主要和备用负责人。家庭的主要负责人即一家之主;备用负责人已具有本归属管理权限,意外发生也能继续管理。正式交接由当前主要负责人或超级管理员办理。"),s("div",{class:"form-grid"},[s("label",null,[h("主要负责人 *"),s("select",{name:"ownerId",required:""})]),s("label",null,[h("备用负责人"),s("select",{name:"successorId"})]),s("label",{class:"full"},[h("安排 / 交接说明 *"),s("textarea",{name:"reason",required:"",maxlength:"300",rows:"3",placeholder:"说明负责人安排或本次交接原因"})])]),s("p",{class:"description"},"交接后原负责人仍保留本归属的管理员权限。系统不会依据未登录或家谱去世日期自动转移权限;交接记录可追溯。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"确认保存负责人安排")])])],-1)),t[2]||(t[2]=s("dialog",{id:"household-dialog"},[s("form",{id:"household-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"家庭 / 场所档案"),s("button",{type:"button",class:"quiet","data-close":"household-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"profileRevision",type:"hidden",value:"0"}),s("div",{class:"form-grid"},[s("label",{class:"full"},[h("归属名称 *"),s("input",{name:"name",maxlength:"80",required:"",placeholder:"例如:赵府、济南办公室、莱阳工厂"})]),s("label",{class:"full"},[h("归属类型"),s("select",{name:"kind"},[s("option",{value:"home"},"家庭"),s("option",{value:"office"},"办公场所"),s("option",{value:"factory"},"工厂")])]),s("fieldset",{class:"full geo-picker","data-geography":"","data-geo-title":"所在地"}),s("div",{class:"full cover-editor"},[s("img",{id:"household-cover-preview",alt:"场所封面预览",hidden:""}),s("label",null,[h("卡片封面照片"),s("input",{id:"household-cover-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"household-cover-cancel",class:"quiet"},"取消本次图片选择"),s("button",{type:"button",id:"household-cover-reset",class:"quiet"},"使用默认封面"),s("p",{id:"household-cover-status",class:"description",role:"status","aria-live":"polite"},"照片仅向有权进入该家庭或场所的账号开放。")]),s("label",{class:"full"},[h("备注"),s("textarea",{name:"note",maxlength:"300",rows:"3"})])]),s("p",{class:"description"},"创建后进入该归属,建立管理员,再自行划分区域和登记设备。"),s("p",{class:"form-error"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存家庭")])])],-1)),t[3]||(t[3]=ke('
账号档案 关闭
',2)),t[4]||(t[4]=s("dialog",{id:"person-dialog"},[s("form",{id:"person-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"家谱人物"),s("button",{type:"button",class:"quiet","data-close":"person-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("div",{class:"form-grid"},[s("label",null,[h("姓名 / 称呼 *"),s("input",{name:"name",required:"",maxlength:"80",placeholder:"姓名暂不知时可先填称呼"})]),s("label",null,[h("别名 / 字 / 号"),s("input",{name:"alias",maxlength:"120"})]),s("label",null,[h("性别"),s("select",{name:"gender"},[s("option",{value:"unknown"},"待确认"),s("option",{value:"male"},"男"),s("option",{value:"female"},"女")])]),s("label",null,[h("在世情况"),s("select",{name:"lifeStatus"},[s("option",{value:"alive"},"在世"),s("option",{value:"deceased"},"不在世"),s("option",{value:"unknown"},"待确认")])]),s("fieldset",{class:"family-date","data-date-field":"birthDate"},[s("legend",null,"出生日期"),s("input",{name:"birthDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"出生日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"出生日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),s("fieldset",{class:"family-date","data-date-field":"deathDate",hidden:""},[s("legend",null,"去世日期"),s("input",{name:"deathDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"去世日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"去世日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),s("label",{class:"full",id:"person-legacy-place"},[h("原籍贯/出生地记录"),s("input",{name:"birthplace",maxlength:"160"}),s("small",null,"历史填写内容保留,可在下方分别补充。")]),s("fieldset",{class:"full person-location"},[s("legend",null,"籍贯(祖籍)"),s("div",{class:"form-grid"},[s("fieldset",{class:"full geo-picker","data-geography":"native","data-geo-title":"籍贯(祖籍)"}),s("label",null,[h("乡镇/街道"),s("input",{name:"nativeTown",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 乡镇/街道"})]),s("label",null,[h("村/社区"),s("input",{name:"nativeCommunity",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 村/社区"})]),s("label",{class:"full"},[h("详细地址/历史地名"),s("input",{name:"nativeAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"籍贯(祖籍) · 详细地址/历史地名"})])])]),s("fieldset",{class:"full person-location"},[s("legend",null,"出生地"),s("div",{class:"form-grid"},[s("fieldset",{class:"full geo-picker","data-geography":"birth","data-geo-title":"出生地"}),s("label",null,[h("乡镇/街道"),s("input",{name:"birthTown",maxlength:"80",placeholder:"","aria-label":"出生地 · 乡镇/街道"})]),s("label",null,[h("村/社区"),s("input",{name:"birthCommunity",maxlength:"80",placeholder:"","aria-label":"出生地 · 村/社区"})]),s("label",{class:"full"},[h("详细地址/历史地名"),s("input",{name:"birthAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"出生地 · 详细地址/历史地名"})])])]),s("p",{class:"description full"},"籍贯与出生地可不同;选择中国、世界或自定义地域,不详的层级可留空。"),s("label",{class:"full"},[h("生平简介"),s("textarea",{name:"biography",rows:"4",maxlength:"2000"})]),s("label",{class:"full"},[h("备注 / 信息来源"),s("textarea",{name:"note",rows:"3",maxlength:"500",placeholder:"例如:长辈口述、族谱记载、待考证信息"})]),s("label",{class:"check"},[s("input",{name:"archived",type:"checkbox"}),h("归档人物(保留关系,可恢复)")])]),s("p",{class:"form-error"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存人物")])])],-1)),t[5]||(t[5]=ke('
连接人物关系 关闭 关系类型父母 → 子女 配偶 ↔ 配偶 亲子属性未注明 亲生 收养 继亲 父母一方 / 配偶一方 子女 / 另一位配偶 关系备注 关系有效(取消后保留记录,可恢复)
每条亲子关系连接一位父母与一位子女。录入另一位父母时,再建立一条关系。
',1)),t[6]||(t[6]=s("dialog",{id:"event-dialog","aria-labelledby":"event-editor-title"},[s("form",{id:"event-form"},[s("div",{class:"dialog-heading"},[s("h2",{id:"event-editor-title"},"写一则家族记事"),s("button",{type:"button",class:"quiet","data-close":"event-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("div",{class:"form-grid"},[s("label",{class:"full"},[h("记事标题 *"),s("input",{name:"title",required:"",maxlength:"160",placeholder:"用一句话概括这件事"})]),s("fieldset",{class:"family-date full","data-date-field":"eventDate"},[s("legend",null,"事情发生的日期 *"),s("input",{name:"eventDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"记事日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"记事日期",required:"",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"})]),s("fieldset",{class:"full"},[s("legend",null,"关联人物(可多选)"),s("input",{id:"event-person-search",type:"search",placeholder:"查找要关联的亲人","aria-label":"查找关联人物"}),s("div",{id:"event-person-choices"}),s("p",{class:"description"},"未选择人物时记为全家记事。每位关联人物的档案都可以追溯到这条记事。")]),s("label",{class:"full"},[h("摘要"),s("textarea",{name:"summary",maxlength:"400",rows:"2",placeholder:"简要说明这件事"})]),s("label",{class:"full"},[h("详细记载"),s("textarea",{name:"body",maxlength:"12000",rows:"7",placeholder:"记录经过、意义、长辈口述或资料出处。可分段书写。"})]),s("label",null,[h("报道 / 资料来源"),s("input",{name:"sourceName",maxlength:"160",placeholder:"例如:报刊名称、个人博客"})]),s("label",null,[h("原始报道链接"),s("input",{name:"sourceUrl",type:"url",maxlength:"2000",placeholder:"https://…"})]),s("label",{class:"check full"},[s("input",{name:"archived",type:"checkbox"}),h("归档记事(保留内容,可恢复)")])]),s("p",{class:"description"},"正式发布后,有家谱查看权限的账号即可在时间线看到;草稿只对有编辑权限的人可见。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer event-editor-actions"},[s("button",{type:"submit","data-save-event":"",value:"draft",class:"secondary"},"保存草稿"),s("button",{type:"submit","data-publish-event":"",value:"published"},"发布记事"),s("button",{type:"submit","data-withdraw-event":"",value:"draft",class:"secondary",hidden:""},"撤回为草稿")])])],-1)),t[7]||(t[7]=ke('家事 · 家声 关闭
',1)),t[8]||(t[8]=s("dialog",{id:"history-dialog","aria-labelledby":"history-title"},[s("div",{class:"dialog-heading"},[s("h2",{id:"history-title"},"修改记录"),s("button",{type:"button",class:"quiet","data-close":"history-dialog"},"关闭")]),s("p",{class:"description"},"人物、关系与记事每次保存都会留存版本。仅有家谱编辑权限的账号可查阅和恢复。"),s("p",{id:"history-error",class:"form-error",role:"status"}),s("div",{id:"history-list"}),s("button",{id:"history-more",class:"quiet",hidden:""},"加载更早记录"),s("article",{id:"history-detail"})],-1)),t[9]||(t[9]=s("dialog",{id:"password-dialog","aria-labelledby":"password-title"},[s("form",{id:"password-form"},[s("div",{class:"dialog-heading"},[s("h2",{id:"password-title"},"修改我的密码"),s("button",{type:"button",class:"quiet","data-close":"password-dialog"},"关闭")]),s("p",{id:"password-account",class:"description"}),s("label",null,[h("当前密码"),s("input",{name:"currentPassword",type:"password",required:"",maxlength:"128",autocomplete:"current-password"})]),s("label",null,[h("新密码"),s("input",{name:"newPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),s("label",null,[h("再次输入新密码"),s("input",{name:"confirmPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),s("p",{class:"description"},"保存后,这个账号在所有设备上都需要用新密码重新登录。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存新密码")])])],-1)),t[10]||(t[10]=s("dialog",{id:"camera-settings-dialog","aria-labelledby":"camera-settings-title"},[s("div",{class:"dialog-heading"},[s("h2",{id:"camera-settings-title"},"摄像机参数"),s("button",{class:"quiet","data-close":"camera-settings-dialog"},"关闭")]),s("div",{class:"section-head"},[s("label",null,[h("设置码流"),s("select",{id:"camera-settings-quality"},[s("option",{value:"main"},"主码流"),s("option",{value:"sub"},"子码流")])]),s("button",{id:"camera-settings-reload",class:"quiet"},"重新读取")]),s("div",{id:"camera-settings-info"}),s("p",{id:"camera-settings-status",class:"form-error",role:"status"}),s("form",{id:"camera-image-form"},[s("h3",null,"图像与日夜模式"),s("p",{class:"description"},"作用于当前物理镜头,主、子码流共用这些图像参数。"),s("div",{id:"camera-image-fields",class:"form-grid"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit",disabled:""},"保存图像参数")])]),s("form",{id:"camera-video-form"},[s("h3",null,"码流与清晰度"),s("p",{class:"description"},"作用于上方选定的码流。保存后画面可能短暂重连,录像机也会使用调整后的码流。本页保留原有视频编码。"),s("div",{id:"camera-video-fields",class:"form-grid"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit",disabled:""},"保存码流参数")])]),s("details",null,[s("summary",null,"其他萤石功能的接入情况"),s("ul",null,[s("li",null,"云台方向微调与预置位:在实时画面的“云台”中使用,按设备能力启用。"),s("li",null,"实时声音与全屏:通过画面播放器控制。"),s("li",null,"双向对讲、智能追踪、声光告警、隐私遮蔽、设备翻转、云录像和消息推送:当前尚未接入,请使用萤石 App。"),s("li",null,"录像机原有录像:仍通过录像机或原厂 App 查看;本系统已支持本机额外录像的回放。")]),s("p",{class:"description"},"功能按设备实际开放能力逐项接入,型号与固件不同可能有差异。")])],-1)),t[11]||(t[11]=s("div",{id:"toast",role:"status",hidden:""},null,-1)),t[12]||(t[12]=ke('
画面截图 关闭
下载 PNG 图片
',2))],64)}const cu=xi(au,[["render",ru]]),uu=["/vendor/hls.min.js","/live-player.js","/kinship.js","/family-graph.js","/calendar.js","/device-model.js","/data/geography-data.js","/geography.js","/app.js","/monitor.js","/date-fields.js","/family-map.js","/family.js","/family-events.js","/family-history.js","/camera-settings.js","/recording-ranges.js","/recording-ui.js","/snapshot.js","/households.js","/devices.js","/steward.js","/heritage.js","/personalization.js","/file-hash.js","/journal.js"];function rn(e){if(!(e instanceof Element))return;const t=[e,...e.querySelectorAll("button,input,select,textarea,table")];for(const l of t)l.matches("button")&&!l.closest(".family-map-viewport")&&!l.classList.contains("btn")&&l.classList.add("btn",l.matches(".quiet,.secondary")?"btn-outline-secondary":"btn-primary"),l.matches("select")&&l.classList.add("form-select"),l.matches("textarea,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden])")&&l.classList.add("form-control"),l.matches("input[type=checkbox],input[type=radio]")&&l.classList.add("form-check-input"),l.matches("table")&&l.classList.add("table","align-middle")}async function du(){rn(document.getElementById("app")),new MutationObserver(e=>{for(const t of e)for(const l of t.addedNodes)rn(l)}).observe(document.getElementById("app"),{childList:!0,subtree:!0});for(const e of[...uu,"/vue-bridge.js"])await new Promise((t,l)=>{const n=document.createElement("script");n.src=e+"?ui=0.1.35",n.onload=t,n.onerror=()=>l(new Error("Could not load "+e)),document.head.append(n)});await window.ZhaoVue.boot()}const fu={key:0,class:"alert alert-danger",role:"alert"},pu={__name:"App",setup(e){const t=Se(!1);return zn(async()=>{try{await du()}catch(l){console.error("Application startup failed",l),t.value=!0}}),(l,n)=>(P(),$(G,null,[L(ir),s("main",null,[L(rr),t.value?(P(),$("div",fu,"页面组件加载失败,请检查网络后重新打开页面。")):B("",!0),L(ou)]),L(cu)],64))}};Ka(pu).mount("#app");
diff --git a/web/ui/index.html b/web/ui/index.html
new file mode 100644
index 0000000..ffd217c
--- /dev/null
+++ b/web/ui/index.html
@@ -0,0 +1,3 @@
+赵府 · 智能数字管家
+
+
diff --git a/web/vue-bridge.js b/web/vue-bridge.js
new file mode 100644
index 0000000..db4b687
--- /dev/null
+++ b/web/vue-bridge.js
@@ -0,0 +1,11 @@
+'use strict';
+Object.assign(window.ZhaoVue,{
+ boot:bootApplication,
+ publish(){this.accept({state,user:currentUser,admin:isAdmin(),platformAdmin:isPlatformAdmin(),loggedIn,page:activePage,session:sessionGeneration,device:selectedDevice(),brandName:branding.name});},
+ api,notify:toast,address:ZhaoGeography.describe,
+ async saveLayout(value){const saved=await api('/api/households/layout',value);state.householdLayout=saved;this.publish();return saved;},
+ async enterHome(id,network=false){try{if(id!==state.familyId&&!await switchHousehold(id))return;if(network){devicePresentation='topology';showPage('objects');}else showPage('overview');}catch(e){if(!e.stale)toast(e.message);}},
+ enterDevice,
+ location(id){return siteName(id);},
+ network(device){return ZhaoDevices.network(device,state);}
+});