From b4e99240c688bf7bb96f4eb419faf699e155aace Mon Sep 17 00:00:00 2001 From: tajniak81 <13187254+tajniak81@users.noreply.github.com> Date: Fri, 21 Aug 2026 22:56:53 +0200 Subject: [PATCH] API panel: document the whole REST surface, not half of it The API section's tables are hand-maintained and carry a comment saying they mirror the routes in server.go. They had stopped: 60 rows against 141 routes, so 81 endpoints were reachable and undocumented. Everything added since the tables were written is in that gap - technical checks, fuel, charging, maintenance, documents, reminders, attachments, the vehicle-provider and integration surfaces, and the OCPP socket - along with the per-car sub-resources (fuel-stats, charging-stats, the provider routes) and PUT /api/cars/{id}/view. Ten new groups, 60 rows to 123, and nothing listed that no longer exists. Checked by extracting every mux.Handle route from server.go and diffing it against every row in the tables rather than by reading both lists: the seven attachmentRoutes calls expand to their 21 concrete routes, the three static panel paths are excluded, and the diff is empty in both directions. That script is not committed - it is a one-off, and a real guard belongs in the Go tests where it can see the mux, which is worth doing if these tables drift again. The flat list endpoints require ?car={id} - they refuse a cross-car listing so access can be enforced - so the ones that do now say it. Attachments are documented once with {records} standing for the seven collections that take a file, because all seven behave identically and seven copies of three rows would bury that. EndpointTable grew an optional note line under the header to say what {records} means. Two things fixed while in there. PUT rendered uncolored - methodClass has had no PUT entry since the superadmin group started using it - and the longest paths, the per-charger OCPP control routes, overran the card and were clipped by its overflow-hidden rather than scrolling; the table sits in an overflow-x-auto wrapper now. Thirteen of the eighteen tables scroll at phone width, four of them before this commit's rows were added. Group titles are translated in all three languages, plus one new auth label for the OCPP socket, which authenticates the charger with OCPP Basic auth rather than a bearer token. The endpoint descriptions stay English: TRANSLATIONS.md calls them developer reference documentation, and this commit does not reopen that. Verified by go build ./... and go vet ./internal/api, and by driving the panel in a browser against a mock API Server standing in for the real one - all eighteen tables render, the {records} note and the PUT color show, the Polish titles resolve, and no table clips at 375px. dist is rebuilt so the embedded panel matches the source. Not verified: nothing ran against a live API Server, so the descriptions are checked against the handlers' code and comments rather than against responses. The mock only answers /api/identity and /api/status, which is enough to get past the login gate and reach the section. Co-Authored-By: Claude Opus 5 --- .../api/dist/assets/index-B4_v9nDZ.js | 17 --- .../api/dist/assets/index-CGuUVjJH.css | 1 + .../api/dist/assets/index-D2BCqgpA.js | 17 +++ .../api/dist/assets/index-D3MeNcl7.css | 1 - API Server/internal/api/dist/index.html | 4 +- API Server/panel/src/App.vue | 119 +++++++++++++++++- .../panel/src/components/EndpointTable.vue | 57 +++++---- API Server/panel/src/i18n/da.json | 11 ++ API Server/panel/src/i18n/en.json | 11 ++ API Server/panel/src/i18n/pl.json | 11 ++ 10 files changed, 203 insertions(+), 46 deletions(-) delete mode 100644 API Server/internal/api/dist/assets/index-B4_v9nDZ.js create mode 100644 API Server/internal/api/dist/assets/index-CGuUVjJH.css create mode 100644 API Server/internal/api/dist/assets/index-D2BCqgpA.js delete mode 100644 API Server/internal/api/dist/assets/index-D3MeNcl7.css diff --git a/API Server/internal/api/dist/assets/index-B4_v9nDZ.js b/API Server/internal/api/dist/assets/index-B4_v9nDZ.js deleted file mode 100644 index 6556b9b..0000000 --- a/API Server/internal/api/dist/assets/index-B4_v9nDZ.js +++ /dev/null @@ -1,17 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();/** -* @vue/shared v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function cn(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const Y={},xt=[],Ke=()=>{},mi=()=>!1,Ts=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Es=e=>e.startsWith("onUpdate:"),he=Object.assign,un=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Ao=Object.prototype.hasOwnProperty,G=(e,t)=>Ao.call(e,t),M=Array.isArray,kt=e=>es(e)==="[object Map]",zt=e=>es(e)==="[object Set]",Rn=e=>es(e)==="[object Date]",V=e=>typeof e=="function",ne=e=>typeof e=="string",We=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",bi=e=>(Z(e)||V(e))&&V(e.then)&&V(e.catch),vi=Object.prototype.toString,es=e=>vi.call(e),Oo=e=>es(e).slice(8,-1),_i=e=>es(e)==="[object Object]",dn=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ft=cn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),$s=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},zo=/-\w/g,Ce=$s(e=>e.replace(zo,t=>t.slice(1).toUpperCase())),Io=/\B([A-Z])/g,dt=$s(e=>e.replace(Io,"-$1").toLowerCase()),yi=$s(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ds=$s(e=>e?`on${yi(e)}`:""),Ve=(e,t)=>!Object.is(e,t),fs=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Cs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let jn;const Ps=()=>jn||(jn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function fn(e){if(M(e)){const t={};for(let s=0;s{if(s){const n=s.split(jo);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Oe(e){let t="";if(ne(e))t=e;else if(M(e))for(let s=0;sat(s,t))}const ki=e=>!!(e&&e.__v_isRef===!0),m=e=>ne(e)?e:e==null?"":M(e)||Z(e)&&(e.toString===vi||!V(e.toString))?ki(e)?m(e.value):JSON.stringify(e,Si,2):String(e),Si=(e,t)=>ki(t)?Si(e,t.value):kt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,i],o)=>(s[Ms(n,o)+" =>"]=i,s),{})}:zt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Ms(s))}:We(t)?Ms(t):Z(t)&&!M(t)&&!_i(t)?String(t):t,Ms=(e,t="")=>{var s;return We(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/** -* @vue/reactivity v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let ce;class Fo{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&&ce&&(ce.active?(this.parent=ce,this.index=(ce.scopes||(ce.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0){if(ce===this)ce=this.prevScope;else{let t=ce;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 s,n;for(s=0,n=this.effects.length;s0)return;if(Ht){let t=Ht;for(Ht=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Bt;){let t=Bt;for(Bt=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Ci(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Pi(e){let t,s=e.depsTail,n=s;for(;n;){const i=n.prevDep;n.version===-1?(n===s&&(s=i),mn(n),Ho(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=s}function Js(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ai(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ai(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===qt)||(e.globalVersion=qt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Js(e))))return;e.flags|=2;const t=e.dep,s=Q,n=Pe;Q=e,Pe=!0;try{Ci(e);const i=e.fn(e._value);(t.version===0||Ve(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{Q=s,Pe=n,Pi(e),e.flags&=-3}}function mn(e,t=!1){const{dep:s,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)mn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ho(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Pe=!0;const Oi=[];function Ge(){Oi.push(Pe),Pe=!1}function qe(){const e=Oi.pop();Pe=e===void 0?!0:e}function Nn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=Q;Q=void 0;try{t()}finally{Q=s}}}let qt=0;class Vo{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class bn{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(!Q||!Pe||Q===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==Q)s=this.activeLink=new Vo(Q,this),Q.deps?(s.prevDep=Q.depsTail,Q.depsTail.nextDep=s,Q.depsTail=s):Q.deps=Q.depsTail=s,zi(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=Q.depsTail,s.nextDep=void 0,Q.depsTail.nextDep=s,Q.depsTail=s,Q.deps===s&&(Q.deps=n)}return s}trigger(t){this.version++,qt++,this.notify(t)}notify(t){hn();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{gn()}}}function zi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)zi(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const Ys=new WeakMap,vt=Symbol(""),Xs=Symbol(""),Zt=Symbol("");function fe(e,t,s){if(Pe&&Q){let n=Ys.get(e);n||Ys.set(e,n=new Map);let i=n.get(s);i||(n.set(s,i=new bn),i.map=n,i.key=s),i.track()}}function Qe(e,t,s,n,i,o){const r=Ys.get(e);if(!r){qt++;return}const l=a=>{a&&a.trigger()};if(hn(),t==="clear")r.forEach(l);else{const a=M(e),p=a&&dn(s);if(a&&s==="length"){const d=Number(n);r.forEach((b,C)=>{(C==="length"||C===Zt||!We(C)&&C>=d)&&l(b)})}else switch((s!==void 0||r.has(void 0))&&l(r.get(s)),p&&l(r.get(Zt)),t){case"add":a?p&&l(r.get("length")):(l(r.get(vt)),kt(e)&&l(r.get(Xs)));break;case"delete":a||(l(r.get(vt)),kt(e)&&l(r.get(Xs)));break;case"set":kt(e)&&l(r.get(vt));break}}gn()}function yt(e){const t=W(e);return t===e?t:(fe(t,"iterate",Zt),Te(e)?t:t.map(ze))}function As(e){return fe(e=W(e),"iterate",Zt),e}function Be(e,t){return st(e)?$t(_t(e)?ze(t):t):ze(t)}const Ko={__proto__:null,[Symbol.iterator](){return Fs(this,Symbol.iterator,e=>Be(this,e))},concat(...e){return yt(this).concat(...e.map(t=>M(t)?yt(t):t))},entries(){return Fs(this,"entries",e=>(e[1]=Be(this,e[1]),e))},every(e,t){return Ze(this,"every",e,t,void 0,arguments)},filter(e,t){return Ze(this,"filter",e,t,s=>s.map(n=>Be(this,n)),arguments)},find(e,t){return Ze(this,"find",e,t,s=>Be(this,s),arguments)},findIndex(e,t){return Ze(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ze(this,"findLast",e,t,s=>Be(this,s),arguments)},findLastIndex(e,t){return Ze(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ze(this,"forEach",e,t,void 0,arguments)},includes(...e){return Bs(this,"includes",e)},indexOf(...e){return Bs(this,"indexOf",e)},join(e){return yt(this).join(e)},lastIndexOf(...e){return Bs(this,"lastIndexOf",e)},map(e,t){return Ze(this,"map",e,t,void 0,arguments)},pop(){return Ut(this,"pop")},push(...e){return Ut(this,"push",e)},reduce(e,...t){return Un(this,"reduce",e,t)},reduceRight(e,...t){return Un(this,"reduceRight",e,t)},shift(){return Ut(this,"shift")},some(e,t){return Ze(this,"some",e,t,void 0,arguments)},splice(...e){return Ut(this,"splice",e)},toReversed(){return yt(this).toReversed()},toSorted(e){return yt(this).toSorted(e)},toSpliced(...e){return yt(this).toSpliced(...e)},unshift(...e){return Ut(this,"unshift",e)},values(){return Fs(this,"values",e=>Be(this,e))}};function Fs(e,t,s){const n=As(e),i=n[t]();return n!==e&&!Te(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=s(o.value)),o}),i}const Wo=Array.prototype;function Ze(e,t,s,n,i,o){const r=As(e),l=r!==e&&!Te(e),a=r[t];if(a!==Wo[t]){const b=a.apply(e,o);return l?ze(b):b}let p=s;r!==e&&(l?p=function(b,C){return s.call(this,Be(e,b),C,e)}:s.length>2&&(p=function(b,C){return s.call(this,b,C,e)}));const d=a.call(r,p,n);return l&&i?i(d):d}function Un(e,t,s,n){const i=As(e),o=i!==e&&!Te(e);let r=s,l=!1;i!==e&&(o?(l=n.length===0,r=function(p,d,b){return l&&(l=!1,p=Be(e,p)),s.call(this,p,Be(e,d),b,e)}):s.length>3&&(r=function(p,d,b){return s.call(this,p,d,b,e)}));const a=i[t](r,...n);return l?Be(e,a):a}function Bs(e,t,s){const n=W(e);fe(n,"iterate",Zt);const i=n[t](...s);return(i===-1||i===!1)&&yn(s[0])?(s[0]=W(s[0]),n[t](...s)):i}function Ut(e,t,s=[]){Ge(),hn();const n=W(e)[t].apply(e,s);return gn(),qe(),n}const Go=cn("__proto__,__v_isRef,__isVue"),Ii=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(We));function qo(e){We(e)||(e=String(e));const t=W(this);return fe(t,"has",e),t.hasOwnProperty(e)}class Ri{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!i;if(s==="__v_isReadonly")return i;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(i?o?ir:Di:o?Ui:Ni).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=M(t);if(!i){let a;if(r&&(a=Ko[s]))return a;if(s==="hasOwnProperty")return qo}const l=Reflect.get(t,s,pe(t)?t:n);if((We(s)?Ii.has(s):Go(s))||(i||fe(t,"get",s),o))return l;if(pe(l)){const a=r&&dn(s)?l:l.value;return i&&Z(a)?en(a):a}return Z(l)?i?en(l):Jt(l):l}}class ji extends Ri{constructor(t=!1){super(!1,t)}set(t,s,n,i){let o=t[s];const r=M(t)&&dn(s);if(!this._isShallow){const p=st(o);if(!Te(n)&&!st(n)&&(o=W(o),n=W(n)),!r&&pe(o)&&!pe(n))return p||(o.value=n),!0}const l=r?Number(s)e,as=e=>Reflect.getPrototypeOf(e);function Qo(e,t,s){return function(...n){const i=this.__v_raw,o=W(i),r=kt(o),l=e==="entries"||e===Symbol.iterator&&r,a=e==="keys"&&r,p=i[e](...n),d=s?Qs:t?$t:ze;return!t&&fe(o,"iterate",a?Xs:vt),he(Object.create(p),{next(){const{value:b,done:C}=p.next();return C?{value:b,done:C}:{value:l?[d(b[0]),d(b[1])]:d(b),done:C}}})}}function cs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function er(e,t){const s={get(i){const o=this.__v_raw,r=W(o),l=W(i);e||(Ve(i,l)&&fe(r,"get",i),fe(r,"get",l));const{has:a}=as(r),p=t?Qs:e?$t:ze;if(a.call(r,i))return p(o.get(i));if(a.call(r,l))return p(o.get(l));o!==r&&o.get(i)},get size(){const i=this.__v_raw;return!e&&fe(W(i),"iterate",vt),i.size},has(i){const o=this.__v_raw,r=W(o),l=W(i);return e||(Ve(i,l)&&fe(r,"has",i),fe(r,"has",l)),i===l?o.has(i):o.has(i)||o.has(l)},forEach(i,o){const r=this,l=r.__v_raw,a=W(l),p=t?Qs:e?$t:ze;return!e&&fe(a,"iterate",vt),l.forEach((d,b)=>i.call(o,p(d),p(b),r))}};return he(s,e?{add:cs("add"),set:cs("set"),delete:cs("delete"),clear:cs("clear")}:{add(i){const o=W(this),r=as(o),l=W(i),a=!t&&!Te(i)&&!st(i)?l:i;return r.has.call(o,a)||Ve(i,a)&&r.has.call(o,i)||Ve(l,a)&&r.has.call(o,l)||(o.add(a),Qe(o,"add",a,a)),this},set(i,o){!t&&!Te(o)&&!st(o)&&(o=W(o));const r=W(this),{has:l,get:a}=as(r);let p=l.call(r,i);p||(i=W(i),p=l.call(r,i));const d=a.call(r,i);return r.set(i,o),p?Ve(o,d)&&Qe(r,"set",i,o):Qe(r,"add",i,o),this},delete(i){const o=W(this),{has:r,get:l}=as(o);let a=r.call(o,i);a||(i=W(i),a=r.call(o,i)),l&&l.call(o,i);const p=o.delete(i);return a&&Qe(o,"delete",i,void 0),p},clear(){const i=W(this),o=i.size!==0,r=i.clear();return o&&Qe(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{s[i]=Qo(i,e,t)}),s}function vn(e,t){const s=er(e,t);return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(G(s,i)&&i in n?s:n,i,o)}const tr={get:vn(!1,!1)},sr={get:vn(!1,!0)},nr={get:vn(!0,!1)};const Ni=new WeakMap,Ui=new WeakMap,Di=new WeakMap,ir=new WeakMap;function or(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Jt(e){return st(e)?e:_n(e,!1,Jo,tr,Ni)}function rr(e){return _n(e,!1,Xo,sr,Ui)}function en(e){return _n(e,!0,Yo,nr,Di)}function _n(e,t,s,n,i){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=i.get(e);if(o)return o;const r=or(Oo(e));if(r===0)return e;const l=new Proxy(e,r===2?n:s);return i.set(e,l),l}function _t(e){return st(e)?_t(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Te(e){return!!(e&&e.__v_isShallow)}function yn(e){return e?!!e.__v_raw:!1}function W(e){const t=e&&e.__v_raw;return t?W(t):e}function lr(e){return!G(e,"__v_skip")&&Object.isExtensible(e)&&wi(e,"__v_skip",!0),e}const ze=e=>Z(e)?Jt(e):e,$t=e=>Z(e)?en(e):e;function pe(e){return e?e.__v_isRef===!0:!1}function B(e){return ar(e,!1)}function ar(e,t){return pe(e)?e:new cr(e,t)}class cr{constructor(t,s){this.dep=new bn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:W(t),this._value=s?t:ze(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Te(t)||st(t);t=n?t:W(t),Ve(t,s)&&(this._rawValue=t,this._value=n?t:ze(t),this.dep.trigger())}}function g(e){return pe(e)?e.value:e}const ur={get:(e,t,s)=>t==="__v_raw"?e:g(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const i=e[t];return pe(i)&&!pe(s)?(i.value=s,!0):Reflect.set(e,t,s,n)}};function Mi(e){return _t(e)?e:new Proxy(e,ur)}class dr{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new bn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=qt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&Q!==this)return $i(this,!0),!0}get value(){const t=this.dep.track();return Ai(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function fr(e,t,s=!1){let n,i;return V(e)?n=e:(n=e.get,i=e.set),new dr(n,i,s)}const us={},ms=new WeakMap;let bt;function pr(e,t=!1,s=bt){if(s){let n=ms.get(s);n||ms.set(s,n=[]),n.push(e)}}function hr(e,t,s=Y){const{immediate:n,deep:i,once:o,scheduler:r,augmentJob:l,call:a}=s,p=N=>i?N:Te(N)||i===!1||i===0?et(N,1):et(N);let d,b,C,O,F=!1,_=!1;if(pe(e)?(b=()=>e.value,F=Te(e)):_t(e)?(b=()=>p(e),F=!0):M(e)?(_=!0,F=e.some(N=>_t(N)||Te(N)),b=()=>e.map(N=>{if(pe(N))return N.value;if(_t(N))return p(N);if(V(N))return a?a(N,2):N()})):V(e)?t?b=a?()=>a(e,2):e:b=()=>{if(C){Ge();try{C()}finally{qe()}}const N=bt;bt=d;try{return a?a(e,3,[O]):e(O)}finally{bt=N}}:b=Ke,t&&i){const N=b,oe=i===!0?1/0:i;b=()=>et(N(),oe)}const E=Bo(),w=()=>{d.stop(),E&&E.active&&un(E.effects,d)};if(o&&t){const N=t;t=(...oe)=>{const Re=N(...oe);return w(),Re}}let P=_?new Array(e.length).fill(us):us;const j=N=>{if(!(!(d.flags&1)||!d.dirty&&!N))if(t){const oe=d.run();if(N||i||F||(_?oe.some((Re,je)=>Ve(Re,P[je])):Ve(oe,P))){C&&C();const Re=bt;bt=d;try{const je=[oe,P===us?void 0:_&&P[0]===us?[]:P,O];P=oe,a?a(t,3,je):t(...je)}finally{bt=Re}}}else d.run()};return l&&l(j),d=new Ti(b),d.scheduler=r?()=>r(j,!1):j,O=N=>pr(N,!1,d),C=d.onStop=()=>{const N=ms.get(d);if(N){if(a)a(N,4);else for(const oe of N)oe();ms.delete(d)}},t?n?j(!0):P=d.run():r?r(j.bind(null,!0),!0):d.run(),w.pause=d.pause.bind(d),w.resume=d.resume.bind(d),w.stop=w,w}function et(e,t=1/0,s){if(t<=0||!Z(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,pe(e))et(e.value,t,s);else if(M(e))for(let n=0;n{et(n,t,s)});else if(_i(e)){for(const n in e)et(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&et(e[n],t,s)}return e}/** -* @vue/runtime-core v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ts(e,t,s,n){try{return n?e(...n):e()}catch(i){Os(i,t,s)}}function Ie(e,t,s,n){if(V(e)){const i=ts(e,t,s,n);return i&&bi(i)&&i.catch(o=>{Os(o,t,s)}),i}if(M(e)){const i=[];for(let o=0;o>>1,i=be[n],o=Yt(i);o=Yt(s)?be.push(e):be.splice(mr(t),0,e),e.flags|=1,Bi()}}function Bi(){bs||(bs=Li.then(Vi))}function br(e){M(e)?St.push(...e):lt&&e.id===-1?lt.splice(wt+1,0,e):e.flags&1||(St.push(e),e.flags|=1),Bi()}function Dn(e,t,s=Fe+1){for(;sYt(s)-Yt(n));if(St.length=0,lt){lt.push(...t);return}for(lt=t,wt=0;wte.id==null?e.flags&2?-1:1/0:e.id;function Vi(e){try{for(Fe=0;Fe{n._d&&Zn(-1);const o=vs(t);let r;try{r=e(...i)}finally{vs(o),n._d&&Zn(1)}return r};return n._n=!0,n._c=!0,n._d=!0,n}function re(e,t){if(ke===null)return e;const s=js(ke),n=e.dirs||(e.dirs=[]);for(let i=0;i1)return s&&V(t)?t.call(n&&n.proxy):t}}const yr=Symbol.for("v-scx"),wr=()=>ps(yr);function Hs(e,t,s){return Wi(e,t,s)}function Wi(e,t,s=Y){const{immediate:n,deep:i,flush:o,once:r}=s,l=he({},s),a=t&&n||!t&&o!=="post";let p;if(Qt){if(o==="sync"){const O=wr();p=O.__watcherHandles||(O.__watcherHandles=[])}else if(!a){const O=()=>{};return O.stop=Ke,O.resume=Ke,O.pause=Ke,O}}const d=ve;l.call=(O,F,_)=>Ie(O,d,F,_);let b=!1;o==="post"?l.scheduler=O=>{_e(O,d&&d.suspense)}:o!=="sync"&&(b=!0,l.scheduler=(O,F)=>{F?O():wn(O)}),l.augmentJob=O=>{t&&(O.flags|=4),b&&(O.flags|=2,d&&(O.id=d.uid,O.i=d))};const C=hr(e,t,l);return Qt&&(p?p.push(C):a&&C()),C}function xr(e,t,s){const n=this.proxy,i=ne(e)?e.includes(".")?Gi(n,e):()=>n[e]:e.bind(n,n);let o;V(t)?o=t:(o=t.handler,s=t);const r=ss(this),l=Wi(i,o.bind(n),s);return r(),l}function Gi(e,t){const s=t.split(".");return()=>{let n=e;for(let i=0;ie.__isTeleport,Vs=Symbol("_leaveCb");function xn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,xn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function qi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Mn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const _s=new WeakMap;function Vt(e,t,s,n,i=!1){if(M(e)){e.forEach((_,E)=>Vt(_,t&&(M(t)?t[E]:t),s,n,i));return}if(Kt(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Vt(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?js(n.component):n.el,r=i?null:o,{i:l,r:a}=e,p=t&&t.r,d=l.refs===Y?l.refs={}:l.refs,b=l.setupState,C=W(b),O=b===Y?mi:_=>Mn(d,_)?!1:G(C,_),F=(_,E)=>!(E&&Mn(d,E));if(p!=null&&p!==a){if(Ln(t),ne(p))d[p]=null,O(p)&&(b[p]=null);else if(pe(p)){const _=t;F(p,_.k)&&(p.value=null),_.k&&(d[_.k]=null)}}if(V(a)){Ge();try{ts(a,l,12,[r,d])}finally{qe()}}else{const _=ne(a),E=pe(a);if(_||E){const w=()=>{if(e.f){const P=_?O(a)?b[a]:d[a]:F()||!e.k?a.value:d[e.k];if(i)M(P)&&un(P,o);else if(M(P))P.includes(o)||P.push(o);else if(_)d[a]=[o],O(a)&&(b[a]=d[a]);else{const j=[o];F(a,e.k)&&(a.value=j),e.k&&(d[e.k]=j)}}else _?(d[a]=r,O(a)&&(b[a]=r)):E&&(F(a,e.k)&&(a.value=r),e.k&&(d[e.k]=r))};if(r){const P=()=>{w(),_s.delete(e)};P.id=-1,_s.set(e,P),_e(P,s)}else Ln(e),w()}}}function Ln(e){const t=_s.get(e);t&&(t.flags|=8,_s.delete(e))}Ps().requestIdleCallback;Ps().cancelIdleCallback;const Kt=e=>!!e.type.__asyncLoader,Zi=e=>e.type.__isKeepAlive;function Tr(e,t){Ji(e,"a",t)}function Er(e,t){Ji(e,"da",t)}function Ji(e,t,s=ve){const n=e.__wdc||(e.__wdc=()=>{let i=s;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(zs(t,n,s),s){let i=s.parent;for(;i&&i.parent;)Zi(i.parent.vnode)&&$r(n,t,s,i),i=i.parent}}function $r(e,t,s,n){const i=zs(t,e,n,!0);kn(()=>{un(n[t],i)},s)}function zs(e,t,s=ve,n=!1){if(s){const i=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...r)=>{Ge();const l=ss(s),a=Ie(t,s,e,r);return l(),qe(),a});return n?i.unshift(o):i.push(o),o}}const nt=e=>(t,s=ve)=>{(!Qt||e==="sp")&&zs(e,(...n)=>t(...n),s)},Cr=nt("bm"),it=nt("m"),Pr=nt("bu"),Ar=nt("u"),Or=nt("bum"),kn=nt("um"),zr=nt("sp"),Ir=nt("rtg"),Rr=nt("rtc");function jr(e,t=ve){zs("ec",e,t)}const Nr=Symbol.for("v-ndc");function Se(e,t,s,n){let i;const o=s,r=M(e);if(r||ne(e)){const l=r&&_t(e);let a=!1,p=!1;l&&(a=!Te(e),p=st(e),e=As(e)),i=new Array(e.length);for(let d=0,b=e.length;dt(l,a,void 0,o));else{const l=Object.keys(e);i=new Array(l.length);for(let a=0,p=l.length;ae?vo(e)?js(e):tn(e.parent):null,Wt=he(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=>tn(e.parent),$root:e=>tn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Xi(e),$forceUpdate:e=>e.f||(e.f=()=>{wn(e.update)}),$nextTick:e=>e.n||(e.n=Fi.bind(e.proxy)),$watch:e=>xr.bind(e)}),Ks=(e,t)=>e!==Y&&!e.__isScriptSetup&&G(e,t),Ur={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:i,props:o,accessCache:r,type:l,appContext:a}=e;if(t[0]!=="$"){const C=r[t];if(C!==void 0)switch(C){case 1:return n[t];case 2:return i[t];case 4:return s[t];case 3:return o[t]}else{if(Ks(n,t))return r[t]=1,n[t];if(i!==Y&&G(i,t))return r[t]=2,i[t];if(G(o,t))return r[t]=3,o[t];if(s!==Y&&G(s,t))return r[t]=4,s[t];sn&&(r[t]=0)}}const p=Wt[t];let d,b;if(p)return t==="$attrs"&&fe(e.attrs,"get",""),p(e);if((d=l.__cssModules)&&(d=d[t]))return d;if(s!==Y&&G(s,t))return r[t]=4,s[t];if(b=a.config.globalProperties,G(b,t))return b[t]},set({_:e},t,s){const{data:n,setupState:i,ctx:o}=e;return Ks(i,t)?(i[t]=s,!0):n!==Y&&G(n,t)?(n[t]=s,!0):G(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:i,props:o,type:r}},l){let a;return!!(s[l]||e!==Y&&l[0]!=="$"&&G(e,l)||Ks(t,l)||G(o,l)||G(n,l)||G(Wt,l)||G(i.config.globalProperties,l)||(a=r.__cssModules)&&a[l])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:G(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Fn(e){return M(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let sn=!0;function Dr(e){const t=Xi(e),s=e.proxy,n=e.ctx;sn=!1,t.beforeCreate&&Bn(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:r,watch:l,provide:a,inject:p,created:d,beforeMount:b,mounted:C,beforeUpdate:O,updated:F,activated:_,deactivated:E,beforeDestroy:w,beforeUnmount:P,destroyed:j,unmounted:N,render:oe,renderTracked:Re,renderTriggered:je,errorCaptured:ot,serverPrefetch:ns,expose:ft,inheritAttrs:It,components:is,directives:os,filters:Ns}=t;if(p&&Mr(p,n,null),r)for(const se in r){const X=r[se];V(X)&&(n[se]=X.bind(s))}if(i){const se=i.call(s,s);Z(se)&&(e.data=Jt(se))}if(sn=!0,o)for(const se in o){const X=o[se],pt=V(X)?X.bind(s,s):V(X.get)?X.get.bind(s,s):Ke,rs=!V(X)&&V(X.set)?X.set.bind(s):Ke,ht=Ae({get:pt,set:rs});Object.defineProperty(n,se,{enumerable:!0,configurable:!0,get:()=>ht.value,set:Ne=>ht.value=Ne})}if(l)for(const se in l)Yi(l[se],n,s,se);if(a){const se=V(a)?a.call(s):a;Reflect.ownKeys(se).forEach(X=>{_r(X,se[X])})}d&&Bn(d,e,"c");function ge(se,X){M(X)?X.forEach(pt=>se(pt.bind(s))):X&&se(X.bind(s))}if(ge(Cr,b),ge(it,C),ge(Pr,O),ge(Ar,F),ge(Tr,_),ge(Er,E),ge(jr,ot),ge(Rr,Re),ge(Ir,je),ge(Or,P),ge(kn,N),ge(zr,ns),M(ft))if(ft.length){const se=e.exposed||(e.exposed={});ft.forEach(X=>{Object.defineProperty(se,X,{get:()=>s[X],set:pt=>s[X]=pt,enumerable:!0})})}else e.exposed||(e.exposed={});oe&&e.render===Ke&&(e.render=oe),It!=null&&(e.inheritAttrs=It),is&&(e.components=is),os&&(e.directives=os),ns&&qi(e)}function Mr(e,t,s=Ke){M(e)&&(e=nn(e));for(const n in e){const i=e[n];let o;Z(i)?"default"in i?o=ps(i.from||n,i.default,!0):o=ps(i.from||n):o=ps(i),pe(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function Bn(e,t,s){Ie(M(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Yi(e,t,s,n){let i=n.includes(".")?Gi(s,n):()=>s[n];if(ne(e)){const o=t[e];V(o)&&Hs(i,o)}else if(V(e))Hs(i,e.bind(s));else if(Z(e))if(M(e))e.forEach(o=>Yi(o,t,s,n));else{const o=V(e.handler)?e.handler.bind(s):t[e.handler];V(o)&&Hs(i,o,e)}}function Xi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,l=o.get(t);let a;return l?a=l:!i.length&&!s&&!n?a=t:(a={},i.length&&i.forEach(p=>ys(a,p,r,!0)),ys(a,t,r)),Z(t)&&o.set(t,a),a}function ys(e,t,s,n=!1){const{mixins:i,extends:o}=t;o&&ys(e,o,s,!0),i&&i.forEach(r=>ys(e,r,s,!0));for(const r in t)if(!(n&&r==="expose")){const l=Lr[r]||s&&s[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const Lr={data:Hn,props:Vn,emits:Vn,methods:Mt,computed:Mt,beforeCreate:me,created:me,beforeMount:me,mounted:me,beforeUpdate:me,updated:me,beforeDestroy:me,beforeUnmount:me,destroyed:me,unmounted:me,activated:me,deactivated:me,errorCaptured:me,serverPrefetch:me,components:Mt,directives:Mt,watch:Br,provide:Hn,inject:Fr};function Hn(e,t){return t?e?function(){return he(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Fr(e,t){return Mt(nn(e),nn(t))}function nn(e){if(M(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ce(t)}Modifiers`]||e[`${dt(t)}Modifiers`];function Wr(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||Y;let i=s;const o=t.startsWith("update:"),r=o&&Kr(n,t.slice(7));r&&(r.trim&&(i=s.map(d=>ne(d)?d.trim():d)),r.number&&(i=s.map(Cs)));let l,a=n[l=Ds(t)]||n[l=Ds(Ce(t))];!a&&o&&(a=n[l=Ds(dt(t))]),a&&Ie(a,e,6,i);const p=n[l+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ie(p,e,6,i)}}const Gr=new WeakMap;function eo(e,t,s=!1){const n=s?Gr:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},l=!1;if(!V(e)){const a=p=>{const d=eo(p,t,!0);d&&(l=!0,he(r,d))};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!o&&!l?(Z(e)&&n.set(e,null),null):(M(o)?o.forEach(a=>r[a]=null):he(r,o),Z(e)&&n.set(e,r),r)}function Is(e,t){return!e||!Ts(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),G(e,t[0].toLowerCase()+t.slice(1))||G(e,dt(t))||G(e,t))}function Kn(e){const{type:t,vnode:s,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:l,emit:a,render:p,renderCache:d,props:b,data:C,setupState:O,ctx:F,inheritAttrs:_}=e,E=vs(e);let w,P;try{if(s.shapeFlag&4){const N=i||n,oe=N;w=He(p.call(oe,N,d,b,O,C,F)),P=l}else{const N=t;w=He(N.length>1?N(b,{attrs:l,slots:r,emit:a}):N(b,null)),P=t.props?l:qr(l)}}catch(N){Gt.length=0,Os(N,e,1),w=ue(ct)}let j=w;if(P&&_!==!1){const N=Object.keys(P),{shapeFlag:oe}=j;N.length&&oe&7&&(o&&N.some(Es)&&(P=Zr(P,o)),j=Ct(j,P,!1,!0))}return s.dirs&&(j=Ct(j,null,!1,!0),j.dirs=j.dirs?j.dirs.concat(s.dirs):s.dirs),s.transition&&xn(j,s.transition),w=j,vs(E),w}const qr=e=>{let t;for(const s in e)(s==="class"||s==="style"||Ts(s))&&((t||(t={}))[s]=e[s]);return t},Zr=(e,t)=>{const s={};for(const n in e)(!Es(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Jr(e,t,s){const{props:n,children:i,component:o}=e,{props:r,children:l,patchFlag:a}=t,p=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&a>=0){if(a&1024)return!0;if(a&16)return n?Wn(n,r,p):!!r;if(a&8){const d=t.dynamicProps;for(let b=0;bObject.create(so),io=e=>Object.getPrototypeOf(e)===so;function Xr(e,t,s,n=!1){const i={},o=no();e.propsDefaults=Object.create(null),oo(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);s?e.props=n?i:rr(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Qr(e,t,s,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,l=W(i),[a]=e.propsOptions;let p=!1;if((n||r>0)&&!(r&16)){if(r&8){const d=e.vnode.dynamicProps;for(let b=0;b{a=!0;const[C,O]=ro(b,t,!0);he(r,C),O&&l.push(...O)};!s&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!a)return Z(e)&&n.set(e,xt),xt;if(M(o))for(let d=0;de==="_"||e==="_ctx"||e==="$stable",Tn=e=>M(e)?e.map(He):[He(e)],tl=(e,t,s)=>{if(t._n)return t;const n=vr((...i)=>Tn(t(...i)),s);return n._c=!1,n},lo=(e,t,s)=>{const n=e._ctx;for(const i in e){if(Sn(i))continue;const o=e[i];if(V(o))t[i]=tl(i,o,n);else if(o!=null){const r=Tn(o);t[i]=()=>r}}},ao=(e,t)=>{const s=Tn(t);e.slots.default=()=>s},co=(e,t,s)=>{for(const n in t)(s||!Sn(n))&&(e[n]=t[n])},sl=(e,t,s)=>{const n=e.slots=no();if(e.vnode.shapeFlag&32){const i=t._;i?(co(n,t,s),s&&wi(n,"_",i,!0)):lo(t,n)}else t&&ao(e,t)},nl=(e,t,s)=>{const{vnode:n,slots:i}=e;let o=!0,r=Y;if(n.shapeFlag&32){const l=t._;l?s&&l===1?o=!1:co(i,t,s):(o=!t.$stable,lo(t,i)),r=t}else t&&(ao(e,t),r={default:1});if(o)for(const l in i)!Sn(l)&&r[l]==null&&delete i[l]},_e=al;function il(e){return ol(e)}function ol(e,t){const s=Ps();s.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:l,createComment:a,setText:p,setElementText:d,parentNode:b,nextSibling:C,setScopeId:O=Ke,insertStaticContent:F}=e,_=(c,f,v,T=null,S=null,x=null,I=void 0,z=null,A=!!f.dynamicChildren)=>{if(c===f)return;c&&!Dt(c,f)&&(T=ls(c),Ne(c,S,x,!0),c=null),f.patchFlag===-2&&(A=!1,f.dynamicChildren=null);const{type:k,ref:D,shapeFlag:R}=f;switch(k){case Rs:E(c,f,v,T);break;case ct:w(c,f,v,T);break;case Gs:c==null&&P(f,v,T,I);break;case te:is(c,f,v,T,S,x,I,z,A);break;default:R&1?oe(c,f,v,T,S,x,I,z,A):R&6?os(c,f,v,T,S,x,I,z,A):(R&64||R&128)&&k.process(c,f,v,T,S,x,I,z,A,jt)}D!=null&&S?Vt(D,c&&c.ref,x,f||c,!f):D==null&&c&&c.ref!=null&&Vt(c.ref,null,x,c,!0)},E=(c,f,v,T)=>{if(c==null)n(f.el=l(f.children),v,T);else{const S=f.el=c.el;f.children!==c.children&&p(S,f.children)}},w=(c,f,v,T)=>{c==null?n(f.el=a(f.children||""),v,T):f.el=c.el},P=(c,f,v,T)=>{[c.el,c.anchor]=F(c.children,f,v,T,c.el,c.anchor)},j=({el:c,anchor:f},v,T)=>{let S;for(;c&&c!==f;)S=C(c),n(c,v,T),c=S;n(f,v,T)},N=({el:c,anchor:f})=>{let v;for(;c&&c!==f;)v=C(c),i(c),c=v;i(f)},oe=(c,f,v,T,S,x,I,z,A)=>{if(f.type==="svg"?I="svg":f.type==="math"&&(I="mathml"),c==null)Re(f,v,T,S,x,I,z,A);else{const k=c.el&&c.el._isVueCE?c.el:null;try{k&&k._beginPatch(),ns(c,f,S,x,I,z,A)}finally{k&&k._endPatch()}}},Re=(c,f,v,T,S,x,I,z)=>{let A,k;const{props:D,shapeFlag:R,transition:U,dirs:L}=c;if(A=c.el=r(c.type,x,D&&D.is,D),R&8?d(A,c.children):R&16&&ot(c.children,A,null,T,S,Ws(c,x),I,z),L&>(c,null,T,"created"),je(A,c,c.scopeId,I,T),D){for(const J in D)J!=="value"&&!Ft(J)&&o(A,J,null,D[J],x,T);"value"in D&&o(A,"value",null,D.value,x),(k=D.onVnodeBeforeMount)&&Le(k,T,c)}L&>(c,null,T,"beforeMount");const K=rl(S,U);K&&U.beforeEnter(A),n(A,f,v),((k=D&&D.onVnodeMounted)||K||L)&&_e(()=>{try{k&&Le(k,T,c),K&&U.enter(A),L&>(c,null,T,"mounted")}finally{}},S)},je=(c,f,v,T,S)=>{if(v&&O(c,v),T)for(let x=0;x{for(let k=A;k{const z=f.el=c.el;let{patchFlag:A,dynamicChildren:k,dirs:D}=f;A|=c.patchFlag&16;const R=c.props||Y,U=f.props||Y;let L;if(v&&mt(v,!1),(L=U.onVnodeBeforeUpdate)&&Le(L,v,f,c),D&>(f,c,v,"beforeUpdate"),v&&mt(v,!0),k&&(!c.dynamicChildren||c.dynamicChildren.length!==k.length)&&(A=0,I=!1,k=null),(R.innerHTML&&U.innerHTML==null||R.textContent&&U.textContent==null)&&d(z,""),k?ft(c.dynamicChildren,k,z,v,T,Ws(f,S),x):I||X(c,f,z,null,v,T,Ws(f,S),x,!1),A>0){if(A&16)It(z,R,U,v,S);else if(A&2&&R.class!==U.class&&o(z,"class",null,U.class,S),A&4&&o(z,"style",R.style,U.style,S),A&8){const K=f.dynamicProps;for(let J=0;J{L&&Le(L,v,f,c),D&>(f,c,v,"updated")},T)},ft=(c,f,v,T,S,x,I)=>{for(let z=0;z{if(f!==v){if(f!==Y)for(const x in f)!Ft(x)&&!(x in v)&&o(c,x,f[x],null,S,T);for(const x in v){if(Ft(x))continue;const I=v[x],z=f[x];I!==z&&x!=="value"&&o(c,x,z,I,S,T)}"value"in v&&o(c,"value",f.value,v.value,S)}},is=(c,f,v,T,S,x,I,z,A)=>{const k=f.el=c?c.el:l(""),D=f.anchor=c?c.anchor:l("");let{patchFlag:R,dynamicChildren:U,slotScopeIds:L}=f;L&&(z=z?z.concat(L):L),c==null?(n(k,v,T),n(D,v,T),ot(f.children||[],v,D,S,x,I,z,A)):R>0&&R&64&&U&&c.dynamicChildren&&c.dynamicChildren.length===U.length?(ft(c.dynamicChildren,U,v,S,x,I,z),(f.key!=null||S&&f===S.subTree)&&uo(c,f,!0)):X(c,f,v,D,S,x,I,z,A)},os=(c,f,v,T,S,x,I,z,A)=>{f.slotScopeIds=z,c==null?f.shapeFlag&512?S.ctx.activate(f,v,T,I,A):Ns(f,v,T,S,x,I,A):Cn(c,f,A)},Ns=(c,f,v,T,S,x,I)=>{const z=c.component=gl(c,T,S);if(Zi(c)&&(z.ctx.renderer=jt),bl(z,!1,I),z.asyncDep){if(S&&S.registerDep(z,ge,I),!c.el){const A=z.subTree=ue(ct);w(null,A,f,v),c.placeholder=A.el}}else ge(z,c,f,v,S,x,I)},Cn=(c,f,v)=>{const T=f.component=c.component;if(Jr(c,f,v))if(T.asyncDep&&!T.asyncResolved){se(T,f,v);return}else T.next=f,T.update();else f.el=c.el,T.vnode=f},ge=(c,f,v,T,S,x,I)=>{const z=()=>{if(c.isMounted){let{next:R,bu:U,u:L,parent:K,vnode:J}=c;{const De=fo(c);if(De){R&&(R.el=J.el,se(c,R,I)),De.asyncDep.then(()=>{_e(()=>{c.isUnmounted||k()},S)});return}}let q=R,ie;mt(c,!1),R?(R.el=J.el,se(c,R,I)):R=J,U&&fs(U),(ie=R.props&&R.props.onVnodeBeforeUpdate)&&Le(ie,K,R,J),mt(c,!0);const ae=Kn(c),Ue=c.subTree;c.subTree=ae,_(Ue,ae,b(Ue.el),ls(Ue),c,S,x),R.el=ae.el,q===null&&Yr(c,ae.el),L&&_e(L,S),(ie=R.props&&R.props.onVnodeUpdated)&&_e(()=>Le(ie,K,R,J),S)}else{let R;const{el:U,props:L}=f,{bm:K,m:J,parent:q,root:ie,type:ae}=c,Ue=Kt(f);mt(c,!1),K&&fs(K),!Ue&&(R=L&&L.onVnodeBeforeMount)&&Le(R,q,f),mt(c,!0);{ie.ce&&ie.ce._hasShadowRoot()&&ie.ce._injectChildStyle(ae,c.parent?c.parent.type:void 0);const De=c.subTree=Kn(c);_(null,De,v,T,c,S,x),f.el=De.el}if(J&&_e(J,S),!Ue&&(R=L&&L.onVnodeMounted)){const De=f;_e(()=>Le(R,q,De),S)}(f.shapeFlag&256||q&&Kt(q.vnode)&&q.vnode.shapeFlag&256)&&c.a&&_e(c.a,S),c.isMounted=!0,f=v=T=null}};c.scope.on();const A=c.effect=new Ti(z);c.scope.off();const k=c.update=A.run.bind(A),D=c.job=A.runIfDirty.bind(A);D.i=c,D.id=c.uid,A.scheduler=()=>wn(D),mt(c,!0),k()},se=(c,f,v)=>{f.component=c;const T=c.vnode.props;c.vnode=f,c.next=null,Qr(c,f.props,T,v),nl(c,f.children,v),Ge(),Dn(c),qe()},X=(c,f,v,T,S,x,I,z,A=!1)=>{const k=c&&c.children,D=c?c.shapeFlag:0,R=f.children,{patchFlag:U,shapeFlag:L}=f;if(U>0){if(U&128){rs(k,R,v,T,S,x,I,z,A);return}else if(U&256){pt(k,R,v,T,S,x,I,z,A);return}}L&8?(D&16&&Rt(k,S,x),R!==k&&d(v,R)):D&16?L&16?rs(k,R,v,T,S,x,I,z,A):Rt(k,S,x,!0):(D&8&&d(v,""),L&16&&ot(R,v,T,S,x,I,z,A))},pt=(c,f,v,T,S,x,I,z,A)=>{c=c||xt,f=f||xt;const k=c.length,D=f.length,R=Math.min(k,D);let U;for(U=0;UD?Rt(c,S,x,!0,!1,R):ot(f,v,T,S,x,I,z,A,R)},rs=(c,f,v,T,S,x,I,z,A)=>{let k=0;const D=f.length;let R=c.length-1,U=D-1;for(;k<=R&&k<=U;){const L=c[k],K=f[k]=A?Xe(f[k]):He(f[k]);if(Dt(L,K))_(L,K,v,null,S,x,I,z,A);else break;k++}for(;k<=R&&k<=U;){const L=c[R],K=f[U]=A?Xe(f[U]):He(f[U]);if(Dt(L,K))_(L,K,v,null,S,x,I,z,A);else break;R--,U--}if(k>R){if(k<=U){const L=U+1,K=LU)for(;k<=R;)Ne(c[k],S,x,!0),k++;else{const L=k,K=k,J=new Map;for(k=K;k<=U;k++){const ye=f[k]=A?Xe(f[k]):He(f[k]);ye.key!=null&&J.set(ye.key,k)}let q,ie=0;const ae=U-K+1;let Ue=!1,De=0;const Nt=new Array(ae);for(k=0;k=ae){Ne(ye,S,x,!0);continue}let Me;if(ye.key!=null)Me=J.get(ye.key);else for(q=K;q<=U;q++)if(Nt[q-K]===0&&Dt(ye,f[q])){Me=q;break}Me===void 0?Ne(ye,S,x,!0):(Nt[Me-K]=k+1,Me>=De?De=Me:Ue=!0,_(ye,f[Me],v,null,S,x,I,z,A),ie++)}const On=Ue?ll(Nt):xt;for(q=On.length-1,k=ae-1;k>=0;k--){const ye=K+k,Me=f[ye],zn=f[ye+1],In=ye+1{const{el:x,type:I,transition:z,children:A,shapeFlag:k}=c;if(k&6){ht(c.component.subTree,f,v,T);return}if(k&128){c.suspense.move(f,v,T);return}if(k&64){I.move(c,f,v,jt);return}if(I===te){n(x,f,v);for(let R=0;Rz.enter(x),S));else{const{leave:R,delayLeave:U,afterLeave:L}=z,K=()=>{c.ctx.isUnmounted?i(x):n(x,f,v)},J=()=>{const q=x._isLeaving||!!x[Vs];x._isLeaving&&x[Vs](!0),z.persisted&&!q?K():R(x,()=>{K(),L&&L()})};U?U(x,K,J):J()}else n(x,f,v)},Ne=(c,f,v,T=!1,S=!1)=>{const{type:x,props:I,ref:z,children:A,dynamicChildren:k,shapeFlag:D,patchFlag:R,dirs:U,cacheIndex:L,memo:K}=c;if(R===-2&&(S=!1),z!=null&&(Ge(),Vt(z,null,v,c,!0),qe()),L!=null&&(f.renderCache[L]=void 0),D&256){f.ctx.deactivate(c);return}const J=D&1&&U,q=!Kt(c);let ie;if(q&&(ie=I&&I.onVnodeBeforeUnmount)&&Le(ie,f,c),D&6)Po(c.component,v,T);else{if(D&128){c.suspense.unmount(v,T);return}J&>(c,null,f,"beforeUnmount"),D&64?c.type.remove(c,f,v,jt,T):k&&!k.hasOnce&&(x!==te||R>0&&R&64)?Rt(k,f,v,!1,!0):(x===te&&R&384||!S&&D&16)&&Rt(A,f,v),T&&Pn(c)}const ae=K!=null&&L==null;(q&&(ie=I&&I.onVnodeUnmounted)||J||ae)&&_e(()=>{ie&&Le(ie,f,c),J&>(c,null,f,"unmounted"),ae&&(c.el=null)},v)},Pn=c=>{const{type:f,el:v,anchor:T,transition:S}=c;if(f===te){Co(v,T);return}if(f===Gs){N(c);return}const x=()=>{i(v),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(c.shapeFlag&1&&S&&!S.persisted){const{leave:I,delayLeave:z}=S,A=()=>I(v,x);z?z(c.el,x,A):A()}else x()},Co=(c,f)=>{let v;for(;c!==f;)v=C(c),i(c),c=v;i(f)},Po=(c,f,v)=>{const{bum:T,scope:S,job:x,subTree:I,um:z,m:A,a:k}=c;qn(A),qn(k),T&&fs(T),S.stop(),x&&(x.flags|=8,Ne(I,c,f,v)),z&&_e(z,f),_e(()=>{c.isUnmounted=!0},f)},Rt=(c,f,v,T=!1,S=!1,x=0)=>{for(let I=x;I{if(c.shapeFlag&6)return ls(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const f=C(c.anchor||c.el),v=f&&f[kr];return v?C(v):f};let Us=!1;const An=(c,f,v)=>{let T;c==null?f._vnode&&(Ne(f._vnode,null,null,!0),T=f._vnode.component):_(f._vnode||null,c,f,null,null,null,v),f._vnode=c,Us||(Us=!0,Dn(T),Hi(),Us=!1)},jt={p:_,um:Ne,m:ht,r:Pn,mt:Ns,mc:ot,pc:X,pbc:ft,n:ls,o:e};return{render:An,hydrate:void 0,createApp:Vr(An)}}function Ws({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function mt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function rl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function uo(e,t,s=!1){const n=e.children,i=t.children;if(M(n)&&M(i))for(let o=0;o>1,e[s[l]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,r=s[o-1];o-- >0;)s[o]=r,r=t[r];return s}function fo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:fo(t)}function qn(e){if(e)for(let t=0;te.__isSuspense;function al(e,t){t&&t.pendingBranch?M(e)?t.effects.push(...e):t.effects.push(e):br(e)}const te=Symbol.for("v-fgt"),Rs=Symbol.for("v-txt"),ct=Symbol.for("v-cmt"),Gs=Symbol.for("v-stc"),Gt=[];let we=null;function y(e=!1){Gt.push(we=e?null:[])}function cl(){Gt.pop(),we=Gt[Gt.length-1]||null}let Xt=1;function Zn(e,t=!1){Xt+=e,e<0&&we&&t&&(we.hasOnce=!0)}function go(e){return e.dynamicChildren=Xt>0?we||xt:null,cl(),Xt>0&&we&&we.push(e),e}function $(e,t,s,n,i,o){return go(u(e,t,s,n,i,o,!0))}function Je(e,t,s,n,i){return go(ue(e,t,s,n,i,!0))}function mo(e){return e?e.__v_isVNode===!0:!1}function Dt(e,t){return e.type===t.type&&e.key===t.key}const bo=({key:e})=>e??null,hs=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||pe(e)||V(e)?{i:ke,r:e,k:t,f:!!s}:e:null);function u(e,t=null,s=null,n=0,i=null,o=e===te?0:1,r=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&bo(t),ref:t&&hs(t),scopeId:Ki,slotScopeIds:null,children:s,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:ke};return l?(ws(a,s),o&128&&e.normalize(a)):s&&(a.shapeFlag|=ne(s)?8:16),Xt>0&&!r&&we&&(a.patchFlag>0||o&6)&&a.patchFlag!==32&&we.push(a),a}const ue=ul;function ul(e,t=null,s=null,n=0,i=null,o=!1){if((!e||e===Nr)&&(e=ct),mo(e)){const l=Ct(e,t,!0);return s&&ws(l,s),Xt>0&&!o&&we&&(l.shapeFlag&6?we[we.indexOf(e)]=l:we.push(l)),l.patchFlag=-2,l}if(wl(e)&&(e=e.__vccOpts),t){t=dl(t);let{class:l,style:a}=t;l&&!ne(l)&&(t.class=Oe(l)),Z(a)&&(yn(a)&&!M(a)&&(a=he({},a)),t.style=fn(a))}const r=ne(e)?1:ho(e)?128:Sr(e)?64:Z(e)?4:V(e)?2:0;return u(e,t,s,n,i,r,o,!0)}function dl(e){return e?yn(e)||io(e)?he({},e):e:null}function Ct(e,t,s=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:l,transition:a}=e,p=t?fl(i||{},t):i,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:p,key:p&&bo(p),ref:t&&t.ref?s&&o?M(o)?o.concat(hs(t)):[o,hs(t)]:hs(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==te?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ct(e.ssContent),ssFallback:e.ssFallback&&Ct(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&n&&xn(d,a.clone(d)),d}function Ee(e=" ",t=0){return ue(Rs,null,e,t)}function H(e="",t=!1){return t?(y(),Je(ct,null,e)):ue(ct,null,e)}function He(e){return e==null||typeof e=="boolean"?ue(ct):M(e)?ue(te,null,e.slice()):mo(e)?Xe(e):ue(Rs,null,String(e))}function Xe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ct(e)}function ws(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(M(t))s=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),ws(e,i()),i._c&&(i._d=!0));return}else{s=32;const i=t._;!i&&!io(t)?t._ctx=ke:i===3&&ke&&(ke.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(V(t)){if(n&65){ws(e,{default:t});return}t={default:t,_ctx:ke},s=32}else t=String(t),n&64?(s=16,t=[Ee(t)]):s=8;e.children=t,e.shapeFlag|=s}function fl(...e){const t={};for(let s=0;sve||ke;let xs,rn;{const e=Ps(),t=(s,n)=>{let i;return(i=e[s])||(i=e[s]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};xs=t("__VUE_INSTANCE_SETTERS__",s=>ve=s),rn=t("__VUE_SSR_SETTERS__",s=>Qt=s)}const ss=e=>{const t=ve;return xs(e),e.scope.on(),()=>{e.scope.off(),xs(t)}},Jn=()=>{ve&&ve.scope.off(),xs(null)};function vo(e){return e.vnode.shapeFlag&4}let Qt=!1;function bl(e,t=!1,s=!1){t&&rn(t);const{props:n,children:i}=e.vnode,o=vo(e);Xr(e,n,o,t),sl(e,i,s||t);const r=o?vl(e,t):void 0;return t&&rn(!1),r}function vl(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ur);const{setup:n}=s;if(n){Ge();const i=e.setupContext=n.length>1?yl(e):null,o=ss(e),r=ts(n,e,0,[e.props,i]),l=bi(r);if(qe(),o(),(l||e.sp)&&!Kt(e)&&qi(e),l){if(r.then(Jn,Jn),t)return r.then(a=>{Yn(e,a)}).catch(a=>{Os(a,e,0)});e.asyncDep=r}else Yn(e,r)}else _o(e)}function Yn(e,t,s){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Mi(t)),_o(e)}function _o(e,t,s){const n=e.type;e.render||(e.render=n.render||Ke);{const i=ss(e);Ge();try{Dr(e)}finally{qe(),i()}}}const _l={get(e,t){return fe(e,"get",""),e[t]}};function yl(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,_l),slots:e.slots,emit:e.emit,expose:t}}function js(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mi(lr(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Wt)return Wt[s](e)},has(t,s){return s in t||s in Wt}})):e.proxy}function wl(e){return V(e)&&"__vccOpts"in e}const Ae=(e,t)=>fr(e,t,Qt),xl="3.5.39";/** -* @vue/runtime-dom v3.5.39 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let ln;const Xn=typeof window<"u"&&window.trustedTypes;if(Xn)try{ln=Xn.createPolicy("vue",{createHTML:e=>e})}catch{}const yo=ln?e=>ln.createHTML(e):e=>e,kl="http://www.w3.org/2000/svg",Sl="http://www.w3.org/1998/Math/MathML",Ye=typeof document<"u"?document:null,Qn=Ye&&Ye.createElement("template"),Tl={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const i=t==="svg"?Ye.createElementNS(kl,e):t==="mathml"?Ye.createElementNS(Sl,e):s?Ye.createElement(e,{is:s}):Ye.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>Ye.createTextNode(e),createComment:e=>Ye.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ye.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,i,o){const r=s?s.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),s),!(i===o||!(i=i.nextSibling)););else{Qn.innerHTML=yo(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const l=Qn.content;if(n==="svg"||n==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},El=Symbol("_vtc");function $l(e,t,s){const n=e[El];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const ei=Symbol("_vod"),Cl=Symbol("_vsh"),Pl=Symbol(""),Al=/(?:^|;)\s*display\s*:/;function Ol(e,t,s){const n=e.style,i=ne(s);let o=!1;if(s&&!i){if(t)if(ne(t))for(const r of t.split(";")){const l=r.slice(0,r.indexOf(":")).trim();s[l]==null&&Lt(n,l,"")}else for(const r in t)s[r]==null&&Lt(n,r,"");for(const r in s){r==="display"&&(o=!0);const l=s[r];l!=null?Il(e,r,!ne(t)&&t?t[r]:void 0,l)||Lt(n,r,l):Lt(n,r,"")}}else if(i){if(t!==s){const r=n[Pl];r&&(s+=";"+r),n.cssText=s,o=Al.test(s)}}else t&&e.removeAttribute("style");ei in e&&(e[ei]=o?n.display:"",e[Cl]&&(n.display="none"))}const ti=/\s*!important$/;function Lt(e,t,s){if(M(s))s.forEach(n=>Lt(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=zl(e,t);ti.test(s)?e.setProperty(dt(n),s.replace(ti,""),"important"):e[n]=s}}const si=["Webkit","Moz","ms"],qs={};function zl(e,t){const s=qs[t];if(s)return s;let n=Ce(t);if(n!=="filter"&&n in e)return qs[t]=n;n=yi(n);for(let i=0;iZs||(Ml.then(()=>Zs=0),Zs=Date.now());function Fl(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const i=s.value;if(M(i)){const o=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{o.call(n),n._stopped=!0};const r=i.slice(),l=[n];for(let a=0;ae.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Bl=(e,t,s,n,i,o)=>{const r=i==="svg";t==="class"?$l(e,n,r):t==="style"?Ol(e,s,n):Ts(t)?Es(t)||jl(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Hl(e,t,n,r))?(oi(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ii(e,t,n,r,o,t!=="value")):e._isVueCE&&(Vl(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ne(n)))?oi(e,Ce(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),ii(e,t,n,r))};function Hl(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&li(t)&&V(s));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 li(t)&&ne(s)?!1:t in e}function Vl(e,t){const s=e._def.props;if(!s)return!1;const n=Ce(t);return Array.isArray(s)?s.some(i=>Ce(i)===n):Object.keys(s).some(i=>Ce(i)===n)}const ut=e=>{const t=e.props["onUpdate:modelValue"]||!1;return M(t)?s=>fs(t,s):t};function Kl(e){e.target.composing=!0}function ai(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const $e=Symbol("_assign");function ci(e,t,s){return t&&(e=e.trim()),s&&(e=Cs(e)),e}const de={created(e,{modifiers:{lazy:t,trim:s,number:n}},i){e[$e]=ut(i);const o=n||i.props&&i.props.type==="number";tt(e,t?"change":"input",r=>{r.target.composing||e[$e](ci(e.value,s,o))}),(s||o)&&tt(e,"change",()=>{e.value=ci(e.value,s,o)}),t||(tt(e,"compositionstart",Kl),tt(e,"compositionend",ai),tt(e,"change",ai))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:i,number:o}},r){if(e[$e]=ut(r),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?Cs(e.value):e.value,a=t??"";if(l===a)return;const p=e.getRootNode();(p instanceof Document||p instanceof ShadowRoot)&&p.activeElement===e&&e.type!=="range"&&(n&&t===s||i&&e.value.trim()===a)||(e.value=a)}},Wl={deep:!0,created(e,t,s){e[$e]=ut(s),tt(e,"change",()=>{const n=e._modelValue,i=Pt(e),o=e.checked,r=e[$e];if(M(n)){const l=pn(n,i),a=l!==-1;if(o&&!a)r(n.concat(i));else if(!o&&a){const p=[...n];p.splice(l,1),r(p)}}else if(zt(n)){const l=new Set(n);o?l.add(i):l.delete(i),r(l)}else r(wo(e,o))})},mounted:ui,beforeUpdate(e,t,s){e[$e]=ut(s),ui(e,t,s)}};function ui(e,{value:t,oldValue:s},n){e._modelValue=t;let i;if(M(t))i=pn(t,n.props.value)>-1;else if(zt(t))i=t.has(n.props.value);else{if(t===s)return;i=at(t,wo(e,!0))}e.checked!==i&&(e.checked=i)}const Gl={created(e,{value:t},s){e.checked=at(t,s.props.value),e[$e]=ut(s),tt(e,"change",()=>{e[$e](Pt(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[$e]=ut(n),t!==s&&(e.checked=at(t,n.props.value))}},ks={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const i=zt(t);tt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Cs(Pt(r)):Pt(r));e[$e](e.multiple?i?new Set(o):o:o[0]),e._assigning=!0,Fi(()=>{e._assigning=!1})}),e[$e]=ut(n)},mounted(e,{value:t}){di(e,t)},beforeUpdate(e,t,s){e[$e]=ut(s)},updated(e,{value:t}){e._assigning||di(e,t)}};function di(e,t){const s=e.multiple,n=M(t);if(!(s&&!n&&!zt(t))){for(let i=0,o=e.options.length;iString(p)===String(l)):r.selected=pn(t,l)>-1}else r.selected=t.has(l);else if(at(Pt(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Pt(e){return"_value"in e?e._value:e.value}function wo(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const ql={created(e,t,s){ds(e,t,s,null,"created")},mounted(e,t,s){ds(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){ds(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){ds(e,t,s,n,"updated")}};function Zl(e,t){switch(e){case"SELECT":return ks;case"TEXTAREA":return de;default:switch(t){case"checkbox":return Wl;case"radio":return Gl;default:return de}}}function ds(e,t,s,n,i){const r=Zl(e.tagName,s.props&&s.props.type)[i];r&&r(e,t,s,n)}const Jl=["ctrl","shift","alt","meta"],Yl={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)=>Jl.some(s=>e[`${s}Key`]&&!t.includes(s))},Xl=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((i,...o)=>{for(let r=0;r{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(i=>{if(!("key"in i))return;const o=dt(i.key);if(t.some(r=>r===o||Ql[r]===o))return e(i)}))},ea=he({patchProp:Bl},Tl);let fi;function ta(){return fi||(fi=il(ea))}const sa=((...e)=>{const t=ta().createApp(...e),{mount:s}=t;return t.mount=n=>{const i=ia(n);if(!i)return;const o=t._component;!V(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=s(i,!1,na(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function na(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ia(e){return ne(e)?document.querySelector(e):e}const ko="dh-panel-theme";function oa(){var e;try{const t=localStorage.getItem(ko);if(t==="dark"||t==="light")return t}catch{}return(e=window.matchMedia)!=null&&e.call(window,"(prefers-color-scheme: dark)").matches?"dark":"light"}const Et=B(oa());function So(e){Et.value=e,document.documentElement.classList.toggle("dark",e==="dark");try{localStorage.setItem(ko,e)}catch{}}function pi(){So(Et.value==="dark"?"light":"dark")}So(Et.value);const ra={apiServer:"API server",switchToLight:"Switch to light theme",switchToDark:"Switch to dark theme",theme:"Theme",signOut:"Sign out",loading:"Loading…",standardUserNote:"Signed in as a standard user — management sections need an admin role",footer:"DriverVault — car maintenance & service tracker."},la={overview:"Overview",users:"Users",orgs:"Organizations",server:"API Server",pocketbase:"PocketBase",webapp:"Web App",plugins:"Plugins",api:"API"},aa={title:"Sign in",subtitle:"Superadmin console for the DriverVault API Server.",email:"Email",password:"Password",submit:"Sign in",submitting:"Signing in…",invalid:"Invalid email or password.",failed:"Could not sign in.",authNote:"Authenticates against PocketBase through this server"},ca={title:"Status",unreachable:"unreachable",checking:"Checking…",apiServer:"API Server",pocketBase:"PocketBase",webApp:"Web App",thisProcess:"this process"},ua={create:"Create",save:"Save",cancel:"Cancel",edit:"Edit",delete:"Delete",rename:"Rename",empty:"—",name:"Name",email:"Email",role:"Role",organization:"Organization"},da={title:"Users",allOrgs:"All organizations",yourOrg:"Your organization",newUser:"New user",password:"Password",passwordUnchanged:"Password (blank = unchanged)",passwordPlaceholder:"min 8 characters",orgNone:"— none —",you:"you",empty:"No users.",confirmDelete:"Delete {email}? This cannot be undone."},fa={title:"Organizations",subtitle:"Tenants users belong to",subtitleOwn:"Your organization",subtitleNone:"Create one to manage your own team",newOrg:"New organization",namePlaceholder:"Acme Fleet",empty:"No organizations yet.",createHint:"You have no organization yet. Create one to become its admin.",colId:"ID",confirmDelete:'Delete the organization "{name}"?',confirmDeleteOwn:'Delete your organization "{name}"? You will be removed from it and become a regular user.'},pa={title:"API Server",subtitle:"How this server identifies itself to the clients that connect to it",name:"Server name",nameHint:"Shown by clients that can be pointed at more than one DriverVault, such as the Web App's server switcher. Reported by /api/health.",saveApply:"Save & apply",persistedEnv:"persisted to .env",savedNotice:"Saved. The new name applies to the next request."},ha={title:"PocketBase",subtitle:"Database connection used by every endpoint",connected:"connected",noSuperuser:"no superuser",unreachable:"unreachable",baseUrl:"Base URL",superuserEmail:"Superuser email",superuserPassword:"Superuser password",passwordUnchanged:"unchanged",passwordNotSet:"not set",saveApply:"Save & apply",testConnection:"Test connection",persistedEnv:"persisted to .env",testOk:"Connection OK — superuser authenticated.",testReachableNoAuth:"PocketBase is reachable, but the service account did not authenticate.",testUnreachable:"PocketBase is not reachable at that address.",savedNotice:"Saved. The server is now using this PocketBase."},ga={title:"Web App",subtitle:"Address probed by the status check, and who may call this API from a browser",reachable:"reachable",unreachable:"unreachable",baseUrl:"Base URL",allowedOrigins:"Allowed origins",originsHint:"Comma separated, or {star} for any. Native mobile apps are not subject to CORS.",saveApply:"Save & apply",testConnection:"Test connection",persistedEnv:"persisted to .env",testOk:"Web App is reachable.",testFailed:"Web App did not answer its health check at that address.",savedNotice:"Saved. New origins apply to the next request."},ma={title:"Plugins",subtitle:"Third-party service integrations",registerExternal:"Register external",cancelRegister:"Cancel",name:"Name",baseUrl:"Base URL",provider:"Provider",register:"Register",empty:"No plugins yet. Register an external one above, or compile a built-in connector.",builtin:"builtin",enabled:"enabled",disabled:"disabled",health:"Health",configure:"Configure",close:"Close",noConfig:"This plugin takes no configuration.",notSet:"Not set — let organizations and users choose",capabilities:"Capabilities",saved:"Saved.",checking:"Checking…",save:"Save",saveEnable:"Save & enable",disable:"Disable",remove:"Remove",builtinNote:"Built-in plugins can be disabled but not removed",confirmRemove:'Remove the external plugin "{name}"? Its saved config is deleted.'},ba={colEndpoint:"Endpoint",colDescription:"Description",authNone:"No auth",authBearer:"Bearer token",authManager:"Admin / superadmin",authSuperadmin:"Superadmin",groupPublic:"Public",groupIdentity:"Identity",groupCars:"Cars",groupService:"Service records",groupParts:"Parts",groupAccount:"Account",groupManagement:"Management",groupSuperadmin:"Superadmin"},va={app:ra,sections:la,login:aa,status:ca,common:ua,users:da,orgs:fa,server:pa,pocketbase:ha,webapp:ga,plugins:ma,api:ba},_a={apiServer:"Serwer API",switchToLight:"Przełącz na motyw jasny",switchToDark:"Przełącz na motyw ciemny",theme:"Motyw",signOut:"Wyloguj się",loading:"Ładowanie…",standardUserNote:"Zalogowano jako zwykły użytkownik — sekcje zarządzania wymagają roli administratora",footer:"DriverVault — rejestr serwisu i konserwacji samochodu."},ya={overview:"Przegląd",users:"Użytkownicy",orgs:"Organizacje",server:"Serwer API",pocketbase:"PocketBase",webapp:"Aplikacja webowa",plugins:"Wtyczki",api:"API"},wa={title:"Zaloguj się",subtitle:"Konsola superadministratora serwera API DriverVault.",email:"E-mail",password:"Hasło",submit:"Zaloguj się",submitting:"Logowanie…",invalid:"Nieprawidłowy e-mail lub hasło.",failed:"Nie udało się zalogować.",authNote:"Uwierzytelnia w PocketBase za pośrednictwem tego serwera"},xa={title:"Status",unreachable:"niedostępny",checking:"Sprawdzanie…",apiServer:"Serwer API",pocketBase:"PocketBase",webApp:"Aplikacja webowa",thisProcess:"ten proces"},ka={create:"Utwórz",save:"Zapisz",cancel:"Anuluj",edit:"Edytuj",delete:"Usuń",rename:"Zmień nazwę",empty:"—",name:"Nazwa",email:"E-mail",role:"Rola",organization:"Organizacja"},Sa={title:"Użytkownicy",allOrgs:"Wszystkie organizacje",yourOrg:"Twoja organizacja",newUser:"Nowy użytkownik",password:"Hasło",passwordUnchanged:"Hasło (puste = bez zmian)",passwordPlaceholder:"min. 8 znaków",orgNone:"— brak —",you:"Ty",empty:"Brak użytkowników.",confirmDelete:"Usunąć {email}? Tej operacji nie można cofnąć."},Ta={title:"Organizacje",subtitle:"Podmioty, do których należą użytkownicy",subtitleOwn:"Twoja organizacja",subtitleNone:"Utwórz ją, aby zarządzać własnym zespołem",newOrg:"Nowa organizacja",namePlaceholder:"Acme Fleet",empty:"Brak organizacji.",createHint:"Nie masz jeszcze organizacji. Utwórz ją, aby zostać jej administratorem.",colId:"ID",confirmDelete:"Usunąć organizację „{name}”?",confirmDeleteOwn:"Usunąć Twoją organizację „{name}”? Zostaniesz z niej usunięty i staniesz się zwykłym użytkownikiem."},Ea={title:"Serwer API",subtitle:"Jak ten serwer przedstawia się klientom, które się z nim łączą",name:"Nazwa serwera",nameHint:"Widoczna w klientach, które można skierować na więcej niż jeden DriverVault, na przykład w przełączniku serwerów aplikacji webowej. Zwracana przez /api/health.",saveApply:"Zapisz i zastosuj",persistedEnv:"zapisano w .env",savedNotice:"Zapisano. Nowa nazwa obowiązuje od następnego żądania."},$a={title:"PocketBase",subtitle:"Połączenie z bazą danych używane przez każdy punkt końcowy",connected:"połączono",noSuperuser:"brak superużytkownika",unreachable:"niedostępny",baseUrl:"Adres bazowy",superuserEmail:"E-mail superużytkownika",superuserPassword:"Hasło superużytkownika",passwordUnchanged:"bez zmian",passwordNotSet:"nie ustawiono",saveApply:"Zapisz i zastosuj",testConnection:"Testuj połączenie",persistedEnv:"zapisano w .env",testOk:"Połączenie OK — superużytkownik uwierzytelniony.",testReachableNoAuth:"PocketBase jest dostępny, ale konto usługowe nie zostało uwierzytelnione.",testUnreachable:"PocketBase jest niedostępny pod tym adresem.",savedNotice:"Zapisano. Serwer korzysta teraz z tego PocketBase."},Ca={title:"Aplikacja webowa",subtitle:"Adres sprawdzany podczas kontroli statusu oraz kto może wywoływać to API z przeglądarki",reachable:"dostępna",unreachable:"niedostępna",baseUrl:"Adres bazowy",allowedOrigins:"Dozwolone źródła",originsHint:"Oddzielone przecinkami lub {star} dla dowolnego. Natywne aplikacje mobilne nie podlegają CORS.",saveApply:"Zapisz i zastosuj",testConnection:"Testuj połączenie",persistedEnv:"zapisano w .env",testOk:"Aplikacja webowa jest dostępna.",testFailed:"Aplikacja webowa nie odpowiedziała na kontrolę stanu pod tym adresem.",savedNotice:"Zapisano. Nowe źródła obowiązują od następnego żądania."},Pa={title:"Wtyczki",subtitle:"Integracje z usługami zewnętrznymi",registerExternal:"Zarejestruj zewnętrzną",cancelRegister:"Anuluj",name:"Nazwa",baseUrl:"Adres bazowy",provider:"Dostawca",register:"Zarejestruj",empty:"Brak wtyczek. Zarejestruj zewnętrzną powyżej lub skompiluj wbudowany łącznik.",builtin:"wbudowana",enabled:"włączona",disabled:"wyłączona",health:"Stan",configure:"Konfiguruj",close:"Zamknij",noConfig:"Ta wtyczka nie wymaga konfiguracji.",notSet:"Nie ustawiono — pozwól organizacjom i użytkownikom wybrać",capabilities:"Możliwości",saved:"Zapisano.",checking:"Sprawdzanie…",save:"Zapisz",saveEnable:"Zapisz i włącz",disable:"Wyłącz",remove:"Usuń",builtinNote:"Wtyczki wbudowane można wyłączyć, ale nie usunąć",confirmRemove:"Usunąć zewnętrzną wtyczkę „{name}”? Jej zapisana konfiguracja zostanie usunięta."},Aa={colEndpoint:"Punkt końcowy",colDescription:"Opis",authNone:"Bez uwierzytelniania",authBearer:"Token Bearer",authManager:"Administrator / superadministrator",authSuperadmin:"Superadministrator",groupPublic:"Publiczne",groupIdentity:"Tożsamość",groupCars:"Samochody",groupService:"Wpisy serwisowe",groupParts:"Części",groupAccount:"Konto",groupManagement:"Zarządzanie",groupSuperadmin:"Superadministrator"},Oa={app:_a,sections:ya,login:wa,status:xa,common:ka,users:Sa,orgs:Ta,server:Ea,pocketbase:$a,webapp:Ca,plugins:Pa,api:Aa},za={apiServer:"API-server",switchToLight:"Skift til lyst tema",switchToDark:"Skift til mørkt tema",theme:"Tema",signOut:"Log ud",loading:"Indlæser…",standardUserNote:"Logget ind som almindelig bruger — administrationssektioner kræver en administratorrolle",footer:"DriverVault — bilservice- og vedligeholdelsesregister."},Ia={overview:"Oversigt",users:"Brugere",orgs:"Organisationer",server:"API-server",pocketbase:"PocketBase",webapp:"Webapp",plugins:"Plugins",api:"API"},Ra={title:"Log ind",subtitle:"Superadmin-konsol til DriverVault API-serveren.",email:"E-mail",password:"Adgangskode",submit:"Log ind",submitting:"Logger ind…",invalid:"Ugyldig e-mail eller adgangskode.",failed:"Kunne ikke logge ind.",authNote:"Godkender mod PocketBase gennem denne server"},ja={title:"Status",unreachable:"utilgængelig",checking:"Tjekker…",apiServer:"API-server",pocketBase:"PocketBase",webApp:"Webapp",thisProcess:"denne proces"},Na={create:"Opret",save:"Gem",cancel:"Annuller",edit:"Rediger",delete:"Slet",rename:"Omdøb",empty:"—",name:"Navn",email:"E-mail",role:"Rolle",organization:"Organisation"},Ua={title:"Brugere",allOrgs:"Alle organisationer",yourOrg:"Din organisation",newUser:"Ny bruger",password:"Adgangskode",passwordUnchanged:"Adgangskode (tom = uændret)",passwordPlaceholder:"mindst 8 tegn",orgNone:"— ingen —",you:"dig",empty:"Ingen brugere.",confirmDelete:"Slet {email}? Dette kan ikke fortrydes."},Da={title:"Organisationer",subtitle:"Enheder, som brugere tilhører",subtitleOwn:"Din organisation",subtitleNone:"Opret en for at administrere dit eget team",newOrg:"Ny organisation",namePlaceholder:"Acme Fleet",empty:"Ingen organisationer endnu.",createHint:"Du har endnu ingen organisation. Opret en for at blive dens administrator.",colId:"ID",confirmDelete:'Slet organisationen "{name}"?',confirmDeleteOwn:"Slet din organisation „{name}“? Du fjernes fra den og bliver en almindelig bruger."},Ma={title:"API-server",subtitle:"Hvordan denne server identificerer sig over for de klienter, der forbinder til den",name:"Servernavn",nameHint:"Vises af klienter, der kan pege på mere end én DriverVault, for eksempel webappens serverskifter. Returneres af /api/health.",saveApply:"Gem og anvend",persistedEnv:"gemt i .env",savedNotice:"Gemt. Det nye navn gælder fra næste anmodning."},La={title:"PocketBase",subtitle:"Databaseforbindelse brugt af hvert endpoint",connected:"forbundet",noSuperuser:"ingen superbruger",unreachable:"utilgængelig",baseUrl:"Basis-URL",superuserEmail:"Superbrugerens e-mail",superuserPassword:"Superbrugerens adgangskode",passwordUnchanged:"uændret",passwordNotSet:"ikke angivet",saveApply:"Gem og anvend",testConnection:"Test forbindelse",persistedEnv:"gemt i .env",testOk:"Forbindelse OK — superbruger godkendt.",testReachableNoAuth:"PocketBase er tilgængelig, men servicekontoen blev ikke godkendt.",testUnreachable:"PocketBase er ikke tilgængelig på den adresse.",savedNotice:"Gemt. Serveren bruger nu denne PocketBase."},Fa={title:"Webapp",subtitle:"Adressen, der tjekkes ved statuskontrol, og hvem der må kalde dette API fra en browser",reachable:"tilgængelig",unreachable:"utilgængelig",baseUrl:"Basis-URL",allowedOrigins:"Tilladte oprindelser",originsHint:"Kommasepareret, eller {star} for enhver. Native mobilapps er ikke underlagt CORS.",saveApply:"Gem og anvend",testConnection:"Test forbindelse",persistedEnv:"gemt i .env",testOk:"Webappen er tilgængelig.",testFailed:"Webappen svarede ikke på sit helbredstjek på den adresse.",savedNotice:"Gemt. Nye oprindelser gælder fra næste anmodning."},Ba={title:"Plugins",subtitle:"Integrationer med tredjepartstjenester",registerExternal:"Registrér ekstern",cancelRegister:"Annuller",name:"Navn",baseUrl:"Basis-URL",provider:"Udbyder",register:"Registrér",empty:"Ingen plugins endnu. Registrér et eksternt ovenfor, eller kompilér et indbygget stik.",builtin:"indbygget",enabled:"aktiveret",disabled:"deaktiveret",health:"Helbred",configure:"Konfigurer",close:"Luk",noConfig:"Dette plugin kræver ingen konfiguration.",notSet:"Ikke angivet — lad organisationer og brugere vælge",capabilities:"Funktioner",saved:"Gemt.",checking:"Tjekker…",save:"Gem",saveEnable:"Gem og aktivér",disable:"Deaktiver",remove:"Fjern",builtinNote:"Indbyggede plugins kan deaktiveres, men ikke fjernes",confirmRemove:'Fjern det eksterne plugin "{name}"? Dets gemte konfiguration slettes.'},Ha={colEndpoint:"Endpoint",colDescription:"Beskrivelse",authNone:"Ingen godkendelse",authBearer:"Bearer-token",authManager:"Admin / superadmin",authSuperadmin:"Superadmin",groupPublic:"Offentlig",groupIdentity:"Identitet",groupCars:"Biler",groupService:"Serviceposter",groupParts:"Reservedele",groupAccount:"Konto",groupManagement:"Administration",groupSuperadmin:"Superadmin"},Va={app:za,sections:Ia,login:Ra,status:ja,common:Na,users:Ua,orgs:Da,server:Ma,pocketbase:La,webapp:Fa,plugins:Ba,api:Ha},To="dh-panel-lang",Eo="en",At={en:va,pl:Oa,da:Va},Ka=Object.keys(At);function Wa(){try{const t=localStorage.getItem(To);if(t&&At[t])return t}catch{}const e=(navigator.language||"en").split("-")[0];return At[e]?e:Eo}const En=B(Wa());function Ga(e){if(At[e]){En.value=e;try{localStorage.setItem(To,e)}catch{}}}function hi(e,t){return t.split(".").reduce((s,n)=>s==null?void 0:s[n],e)}function qa(e,t){return t?e.replace(/\{(\w+)\}/g,(s,n)=>t[n]==null?s:String(t[n])):e}function Za(e,t,s){let n="other";try{n=new Intl.PluralRules(s).select(t)}catch{n=t===1?"one":"other"}return e[n]??e.other??e.one}function h(e,t){const s=En.value;let n=hi(At[s],e);if(n==null&&(n=hi(At[Eo],e)),n==null)return e;if(typeof n=="object"){if((t==null?void 0:t.n)==null)return e;n=Za(n,t.n,s)}return typeof n!="string"?e:qa(n,t)}function gi(e,t,s){const i=h(e,{...s,[t]:"\0"}),o=i.indexOf("\0");return o===-1?{before:i,after:""}:{before:i.slice(0,o),after:i.slice(o+1)}}const an="dh-panel-token";function Ja(){try{return localStorage.getItem(an)||""}catch{return""}}const Ot=B(Ja()),le=B(null),xe=Ae(()=>{var e;return((e=le.value)==null?void 0:e.role)==="superadmin"}),gs=Ae(()=>{var e,t;return((e=le.value)==null?void 0:e.role)==="admin"||((t=le.value)==null?void 0:t.role)==="superadmin"});function $o(e){Ot.value=e;try{e?localStorage.setItem(an,e):localStorage.removeItem(an)}catch{}}class Ya extends Error{constructor(t,s,n){super(t),this.status=s,this.body=n}}function Xa(e,t){if(!e||typeof e!="object")return`HTTP ${t}`;if(e.error)return e.error;const s=Object.entries(e.data||{}).map(([n,i])=>`${n}: ${(i==null?void 0:i.message)||i}`).filter(Boolean);return s.length?s.join("; "):e.message||`HTTP ${t}`}async function ee(e,{method:t="GET",body:s,auth:n=!0}={}){const i={};s!==void 0&&(i["Content-Type"]="application/json"),n&&Ot.value&&(i.Authorization=Ot.value);const o=await fetch(e,{method:t,headers:i,body:s===void 0?void 0:JSON.stringify(s)}),r=await o.text();let l=null;try{l=r?JSON.parse(r):null}catch{l=null}if(!o.ok)throw o.status===401&&n&&$n(),new Ya(Xa(l,o.status),o.status,l);return l}async function Qa(e,t){const s=await ee("/api/auth/login",{method:"POST",body:{email:e,password:t},auth:!1});return $o(s.token),await Ss(),le.value}async function Ss(){return le.value=await ee("/api/identity"),le.value}function $n(){$o(""),le.value=null}async function ec(){if(!Ot.value)return null;try{return await Ss()}catch{return $n(),null}}const tc={class:"mx-auto flex w-full max-w-sm flex-col gap-5 pt-24"},sc={class:"dh-card p-6"},nc={class:"text-lg font-bold tracking-[-0.02em] text-strong"},ic={class:"mt-1 mb-5 text-sm text-body"},oc={class:"dh-label",for:"login-email"},rc={class:"dh-label",for:"login-password"},lc={key:0,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},ac=["disabled"],cc={class:"eyebrow text-center"},uc={__name:"LoginView",emits:["authenticated"],setup(e,{emit:t}){const s=t,n=B(""),i=B(""),o=B(""),r=B(!1),l=Ae(()=>n.value.trim()!==""&&i.value!==""&&!r.value);async function a(){if(l.value){o.value="",r.value=!0;try{const p=await Qa(n.value.trim(),i.value);s("authenticated",p)}catch(p){o.value=p.status===400||p.status===404?h("login.invalid"):p.message||h("login.failed"),i.value=""}finally{r.value=!1}}}return(p,d)=>(y(),$("div",tc,[u("div",sc,[u("h1",nc,m(g(h)("login.title")),1),u("p",ic,m(g(h)("login.subtitle")),1),u("form",{class:"flex flex-col gap-4",onSubmit:Xl(a,["prevent"])},[u("div",null,[u("label",oc,m(g(h)("login.email")),1),re(u("input",{id:"login-email","onUpdate:modelValue":d[0]||(d[0]=b=>n.value=b),class:"dh-input",type:"email",autocomplete:"username",autofocus:"",placeholder:"you@example.com"},null,512),[[de,n.value]])]),u("div",null,[u("label",rc,m(g(h)("login.password")),1),re(u("input",{id:"login-password","onUpdate:modelValue":d[1]||(d[1]=b=>i.value=b),class:"dh-input",type:"password",autocomplete:"current-password",placeholder:"••••••••"},null,512),[[de,i.value]])]),o.value?(y(),$("p",lc,m(o.value),1)):H("",!0),u("button",{class:"dh-btn w-full",type:"submit",disabled:!l.value},m(r.value?g(h)("login.submitting"):g(h)("login.submit")),9,ac)],32)]),u("p",cc,m(g(h)("login.authNote")),1)]))}},dc={class:"dh-card overflow-hidden"},fc={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},pc={class:"text-base font-bold tracking-[-0.02em] text-strong"},hc={key:0,class:"dh-pill bg-danger-soft text-danger"},gc={key:0,class:"px-5 py-4 text-sm text-danger"},mc={key:1,class:"w-full text-left text-sm"},bc={class:"px-5 py-3 font-medium text-strong"},vc={class:"data px-5 py-3 text-xs text-muted"},_c={class:"data px-5 py-3 text-right text-xs text-muted"},yc={class:"px-5 py-3 text-right"},wc={key:2,class:"px-5 py-4 text-sm text-muted"},xc={__name:"StatusCard",setup(e){const t=B(null),s=B("");let n=null;async function i(){try{t.value=await ee("/api/status",{auth:!1}),s.value=""}catch(l){t.value=null,s.value=l.message||h("status.unreachable")}}const o=Ae(()=>{var l,a,p;return[{key:"apiServer",label:h("status.apiServer"),h:(l=t.value)==null?void 0:l.apiServer},{key:"pocketBase",label:h("status.pocketBase"),h:(a=t.value)==null?void 0:a.pocketBase},{key:"webApp",label:h("status.webApp"),h:(p=t.value)==null?void 0:p.webApp}]});it(()=>{i(),n=setInterval(i,1e4)}),kn(()=>clearInterval(n));const r=l=>l==="ok"?"bg-success-soft text-success":"bg-danger-soft text-danger";return(l,a)=>(y(),$("div",dc,[u("div",fc,[u("div",pc,m(g(h)("status.title")),1),s.value?(y(),$("span",hc,[a[0]||(a[0]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Ee(m(g(h)("status.unreachable")),1)])):H("",!0)]),s.value?(y(),$("div",gc,m(s.value),1)):t.value?(y(),$("table",mc,[u("tbody",null,[(y(!0),$(te,null,Se(o.value,p=>(y(),$("tr",{key:p.key,class:"border-t border-subtle first:border-t-0"},[u("td",bc,m(p.label),1),u("td",vc,m(p.h.url||g(h)("status.thisProcess")),1),u("td",_c,m(p.h.latencyMs!=null?p.h.latencyMs+"ms":g(h)("common.empty")),1),u("td",yc,[u("span",{class:Oe(["dh-pill",r(p.h.status)])},[a[1]||(a[1]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Ee(m(p.h.status),1)],2)])]))),128))])])):(y(),$("div",wc,m(g(h)("status.checking")),1))]))}},kc={class:"dh-card overflow-hidden"},Sc={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},Tc={class:"text-base font-bold tracking-[-0.02em] text-strong"},Ec={class:"mt-0.5 text-xs text-muted"},$c={class:"flex flex-col gap-4 px-5 py-4"},Cc={class:"dh-label",for:"pb-url"},Pc={class:"grid gap-4 sm:grid-cols-2"},Ac={class:"dh-label",for:"pb-email"},Oc={class:"dh-label",for:"pb-password"},zc=["placeholder"],Ic={key:0,class:"data text-xs text-muted"},Rc={key:1,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},jc={key:2,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},Nc={class:"flex items-center gap-2"},Uc=["disabled"],Dc=["disabled"],Mc={class:"eyebrow"},Lc={__name:"PocketBaseCard",setup(e){const t=B(null),s=B({url:"",adminEmail:"",adminPassword:""}),n=B(null),i=B(""),o=B(""),r=B(!1);async function l(){try{t.value=await ee("/api/admin/pb-config"),s.value={url:t.value.url,adminEmail:t.value.adminEmail,adminPassword:""},n.value=t.value.probe}catch(d){i.value=d.message}}it(l);async function a(){i.value="",o.value="",r.value=!0;try{n.value=await ee("/api/admin/pb-config/test",{method:"POST",body:s.value}),o.value=n.value.superuser?h("pocketbase.testOk"):n.value.reachable?h("pocketbase.testReachableNoAuth"):h("pocketbase.testUnreachable")}catch(d){i.value=d.message}finally{r.value=!1}}async function p(){i.value="",o.value="",r.value=!0;try{const d=await ee("/api/admin/pb-config",{method:"PUT",body:s.value});t.value=d.config,n.value=d.config.probe,s.value.adminPassword="",o.value=d.warning||h("pocketbase.savedNotice")}catch(d){i.value=d.message}finally{r.value=!1}}return(d,b)=>{var C,O;return y(),$("div",kc,[u("div",Sc,[u("div",null,[u("div",Tc,m(g(h)("pocketbase.title")),1),u("p",Ec,m(g(h)("pocketbase.subtitle")),1)]),n.value?(y(),$("span",{key:0,class:Oe(["dh-pill",n.value.superuser?"bg-success-soft text-success":n.value.reachable?"bg-warning-soft text-warning":"bg-danger-soft text-danger"])},[b[3]||(b[3]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Ee(" "+m(n.value.superuser?g(h)("pocketbase.connected"):n.value.reachable?g(h)("pocketbase.noSuperuser"):g(h)("pocketbase.unreachable")),1)],2)):H("",!0)]),u("div",$c,[u("div",null,[u("label",Cc,m(g(h)("pocketbase.baseUrl")),1),re(u("input",{id:"pb-url","onUpdate:modelValue":b[0]||(b[0]=F=>s.value.url=F),class:"dh-input",placeholder:"http://10.2.1.10:8027"},null,512),[[de,s.value.url]])]),u("div",Pc,[u("div",null,[u("label",Ac,m(g(h)("pocketbase.superuserEmail")),1),re(u("input",{id:"pb-email","onUpdate:modelValue":b[1]||(b[1]=F=>s.value.adminEmail=F),class:"dh-input",autocomplete:"off"},null,512),[[de,s.value.adminEmail]])]),u("div",null,[u("label",Oc,m(g(h)("pocketbase.superuserPassword")),1),re(u("input",{id:"pb-password","onUpdate:modelValue":b[2]||(b[2]=F=>s.value.adminPassword=F),class:"dh-input",type:"password",autocomplete:"new-password",placeholder:(C=t.value)!=null&&C.adminConfigured?g(h)("pocketbase.passwordUnchanged"):g(h)("pocketbase.passwordNotSet")},null,8,zc),[[de,s.value.adminPassword]])])]),(O=n.value)!=null&&O.detail?(y(),$("p",Ic,m(n.value.detail),1)):H("",!0),o.value?(y(),$("p",Rc,m(o.value),1)):H("",!0),i.value?(y(),$("p",jc,m(i.value),1)):H("",!0),u("div",Nc,[u("button",{class:"dh-btn",disabled:r.value,onClick:p},m(g(h)("pocketbase.saveApply")),9,Uc),u("button",{class:"dh-btn-ghost",disabled:r.value,onClick:a},m(g(h)("pocketbase.testConnection")),9,Dc),b[4]||(b[4]=u("span",{class:"flex-1"},null,-1)),u("span",Mc,m(g(h)("pocketbase.persistedEnv")),1)])])])}}},Fc={class:"dh-card overflow-hidden"},Bc={class:"border-b border-subtle px-5 py-4"},Hc={class:"text-base font-bold tracking-[-0.02em] text-strong"},Vc={class:"mt-0.5 text-xs text-muted"},Kc={class:"flex flex-col gap-4 px-5 py-4"},Wc={class:"dh-label",for:"server-name"},Gc={class:"mt-1 text-xs text-muted"},qc={key:0,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},Zc={key:1,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},Jc={class:"flex items-center gap-2"},Yc=["disabled"],Xc={class:"eyebrow"},Qc={__name:"ServerCard",setup(e){const t=B({name:""}),s=B(""),n=B(""),i=B(!1);async function o(){try{const l=await ee("/api/admin/server-config");t.value={name:l.name}}catch(l){s.value=l.message}}it(o);async function r(){s.value="",n.value="",i.value=!0;try{const l=await ee("/api/admin/server-config",{method:"PUT",body:{name:t.value.name}});t.value={name:l.config.name},n.value=l.warning||h("server.savedNotice")}catch(l){s.value=l.message}finally{i.value=!1}}return(l,a)=>(y(),$("div",Fc,[u("div",Bc,[u("div",Hc,m(g(h)("server.title")),1),u("p",Vc,m(g(h)("server.subtitle")),1)]),u("div",Kc,[u("div",null,[u("label",Wc,m(g(h)("server.name")),1),re(u("input",{id:"server-name","onUpdate:modelValue":a[0]||(a[0]=p=>t.value.name=p),class:"dh-input",maxlength:"64",placeholder:"DriverVault API Server",onKeyup:xo(r,["enter"])},null,544),[[de,t.value.name]]),u("p",Gc,m(g(h)("server.nameHint")),1)]),n.value?(y(),$("p",qc,m(n.value),1)):H("",!0),s.value?(y(),$("p",Zc,m(s.value),1)):H("",!0),u("div",Jc,[u("button",{class:"dh-btn",disabled:i.value,onClick:r},m(g(h)("server.saveApply")),9,Yc),a[1]||(a[1]=u("span",{class:"flex-1"},null,-1)),u("span",Xc,m(g(h)("server.persistedEnv")),1)])])]))}},eu={class:"dh-card overflow-hidden"},tu={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},su={class:"text-base font-bold tracking-[-0.02em] text-strong"},nu={class:"mt-0.5 text-xs text-muted"},iu={class:"flex flex-col gap-4 px-5 py-4"},ou={class:"dh-label",for:"web-url"},ru={class:"dh-label",for:"web-origins"},lu={class:"mt-1 text-xs text-muted"},au={key:0,class:"data text-xs text-muted"},cu={key:1,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},uu={key:2,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},du={class:"flex items-center gap-2"},fu=["disabled"],pu=["disabled"],hu={class:"eyebrow"},gu={__name:"WebAppCard",setup(e){const t=B(null),s=B({url:"",origins:""}),n=B(null),i=B(""),o=B(""),r=B(!1),l=C=>C.split(",").map(O=>O.trim()).filter(Boolean);function a(C){t.value=C,s.value={url:C.url,origins:(C.allowOrigins||[]).join(", ")},n.value=C.probe}async function p(){try{a(await ee("/api/admin/webapp-config"))}catch(C){i.value=C.message}}it(p);async function d(){i.value="",o.value="",r.value=!0;try{n.value=await ee("/api/admin/webapp-config/test",{method:"POST",body:{url:s.value.url}}),o.value=n.value.status==="ok"?h("webapp.testOk"):h("webapp.testFailed")}catch(C){i.value=C.message}finally{r.value=!1}}async function b(){i.value="",o.value="",r.value=!0;try{const C=await ee("/api/admin/webapp-config",{method:"PUT",body:{url:s.value.url,allowOrigins:l(s.value.origins)}});a(C.config),o.value=C.warning||h("webapp.savedNotice")}catch(C){i.value=C.message}finally{r.value=!1}}return(C,O)=>{var F;return y(),$("div",eu,[u("div",tu,[u("div",null,[u("div",su,m(g(h)("webapp.title")),1),u("p",nu,m(g(h)("webapp.subtitle")),1)]),n.value?(y(),$("span",{key:0,class:Oe(["dh-pill",n.value.status==="ok"?"bg-success-soft text-success":"bg-danger-soft text-danger"])},[O[2]||(O[2]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Ee(" "+m(n.value.status==="ok"?g(h)("webapp.reachable"):g(h)("webapp.unreachable")),1)],2)):H("",!0)]),u("div",iu,[u("div",null,[u("label",ou,m(g(h)("webapp.baseUrl")),1),re(u("input",{id:"web-url","onUpdate:modelValue":O[0]||(O[0]=_=>s.value.url=_),class:"dh-input",placeholder:"http://localhost:8090"},null,512),[[de,s.value.url]])]),u("div",null,[u("label",ru,m(g(h)("webapp.allowedOrigins")),1),re(u("input",{id:"web-origins","onUpdate:modelValue":O[1]||(O[1]=_=>s.value.origins=_),class:"dh-input",placeholder:"http://localhost:8090, https://app.example.com"},null,512),[[de,s.value.origins]]),u("p",lu,[Ee(m(g(gi)("webapp.originsHint","star").before),1),O[3]||(O[3]=u("span",{class:"data"},"*",-1)),Ee(m(g(gi)("webapp.originsHint","star").after),1)])]),(F=n.value)!=null&&F.error?(y(),$("p",au,m(n.value.error),1)):H("",!0),o.value?(y(),$("p",cu,m(o.value),1)):H("",!0),i.value?(y(),$("p",uu,m(i.value),1)):H("",!0),u("div",du,[u("button",{class:"dh-btn",disabled:r.value,onClick:b},m(g(h)("webapp.saveApply")),9,fu),u("button",{class:"dh-btn-ghost",disabled:r.value,onClick:d},m(g(h)("webapp.testConnection")),9,pu),O[4]||(O[4]=u("span",{class:"flex-1"},null,-1)),u("span",hu,m(g(h)("webapp.persistedEnv")),1)])])])}}},mu={class:"dh-card overflow-hidden"},bu={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},vu={class:"text-base font-bold tracking-[-0.02em] text-strong"},_u={class:"mt-0.5 text-xs text-muted"},yu={key:0,class:"border-b border-subtle bg-sunken px-5 py-4"},wu={class:"grid gap-3 sm:grid-cols-3"},xu={class:"dh-label"},ku={class:"dh-label"},Su={class:"dh-label"},Tu=["disabled"],Eu={key:1,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},$u={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Cu={class:"flex items-center gap-3 px-5 py-3"},Pu=["onClick"],Au={class:"font-semibold text-strong"},Ou={class:"dh-pill bg-sunken text-muted"},zu={key:0,class:"text-xs text-muted"},Iu=["disabled","onClick"],Ru=["disabled","onClick"],ju={key:0,class:"bg-sunken px-5 py-4"},Nu={key:0,class:"data mb-3 text-xs text-muted"},Uu={key:1,class:"grid gap-3 sm:grid-cols-2"},Du={class:"dh-label"},Mu={key:0,class:"text-danger"},Lu=["onUpdate:modelValue"],Fu={key:0,value:""},Bu=["value"],Hu=["onUpdate:modelValue","type","placeholder"],Vu={key:2,class:"mt-1 text-xs text-muted"},Ku={key:2,class:"text-xs text-muted"},Wu={key:3,class:"mt-4"},Gu={class:"eyebrow mb-1.5"},qu={class:"data flex flex-col gap-1 text-xs text-muted"},Zu={class:"text-strong"},Ju={key:0},Yu={key:1},Xu={key:4,class:"data mt-3 text-xs text-body"},Qu={class:"mt-4 flex items-center gap-2"},ed=["disabled","onClick"],td=["disabled","onClick"],sd=["disabled","onClick"],nd={key:5,class:"eyebrow mt-2"},id={__name:"PluginsCard",setup(e){const t=B([]),s=B(""),n=B(!1),i=B(null),o=Jt({}),r=Jt({}),l=B(!1),a=B({name:"",baseURL:"",provider:""});async function p(){try{const E=await ee("/api/admin/plugins");t.value=E.plugins||[],s.value=""}catch(E){s.value=E.message}}it(p);function d(E){var P;if(i.value===E.name){i.value=null;return}const w={};for(const j of E.configFields||[])w[j.key]=((P=E.config)==null?void 0:P[j.key])??"";o[E.name]=w,i.value=E.name}async function b(E,w){n.value=!0,r[E.name]="";try{const P=await ee(`/api/admin/plugins/${encodeURIComponent(E.name)}`,{method:"PUT",body:{enabled:w,config:o[E.name]??{}}});r[E.name]=P.warning||h("plugins.saved"),await p()}catch(P){r[E.name]=P.message}finally{n.value=!1}}async function C(E){n.value=!0,r[E.name]=h("plugins.checking");try{const w=await ee(`/api/admin/plugins/${encodeURIComponent(E.name)}/health`,{method:"POST"});r[E.name]=`${w.health.status}${w.health.detail?" — "+w.health.detail:""}`,await p()}catch(w){r[E.name]=w.message}finally{n.value=!1}}async function O(E){if(confirm(h("plugins.confirmRemove",{name:E.name}))){n.value=!0;try{await ee(`/api/admin/plugins/${encodeURIComponent(E.name)}`,{method:"DELETE"}),i.value===E.name&&(i.value=null),await p()}catch(w){r[E.name]=w.message}finally{n.value=!1}}}async function F(){n.value=!0,s.value="";try{await ee("/api/admin/plugins",{method:"POST",body:a.value}),a.value={name:"",baseURL:"",provider:""},l.value=!1,await p()}catch(E){s.value=E.message}finally{n.value=!1}}const _=E=>E==="ok"?"bg-success-soft text-success":E==="degraded"?"bg-warning-soft text-warning":"bg-danger-soft text-danger";return(E,w)=>(y(),$("div",mu,[u("div",bu,[u("div",null,[u("div",vu,m(g(h)("plugins.title")),1),u("p",_u,m(g(h)("plugins.subtitle")),1)]),u("button",{class:"dh-btn-ghost",onClick:w[0]||(w[0]=P=>l.value=!l.value)},m(l.value?g(h)("plugins.cancelRegister"):g(h)("plugins.registerExternal")),1)]),l.value?(y(),$("div",yu,[u("div",wu,[u("div",null,[u("label",xu,m(g(h)("plugins.name")),1),re(u("input",{"onUpdate:modelValue":w[1]||(w[1]=P=>a.value.name=P),class:"dh-input",placeholder:"acme-parts"},null,512),[[de,a.value.name]])]),u("div",null,[u("label",ku,m(g(h)("plugins.baseUrl")),1),re(u("input",{"onUpdate:modelValue":w[2]||(w[2]=P=>a.value.baseURL=P),class:"dh-input",placeholder:"http://127.0.0.1:9100"},null,512),[[de,a.value.baseURL]])]),u("div",null,[u("label",Su,m(g(h)("plugins.provider")),1),re(u("input",{"onUpdate:modelValue":w[3]||(w[3]=P=>a.value.provider=P),class:"dh-input",placeholder:"ACME Corp"},null,512),[[de,a.value.provider]])])]),u("button",{class:"dh-btn mt-3",disabled:n.value||!a.value.name||!a.value.baseURL,onClick:F},m(g(h)("plugins.register")),9,Tu)])):H("",!0),s.value?(y(),$("p",Eu,m(s.value),1)):H("",!0),t.value.length?H("",!0):(y(),$("p",$u,m(g(h)("plugins.empty")),1)),(y(!0),$(te,null,Se(t.value,P=>(y(),$("div",{key:P.name,class:"border-t border-subtle first:border-t-0"},[u("div",Cu,[u("button",{class:"flex flex-1 items-center gap-3 text-left",onClick:j=>d(P)},[u("span",Au,m(P.name),1),u("span",Ou,m(P.kind||g(h)("plugins.builtin")),1),P.provider?(y(),$("span",zu,m(P.provider),1)):H("",!0),P.health?(y(),$("span",{key:1,class:Oe(["dh-pill",_(P.health.status)])},[w[4]||(w[4]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Ee(m(P.health.status),1)],2)):H("",!0)],8,Pu),u("span",{class:Oe(["dh-pill",P.enabled?"bg-success-soft text-success":"bg-sunken text-muted"])},m(P.enabled?g(h)("plugins.enabled"):g(h)("plugins.disabled")),3),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:j=>C(P)},m(g(h)("plugins.health")),9,Iu),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:j=>d(P)},m(i.value===P.name?g(h)("plugins.close"):g(h)("plugins.configure")),9,Ru)]),i.value===P.name?(y(),$("div",ju,[P.baseURL?(y(),$("div",Nu,m(P.baseURL),1)):H("",!0),(P.configFields||[]).length?(y(),$("div",Uu,[(y(!0),$(te,null,Se(P.configFields,j=>(y(),$("div",{key:j.key},[u("label",Du,[Ee(m(j.label||j.key),1),j.required?(y(),$("span",Mu," *")):H("",!0)]),j.type==="select"?re((y(),$("select",{key:0,"onUpdate:modelValue":N=>o[P.name][j.key]=N,class:"dh-select"},[j.required?H("",!0):(y(),$("option",Fu,m(g(h)("plugins.notSet")),1)),(y(!0),$(te,null,Se(j.options||[],N=>(y(),$("option",{key:N.value,value:N.value},m(N.label||N.value),9,Bu))),128))],8,Lu)),[[ks,o[P.name][j.key]]]):re((y(),$("input",{key:1,"onUpdate:modelValue":N=>o[P.name][j.key]=N,class:"dh-input",type:j.type==="password"?"password":j.type==="number"?"number":"text",placeholder:j.default||"",autocomplete:"off"},null,8,Hu)),[[ql,o[P.name][j.key]]]),j.help?(y(),$("p",Vu,m(j.help),1)):H("",!0)]))),128))])):(y(),$("p",Ku,m(g(h)("plugins.noConfig")),1)),(P.capabilities||[]).length?(y(),$("div",Wu,[u("div",Gu,m(g(h)("plugins.capabilities")),1),u("ul",qu,[(y(!0),$(te,null,Se(P.capabilities,j=>(y(),$("li",{key:j.id},[u("span",Zu,m(j.id),1),j.method||j.endpoint?(y(),$("span",Ju," — "+m(j.method)+" "+m(j.endpoint),1)):H("",!0),j.description?(y(),$("span",Yu," · "+m(j.description),1)):H("",!0)]))),128))])])):H("",!0),r[P.name]?(y(),$("p",Xu,m(r[P.name]),1)):H("",!0),u("div",Qu,[u("button",{class:"dh-btn",disabled:n.value,onClick:j=>b(P,!0)},m(P.enabled?g(h)("plugins.save"):g(h)("plugins.saveEnable")),9,ed),P.enabled?(y(),$("button",{key:0,class:"dh-btn-ghost",disabled:n.value,onClick:j=>b(P,!1)},m(g(h)("plugins.disable")),9,td)):H("",!0),w[5]||(w[5]=u("span",{class:"flex-1"},null,-1)),P.kind==="external"?(y(),$("button",{key:1,class:"dh-btn-danger",disabled:n.value,onClick:j=>O(P)},m(g(h)("plugins.remove")),9,sd)):H("",!0)]),P.kind!=="external"?(y(),$("p",nd,m(g(h)("plugins.builtinNote")),1)):H("",!0)])):H("",!0)]))),128))]))}},od={class:"dh-card overflow-hidden"},rd={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},ld={class:"text-base font-bold tracking-[-0.02em] text-strong"},ad={class:"mt-0.5 text-xs text-muted"},cd={key:0,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},ud={key:1,class:"border-b border-subtle bg-sunken px-5 py-4"},dd={class:"grid gap-3 sm:grid-cols-2"},fd={class:"dh-label"},pd={class:"dh-label"},hd={class:"dh-label"},gd=["placeholder"],md={class:"dh-label"},bd=["value"],vd={key:0},_d={class:"dh-label"},yd={value:""},wd=["value"],xd={class:"mt-3 flex items-center gap-2"},kd=["disabled"],Sd=["disabled"],Td={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Ed={key:3,class:"w-full text-left text-sm"},$d={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},Cd={class:"data px-5 py-2.5 text-xs text-strong"},Pd={key:0,class:"eyebrow ml-1"},Ad={class:"px-5 py-2.5 text-body"},Od={class:"px-5 py-2.5 text-body"},zd={class:"px-5 py-2.5"},Id={class:"px-5 py-2.5 text-right whitespace-nowrap"},Rd=["onClick"],jd=["disabled","onClick"],Nd={__name:"UsersCard",setup(e){const t=B([]),s=B([]),n=B(""),i=B(!1),o=B(null),r=B({}),l=Ae(()=>xe.value?["user","admin","superadmin"]:["user","admin"]);async function a(){try{const[_,E]=await Promise.all([ee("/api/users"),ee("/api/orgs")]);t.value=_.users||[],s.value=E.organizations||[],n.value=""}catch(_){n.value=_.message}}it(a);function p(){var _;o.value="new",r.value={email:"",name:"",password:"",role:"user",organization:xe.value?"":((_=le.value)==null?void 0:_.organization)||""}}function d(_){o.value=_.id,r.value={email:_.email,name:_.name||"",password:"",role:_.role,organization:_.organization||""}}function b(){o.value=null,n.value=""}async function C(){i.value=!0,n.value="";try{if(o.value==="new")await ee("/api/users",{method:"POST",body:r.value});else{const _={...r.value};_.password||delete _.password,await ee(`/api/users/${o.value}`,{method:"PATCH",body:_})}o.value=null,await a()}catch(_){n.value=_.message}finally{i.value=!1}}async function O(_){if(confirm(h("users.confirmDelete",{email:_.email}))){i.value=!0,n.value="";try{await ee(`/api/users/${_.id}`,{method:"DELETE"}),await a()}catch(E){n.value=E.message}finally{i.value=!1}}}const F=_=>_==="superadmin"?"bg-info-soft text-info":_==="admin"?"bg-warning-soft text-warning":"bg-sunken text-muted";return(_,E)=>(y(),$("div",od,[u("div",rd,[u("div",null,[u("div",ld,m(g(h)("users.title")),1),u("p",ad,m(g(xe)?g(h)("users.allOrgs"):g(h)("users.yourOrg")),1)]),u("button",{class:"dh-btn",onClick:p},m(g(h)("users.newUser")),1)]),n.value?(y(),$("p",cd,m(n.value),1)):H("",!0),o.value?(y(),$("div",ud,[u("div",dd,[u("div",null,[u("label",fd,m(g(h)("common.email")),1),re(u("input",{"onUpdate:modelValue":E[0]||(E[0]=w=>r.value.email=w),class:"dh-input",type:"email",autocomplete:"off"},null,512),[[de,r.value.email]])]),u("div",null,[u("label",pd,m(g(h)("common.name")),1),re(u("input",{"onUpdate:modelValue":E[1]||(E[1]=w=>r.value.name=w),class:"dh-input",autocomplete:"off"},null,512),[[de,r.value.name]])]),u("div",null,[u("label",hd,m(o.value==="new"?g(h)("users.password"):g(h)("users.passwordUnchanged")),1),re(u("input",{"onUpdate:modelValue":E[2]||(E[2]=w=>r.value.password=w),class:"dh-input",type:"password",autocomplete:"new-password",placeholder:g(h)("users.passwordPlaceholder")},null,8,gd),[[de,r.value.password]])]),u("div",null,[u("label",md,m(g(h)("common.role")),1),re(u("select",{"onUpdate:modelValue":E[3]||(E[3]=w=>r.value.role=w),class:"dh-select"},[(y(!0),$(te,null,Se(l.value,w=>(y(),$("option",{key:w,value:w},m(w),9,bd))),128))],512),[[ks,r.value.role]])]),g(xe)?(y(),$("div",vd,[u("label",_d,m(g(h)("common.organization")),1),re(u("select",{"onUpdate:modelValue":E[4]||(E[4]=w=>r.value.organization=w),class:"dh-select"},[u("option",yd,m(g(h)("users.orgNone")),1),(y(!0),$(te,null,Se(s.value,w=>(y(),$("option",{key:w.id,value:w.id},m(w.name),9,wd))),128))],512),[[ks,r.value.organization]])])):H("",!0)]),u("div",xd,[u("button",{class:"dh-btn",disabled:i.value,onClick:C},m(o.value==="new"?g(h)("common.create"):g(h)("common.save")),9,kd),u("button",{class:"dh-btn-ghost",disabled:i.value,onClick:b},m(g(h)("common.cancel")),9,Sd)])])):H("",!0),t.value.length?(y(),$("table",Ed,[u("thead",null,[u("tr",$d,[u("th",null,m(g(h)("common.email")),1),u("th",null,m(g(h)("common.name")),1),u("th",null,m(g(h)("common.organization")),1),u("th",null,m(g(h)("common.role")),1),E[5]||(E[5]=u("th",null,null,-1))])]),u("tbody",null,[(y(!0),$(te,null,Se(t.value,w=>{var P,j;return y(),$("tr",{key:w.id,class:"border-t border-subtle transition-colors hover:bg-sunken"},[u("td",Cd,[Ee(m(w.email)+" ",1),w.id===((P=g(le))==null?void 0:P.id)?(y(),$("span",Pd,m(g(h)("users.you")),1)):H("",!0)]),u("td",Ad,m(w.name||g(h)("common.empty")),1),u("td",Od,m(w.organizationName||g(h)("common.empty")),1),u("td",zd,[u("span",{class:Oe(["dh-pill",F(w.role)])},m(w.role),3)]),u("td",Id,[u("button",{class:"dh-btn-ghost",onClick:N=>d(w)},m(g(h)("common.edit")),9,Rd),w.id!==((j=g(le))==null?void 0:j.id)?(y(),$("button",{key:0,class:"dh-btn-danger ml-1.5",disabled:i.value,onClick:N=>O(w)},m(g(h)("common.delete")),9,jd)):H("",!0)])])}),128))])])):(y(),$("p",Td,m(g(h)("users.empty")),1))]))}},Ud={class:"dh-card overflow-hidden"},Dd={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},Md={class:"text-base font-bold tracking-[-0.02em] text-strong"},Ld={class:"mt-0.5 text-xs text-muted"},Fd={key:0,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},Bd={key:1,class:"border-b border-subtle bg-sunken px-5 py-4"},Hd={class:"dh-label"},Vd=["placeholder"],Kd={class:"mt-3 flex items-center gap-2"},Wd=["disabled"],Gd=["disabled"],qd={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Zd={key:3,class:"w-full text-left text-sm"},Jd={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},Yd={class:"px-5 py-2.5 font-medium text-strong"},Xd={class:"data px-5 py-2.5 text-xs text-muted"},Qd={class:"px-5 py-2.5 text-right whitespace-nowrap"},ef=["onClick"],tf=["disabled","onClick"],sf={__name:"OrgsCard",setup(e){const t=B([]),s=B(""),n=B(!1),i=B(null),o=B(""),r=Ae(()=>{var _;return((_=le.value)==null?void 0:_.organization)||""}),l=Ae(()=>xe.value||!r.value);function a(_){return xe.value||_.id===r.value}async function p(){if(!gs.value){t.value=[];return}try{const _=await ee("/api/orgs");t.value=_.organizations||[],s.value=""}catch(_){s.value=_.message}}it(p);function d(){i.value="new",o.value=""}function b(_){i.value=_.id,o.value=_.name}function C(){i.value=null,s.value=""}async function O(){n.value=!0,s.value="";try{i.value==="new"?(await ee("/api/orgs",{method:"POST",body:{name:o.value}}),xe.value||await Ss()):await ee(`/api/orgs/${i.value}`,{method:"PATCH",body:{name:o.value}}),i.value=null,await p()}catch(_){s.value=_.message}finally{n.value=!1}}async function F(_){const E=!xe.value&&_.id===r.value;if(confirm(h(E?"orgs.confirmDeleteOwn":"orgs.confirmDelete",{name:_.name}))){n.value=!0,s.value="";try{await ee(`/api/orgs/${_.id}`,{method:"DELETE"}),E&&await Ss(),await p()}catch(P){s.value=P.message}finally{n.value=!1}}}return(_,E)=>(y(),$("div",Ud,[u("div",Dd,[u("div",null,[u("div",Md,m(g(xe)?g(h)("orgs.title"):g(h)("common.organization")),1),u("p",Ld,m(g(xe)?g(h)("orgs.subtitle"):r.value?g(h)("orgs.subtitleOwn"):g(h)("orgs.subtitleNone")),1)]),l.value?(y(),$("button",{key:0,class:"dh-btn",onClick:d},m(g(h)("orgs.newOrg")),1)):H("",!0)]),s.value?(y(),$("p",Fd,m(s.value),1)):H("",!0),i.value?(y(),$("div",Bd,[u("label",Hd,m(g(h)("common.name")),1),re(u("input",{"onUpdate:modelValue":E[0]||(E[0]=w=>o.value=w),class:"dh-input",placeholder:g(h)("orgs.namePlaceholder"),onKeyup:xo(O,["enter"])},null,40,Vd),[[de,o.value]]),u("div",Kd,[u("button",{class:"dh-btn",disabled:n.value||!o.value.trim(),onClick:O},m(i.value==="new"?g(h)("common.create"):g(h)("common.save")),9,Wd),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:C},m(g(h)("common.cancel")),9,Gd)])])):H("",!0),t.value.length?(y(),$("table",Zd,[u("thead",null,[u("tr",Jd,[u("th",null,m(g(h)("common.name")),1),u("th",null,m(g(h)("orgs.colId")),1),E[1]||(E[1]=u("th",null,null,-1))])]),u("tbody",null,[(y(!0),$(te,null,Se(t.value,w=>(y(),$("tr",{key:w.id,class:"border-t border-subtle transition-colors hover:bg-sunken"},[u("td",Yd,m(w.name),1),u("td",Xd,m(w.id),1),u("td",Qd,[a(w)?(y(),$(te,{key:0},[u("button",{class:"dh-btn-ghost",onClick:P=>b(w)},m(g(h)("common.rename")),9,ef),u("button",{class:"dh-btn-danger ml-1.5",disabled:n.value,onClick:P=>F(w)},m(g(h)("common.delete")),9,tf)],64)):H("",!0)])]))),128))])])):(y(),$("p",qd,m(l.value&&!g(xe)?g(h)("orgs.createHint"):g(h)("orgs.empty")),1))]))}},nf={class:"dh-card overflow-hidden"},of={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},rf={class:"text-base font-bold tracking-[-0.02em] text-strong"},lf={class:"eyebrow"},af={class:"w-full text-left text-sm"},cf={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},uf={class:"data border-t border-subtle px-5 py-2.5 text-xs whitespace-nowrap"},df={class:"text-strong"},ff={class:"border-t border-subtle px-5 py-2.5 text-body"},rt={__name:"EndpointTable",props:{title:String,auth:String,endpoints:Array},setup(e){const t={GET:"text-success",POST:"text-brandtext",PATCH:"text-warning",DELETE:"text-danger"};return(s,n)=>(y(),$("div",nf,[u("div",of,[u("div",rf,m(e.title),1),u("span",lf,m(e.auth),1)]),u("table",af,[u("thead",null,[u("tr",cf,[u("th",null,m(g(h)("api.colEndpoint")),1),u("th",null,m(g(h)("api.colDescription")),1)])]),u("tbody",null,[(y(!0),$(te,null,Se(e.endpoints,i=>(y(),$("tr",{key:i.method+i.path,class:"transition-colors hover:bg-sunken"},[u("td",uf,[u("span",{class:Oe(["font-semibold",t[i.method]])},m(i.method),3),u("span",df,m(i.path),1)]),u("td",ff,m(i.desc),1)]))),128))])])]))}},pf={class:"mx-auto flex max-w-4xl flex-col gap-6 px-6 pt-12 pb-16"},hf={class:"flex items-center gap-3"},gf={class:"inline-flex items-center gap-2.5 select-none"},mf={class:"h-8 w-8 shrink-0",viewBox:"0 0 48 48",fill:"none","aria-hidden":"true"},bf={transform:"translate(7 0) skewX(-13)"},vf=["fill"],_f=["fill"],yf=["fill"],wf={class:"eyebrow mt-1.5"},xf={key:0,class:"data hidden text-xs text-muted sm:inline"},kf={key:0},Sf={key:1,class:"dh-pill bg-info-soft text-info"},Tf=["value","aria-label"],Ef=["value"],$f=["title"],Cf={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.75",class:"h-4 w-4"},Pf={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.75",class:"h-4 w-4"},Af={key:0,class:"eyebrow py-16 text-center"},Of={class:"flex flex-wrap gap-1.5"},zf=["onClick"],If={key:8,class:"eyebrow text-center"},Rf={class:"eyebrow text-center"},jf={__name:"App",setup(e){const t=B(!0),s=B("overview");it(async()=>{await ec(),t.value=!1});const n=Ae(()=>{const _=[{id:"overview",label:h("sections.overview")}];return gs.value&&_.push({id:"users",label:h("sections.users")}),(gs.value||le.value)&&_.push({id:"orgs",label:h("sections.orgs")}),xe.value&&_.push({id:"server",label:h("sections.server")},{id:"pocketbase",label:h("sections.pocketbase")},{id:"webapp",label:h("sections.webapp")},{id:"plugins",label:h("sections.plugins")}),_.push({id:"api",label:h("sections.api")}),_}),i=Ae(()=>Ka.map(_=>{let E=_;try{E=new Intl.DisplayNames([_],{type:"language"}).of(_)||_}catch{}return{code:_,label:E.charAt(0).toUpperCase()+E.slice(1)}}));function o(){$n(),s.value="overview"}const r=Ae(()=>Et.value==="dark"?["#60a5fa","#93c5fd","#ffffff"]:["var(--brand-700)","var(--brand-500)","var(--brand-400)"]),l=[{method:"GET",path:"/api/health",desc:"Liveness probe (no auth)"},{method:"GET",path:"/api/status",desc:"Health of PocketBase + Web App"},{method:"POST",path:"/api/auth/login",desc:"Exchange email + password for a PocketBase token"},{method:"GET",path:"/api/auth/validate",desc:"Check whether a token is still valid"}],a=[{method:"GET",path:"/api/auth/me",desc:"Identity of the bearer token"},{method:"GET",path:"/api/identity",desc:"Identity incl. role + organization"}],p=[{method:"GET",path:"/api/cars",desc:"List owned + shared cars"},{method:"POST",path:"/api/cars",desc:"Create a car"},{method:"GET",path:"/api/cars/{id}",desc:"Fetch one car"},{method:"PATCH",path:"/api/cars/{id}",desc:"Update a car"},{method:"DELETE",path:"/api/cars/{id}",desc:"Delete a car (owner only)"},{method:"GET",path:"/api/cars/{id}/service-records",desc:"A car's service history"},{method:"GET",path:"/api/cars/{id}/parts",desc:"A car's parts catalog"},{method:"GET",path:"/api/cars/{id}/shares",desc:"Who a car is shared with (owner)"},{method:"POST",path:"/api/cars/{id}/shares",desc:"Share a car by email (owner)"},{method:"DELETE",path:"/api/cars/{id}/shares/{userId}",desc:"Revoke a share (owner)"}],d=[{method:"GET",path:"/api/service-records",desc:"List service records"},{method:"POST",path:"/api/service-records",desc:"Log a service record"},{method:"GET",path:"/api/service-records/{id}",desc:"Fetch one record"},{method:"PATCH",path:"/api/service-records/{id}",desc:"Update a record"},{method:"DELETE",path:"/api/service-records/{id}",desc:"Delete a record"}],b=[{method:"GET",path:"/api/parts",desc:"List parts"},{method:"POST",path:"/api/parts",desc:"Add a part"},{method:"GET",path:"/api/parts/{id}",desc:"Fetch one part"},{method:"PATCH",path:"/api/parts/{id}",desc:"Update a part"},{method:"DELETE",path:"/api/parts/{id}",desc:"Delete a part"}],C=[{method:"GET",path:"/api/me",desc:"Current user profile"},{method:"PATCH",path:"/api/me",desc:"Update profile"},{method:"POST",path:"/api/me/password",desc:"Change password"},{method:"POST",path:"/api/me/avatar",desc:"Upload avatar"},{method:"GET",path:"/api/me/avatar",desc:"Fetch avatar"},{method:"DELETE",path:"/api/me/avatar",desc:"Remove avatar"},{method:"POST",path:"/api/me/verify/request",desc:"Request email verification"},{method:"GET",path:"/api/me/export",desc:"Export your data"},{method:"POST",path:"/api/me/import",desc:"Import data"},{method:"POST",path:"/api/me/delete",desc:"Request account deletion"},{method:"POST",path:"/api/me/delete/cancel",desc:"Cancel deletion request"},{method:"DELETE",path:"/api/me",desc:"Finalize account deletion"}],O=[{method:"GET",path:"/api/users",desc:"List users (scoped by role)"},{method:"POST",path:"/api/users",desc:"Create a user"},{method:"PATCH",path:"/api/users/{id}",desc:"Update email / name / role / org / password"},{method:"DELETE",path:"/api/users/{id}",desc:"Delete a user"},{method:"GET",path:"/api/orgs",desc:"List organizations"},{method:"POST",path:"/api/orgs",desc:"Create an organization (any user without one; creator becomes admin)"},{method:"PATCH",path:"/api/orgs/{id}",desc:"Rename an organization (own org; any as superadmin)"},{method:"DELETE",path:"/api/orgs/{id}",desc:"Delete an organization (own org; any as superadmin)"}],F=[{method:"GET",path:"/api/admin/pb-config",desc:"PocketBase connection + live probe"},{method:"POST",path:"/api/admin/pb-config/test",desc:"Probe a candidate connection"},{method:"PUT",path:"/api/admin/pb-config",desc:"Apply + persist a connection"},{method:"GET",path:"/api/admin/server-config",desc:"This server's display name"},{method:"PUT",path:"/api/admin/server-config",desc:"Rename this server (applied + persisted)"},{method:"GET",path:"/api/admin/webapp-config",desc:"Web App URL + CORS origins, with a live probe"},{method:"POST",path:"/api/admin/webapp-config/test",desc:"Probe a candidate Web App address"},{method:"PUT",path:"/api/admin/webapp-config",desc:"Apply + persist Web App settings"},{method:"GET",path:"/api/admin/plugins",desc:"List plugins (secrets masked)"},{method:"POST",path:"/api/admin/plugins",desc:"Register an external plugin"},{method:"GET",path:"/api/admin/plugins/{name}",desc:"Fetch one plugin"},{method:"PUT",path:"/api/admin/plugins/{name}",desc:"Enable/disable + configure"},{method:"DELETE",path:"/api/admin/plugins/{name}",desc:"Remove an external plugin"},{method:"POST",path:"/api/admin/plugins/{name}/health",desc:"Run a health check now"}];return(_,E)=>(y(),$("div",pf,[u("div",hf,[u("span",gf,[(y(),$("svg",mf,[u("g",bf,[u("rect",{x:"9",y:"16",width:"6",height:"16",rx:"3",fill:r.value[0]},null,8,vf),u("rect",{x:"19",y:"12",width:"6",height:"24",rx:"3",fill:r.value[1]},null,8,_f),u("rect",{x:"29",y:"8",width:"6",height:"32",rx:"3",fill:r.value[2]},null,8,yf)])])),E[2]||(E[2]=u("span",{class:"text-2xl leading-none font-extrabold tracking-[-0.03em] italic"},[u("span",{class:"text-strong"},"Driver"),u("span",{class:"text-brandtext"},"Vault")],-1))]),u("span",wf,m(g(h)("app.apiServer")),1),E[5]||(E[5]=u("div",{class:"flex-1"},null,-1)),g(le)?(y(),$("span",xf,[Ee(m(g(le).email),1),g(le).organizationName?(y(),$("span",kf," · "+m(g(le).organizationName),1)):H("",!0)])):H("",!0),g(le)?(y(),$("span",Sf,m(g(le).role),1)):H("",!0),u("select",{class:"dh-select !w-auto !py-1 !text-xs",value:g(En),"aria-label":g(h)("sections.overview"),onChange:E[0]||(E[0]=w=>g(Ga)(w.target.value))},[(y(!0),$(te,null,Se(i.value,w=>(y(),$("option",{key:w.code,value:w.code},m(w.label),9,Ef))),128))],40,Tf),u("button",{class:"dh-btn-ghost",title:g(Et)==="dark"?g(h)("app.switchToLight"):g(h)("app.switchToDark"),onClick:E[1]||(E[1]=(...w)=>g(pi)&&g(pi)(...w))},[g(Et)==="dark"?(y(),$("svg",Cf,[...E[3]||(E[3]=[u("circle",{cx:"12",cy:"12",r:"4"},null,-1),u("path",{"stroke-linecap":"round",d:"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"},null,-1)])])):(y(),$("svg",Pf,[...E[4]||(E[4]=[u("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"},null,-1)])])),Ee(" "+m(g(h)("app.theme")),1)],8,$f),g(Ot)?(y(),$("button",{key:2,class:"dh-btn-ghost",onClick:o},m(g(h)("app.signOut")),1)):H("",!0)]),t.value?(y(),$("p",Af,m(g(h)("app.loading")),1)):g(Ot)?(y(),$(te,{key:2},[u("nav",Of,[(y(!0),$(te,null,Se(n.value,w=>(y(),$("button",{key:w.id,class:Oe(["dh-btn-ghost",s.value===w.id?"border-accent text-brandtext":""]),onClick:P=>s.value=w.id},m(w.label),11,zf))),128))]),s.value==="overview"?(y(),Je(xc,{key:0})):s.value==="users"?(y(),Je(Nd,{key:1})):s.value==="orgs"?(y(),Je(sf,{key:2})):s.value==="server"?(y(),Je(Qc,{key:3})):s.value==="pocketbase"?(y(),Je(Lc,{key:4})):s.value==="webapp"?(y(),Je(gu,{key:5})):s.value==="plugins"?(y(),Je(id,{key:6})):s.value==="api"?(y(),$(te,{key:7},[ue(rt,{title:g(h)("api.groupPublic"),auth:g(h)("api.authNone"),endpoints:l},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupIdentity"),auth:g(h)("api.authBearer"),endpoints:a},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupCars"),auth:g(h)("api.authBearer"),endpoints:p},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupService"),auth:g(h)("api.authBearer"),endpoints:d},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupParts"),auth:g(h)("api.authBearer"),endpoints:b},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupAccount"),auth:g(h)("api.authBearer"),endpoints:C},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupManagement"),auth:g(h)("api.authManager"),endpoints:O},null,8,["title","auth"]),ue(rt,{title:g(h)("api.groupSuperadmin"),auth:g(h)("api.authSuperadmin"),endpoints:F},null,8,["title","auth"])],64)):H("",!0),!g(gs)&&s.value==="overview"?(y(),$("p",If,m(g(h)("app.standardUserNote")),1)):H("",!0)],64)):(y(),Je(uc,{key:1})),u("p",Rf,m(g(h)("app.footer")),1)]))}};sa(jf).mount("#app"); diff --git a/API Server/internal/api/dist/assets/index-CGuUVjJH.css b/API Server/internal/api/dist/assets/index-CGuUVjJH.css new file mode 100644 index 0000000..400f8f0 --- /dev/null +++ b/API Server/internal/api/dist/assets/index-CGuUVjJH.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--spacing:.25rem;--container-sm:24rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius-control:12px;--radius-card:18px;--radius-pill:999px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.\!w-auto{width:auto!important}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-sm{max-width:var(--container-sm)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-control{border-radius:12px}.rounded-full{border-radius:3.40282e38px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-accent{border-color:var(--accent)}.border-subtle{border-color:var(--border-subtle)}.bg-current{background-color:currentColor}.bg-danger-soft{background-color:var(--danger-100)}.bg-info-soft{background-color:var(--info-100)}.bg-success-soft{background-color:var(--success-100)}.bg-sunken{background-color:var(--surface-sunken)}.bg-warning-soft{background-color:var(--warning-100)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.\!py-1{padding-block:var(--spacing)!important}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.\!text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.03em\]{--tw-tracking:-.03em;letter-spacing:-.03em}.whitespace-nowrap{white-space:nowrap}.text-body{color:var(--text-body)}.text-brandtext{color:var(--text-brand)}.text-danger{color:var(--danger-600)}.text-info{color:var(--info-600)}.text-muted{color:var(--text-muted)}.text-strong{color:var(--text-strong)}.text-success{color:var(--success-600)}.text-warning{color:var(--warning-600)}.italic{font-style:italic}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}@media(hover:hover){.hover\:bg-sunken:hover{background-color:var(--surface-sunken)}}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&\>th\]\:px-5>th{padding-inline:calc(var(--spacing) * 5)}.\[\&\>th\]\:py-2\.5>th{padding-block:calc(var(--spacing) * 2.5)}.\[\&\>th\]\:font-medium>th{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}}:root{color-scheme:light;--brand-900:#0b1730;--brand-800:#0f1e3d;--brand-700:#1e40af;--brand-600:#2563eb;--brand-500:#3b82f6;--brand-400:#60a5fa;--brand-300:#93c5fd;--brand-200:#c7dbfb;--brand-100:#e8f0fd;--ink-900:#0f1e3d;--ink-700:#28374f;--ink-600:#3e4e68;--ink-500:#5c6b85;--ink-400:#7a8aa6;--ink-300:#b4bece;--ink-200:#d6deea;--ink-100:#e4e9f2;--ink-50:#eef2f8;--ink-25:#f7f9fc;--white:#fff;--success-600:#1f8a5b;--success-100:#e1f3ea;--warning-600:#d9822b;--warning-100:#fbeddd;--danger-600:#dc2a45;--danger-100:#fbe3e7;--info-600:#2563eb;--info-100:#e8f0fd;--surface-page:var(--ink-25);--surface-card:var(--white);--surface-sunken:var(--ink-50);--border-subtle:var(--ink-100);--border-default:var(--ink-200);--border-strong:var(--ink-300);--text-strong:var(--ink-900);--text-body:var(--ink-600);--text-muted:var(--ink-400);--text-brand:var(--brand-700);--accent:var(--brand-600);--accent-hover:var(--brand-700);--focus-ring:var(--brand-400);--shadow-xs:0 1px 2px #0f1e3d0f;--shadow-sm:0 1px 2px #0f1e3d0a, 0 2px 6px #0f1e3d0f;--shadow-md:0 1px 2px #0f1e3d0a, 0 12px 30px -12px #0f1e3d24;--font-display:"Archivo", system-ui, sans-serif;--font-sans:"Archivo", system-ui, sans-serif;--font-mono:"DM Mono", ui-monospace, "SF Mono", monospace}html.dark{color-scheme:dark;--success-100:#12352a;--warning-100:#3a2a16;--danger-100:#3a1620;--info-100:#122a4d;--surface-page:#0b1730;--surface-card:#13233f;--surface-sunken:#0f1e38;--border-subtle:#21324f;--border-default:#2c3f5e;--border-strong:#3c5173;--text-strong:#f2f6fc;--text-body:#b7c4d9;--text-muted:#7c8ca8;--text-brand:#93c5fd;--accent:#3b82f6;--accent-hover:#60a5fa;--focus-ring:#60a5fa;--success-600:#35b27a;--warning-600:#e0a03a;--danger-600:#e85c74;--shadow-xs:0 1px 2px #0006;--shadow-sm:0 1px 2px #0006, 0 2px 6px #0006;--shadow-md:0 1px 2px #00000059, 0 12px 30px -12px #0000008c}html,body,#app{height:100%}body{font-family:var(--font-sans);background:var(--surface-page);color:var(--text-body);-webkit-font-smoothing:antialiased;margin:0}.eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.16em;color:var(--text-muted);font-size:11px}.data{font-family:var(--font-mono);letter-spacing:.02em;font-variant-numeric:tabular-nums}.dh-btn-ghost{border-radius:var(--radius-control);border:1px solid var(--border-default);background:var(--surface-card);height:34px;color:var(--text-strong);font-family:var(--font-sans);cursor:pointer;justify-content:center;align-items:center;gap:8px;padding:0 12px;font-size:.8125rem;font-weight:600;transition:background-color .14s,border-color .14s;display:inline-flex}.dh-btn-ghost:hover{background:var(--surface-sunken);border-color:var(--border-strong)}.dh-btn-ghost:focus-visible{box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-btn{border-radius:var(--radius-control);background:var(--accent);color:#fff;height:34px;font-family:var(--font-sans);cursor:pointer;border:1px solid #0000;justify-content:center;align-items:center;gap:8px;padding:0 14px;font-size:.8125rem;font-weight:600;transition:background-color .14s;display:inline-flex}.dh-btn:hover:not(:disabled){background:var(--accent-hover)}.dh-btn:focus-visible{box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-btn:disabled,.dh-btn-ghost:disabled,.dh-btn-danger:disabled{opacity:.55;cursor:not-allowed}.dh-btn-danger{border-radius:var(--radius-control);border:1px solid var(--border-default);height:30px;color:var(--danger-600);font-family:var(--font-sans);cursor:pointer;background:0 0;justify-content:center;align-items:center;gap:6px;padding:0 10px;font-size:.75rem;font-weight:600;transition:background-color .14s,border-color .14s;display:inline-flex}.dh-btn-danger:hover:not(:disabled){background:var(--danger-100);border-color:var(--danger-600)}.dh-input,.dh-select{border-radius:var(--radius-control);border:1px solid var(--border-default);background:var(--surface-card);width:100%;height:36px;color:var(--text-strong);font-family:var(--font-sans);padding:0 10px;font-size:.8125rem;transition:border-color .14s}.dh-input::placeholder{color:var(--text-muted)}.dh-input:focus,.dh-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.16em;color:var(--text-muted);margin-bottom:5px;font-size:10px;display:block}.dh-pill{border-radius:var(--radius-pill);font-family:var(--font-mono);white-space:nowrap;align-items:center;gap:6px;padding:3px 9px;font-size:11px;font-weight:500;display:inline-flex}.dh-card{border:1px solid var(--border-subtle);background:var(--surface-card);border-radius:var(--radius-card);box-shadow:var(--shadow-sm)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false} diff --git a/API Server/internal/api/dist/assets/index-D2BCqgpA.js b/API Server/internal/api/dist/assets/index-D2BCqgpA.js new file mode 100644 index 0000000..ab572ff --- /dev/null +++ b/API Server/internal/api/dist/assets/index-D2BCqgpA.js @@ -0,0 +1,17 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();/** +* @vue/shared v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function cn(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const X={},St=[],Je=()=>{},mi=()=>!1,Ts=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Es=e=>e.startsWith("onUpdate:"),ve=Object.assign,un=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},$o=Object.prototype.hasOwnProperty,W=(e,t)=>$o.call(e,t),M=Array.isArray,Tt=e=>ss(e)==="[object Map]",Dt=e=>ss(e)==="[object Set]",Dn=e=>ss(e)==="[object Date]",V=e=>typeof e=="function",oe=e=>typeof e=="string",Ye=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",bi=e=>(Z(e)||V(e))&&V(e.then)&&V(e.catch),vi=Object.prototype.toString,ss=e=>vi.call(e),Oo=e=>ss(e).slice(8,-1),yi=e=>ss(e)==="[object Object]",dn=e=>oe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ht=cn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ps=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Ro=/-\w/g,De=Ps(e=>e.replace(Ro,t=>t.slice(1).toUpperCase())),zo=/\B([A-Z])/g,ht=Ps(e=>e.replace(zo,"-$1").toLowerCase()),_i=Ps(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ns=Ps(e=>e?`on${_i(e)}`:""),Ze=(e,t)=>!Object.is(e,t),ps=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Cs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let In;const As=()=>In||(In=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function pn(e){if(M(e)){const t={};for(let s=0;s{if(s){const n=s.split(Io);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Ue(e){let t="";if(oe(e))t=e;else if(M(e))for(let s=0;sdt(s,t))}const ki=e=>!!(e&&e.__v_isRef===!0),m=e=>oe(e)?e:e==null?"":M(e)||Z(e)&&(e.toString===vi||!V(e.toString))?ki(e)?m(e.value):JSON.stringify(e,Si,2):String(e),Si=(e,t)=>ki(t)?Si(e,t.value):Tt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,i],o)=>(s[Ms(n,o)+" =>"]=i,s),{})}:Dt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Ms(s))}:Ye(t)?Ms(t):Z(t)&&!M(t)&&!yi(t)?String(t):t,Ms=(e,t="")=>{var s;return Ye(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/** +* @vue/reactivity v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let he;class Fo{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&&he&&(he.active?(this.parent=he,this.index=(he.scopes||(he.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0){if(he===this)he=this.prevScope;else{let t=he;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 s,n;for(s=0,n=this.effects.length;s0)return;if(Gt){let t=Gt;for(Gt=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Vt;){let t=Vt;for(Vt=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Ci(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ai(e){let t,s=e.depsTail,n=s;for(;n;){const i=n.prevDep;n.version===-1?(n===s&&(s=i),mn(n),Ho(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=s}function Js(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&($i(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function $i(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Jt)||(e.globalVersion=Jt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Js(e))))return;e.flags|=2;const t=e.dep,s=ee,n=Ie;ee=e,Ie=!0;try{Ci(e);const i=e.fn(e._value);(t.version===0||Ze(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{ee=s,Ie=n,Ai(e),e.flags&=-3}}function mn(e,t=!1){const{dep:s,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)mn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ho(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Ie=!0;const Oi=[];function Xe(){Oi.push(Ie),Ie=!1}function Qe(){const e=Oi.pop();Ie=e===void 0?!0:e}function jn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=ee;ee=void 0;try{t()}finally{ee=s}}}let Jt=0;class Vo{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class bn{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(!ee||!Ie||ee===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==ee)s=this.activeLink=new Vo(ee,this),ee.deps?(s.prevDep=ee.depsTail,ee.depsTail.nextDep=s,ee.depsTail=s):ee.deps=ee.depsTail=s,Ri(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=ee.depsTail,s.nextDep=void 0,ee.depsTail.nextDep=s,ee.depsTail=s,ee.deps===s&&(ee.deps=n)}return s}trigger(t){this.version++,Jt++,this.notify(t)}notify(t){hn();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{gn()}}}function Ri(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Ri(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const Ys=new WeakMap,_t=Symbol(""),Xs=Symbol(""),Yt=Symbol("");function me(e,t,s){if(Ie&&ee){let n=Ys.get(e);n||Ys.set(e,n=new Map);let i=n.get(s);i||(n.set(s,i=new bn),i.map=n,i.key=s),i.track()}}function it(e,t,s,n,i,o){const r=Ys.get(e);if(!r){Jt++;return}const a=l=>{l&&l.trigger()};if(hn(),t==="clear")r.forEach(a);else{const l=M(e),g=l&&dn(s);if(l&&s==="length"){const d=Number(n);r.forEach((b,P)=>{(P==="length"||P===Yt||!Ye(P)&&P>=d)&&a(b)})}else switch((s!==void 0||r.has(void 0))&&a(r.get(s)),g&&a(r.get(Yt)),t){case"add":l?g&&a(r.get("length")):(a(r.get(_t)),Tt(e)&&a(r.get(Xs)));break;case"delete":l||(a(r.get(_t)),Tt(e)&&a(r.get(Xs)));break;case"set":Tt(e)&&a(r.get(_t));break}}gn()}function xt(e){const t=K(e);return t===e?t:(me(t,"iterate",Yt),Oe(e)?t:t.map(Ne))}function $s(e){return me(e=K(e),"iterate",Yt),e}function We(e,t){return at(e)?At(wt(e)?Ne(t):t):Ne(t)}const Go={__proto__:null,[Symbol.iterator](){return Fs(this,Symbol.iterator,e=>We(this,e))},concat(...e){return xt(this).concat(...e.map(t=>M(t)?xt(t):t))},entries(){return Fs(this,"entries",e=>(e[1]=We(this,e[1]),e))},every(e,t){return et(this,"every",e,t,void 0,arguments)},filter(e,t){return et(this,"filter",e,t,s=>s.map(n=>We(this,n)),arguments)},find(e,t){return et(this,"find",e,t,s=>We(this,s),arguments)},findIndex(e,t){return et(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return et(this,"findLast",e,t,s=>We(this,s),arguments)},findLastIndex(e,t){return et(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return et(this,"forEach",e,t,void 0,arguments)},includes(...e){return Bs(this,"includes",e)},indexOf(...e){return Bs(this,"indexOf",e)},join(e){return xt(this).join(e)},lastIndexOf(...e){return Bs(this,"lastIndexOf",e)},map(e,t){return et(this,"map",e,t,void 0,arguments)},pop(){return Mt(this,"pop")},push(...e){return Mt(this,"push",e)},reduce(e,...t){return Un(this,"reduce",e,t)},reduceRight(e,...t){return Un(this,"reduceRight",e,t)},shift(){return Mt(this,"shift")},some(e,t){return et(this,"some",e,t,void 0,arguments)},splice(...e){return Mt(this,"splice",e)},toReversed(){return xt(this).toReversed()},toSorted(e){return xt(this).toSorted(e)},toSpliced(...e){return xt(this).toSpliced(...e)},unshift(...e){return Mt(this,"unshift",e)},values(){return Fs(this,"values",e=>We(this,e))}};function Fs(e,t,s){const n=$s(e),i=n[t]();return n!==e&&!Oe(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=s(o.value)),o}),i}const Ko=Array.prototype;function et(e,t,s,n,i,o){const r=$s(e),a=r!==e&&!Oe(e),l=r[t];if(l!==Ko[t]){const b=l.apply(e,o);return a?Ne(b):b}let g=s;r!==e&&(a?g=function(b,P){return s.call(this,We(e,b),P,e)}:s.length>2&&(g=function(b,P){return s.call(this,b,P,e)}));const d=l.call(r,g,n);return a&&i?i(d):d}function Un(e,t,s,n){const i=$s(e),o=i!==e&&!Oe(e);let r=s,a=!1;i!==e&&(o?(a=n.length===0,r=function(g,d,b){return a&&(a=!1,g=We(e,g)),s.call(this,g,We(e,d),b,e)}):s.length>3&&(r=function(g,d,b){return s.call(this,g,d,b,e)}));const l=i[t](r,...n);return a?We(e,l):l}function Bs(e,t,s){const n=K(e);me(n,"iterate",Yt);const i=n[t](...s);return(i===-1||i===!1)&&_n(s[0])?(s[0]=K(s[0]),n[t](...s)):i}function Mt(e,t,s=[]){Xe(),hn();const n=K(e)[t].apply(e,s);return gn(),Qe(),n}const Wo=cn("__proto__,__v_isRef,__isVue"),zi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ye));function qo(e){Ye(e)||(e=String(e));const t=K(this);return me(t,"has",e),t.hasOwnProperty(e)}class Di{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!i;if(s==="__v_isReadonly")return i;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(i?o?ir:Ni:o?Ui:ji).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=M(t);if(!i){let l;if(r&&(l=Go[s]))return l;if(s==="hasOwnProperty")return qo}const a=Reflect.get(t,s,be(t)?t:n);if((Ye(s)?zi.has(s):Wo(s))||(i||me(t,"get",s),o))return a;if(be(a)){const l=r&&dn(s)?a:a.value;return i&&Z(l)?en(l):l}return Z(a)?i?en(a):Xt(a):a}}class Ii extends Di{constructor(t=!1){super(!1,t)}set(t,s,n,i){let o=t[s];const r=M(t)&&dn(s);if(!this._isShallow){const g=at(o);if(!Oe(n)&&!at(n)&&(o=K(o),n=K(n)),!r&&be(o)&&!be(n))return g||(o.value=n),!0}const a=r?Number(s)e,ls=e=>Reflect.getPrototypeOf(e);function Qo(e,t,s){return function(...n){const i=this.__v_raw,o=K(i),r=Tt(o),a=e==="entries"||e===Symbol.iterator&&r,l=e==="keys"&&r,g=i[e](...n),d=s?Qs:t?At:Ne;return!t&&me(o,"iterate",l?Xs:_t),ve(Object.create(g),{next(){const{value:b,done:P}=g.next();return P?{value:b,done:P}:{value:a?[d(b[0]),d(b[1])]:d(b),done:P}}})}}function cs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function er(e,t){const s={get(i){const o=this.__v_raw,r=K(o),a=K(i);e||(Ze(i,a)&&me(r,"get",i),me(r,"get",a));const{has:l}=ls(r),g=t?Qs:e?At:Ne;if(l.call(r,i))return g(o.get(i));if(l.call(r,a))return g(o.get(a));o!==r&&o.get(i)},get size(){const i=this.__v_raw;return!e&&me(K(i),"iterate",_t),i.size},has(i){const o=this.__v_raw,r=K(o),a=K(i);return e||(Ze(i,a)&&me(r,"has",i),me(r,"has",a)),i===a?o.has(i):o.has(i)||o.has(a)},forEach(i,o){const r=this,a=r.__v_raw,l=K(a),g=t?Qs:e?At:Ne;return!e&&me(l,"iterate",_t),a.forEach((d,b)=>i.call(o,g(d),g(b),r))}};return ve(s,e?{add:cs("add"),set:cs("set"),delete:cs("delete"),clear:cs("clear")}:{add(i){const o=K(this),r=ls(o),a=K(i),l=!t&&!Oe(i)&&!at(i)?a:i;return r.has.call(o,l)||Ze(i,l)&&r.has.call(o,i)||Ze(a,l)&&r.has.call(o,a)||(o.add(l),it(o,"add",l,l)),this},set(i,o){!t&&!Oe(o)&&!at(o)&&(o=K(o));const r=K(this),{has:a,get:l}=ls(r);let g=a.call(r,i);g||(i=K(i),g=a.call(r,i));const d=l.call(r,i);return r.set(i,o),g?Ze(o,d)&&it(r,"set",i,o):it(r,"add",i,o),this},delete(i){const o=K(this),{has:r,get:a}=ls(o);let l=r.call(o,i);l||(i=K(i),l=r.call(o,i)),a&&a.call(o,i);const g=o.delete(i);return l&&it(o,"delete",i,void 0),g},clear(){const i=K(this),o=i.size!==0,r=i.clear();return o&&it(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{s[i]=Qo(i,e,t)}),s}function vn(e,t){const s=er(e,t);return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(W(s,i)&&i in n?s:n,i,o)}const tr={get:vn(!1,!1)},sr={get:vn(!1,!0)},nr={get:vn(!0,!1)};const ji=new WeakMap,Ui=new WeakMap,Ni=new WeakMap,ir=new WeakMap;function or(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Xt(e){return at(e)?e:yn(e,!1,Jo,tr,ji)}function rr(e){return yn(e,!1,Xo,sr,Ui)}function en(e){return yn(e,!0,Yo,nr,Ni)}function yn(e,t,s,n,i){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=i.get(e);if(o)return o;const r=or(Oo(e));if(r===0)return e;const a=new Proxy(e,r===2?n:s);return i.set(e,a),a}function wt(e){return at(e)?wt(e.__v_raw):!!(e&&e.__v_isReactive)}function at(e){return!!(e&&e.__v_isReadonly)}function Oe(e){return!!(e&&e.__v_isShallow)}function _n(e){return e?!!e.__v_raw:!1}function K(e){const t=e&&e.__v_raw;return t?K(t):e}function ar(e){return!W(e,"__v_skip")&&Object.isExtensible(e)&&wi(e,"__v_skip",!0),e}const Ne=e=>Z(e)?Xt(e):e,At=e=>Z(e)?en(e):e;function be(e){return e?e.__v_isRef===!0:!1}function H(e){return lr(e,!1)}function lr(e,t){return be(e)?e:new cr(e,t)}class cr{constructor(t,s){this.dep=new bn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:K(t),this._value=s?t:Ne(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Oe(t)||at(t);t=n?t:K(t),Ze(t,s)&&(this._rawValue=t,this._value=n?t:Ne(t),this.dep.trigger())}}function h(e){return be(e)?e.value:e}const ur={get:(e,t,s)=>t==="__v_raw"?e:h(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const i=e[t];return be(i)&&!be(s)?(i.value=s,!0):Reflect.set(e,t,s,n)}};function Mi(e){return wt(e)?e:new Proxy(e,ur)}class dr{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new bn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Jt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&ee!==this)return Pi(this,!0),!0}get value(){const t=this.dep.track();return $i(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function pr(e,t,s=!1){let n,i;return V(e)?n=e:(n=e.get,i=e.set),new dr(n,i,s)}const us={},ms=new WeakMap;let yt;function fr(e,t=!1,s=yt){if(s){let n=ms.get(s);n||ms.set(s,n=[]),n.push(e)}}function hr(e,t,s=X){const{immediate:n,deep:i,once:o,scheduler:r,augmentJob:a,call:l}=s,g=j=>i?j:Oe(j)||i===!1||i===0?ot(j,1):ot(j);let d,b,P,$,F=!1,k=!1;if(be(e)?(b=()=>e.value,F=Oe(e)):wt(e)?(b=()=>g(e),F=!0):M(e)?(k=!0,F=e.some(j=>wt(j)||Oe(j)),b=()=>e.map(j=>{if(be(j))return j.value;if(wt(j))return g(j);if(V(j))return l?l(j,2):j()})):V(e)?t?b=l?()=>l(e,2):e:b=()=>{if(P){Xe();try{P()}finally{Qe()}}const j=yt;yt=d;try{return l?l(e,3,[$]):e($)}finally{yt=j}}:b=Je,t&&i){const j=b,re=i===!0?1/0:i;b=()=>ot(j(),re)}const O=Bo(),E=()=>{d.stop(),O&&O.active&&un(O.effects,d)};if(o&&t){const j=t;t=(...re)=>{const Ee=j(...re);return E(),Ee}}let C=k?new Array(e.length).fill(us):us;const I=j=>{if(!(!(d.flags&1)||!d.dirty&&!j))if(t){const re=d.run();if(j||i||F||(k?re.some((Ee,Pe)=>Ze(Ee,C[Pe])):Ze(re,C))){P&&P();const Ee=yt;yt=d;try{const Pe=[re,C===us?void 0:k&&C[0]===us?[]:C,$];C=re,l?l(t,3,Pe):t(...Pe)}finally{yt=Ee}}}else d.run()};return a&&a(I),d=new Ti(b),d.scheduler=r?()=>r(I,!1):I,$=j=>fr(j,!1,d),P=d.onStop=()=>{const j=ms.get(d);if(j){if(l)l(j,4);else for(const re of j)re();ms.delete(d)}},t?n?I(!0):C=d.run():r?r(I.bind(null,!0),!0):d.run(),E.pause=d.pause.bind(d),E.resume=d.resume.bind(d),E.stop=E,E}function ot(e,t=1/0,s){if(t<=0||!Z(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,be(e))ot(e.value,t,s);else if(M(e))for(let n=0;n{ot(n,t,s)});else if(yi(e)){for(const n in e)ot(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&ot(e[n],t,s)}return e}/** +* @vue/runtime-core v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ns(e,t,s,n){try{return n?e(...n):e()}catch(i){Os(i,t,s)}}function Me(e,t,s,n){if(V(e)){const i=ns(e,t,s,n);return i&&bi(i)&&i.catch(o=>{Os(o,t,s)}),i}if(M(e)){const i=[];for(let o=0;o>>1,i=we[n],o=Qt(i);o=Qt(s)?we.push(e):we.splice(mr(t),0,e),e.flags|=1,Bi()}}function Bi(){bs||(bs=Li.then(Vi))}function br(e){M(e)?Et.push(...e):ut&&e.id===-1?ut.splice(kt+1,0,e):e.flags&1||(Et.push(e),e.flags|=1),Bi()}function Nn(e,t,s=Ke+1){for(;sQt(s)-Qt(n));if(Et.length=0,ut){ut.push(...t);return}for(ut=t,kt=0;kte.id==null?e.flags&2?-1:1/0:e.id;function Vi(e){try{for(Ke=0;Ke{n._d&&Zn(-1);const o=vs(t);let r;try{r=e(...i)}finally{vs(o),n._d&&Zn(1)}return r};return n._n=!0,n._c=!0,n._d=!0,n}function le(e,t){if(Ae===null)return e;const s=Is(Ae),n=e.dirs||(e.dirs=[]);for(let i=0;i1)return s&&V(t)?t.call(n&&n.proxy):t}}const _r=Symbol.for("v-scx"),wr=()=>fs(_r);function Hs(e,t,s){return Ki(e,t,s)}function Ki(e,t,s=X){const{immediate:n,deep:i,flush:o,once:r}=s,a=ve({},s),l=t&&n||!t&&o!=="post";let g;if(ts){if(o==="sync"){const $=wr();g=$.__watcherHandles||($.__watcherHandles=[])}else if(!l){const $=()=>{};return $.stop=Je,$.resume=Je,$.pause=Je,$}}const d=xe;a.call=($,F,k)=>Me($,d,F,k);let b=!1;o==="post"?a.scheduler=$=>{ke($,d&&d.suspense)}:o!=="sync"&&(b=!0,a.scheduler=($,F)=>{F?$():wn($)}),a.augmentJob=$=>{t&&($.flags|=4),b&&($.flags|=2,d&&($.id=d.uid,$.i=d))};const P=hr(e,t,a);return ts&&(g?g.push(P):l&&P()),P}function xr(e,t,s){const n=this.proxy,i=oe(e)?e.includes(".")?Wi(n,e):()=>n[e]:e.bind(n,n);let o;V(t)?o=t:(o=t.handler,s=t);const r=is(this),a=Ki(i,o.bind(n),s);return r(),a}function Wi(e,t){const s=t.split(".");return()=>{let n=e;for(let i=0;ie.__isTeleport,Vs=Symbol("_leaveCb");function xn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,xn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function qi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Mn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const ys=new WeakMap;function Kt(e,t,s,n,i=!1){if(M(e)){e.forEach((k,O)=>Kt(k,t&&(M(t)?t[O]:t),s,n,i));return}if(Wt(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Kt(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?Is(n.component):n.el,r=i?null:o,{i:a,r:l}=e,g=t&&t.r,d=a.refs===X?a.refs={}:a.refs,b=a.setupState,P=K(b),$=b===X?mi:k=>Mn(d,k)?!1:W(P,k),F=(k,O)=>!(O&&Mn(d,O));if(g!=null&&g!==l){if(Ln(t),oe(g))d[g]=null,$(g)&&(b[g]=null);else if(be(g)){const k=t;F(g,k.k)&&(g.value=null),k.k&&(d[k.k]=null)}}if(V(l)){Xe();try{ns(l,a,12,[r,d])}finally{Qe()}}else{const k=oe(l),O=be(l);if(k||O){const E=()=>{if(e.f){const C=k?$(l)?b[l]:d[l]:F()||!e.k?l.value:d[e.k];if(i)M(C)&&un(C,o);else if(M(C))C.includes(o)||C.push(o);else if(k)d[l]=[o],$(l)&&(b[l]=d[l]);else{const I=[o];F(l,e.k)&&(l.value=I),e.k&&(d[e.k]=I)}}else k?(d[l]=r,$(l)&&(b[l]=r)):O&&(F(l,e.k)&&(l.value=r),e.k&&(d[e.k]=r))};if(r){const C=()=>{E(),ys.delete(e)};C.id=-1,ys.set(e,C),ke(C,s)}else Ln(e),E()}}}function Ln(e){const t=ys.get(e);t&&(t.flags|=8,ys.delete(e))}As().requestIdleCallback;As().cancelIdleCallback;const Wt=e=>!!e.type.__asyncLoader,Zi=e=>e.type.__isKeepAlive;function Tr(e,t){Ji(e,"a",t)}function Er(e,t){Ji(e,"da",t)}function Ji(e,t,s=xe){const n=e.__wdc||(e.__wdc=()=>{let i=s;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Rs(t,n,s),s){let i=s.parent;for(;i&&i.parent;)Zi(i.parent.vnode)&&Pr(n,t,s,i),i=i.parent}}function Pr(e,t,s,n){const i=Rs(t,e,n,!0);kn(()=>{un(n[t],i)},s)}function Rs(e,t,s=xe,n=!1){if(s){const i=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...r)=>{Xe();const a=is(s),l=Me(t,s,e,r);return a(),Qe(),l});return n?i.unshift(o):i.push(o),o}}const lt=e=>(t,s=xe)=>{(!ts||e==="sp")&&Rs(e,(...n)=>t(...n),s)},Cr=lt("bm"),ct=lt("m"),Ar=lt("bu"),$r=lt("u"),Or=lt("bum"),kn=lt("um"),Rr=lt("sp"),zr=lt("rtg"),Dr=lt("rtc");function Ir(e,t=xe){Rs("ec",e,t)}const jr=Symbol.for("v-ndc");function $e(e,t,s,n){let i;const o=s,r=M(e);if(r||oe(e)){const a=r&&wt(e);let l=!1,g=!1;a&&(l=!Oe(e),g=at(e),e=$s(e)),i=new Array(e.length);for(let d=0,b=e.length;dt(a,l,void 0,o));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,g=a.length;le?vo(e)?Is(e):tn(e.parent):null,qt=ve(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=>tn(e.parent),$root:e=>tn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Xi(e),$forceUpdate:e=>e.f||(e.f=()=>{wn(e.update)}),$nextTick:e=>e.n||(e.n=Fi.bind(e.proxy)),$watch:e=>xr.bind(e)}),Gs=(e,t)=>e!==X&&!e.__isScriptSetup&&W(e,t),Ur={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:i,props:o,accessCache:r,type:a,appContext:l}=e;if(t[0]!=="$"){const P=r[t];if(P!==void 0)switch(P){case 1:return n[t];case 2:return i[t];case 4:return s[t];case 3:return o[t]}else{if(Gs(n,t))return r[t]=1,n[t];if(i!==X&&W(i,t))return r[t]=2,i[t];if(W(o,t))return r[t]=3,o[t];if(s!==X&&W(s,t))return r[t]=4,s[t];sn&&(r[t]=0)}}const g=qt[t];let d,b;if(g)return t==="$attrs"&&me(e.attrs,"get",""),g(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(s!==X&&W(s,t))return r[t]=4,s[t];if(b=l.config.globalProperties,W(b,t))return b[t]},set({_:e},t,s){const{data:n,setupState:i,ctx:o}=e;return Gs(i,t)?(i[t]=s,!0):n!==X&&W(n,t)?(n[t]=s,!0):W(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:i,props:o,type:r}},a){let l;return!!(s[a]||e!==X&&a[0]!=="$"&&W(e,a)||Gs(t,a)||W(o,a)||W(n,a)||W(qt,a)||W(i.config.globalProperties,a)||(l=r.__cssModules)&&l[a])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:W(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Fn(e){return M(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let sn=!0;function Nr(e){const t=Xi(e),s=e.proxy,n=e.ctx;sn=!1,t.beforeCreate&&Bn(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:r,watch:a,provide:l,inject:g,created:d,beforeMount:b,mounted:P,beforeUpdate:$,updated:F,activated:k,deactivated:O,beforeDestroy:E,beforeUnmount:C,destroyed:I,unmounted:j,render:re,renderTracked:Ee,renderTriggered:Pe,errorCaptured:Le,serverPrefetch:pe,expose:se,inheritAttrs:ce,components:It,directives:os,filters:js}=t;if(g&&Mr(g,n,null),r)for(const ie in r){const Q=r[ie];V(Q)&&(n[ie]=Q.bind(s))}if(i){const ie=i.call(s,s);Z(ie)&&(e.data=Xt(ie))}if(sn=!0,o)for(const ie in o){const Q=o[ie],gt=V(Q)?Q.bind(s,s):V(Q.get)?Q.get.bind(s,s):Je,rs=!V(Q)&&V(Q.set)?Q.set.bind(s):Je,mt=je({get:gt,set:rs});Object.defineProperty(n,ie,{enumerable:!0,configurable:!0,get:()=>mt.value,set:Fe=>mt.value=Fe})}if(a)for(const ie in a)Yi(a[ie],n,s,ie);if(l){const ie=V(l)?l.call(s):l;Reflect.ownKeys(ie).forEach(Q=>{yr(Q,ie[Q])})}d&&Bn(d,e,"c");function ye(ie,Q){M(Q)?Q.forEach(gt=>ie(gt.bind(s))):Q&&ie(Q.bind(s))}if(ye(Cr,b),ye(ct,P),ye(Ar,$),ye($r,F),ye(Tr,k),ye(Er,O),ye(Ir,Le),ye(Dr,Ee),ye(zr,Pe),ye(Or,C),ye(kn,j),ye(Rr,pe),M(se))if(se.length){const ie=e.exposed||(e.exposed={});se.forEach(Q=>{Object.defineProperty(ie,Q,{get:()=>s[Q],set:gt=>s[Q]=gt,enumerable:!0})})}else e.exposed||(e.exposed={});re&&e.render===Je&&(e.render=re),ce!=null&&(e.inheritAttrs=ce),It&&(e.components=It),os&&(e.directives=os),pe&&qi(e)}function Mr(e,t,s=Je){M(e)&&(e=nn(e));for(const n in e){const i=e[n];let o;Z(i)?"default"in i?o=fs(i.from||n,i.default,!0):o=fs(i.from||n):o=fs(i),be(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function Bn(e,t,s){Me(M(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Yi(e,t,s,n){let i=n.includes(".")?Wi(s,n):()=>s[n];if(oe(e)){const o=t[e];V(o)&&Hs(i,o)}else if(V(e))Hs(i,e.bind(s));else if(Z(e))if(M(e))e.forEach(o=>Yi(o,t,s,n));else{const o=V(e.handler)?e.handler.bind(s):t[e.handler];V(o)&&Hs(i,o,e)}}function Xi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let l;return a?l=a:!i.length&&!s&&!n?l=t:(l={},i.length&&i.forEach(g=>_s(l,g,r,!0)),_s(l,t,r)),Z(t)&&o.set(t,l),l}function _s(e,t,s,n=!1){const{mixins:i,extends:o}=t;o&&_s(e,o,s,!0),i&&i.forEach(r=>_s(e,r,s,!0));for(const r in t)if(!(n&&r==="expose")){const a=Lr[r]||s&&s[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Lr={data:Hn,props:Vn,emits:Vn,methods:Ft,computed:Ft,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:Ft,directives:Ft,watch:Br,provide:Hn,inject:Fr};function Hn(e,t){return t?e?function(){return ve(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Fr(e,t){return Ft(nn(e),nn(t))}function nn(e){if(M(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${De(t)}Modifiers`]||e[`${ht(t)}Modifiers`];function Kr(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||X;let i=s;const o=t.startsWith("update:"),r=o&&Gr(n,t.slice(7));r&&(r.trim&&(i=s.map(d=>oe(d)?d.trim():d)),r.number&&(i=s.map(Cs)));let a,l=n[a=Ns(t)]||n[a=Ns(De(t))];!l&&o&&(l=n[a=Ns(ht(t))]),l&&Me(l,e,6,i);const g=n[a+"Once"];if(g){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Me(g,e,6,i)}}const Wr=new WeakMap;function eo(e,t,s=!1){const n=s?Wr:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},a=!1;if(!V(e)){const l=g=>{const d=eo(g,t,!0);d&&(a=!0,ve(r,d))};!s&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(Z(e)&&n.set(e,null),null):(M(o)?o.forEach(l=>r[l]=null):ve(r,o),Z(e)&&n.set(e,r),r)}function zs(e,t){return!e||!Ts(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),W(e,t[0].toLowerCase()+t.slice(1))||W(e,ht(t))||W(e,t))}function Gn(e){const{type:t,vnode:s,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:a,emit:l,render:g,renderCache:d,props:b,data:P,setupState:$,ctx:F,inheritAttrs:k}=e,O=vs(e);let E,C;try{if(s.shapeFlag&4){const j=i||n,re=j;E=qe(g.call(re,j,d,b,$,P,F)),C=a}else{const j=t;E=qe(j.length>1?j(b,{attrs:a,slots:r,emit:l}):j(b,null)),C=t.props?a:qr(a)}}catch(j){Zt.length=0,Os(j,e,1),E=Y(pt)}let I=E;if(C&&k!==!1){const j=Object.keys(C),{shapeFlag:re}=I;j.length&&re&7&&(o&&j.some(Es)&&(C=Zr(C,o)),I=$t(I,C,!1,!0))}return s.dirs&&(I=$t(I,null,!1,!0),I.dirs=I.dirs?I.dirs.concat(s.dirs):s.dirs),s.transition&&xn(I,s.transition),E=I,vs(O),E}const qr=e=>{let t;for(const s in e)(s==="class"||s==="style"||Ts(s))&&((t||(t={}))[s]=e[s]);return t},Zr=(e,t)=>{const s={};for(const n in e)(!Es(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Jr(e,t,s){const{props:n,children:i,component:o}=e,{props:r,children:a,patchFlag:l}=t,g=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&l>=0){if(l&1024)return!0;if(l&16)return n?Kn(n,r,g):!!r;if(l&8){const d=t.dynamicProps;for(let b=0;bObject.create(so),io=e=>Object.getPrototypeOf(e)===so;function Xr(e,t,s,n=!1){const i={},o=no();e.propsDefaults=Object.create(null),oo(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);s?e.props=n?i:rr(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Qr(e,t,s,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,a=K(i),[l]=e.propsOptions;let g=!1;if((n||r>0)&&!(r&16)){if(r&8){const d=e.vnode.dynamicProps;for(let b=0;b{l=!0;const[P,$]=ro(b,t,!0);ve(r,P),$&&a.push(...$)};!s&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!l)return Z(e)&&n.set(e,St),St;if(M(o))for(let d=0;de==="_"||e==="_ctx"||e==="$stable",Tn=e=>M(e)?e.map(qe):[qe(e)],ta=(e,t,s)=>{if(t._n)return t;const n=vr((...i)=>Tn(t(...i)),s);return n._c=!1,n},ao=(e,t,s)=>{const n=e._ctx;for(const i in e){if(Sn(i))continue;const o=e[i];if(V(o))t[i]=ta(i,o,n);else if(o!=null){const r=Tn(o);t[i]=()=>r}}},lo=(e,t)=>{const s=Tn(t);e.slots.default=()=>s},co=(e,t,s)=>{for(const n in t)(s||!Sn(n))&&(e[n]=t[n])},sa=(e,t,s)=>{const n=e.slots=no();if(e.vnode.shapeFlag&32){const i=t._;i?(co(n,t,s),s&&wi(n,"_",i,!0)):ao(t,n)}else t&&lo(e,t)},na=(e,t,s)=>{const{vnode:n,slots:i}=e;let o=!0,r=X;if(n.shapeFlag&32){const a=t._;a?s&&a===1?o=!1:co(i,t,s):(o=!t.$stable,ao(t,i)),r=t}else t&&(lo(e,t),r={default:1});if(o)for(const a in i)!Sn(a)&&r[a]==null&&delete i[a]},ke=la;function ia(e){return oa(e)}function oa(e,t){const s=As();s.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:a,createComment:l,setText:g,setElementText:d,parentNode:b,nextSibling:P,setScopeId:$=Je,insertStaticContent:F}=e,k=(c,p,v,S=null,x=null,_=null,z=void 0,R=null,A=!!p.dynamicChildren)=>{if(c===p)return;c&&!Lt(c,p)&&(S=as(c),Fe(c,x,_,!0),c=null),p.patchFlag===-2&&(A=!1,p.dynamicChildren=null);const{type:w,ref:N,shapeFlag:D}=p;switch(w){case Ds:O(c,p,v,S);break;case pt:E(c,p,v,S);break;case Ws:c==null&&C(p,v,S,z);break;case ne:It(c,p,v,S,x,_,z,R,A);break;default:D&1?re(c,p,v,S,x,_,z,R,A):D&6?os(c,p,v,S,x,_,z,R,A):(D&64||D&128)&&w.process(c,p,v,S,x,_,z,R,A,Ut)}N!=null&&x?Kt(N,c&&c.ref,_,p||c,!p):N==null&&c&&c.ref!=null&&Kt(c.ref,null,_,c,!0)},O=(c,p,v,S)=>{if(c==null)n(p.el=a(p.children),v,S);else{const x=p.el=c.el;p.children!==c.children&&g(x,p.children)}},E=(c,p,v,S)=>{c==null?n(p.el=l(p.children||""),v,S):p.el=c.el},C=(c,p,v,S)=>{[c.el,c.anchor]=F(c.children,p,v,S,c.el,c.anchor)},I=({el:c,anchor:p},v,S)=>{let x;for(;c&&c!==p;)x=P(c),n(c,v,S),c=x;n(p,v,S)},j=({el:c,anchor:p})=>{let v;for(;c&&c!==p;)v=P(c),i(c),c=v;i(p)},re=(c,p,v,S,x,_,z,R,A)=>{if(p.type==="svg"?z="svg":p.type==="math"&&(z="mathml"),c==null)Ee(p,v,S,x,_,z,R,A);else{const w=c.el&&c.el._isVueCE?c.el:null;try{w&&w._beginPatch(),pe(c,p,x,_,z,R,A)}finally{w&&w._endPatch()}}},Ee=(c,p,v,S,x,_,z,R)=>{let A,w;const{props:N,shapeFlag:D,transition:U,dirs:L}=c;if(A=c.el=r(c.type,_,N&&N.is,N),D&8?d(A,c.children):D&16&&Le(c.children,A,null,S,x,Ks(c,_),z,R),L&&bt(c,null,S,"created"),Pe(A,c,c.scopeId,z,S),N){for(const J in N)J!=="value"&&!Ht(J)&&o(A,J,null,N[J],_,S);"value"in N&&o(A,"value",null,N.value,_),(w=N.onVnodeBeforeMount)&&Ge(w,S,c)}L&&bt(c,null,S,"beforeMount");const G=ra(x,U);G&&U.beforeEnter(A),n(A,p,v),((w=N&&N.onVnodeMounted)||G||L)&&ke(()=>{try{w&&Ge(w,S,c),G&&U.enter(A),L&&bt(c,null,S,"mounted")}finally{}},x)},Pe=(c,p,v,S,x)=>{if(v&&$(c,v),S)for(let _=0;_{for(let w=A;w{const R=p.el=c.el;let{patchFlag:A,dynamicChildren:w,dirs:N}=p;A|=c.patchFlag&16;const D=c.props||X,U=p.props||X;let L;if(v&&vt(v,!1),(L=U.onVnodeBeforeUpdate)&&Ge(L,v,p,c),N&&bt(p,c,v,"beforeUpdate"),v&&vt(v,!0),w&&(!c.dynamicChildren||c.dynamicChildren.length!==w.length)&&(A=0,z=!1,w=null),(D.innerHTML&&U.innerHTML==null||D.textContent&&U.textContent==null)&&d(R,""),w?se(c.dynamicChildren,w,R,v,S,Ks(p,x),_):z||Q(c,p,R,null,v,S,Ks(p,x),_,!1),A>0){if(A&16)ce(R,D,U,v,x);else if(A&2&&D.class!==U.class&&o(R,"class",null,U.class,x),A&4&&o(R,"style",D.style,U.style,x),A&8){const G=p.dynamicProps;for(let J=0;J{L&&Ge(L,v,p,c),N&&bt(p,c,v,"updated")},S)},se=(c,p,v,S,x,_,z)=>{for(let R=0;R{if(p!==v){if(p!==X)for(const _ in p)!Ht(_)&&!(_ in v)&&o(c,_,p[_],null,x,S);for(const _ in v){if(Ht(_))continue;const z=v[_],R=p[_];z!==R&&_!=="value"&&o(c,_,R,z,x,S)}"value"in v&&o(c,"value",p.value,v.value,x)}},It=(c,p,v,S,x,_,z,R,A)=>{const w=p.el=c?c.el:a(""),N=p.anchor=c?c.anchor:a("");let{patchFlag:D,dynamicChildren:U,slotScopeIds:L}=p;L&&(R=R?R.concat(L):L),c==null?(n(w,v,S),n(N,v,S),Le(p.children||[],v,N,x,_,z,R,A)):D>0&&D&64&&U&&c.dynamicChildren&&c.dynamicChildren.length===U.length?(se(c.dynamicChildren,U,v,x,_,z,R),(p.key!=null||x&&p===x.subTree)&&uo(c,p,!0)):Q(c,p,v,N,x,_,z,R,A)},os=(c,p,v,S,x,_,z,R,A)=>{p.slotScopeIds=R,c==null?p.shapeFlag&512?x.ctx.activate(p,v,S,z,A):js(p,v,S,x,_,z,A):Cn(c,p,A)},js=(c,p,v,S,x,_,z)=>{const R=c.component=ga(c,S,x);if(Zi(c)&&(R.ctx.renderer=Ut),ba(R,!1,z),R.asyncDep){if(x&&x.registerDep(R,ye,z),!c.el){const A=R.subTree=Y(pt);E(null,A,p,v),c.placeholder=A.el}}else ye(R,c,p,v,x,_,z)},Cn=(c,p,v)=>{const S=p.component=c.component;if(Jr(c,p,v))if(S.asyncDep&&!S.asyncResolved){ie(S,p,v);return}else S.next=p,S.update();else p.el=c.el,S.vnode=p},ye=(c,p,v,S,x,_,z)=>{const R=()=>{if(c.isMounted){let{next:D,bu:U,u:L,parent:G,vnode:J}=c;{const He=po(c);if(He){D&&(D.el=J.el,ie(c,D,z)),He.asyncDep.then(()=>{ke(()=>{c.isUnmounted||w()},x)});return}}let q=D,ae;vt(c,!1),D?(D.el=J.el,ie(c,D,z)):D=J,U&&ps(U),(ae=D.props&&D.props.onVnodeBeforeUpdate)&&Ge(ae,G,D,J),vt(c,!0);const fe=Gn(c),Be=c.subTree;c.subTree=fe,k(Be,fe,b(Be.el),as(Be),c,x,_),D.el=fe.el,q===null&&Yr(c,fe.el),L&&ke(L,x),(ae=D.props&&D.props.onVnodeUpdated)&&ke(()=>Ge(ae,G,D,J),x)}else{let D;const{el:U,props:L}=p,{bm:G,m:J,parent:q,root:ae,type:fe}=c,Be=Wt(p);vt(c,!1),G&&ps(G),!Be&&(D=L&&L.onVnodeBeforeMount)&&Ge(D,q,p),vt(c,!0);{ae.ce&&ae.ce._hasShadowRoot()&&ae.ce._injectChildStyle(fe,c.parent?c.parent.type:void 0);const He=c.subTree=Gn(c);k(null,He,v,S,c,x,_),p.el=He.el}if(J&&ke(J,x),!Be&&(D=L&&L.onVnodeMounted)){const He=p;ke(()=>Ge(D,q,He),x)}(p.shapeFlag&256||q&&Wt(q.vnode)&&q.vnode.shapeFlag&256)&&c.a&&ke(c.a,x),c.isMounted=!0,p=v=S=null}};c.scope.on();const A=c.effect=new Ti(R);c.scope.off();const w=c.update=A.run.bind(A),N=c.job=A.runIfDirty.bind(A);N.i=c,N.id=c.uid,A.scheduler=()=>wn(N),vt(c,!0),w()},ie=(c,p,v)=>{p.component=c;const S=c.vnode.props;c.vnode=p,c.next=null,Qr(c,p.props,S,v),na(c,p.children,v),Xe(),Nn(c),Qe()},Q=(c,p,v,S,x,_,z,R,A=!1)=>{const w=c&&c.children,N=c?c.shapeFlag:0,D=p.children,{patchFlag:U,shapeFlag:L}=p;if(U>0){if(U&128){rs(w,D,v,S,x,_,z,R,A);return}else if(U&256){gt(w,D,v,S,x,_,z,R,A);return}}L&8?(N&16&&jt(w,x,_),D!==w&&d(v,D)):N&16?L&16?rs(w,D,v,S,x,_,z,R,A):jt(w,x,_,!0):(N&8&&d(v,""),L&16&&Le(D,v,S,x,_,z,R,A))},gt=(c,p,v,S,x,_,z,R,A)=>{c=c||St,p=p||St;const w=c.length,N=p.length,D=Math.min(w,N);let U;for(U=0;UN?jt(c,x,_,!0,!1,D):Le(p,v,S,x,_,z,R,A,D)},rs=(c,p,v,S,x,_,z,R,A)=>{let w=0;const N=p.length;let D=c.length-1,U=N-1;for(;w<=D&&w<=U;){const L=c[w],G=p[w]=A?nt(p[w]):qe(p[w]);if(Lt(L,G))k(L,G,v,null,x,_,z,R,A);else break;w++}for(;w<=D&&w<=U;){const L=c[D],G=p[U]=A?nt(p[U]):qe(p[U]);if(Lt(L,G))k(L,G,v,null,x,_,z,R,A);else break;D--,U--}if(w>D){if(w<=U){const L=U+1,G=LU)for(;w<=D;)Fe(c[w],x,_,!0),w++;else{const L=w,G=w,J=new Map;for(w=G;w<=U;w++){const Se=p[w]=A?nt(p[w]):qe(p[w]);Se.key!=null&&J.set(Se.key,w)}let q,ae=0;const fe=U-G+1;let Be=!1,He=0;const Nt=new Array(fe);for(w=0;w=fe){Fe(Se,x,_,!0);continue}let Ve;if(Se.key!=null)Ve=J.get(Se.key);else for(q=G;q<=U;q++)if(Nt[q-G]===0&&Lt(Se,p[q])){Ve=q;break}Ve===void 0?Fe(Se,x,_,!0):(Nt[Ve-G]=w+1,Ve>=He?He=Ve:Be=!0,k(Se,p[Ve],v,null,x,_,z,R,A),ae++)}const On=Be?aa(Nt):St;for(q=On.length-1,w=fe-1;w>=0;w--){const Se=G+w,Ve=p[Se],Rn=p[Se+1],zn=Se+1{const{el:_,type:z,transition:R,children:A,shapeFlag:w}=c;if(w&6){mt(c.component.subTree,p,v,S);return}if(w&128){c.suspense.move(p,v,S);return}if(w&64){z.move(c,p,v,Ut);return}if(z===ne){n(_,p,v);for(let D=0;DR.enter(_),x));else{const{leave:D,delayLeave:U,afterLeave:L}=R,G=()=>{c.ctx.isUnmounted?i(_):n(_,p,v)},J=()=>{const q=_._isLeaving||!!_[Vs];_._isLeaving&&_[Vs](!0),R.persisted&&!q?G():D(_,()=>{G(),L&&L()})};U?U(_,G,J):J()}else n(_,p,v)},Fe=(c,p,v,S=!1,x=!1)=>{const{type:_,props:z,ref:R,children:A,dynamicChildren:w,shapeFlag:N,patchFlag:D,dirs:U,cacheIndex:L,memo:G}=c;if(D===-2&&(x=!1),R!=null&&(Xe(),Kt(R,null,v,c,!0),Qe()),L!=null&&(p.renderCache[L]=void 0),N&256){p.ctx.deactivate(c);return}const J=N&1&&U,q=!Wt(c);let ae;if(q&&(ae=z&&z.onVnodeBeforeUnmount)&&Ge(ae,p,c),N&6)Ao(c.component,v,S);else{if(N&128){c.suspense.unmount(v,S);return}J&&bt(c,null,p,"beforeUnmount"),N&64?c.type.remove(c,p,v,Ut,S):w&&!w.hasOnce&&(_!==ne||D>0&&D&64)?jt(w,p,v,!1,!0):(_===ne&&D&384||!x&&N&16)&&jt(A,p,v),S&&An(c)}const fe=G!=null&&L==null;(q&&(ae=z&&z.onVnodeUnmounted)||J||fe)&&ke(()=>{ae&&Ge(ae,p,c),J&&bt(c,null,p,"unmounted"),fe&&(c.el=null)},v)},An=c=>{const{type:p,el:v,anchor:S,transition:x}=c;if(p===ne){Co(v,S);return}if(p===Ws){j(c);return}const _=()=>{i(v),x&&!x.persisted&&x.afterLeave&&x.afterLeave()};if(c.shapeFlag&1&&x&&!x.persisted){const{leave:z,delayLeave:R}=x,A=()=>z(v,_);R?R(c.el,_,A):A()}else _()},Co=(c,p)=>{let v;for(;c!==p;)v=P(c),i(c),c=v;i(p)},Ao=(c,p,v)=>{const{bum:S,scope:x,job:_,subTree:z,um:R,m:A,a:w}=c;qn(A),qn(w),S&&ps(S),x.stop(),_&&(_.flags|=8,Fe(z,c,p,v)),R&&ke(R,p),ke(()=>{c.isUnmounted=!0},p)},jt=(c,p,v,S=!1,x=!1,_=0)=>{for(let z=_;z{if(c.shapeFlag&6)return as(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const p=P(c.anchor||c.el),v=p&&p[kr];return v?P(v):p};let Us=!1;const $n=(c,p,v)=>{let S;c==null?p._vnode&&(Fe(p._vnode,null,null,!0),S=p._vnode.component):k(p._vnode||null,c,p,null,null,null,v),p._vnode=c,Us||(Us=!0,Nn(S),Hi(),Us=!1)},Ut={p:k,um:Fe,m:mt,r:An,mt:js,mc:Le,pc:Q,pbc:se,n:as,o:e};return{render:$n,hydrate:void 0,createApp:Vr($n)}}function Ks({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function vt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ra(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function uo(e,t,s=!1){const n=e.children,i=t.children;if(M(n)&&M(i))for(let o=0;o>1,e[s[a]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,r=s[o-1];o-- >0;)s[o]=r,r=t[r];return s}function po(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:po(t)}function qn(e){if(e)for(let t=0;te.__isSuspense;function la(e,t){t&&t.pendingBranch?M(e)?t.effects.push(...e):t.effects.push(e):br(e)}const ne=Symbol.for("v-fgt"),Ds=Symbol.for("v-txt"),pt=Symbol.for("v-cmt"),Ws=Symbol.for("v-stc"),Zt=[];let Te=null;function y(e=!1){Zt.push(Te=e?null:[])}function ca(){Zt.pop(),Te=Zt[Zt.length-1]||null}let es=1;function Zn(e,t=!1){es+=e,e<0&&Te&&t&&(Te.hasOnce=!0)}function go(e){return e.dynamicChildren=es>0?Te||St:null,ca(),es>0&&Te&&Te.push(e),e}function T(e,t,s,n,i,o){return go(u(e,t,s,n,i,o,!0))}function tt(e,t,s,n,i){return go(Y(e,t,s,n,i,!0))}function mo(e){return e?e.__v_isVNode===!0:!1}function Lt(e,t){return e.type===t.type&&e.key===t.key}const bo=({key:e})=>e??null,hs=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?oe(e)||be(e)||V(e)?{i:Ae,r:e,k:t,f:!!s}:e:null);function u(e,t=null,s=null,n=0,i=null,o=e===ne?0:1,r=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&bo(t),ref:t&&hs(t),scopeId:Gi,slotScopeIds:null,children:s,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:Ae};return a?(ws(l,s),o&128&&e.normalize(l)):s&&(l.shapeFlag|=oe(s)?8:16),es>0&&!r&&Te&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&Te.push(l),l}const Y=ua;function ua(e,t=null,s=null,n=0,i=null,o=!1){if((!e||e===jr)&&(e=pt),mo(e)){const a=$t(e,t,!0);return s&&ws(a,s),es>0&&!o&&Te&&(a.shapeFlag&6?Te[Te.indexOf(e)]=a:Te.push(a)),a.patchFlag=-2,a}if(wa(e)&&(e=e.__vccOpts),t){t=da(t);let{class:a,style:l}=t;a&&!oe(a)&&(t.class=Ue(a)),Z(l)&&(_n(l)&&!M(l)&&(l=ve({},l)),t.style=pn(l))}const r=oe(e)?1:ho(e)?128:Sr(e)?64:Z(e)?4:V(e)?2:0;return u(e,t,s,n,i,r,o,!0)}function da(e){return e?_n(e)||io(e)?ve({},e):e:null}function $t(e,t,s=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:a,transition:l}=e,g=t?pa(i||{},t):i,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:g,key:g&&bo(g),ref:t&&t.ref?s&&o?M(o)?o.concat(hs(t)):[o,hs(t)]:hs(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!==ne?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&$t(e.ssContent),ssFallback:e.ssFallback&&$t(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&n&&xn(d,l.clone(d)),d}function Re(e=" ",t=0){return Y(Ds,null,e,t)}function B(e="",t=!1){return t?(y(),tt(pt,null,e)):Y(pt,null,e)}function qe(e){return e==null||typeof e=="boolean"?Y(pt):M(e)?Y(ne,null,e.slice()):mo(e)?nt(e):Y(Ds,null,String(e))}function nt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:$t(e)}function ws(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(M(t))s=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),ws(e,i()),i._c&&(i._d=!0));return}else{s=32;const i=t._;!i&&!io(t)?t._ctx=Ae:i===3&&Ae&&(Ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(V(t)){if(n&65){ws(e,{default:t});return}t={default:t,_ctx:Ae},s=32}else t=String(t),n&64?(s=16,t=[Re(t)]):s=8;e.children=t,e.shapeFlag|=s}function pa(...e){const t={};for(let s=0;sxe||Ae;let xs,rn;{const e=As(),t=(s,n)=>{let i;return(i=e[s])||(i=e[s]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};xs=t("__VUE_INSTANCE_SETTERS__",s=>xe=s),rn=t("__VUE_SSR_SETTERS__",s=>ts=s)}const is=e=>{const t=xe;return xs(e),e.scope.on(),()=>{e.scope.off(),xs(t)}},Jn=()=>{xe&&xe.scope.off(),xs(null)};function vo(e){return e.vnode.shapeFlag&4}let ts=!1;function ba(e,t=!1,s=!1){t&&rn(t);const{props:n,children:i}=e.vnode,o=vo(e);Xr(e,n,o,t),sa(e,i,s||t);const r=o?va(e,t):void 0;return t&&rn(!1),r}function va(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ur);const{setup:n}=s;if(n){Xe();const i=e.setupContext=n.length>1?_a(e):null,o=is(e),r=ns(n,e,0,[e.props,i]),a=bi(r);if(Qe(),o(),(a||e.sp)&&!Wt(e)&&qi(e),a){if(r.then(Jn,Jn),t)return r.then(l=>{Yn(e,l)}).catch(l=>{Os(l,e,0)});e.asyncDep=r}else Yn(e,r)}else yo(e)}function Yn(e,t,s){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Mi(t)),yo(e)}function yo(e,t,s){const n=e.type;e.render||(e.render=n.render||Je);{const i=is(e);Xe();try{Nr(e)}finally{Qe(),i()}}}const ya={get(e,t){return me(e,"get",""),e[t]}};function _a(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,ya),slots:e.slots,emit:e.emit,expose:t}}function Is(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mi(ar(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in qt)return qt[s](e)},has(t,s){return s in t||s in qt}})):e.proxy}function wa(e){return V(e)&&"__vccOpts"in e}const je=(e,t)=>pr(e,t,ts),xa="3.5.39";/** +* @vue/runtime-dom v3.5.39 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let an;const Xn=typeof window<"u"&&window.trustedTypes;if(Xn)try{an=Xn.createPolicy("vue",{createHTML:e=>e})}catch{}const _o=an?e=>an.createHTML(e):e=>e,ka="http://www.w3.org/2000/svg",Sa="http://www.w3.org/1998/Math/MathML",st=typeof document<"u"?document:null,Qn=st&&st.createElement("template"),Ta={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const i=t==="svg"?st.createElementNS(ka,e):t==="mathml"?st.createElementNS(Sa,e):s?st.createElement(e,{is:s}):st.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>st.createTextNode(e),createComment:e=>st.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>st.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,i,o){const r=s?s.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),s),!(i===o||!(i=i.nextSibling)););else{Qn.innerHTML=_o(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const a=Qn.content;if(n==="svg"||n==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Ea=Symbol("_vtc");function Pa(e,t,s){const n=e[Ea];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const ei=Symbol("_vod"),Ca=Symbol("_vsh"),Aa=Symbol(""),$a=/(?:^|;)\s*display\s*:/;function Oa(e,t,s){const n=e.style,i=oe(s);let o=!1;if(s&&!i){if(t)if(oe(t))for(const r of t.split(";")){const a=r.slice(0,r.indexOf(":")).trim();s[a]==null&&Bt(n,a,"")}else for(const r in t)s[r]==null&&Bt(n,r,"");for(const r in s){r==="display"&&(o=!0);const a=s[r];a!=null?za(e,r,!oe(t)&&t?t[r]:void 0,a)||Bt(n,r,a):Bt(n,r,"")}}else if(i){if(t!==s){const r=n[Aa];r&&(s+=";"+r),n.cssText=s,o=$a.test(s)}}else t&&e.removeAttribute("style");ei in e&&(e[ei]=o?n.display:"",e[Ca]&&(n.display="none"))}const ti=/\s*!important$/;function Bt(e,t,s){if(M(s))s.forEach(n=>Bt(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Ra(e,t);ti.test(s)?e.setProperty(ht(n),s.replace(ti,""),"important"):e[n]=s}}const si=["Webkit","Moz","ms"],qs={};function Ra(e,t){const s=qs[t];if(s)return s;let n=De(t);if(n!=="filter"&&n in e)return qs[t]=n;n=_i(n);for(let i=0;iZs||(Ma.then(()=>Zs=0),Zs=Date.now());function Fa(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const i=s.value;if(M(i)){const o=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{o.call(n),n._stopped=!0};const r=i.slice(),a=[n];for(let l=0;le.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ba=(e,t,s,n,i,o)=>{const r=i==="svg";t==="class"?Pa(e,n,r):t==="style"?Oa(e,s,n):Ts(t)?Es(t)||Ia(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ha(e,t,n,r))?(oi(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ii(e,t,n,r,o,t!=="value")):e._isVueCE&&(Va(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!oe(n)))?oi(e,De(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),ii(e,t,n,r))};function Ha(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&ai(t)&&V(s));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 ai(t)&&oe(s)?!1:t in e}function Va(e,t){const s=e._def.props;if(!s)return!1;const n=De(t);return Array.isArray(s)?s.some(i=>De(i)===n):Object.keys(s).some(i=>De(i)===n)}const ft=e=>{const t=e.props["onUpdate:modelValue"]||!1;return M(t)?s=>ps(t,s):t};function Ga(e){e.target.composing=!0}function li(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ze=Symbol("_assign");function ci(e,t,s){return t&&(e=e.trim()),s&&(e=Cs(e)),e}const ge={created(e,{modifiers:{lazy:t,trim:s,number:n}},i){e[ze]=ft(i);const o=n||i.props&&i.props.type==="number";rt(e,t?"change":"input",r=>{r.target.composing||e[ze](ci(e.value,s,o))}),(s||o)&&rt(e,"change",()=>{e.value=ci(e.value,s,o)}),t||(rt(e,"compositionstart",Ga),rt(e,"compositionend",li),rt(e,"change",li))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:i,number:o}},r){if(e[ze]=ft(r),e.composing)return;const a=(o||e.type==="number")&&!/^0\d/.test(e.value)?Cs(e.value):e.value,l=t??"";if(a===l)return;const g=e.getRootNode();(g instanceof Document||g instanceof ShadowRoot)&&g.activeElement===e&&e.type!=="range"&&(n&&t===s||i&&e.value.trim()===l)||(e.value=l)}},Ka={deep:!0,created(e,t,s){e[ze]=ft(s),rt(e,"change",()=>{const n=e._modelValue,i=Ot(e),o=e.checked,r=e[ze];if(M(n)){const a=fn(n,i),l=a!==-1;if(o&&!l)r(n.concat(i));else if(!o&&l){const g=[...n];g.splice(a,1),r(g)}}else if(Dt(n)){const a=new Set(n);o?a.add(i):a.delete(i),r(a)}else r(wo(e,o))})},mounted:ui,beforeUpdate(e,t,s){e[ze]=ft(s),ui(e,t,s)}};function ui(e,{value:t,oldValue:s},n){e._modelValue=t;let i;if(M(t))i=fn(t,n.props.value)>-1;else if(Dt(t))i=t.has(n.props.value);else{if(t===s)return;i=dt(t,wo(e,!0))}e.checked!==i&&(e.checked=i)}const Wa={created(e,{value:t},s){e.checked=dt(t,s.props.value),e[ze]=ft(s),rt(e,"change",()=>{e[ze](Ot(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[ze]=ft(n),t!==s&&(e.checked=dt(t,n.props.value))}},ks={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const i=Dt(t);rt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Cs(Ot(r)):Ot(r));e[ze](e.multiple?i?new Set(o):o:o[0]),e._assigning=!0,Fi(()=>{e._assigning=!1})}),e[ze]=ft(n)},mounted(e,{value:t}){di(e,t)},beforeUpdate(e,t,s){e[ze]=ft(s)},updated(e,{value:t}){e._assigning||di(e,t)}};function di(e,t){const s=e.multiple,n=M(t);if(!(s&&!n&&!Dt(t))){for(let i=0,o=e.options.length;iString(g)===String(a)):r.selected=fn(t,a)>-1}else r.selected=t.has(a);else if(dt(Ot(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ot(e){return"_value"in e?e._value:e.value}function wo(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const qa={created(e,t,s){ds(e,t,s,null,"created")},mounted(e,t,s){ds(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){ds(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){ds(e,t,s,n,"updated")}};function Za(e,t){switch(e){case"SELECT":return ks;case"TEXTAREA":return ge;default:switch(t){case"checkbox":return Ka;case"radio":return Wa;default:return ge}}}function ds(e,t,s,n,i){const r=Za(e.tagName,s.props&&s.props.type)[i];r&&r(e,t,s,n)}const Ja=["ctrl","shift","alt","meta"],Ya={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)=>Ja.some(s=>e[`${s}Key`]&&!t.includes(s))},Xa=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((i,...o)=>{for(let r=0;r{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(i=>{if(!("key"in i))return;const o=ht(i.key);if(t.some(r=>r===o||Qa[r]===o))return e(i)}))},el=ve({patchProp:Ba},Ta);let pi;function tl(){return pi||(pi=ia(el))}const sl=((...e)=>{const t=tl().createApp(...e),{mount:s}=t;return t.mount=n=>{const i=il(n);if(!i)return;const o=t._component;!V(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=s(i,!1,nl(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function nl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function il(e){return oe(e)?document.querySelector(e):e}const ko="dh-panel-theme";function ol(){var e;try{const t=localStorage.getItem(ko);if(t==="dark"||t==="light")return t}catch{}return(e=window.matchMedia)!=null&&e.call(window,"(prefers-color-scheme: dark)").matches?"dark":"light"}const Ct=H(ol());function So(e){Ct.value=e,document.documentElement.classList.toggle("dark",e==="dark");try{localStorage.setItem(ko,e)}catch{}}function fi(){So(Ct.value==="dark"?"light":"dark")}So(Ct.value);const rl={apiServer:"API server",switchToLight:"Switch to light theme",switchToDark:"Switch to dark theme",theme:"Theme",signOut:"Sign out",loading:"Loading…",standardUserNote:"Signed in as a standard user — management sections need an admin role",footer:"DriverVault — car maintenance & service tracker."},al={overview:"Overview",users:"Users",orgs:"Organizations",server:"API Server",pocketbase:"PocketBase",webapp:"Web App",plugins:"Plugins",api:"API"},ll={title:"Sign in",subtitle:"Superadmin console for the DriverVault API Server.",email:"Email",password:"Password",submit:"Sign in",submitting:"Signing in…",invalid:"Invalid email or password.",failed:"Could not sign in.",authNote:"Authenticates against PocketBase through this server"},cl={title:"Status",unreachable:"unreachable",checking:"Checking…",apiServer:"API Server",pocketBase:"PocketBase",webApp:"Web App",thisProcess:"this process"},ul={create:"Create",save:"Save",cancel:"Cancel",edit:"Edit",delete:"Delete",rename:"Rename",empty:"—",name:"Name",email:"Email",role:"Role",organization:"Organization"},dl={title:"Users",allOrgs:"All organizations",yourOrg:"Your organization",newUser:"New user",password:"Password",passwordUnchanged:"Password (blank = unchanged)",passwordPlaceholder:"min 8 characters",orgNone:"— none —",you:"you",empty:"No users.",confirmDelete:"Delete {email}? This cannot be undone."},pl={title:"Organizations",subtitle:"Tenants users belong to",subtitleOwn:"Your organization",subtitleNone:"Create one to manage your own team",newOrg:"New organization",namePlaceholder:"Acme Fleet",empty:"No organizations yet.",createHint:"You have no organization yet. Create one to become its admin.",colId:"ID",confirmDelete:'Delete the organization "{name}"?',confirmDeleteOwn:'Delete your organization "{name}"? You will be removed from it and become a regular user.'},fl={title:"API Server",subtitle:"How this server identifies itself to the clients that connect to it",name:"Server name",nameHint:"Shown by clients that can be pointed at more than one DriverVault, such as the Web App's server switcher. Reported by /api/health.",saveApply:"Save & apply",persistedEnv:"persisted to .env",savedNotice:"Saved. The new name applies to the next request."},hl={title:"PocketBase",subtitle:"Database connection used by every endpoint",connected:"connected",noSuperuser:"no superuser",unreachable:"unreachable",baseUrl:"Base URL",superuserEmail:"Superuser email",superuserPassword:"Superuser password",passwordUnchanged:"unchanged",passwordNotSet:"not set",saveApply:"Save & apply",testConnection:"Test connection",persistedEnv:"persisted to .env",testOk:"Connection OK — superuser authenticated.",testReachableNoAuth:"PocketBase is reachable, but the service account did not authenticate.",testUnreachable:"PocketBase is not reachable at that address.",savedNotice:"Saved. The server is now using this PocketBase."},gl={title:"Web App",subtitle:"Address probed by the status check, and who may call this API from a browser",reachable:"reachable",unreachable:"unreachable",baseUrl:"Base URL",allowedOrigins:"Allowed origins",originsHint:"Comma separated, or {star} for any. Native mobile apps are not subject to CORS.",saveApply:"Save & apply",testConnection:"Test connection",persistedEnv:"persisted to .env",testOk:"Web App is reachable.",testFailed:"Web App did not answer its health check at that address.",savedNotice:"Saved. New origins apply to the next request."},ml={title:"Plugins",subtitle:"Third-party service integrations",registerExternal:"Register external",cancelRegister:"Cancel",name:"Name",baseUrl:"Base URL",provider:"Provider",register:"Register",empty:"No plugins yet. Register an external one above, or compile a built-in connector.",builtin:"builtin",enabled:"enabled",disabled:"disabled",health:"Health",configure:"Configure",close:"Close",noConfig:"This plugin takes no configuration.",notSet:"Not set — let organizations and users choose",capabilities:"Capabilities",saved:"Saved.",checking:"Checking…",save:"Save",saveEnable:"Save & enable",disable:"Disable",remove:"Remove",builtinNote:"Built-in plugins can be disabled but not removed",confirmRemove:'Remove the external plugin "{name}"? Its saved config is deleted.'},bl={colEndpoint:"Endpoint",colDescription:"Description",authNone:"No auth",authBearer:"Bearer token",authManager:"Admin / superadmin",authSuperadmin:"Superadmin",authCharger:"Charger credentials",groupPublic:"Public",groupIdentity:"Identity",groupCars:"Cars",groupService:"Service records",groupTechnical:"Technical checks",groupParts:"Parts",groupFuel:"Fuel",groupCharging:"Charging",groupMaintenance:"Maintenance",groupDocuments:"Documents",groupReminders:"Reminders",groupAttachments:"Attachments",groupProviders:"Vehicle providers",groupIntegrations:"Integrations",groupOcpp:"OCPP",groupAccount:"Account",groupManagement:"Management",groupSuperadmin:"Superadmin"},vl={app:rl,sections:al,login:ll,status:cl,common:ul,users:dl,orgs:pl,server:fl,pocketbase:hl,webapp:gl,plugins:ml,api:bl},yl={apiServer:"Serwer API",switchToLight:"Przełącz na motyw jasny",switchToDark:"Przełącz na motyw ciemny",theme:"Motyw",signOut:"Wyloguj się",loading:"Ładowanie…",standardUserNote:"Zalogowano jako zwykły użytkownik — sekcje zarządzania wymagają roli administratora",footer:"DriverVault — rejestr serwisu i konserwacji samochodu."},_l={overview:"Przegląd",users:"Użytkownicy",orgs:"Organizacje",server:"Serwer API",pocketbase:"PocketBase",webapp:"Aplikacja webowa",plugins:"Wtyczki",api:"API"},wl={title:"Zaloguj się",subtitle:"Konsola superadministratora serwera API DriverVault.",email:"E-mail",password:"Hasło",submit:"Zaloguj się",submitting:"Logowanie…",invalid:"Nieprawidłowy e-mail lub hasło.",failed:"Nie udało się zalogować.",authNote:"Uwierzytelnia w PocketBase za pośrednictwem tego serwera"},xl={title:"Status",unreachable:"niedostępny",checking:"Sprawdzanie…",apiServer:"Serwer API",pocketBase:"PocketBase",webApp:"Aplikacja webowa",thisProcess:"ten proces"},kl={create:"Utwórz",save:"Zapisz",cancel:"Anuluj",edit:"Edytuj",delete:"Usuń",rename:"Zmień nazwę",empty:"—",name:"Nazwa",email:"E-mail",role:"Rola",organization:"Organizacja"},Sl={title:"Użytkownicy",allOrgs:"Wszystkie organizacje",yourOrg:"Twoja organizacja",newUser:"Nowy użytkownik",password:"Hasło",passwordUnchanged:"Hasło (puste = bez zmian)",passwordPlaceholder:"min. 8 znaków",orgNone:"— brak —",you:"Ty",empty:"Brak użytkowników.",confirmDelete:"Usunąć {email}? Tej operacji nie można cofnąć."},Tl={title:"Organizacje",subtitle:"Podmioty, do których należą użytkownicy",subtitleOwn:"Twoja organizacja",subtitleNone:"Utwórz ją, aby zarządzać własnym zespołem",newOrg:"Nowa organizacja",namePlaceholder:"Acme Fleet",empty:"Brak organizacji.",createHint:"Nie masz jeszcze organizacji. Utwórz ją, aby zostać jej administratorem.",colId:"ID",confirmDelete:"Usunąć organizację „{name}”?",confirmDeleteOwn:"Usunąć Twoją organizację „{name}”? Zostaniesz z niej usunięty i staniesz się zwykłym użytkownikiem."},El={title:"Serwer API",subtitle:"Jak ten serwer przedstawia się klientom, które się z nim łączą",name:"Nazwa serwera",nameHint:"Widoczna w klientach, które można skierować na więcej niż jeden DriverVault, na przykład w przełączniku serwerów aplikacji webowej. Zwracana przez /api/health.",saveApply:"Zapisz i zastosuj",persistedEnv:"zapisano w .env",savedNotice:"Zapisano. Nowa nazwa obowiązuje od następnego żądania."},Pl={title:"PocketBase",subtitle:"Połączenie z bazą danych używane przez każdy punkt końcowy",connected:"połączono",noSuperuser:"brak superużytkownika",unreachable:"niedostępny",baseUrl:"Adres bazowy",superuserEmail:"E-mail superużytkownika",superuserPassword:"Hasło superużytkownika",passwordUnchanged:"bez zmian",passwordNotSet:"nie ustawiono",saveApply:"Zapisz i zastosuj",testConnection:"Testuj połączenie",persistedEnv:"zapisano w .env",testOk:"Połączenie OK — superużytkownik uwierzytelniony.",testReachableNoAuth:"PocketBase jest dostępny, ale konto usługowe nie zostało uwierzytelnione.",testUnreachable:"PocketBase jest niedostępny pod tym adresem.",savedNotice:"Zapisano. Serwer korzysta teraz z tego PocketBase."},Cl={title:"Aplikacja webowa",subtitle:"Adres sprawdzany podczas kontroli statusu oraz kto może wywoływać to API z przeglądarki",reachable:"dostępna",unreachable:"niedostępna",baseUrl:"Adres bazowy",allowedOrigins:"Dozwolone źródła",originsHint:"Oddzielone przecinkami lub {star} dla dowolnego. Natywne aplikacje mobilne nie podlegają CORS.",saveApply:"Zapisz i zastosuj",testConnection:"Testuj połączenie",persistedEnv:"zapisano w .env",testOk:"Aplikacja webowa jest dostępna.",testFailed:"Aplikacja webowa nie odpowiedziała na kontrolę stanu pod tym adresem.",savedNotice:"Zapisano. Nowe źródła obowiązują od następnego żądania."},Al={title:"Wtyczki",subtitle:"Integracje z usługami zewnętrznymi",registerExternal:"Zarejestruj zewnętrzną",cancelRegister:"Anuluj",name:"Nazwa",baseUrl:"Adres bazowy",provider:"Dostawca",register:"Zarejestruj",empty:"Brak wtyczek. Zarejestruj zewnętrzną powyżej lub skompiluj wbudowany łącznik.",builtin:"wbudowana",enabled:"włączona",disabled:"wyłączona",health:"Stan",configure:"Konfiguruj",close:"Zamknij",noConfig:"Ta wtyczka nie wymaga konfiguracji.",notSet:"Nie ustawiono — pozwól organizacjom i użytkownikom wybrać",capabilities:"Możliwości",saved:"Zapisano.",checking:"Sprawdzanie…",save:"Zapisz",saveEnable:"Zapisz i włącz",disable:"Wyłącz",remove:"Usuń",builtinNote:"Wtyczki wbudowane można wyłączyć, ale nie usunąć",confirmRemove:"Usunąć zewnętrzną wtyczkę „{name}”? Jej zapisana konfiguracja zostanie usunięta."},$l={colEndpoint:"Punkt końcowy",colDescription:"Opis",authNone:"Bez uwierzytelniania",authBearer:"Token Bearer",authManager:"Administrator / superadministrator",authSuperadmin:"Superadministrator",authCharger:"Dane logowania ładowarki",groupPublic:"Publiczne",groupIdentity:"Tożsamość",groupCars:"Samochody",groupService:"Wpisy serwisowe",groupTechnical:"Przeglądy techniczne",groupParts:"Części",groupFuel:"Paliwo",groupCharging:"Ładowanie",groupMaintenance:"Naprawy",groupDocuments:"Dokumenty",groupReminders:"Przypomnienia",groupAttachments:"Załączniki",groupProviders:"Dostawcy pojazdów",groupIntegrations:"Integracje",groupOcpp:"OCPP",groupAccount:"Konto",groupManagement:"Zarządzanie",groupSuperadmin:"Superadministrator"},Ol={app:yl,sections:_l,login:wl,status:xl,common:kl,users:Sl,orgs:Tl,server:El,pocketbase:Pl,webapp:Cl,plugins:Al,api:$l},Rl={apiServer:"API-server",switchToLight:"Skift til lyst tema",switchToDark:"Skift til mørkt tema",theme:"Tema",signOut:"Log ud",loading:"Indlæser…",standardUserNote:"Logget ind som almindelig bruger — administrationssektioner kræver en administratorrolle",footer:"DriverVault — bilservice- og vedligeholdelsesregister."},zl={overview:"Oversigt",users:"Brugere",orgs:"Organisationer",server:"API-server",pocketbase:"PocketBase",webapp:"Webapp",plugins:"Plugins",api:"API"},Dl={title:"Log ind",subtitle:"Superadmin-konsol til DriverVault API-serveren.",email:"E-mail",password:"Adgangskode",submit:"Log ind",submitting:"Logger ind…",invalid:"Ugyldig e-mail eller adgangskode.",failed:"Kunne ikke logge ind.",authNote:"Godkender mod PocketBase gennem denne server"},Il={title:"Status",unreachable:"utilgængelig",checking:"Tjekker…",apiServer:"API-server",pocketBase:"PocketBase",webApp:"Webapp",thisProcess:"denne proces"},jl={create:"Opret",save:"Gem",cancel:"Annuller",edit:"Rediger",delete:"Slet",rename:"Omdøb",empty:"—",name:"Navn",email:"E-mail",role:"Rolle",organization:"Organisation"},Ul={title:"Brugere",allOrgs:"Alle organisationer",yourOrg:"Din organisation",newUser:"Ny bruger",password:"Adgangskode",passwordUnchanged:"Adgangskode (tom = uændret)",passwordPlaceholder:"mindst 8 tegn",orgNone:"— ingen —",you:"dig",empty:"Ingen brugere.",confirmDelete:"Slet {email}? Dette kan ikke fortrydes."},Nl={title:"Organisationer",subtitle:"Enheder, som brugere tilhører",subtitleOwn:"Din organisation",subtitleNone:"Opret en for at administrere dit eget team",newOrg:"Ny organisation",namePlaceholder:"Acme Fleet",empty:"Ingen organisationer endnu.",createHint:"Du har endnu ingen organisation. Opret en for at blive dens administrator.",colId:"ID",confirmDelete:'Slet organisationen "{name}"?',confirmDeleteOwn:"Slet din organisation „{name}“? Du fjernes fra den og bliver en almindelig bruger."},Ml={title:"API-server",subtitle:"Hvordan denne server identificerer sig over for de klienter, der forbinder til den",name:"Servernavn",nameHint:"Vises af klienter, der kan pege på mere end én DriverVault, for eksempel webappens serverskifter. Returneres af /api/health.",saveApply:"Gem og anvend",persistedEnv:"gemt i .env",savedNotice:"Gemt. Det nye navn gælder fra næste anmodning."},Ll={title:"PocketBase",subtitle:"Databaseforbindelse brugt af hvert endpoint",connected:"forbundet",noSuperuser:"ingen superbruger",unreachable:"utilgængelig",baseUrl:"Basis-URL",superuserEmail:"Superbrugerens e-mail",superuserPassword:"Superbrugerens adgangskode",passwordUnchanged:"uændret",passwordNotSet:"ikke angivet",saveApply:"Gem og anvend",testConnection:"Test forbindelse",persistedEnv:"gemt i .env",testOk:"Forbindelse OK — superbruger godkendt.",testReachableNoAuth:"PocketBase er tilgængelig, men servicekontoen blev ikke godkendt.",testUnreachable:"PocketBase er ikke tilgængelig på den adresse.",savedNotice:"Gemt. Serveren bruger nu denne PocketBase."},Fl={title:"Webapp",subtitle:"Adressen, der tjekkes ved statuskontrol, og hvem der må kalde dette API fra en browser",reachable:"tilgængelig",unreachable:"utilgængelig",baseUrl:"Basis-URL",allowedOrigins:"Tilladte oprindelser",originsHint:"Kommasepareret, eller {star} for enhver. Native mobilapps er ikke underlagt CORS.",saveApply:"Gem og anvend",testConnection:"Test forbindelse",persistedEnv:"gemt i .env",testOk:"Webappen er tilgængelig.",testFailed:"Webappen svarede ikke på sit helbredstjek på den adresse.",savedNotice:"Gemt. Nye oprindelser gælder fra næste anmodning."},Bl={title:"Plugins",subtitle:"Integrationer med tredjepartstjenester",registerExternal:"Registrér ekstern",cancelRegister:"Annuller",name:"Navn",baseUrl:"Basis-URL",provider:"Udbyder",register:"Registrér",empty:"Ingen plugins endnu. Registrér et eksternt ovenfor, eller kompilér et indbygget stik.",builtin:"indbygget",enabled:"aktiveret",disabled:"deaktiveret",health:"Helbred",configure:"Konfigurer",close:"Luk",noConfig:"Dette plugin kræver ingen konfiguration.",notSet:"Ikke angivet — lad organisationer og brugere vælge",capabilities:"Funktioner",saved:"Gemt.",checking:"Tjekker…",save:"Gem",saveEnable:"Gem og aktivér",disable:"Deaktiver",remove:"Fjern",builtinNote:"Indbyggede plugins kan deaktiveres, men ikke fjernes",confirmRemove:'Fjern det eksterne plugin "{name}"? Dets gemte konfiguration slettes.'},Hl={colEndpoint:"Endpoint",colDescription:"Beskrivelse",authNone:"Ingen godkendelse",authBearer:"Bearer-token",authManager:"Admin / superadmin",authSuperadmin:"Superadmin",authCharger:"Laderens loginoplysninger",groupPublic:"Offentlig",groupIdentity:"Identitet",groupCars:"Biler",groupService:"Serviceposter",groupTechnical:"Syn",groupParts:"Reservedele",groupFuel:"Brændstof",groupCharging:"Opladning",groupMaintenance:"Værksted",groupDocuments:"Dokumenter",groupReminders:"Påmindelser",groupAttachments:"Vedhæftede filer",groupProviders:"Køretøjsudbydere",groupIntegrations:"Integrationer",groupOcpp:"OCPP",groupAccount:"Konto",groupManagement:"Administration",groupSuperadmin:"Superadmin"},Vl={app:Rl,sections:zl,login:Dl,status:Il,common:jl,users:Ul,orgs:Nl,server:Ml,pocketbase:Ll,webapp:Fl,plugins:Bl,api:Hl},To="dh-panel-lang",Eo="en",Rt={en:vl,pl:Ol,da:Vl},Gl=Object.keys(Rt);function Kl(){try{const t=localStorage.getItem(To);if(t&&Rt[t])return t}catch{}const e=(navigator.language||"en").split("-")[0];return Rt[e]?e:Eo}const En=H(Kl());function Wl(e){if(Rt[e]){En.value=e;try{localStorage.setItem(To,e)}catch{}}}function hi(e,t){return t.split(".").reduce((s,n)=>s==null?void 0:s[n],e)}function ql(e,t){return t?e.replace(/\{(\w+)\}/g,(s,n)=>t[n]==null?s:String(t[n])):e}function Zl(e,t,s){let n="other";try{n=new Intl.PluralRules(s).select(t)}catch{n=t===1?"one":"other"}return e[n]??e.other??e.one}function f(e,t){const s=En.value;let n=hi(Rt[s],e);if(n==null&&(n=hi(Rt[Eo],e)),n==null)return e;if(typeof n=="object"){if((t==null?void 0:t.n)==null)return e;n=Zl(n,t.n,s)}return typeof n!="string"?e:ql(n,t)}function gi(e,t,s){const i=f(e,{...s,[t]:"\0"}),o=i.indexOf("\0");return o===-1?{before:i,after:""}:{before:i.slice(0,o),after:i.slice(o+1)}}const ln="dh-panel-token";function Jl(){try{return localStorage.getItem(ln)||""}catch{return""}}const zt=H(Jl()),de=H(null),Ce=je(()=>{var e;return((e=de.value)==null?void 0:e.role)==="superadmin"}),gs=je(()=>{var e,t;return((e=de.value)==null?void 0:e.role)==="admin"||((t=de.value)==null?void 0:t.role)==="superadmin"});function Po(e){zt.value=e;try{e?localStorage.setItem(ln,e):localStorage.removeItem(ln)}catch{}}class Yl extends Error{constructor(t,s,n){super(t),this.status=s,this.body=n}}function Xl(e,t){if(!e||typeof e!="object")return`HTTP ${t}`;if(e.error)return e.error;const s=Object.entries(e.data||{}).map(([n,i])=>`${n}: ${(i==null?void 0:i.message)||i}`).filter(Boolean);return s.length?s.join("; "):e.message||`HTTP ${t}`}async function te(e,{method:t="GET",body:s,auth:n=!0}={}){const i={};s!==void 0&&(i["Content-Type"]="application/json"),n&&zt.value&&(i.Authorization=zt.value);const o=await fetch(e,{method:t,headers:i,body:s===void 0?void 0:JSON.stringify(s)}),r=await o.text();let a=null;try{a=r?JSON.parse(r):null}catch{a=null}if(!o.ok)throw o.status===401&&n&&Pn(),new Yl(Xl(a,o.status),o.status,a);return a}async function Ql(e,t){const s=await te("/api/auth/login",{method:"POST",body:{email:e,password:t},auth:!1});return Po(s.token),await Ss(),de.value}async function Ss(){return de.value=await te("/api/identity"),de.value}function Pn(){Po(""),de.value=null}async function ec(){if(!zt.value)return null;try{return await Ss()}catch{return Pn(),null}}const tc={class:"mx-auto flex w-full max-w-sm flex-col gap-5 pt-24"},sc={class:"dh-card p-6"},nc={class:"text-lg font-bold tracking-[-0.02em] text-strong"},ic={class:"mt-1 mb-5 text-sm text-body"},oc={class:"dh-label",for:"login-email"},rc={class:"dh-label",for:"login-password"},ac={key:0,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},lc=["disabled"],cc={class:"eyebrow text-center"},uc={__name:"LoginView",emits:["authenticated"],setup(e,{emit:t}){const s=t,n=H(""),i=H(""),o=H(""),r=H(!1),a=je(()=>n.value.trim()!==""&&i.value!==""&&!r.value);async function l(){if(a.value){o.value="",r.value=!0;try{const g=await Ql(n.value.trim(),i.value);s("authenticated",g)}catch(g){o.value=g.status===400||g.status===404?f("login.invalid"):g.message||f("login.failed"),i.value=""}finally{r.value=!1}}}return(g,d)=>(y(),T("div",tc,[u("div",sc,[u("h1",nc,m(h(f)("login.title")),1),u("p",ic,m(h(f)("login.subtitle")),1),u("form",{class:"flex flex-col gap-4",onSubmit:Xa(l,["prevent"])},[u("div",null,[u("label",oc,m(h(f)("login.email")),1),le(u("input",{id:"login-email","onUpdate:modelValue":d[0]||(d[0]=b=>n.value=b),class:"dh-input",type:"email",autocomplete:"username",autofocus:"",placeholder:"you@example.com"},null,512),[[ge,n.value]])]),u("div",null,[u("label",rc,m(h(f)("login.password")),1),le(u("input",{id:"login-password","onUpdate:modelValue":d[1]||(d[1]=b=>i.value=b),class:"dh-input",type:"password",autocomplete:"current-password",placeholder:"••••••••"},null,512),[[ge,i.value]])]),o.value?(y(),T("p",ac,m(o.value),1)):B("",!0),u("button",{class:"dh-btn w-full",type:"submit",disabled:!a.value},m(r.value?h(f)("login.submitting"):h(f)("login.submit")),9,lc)],32)]),u("p",cc,m(h(f)("login.authNote")),1)]))}},dc={class:"dh-card overflow-hidden"},pc={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},fc={class:"text-base font-bold tracking-[-0.02em] text-strong"},hc={key:0,class:"dh-pill bg-danger-soft text-danger"},gc={key:0,class:"px-5 py-4 text-sm text-danger"},mc={key:1,class:"w-full text-left text-sm"},bc={class:"px-5 py-3 font-medium text-strong"},vc={class:"data px-5 py-3 text-xs text-muted"},yc={class:"data px-5 py-3 text-right text-xs text-muted"},_c={class:"px-5 py-3 text-right"},wc={key:2,class:"px-5 py-4 text-sm text-muted"},xc={__name:"StatusCard",setup(e){const t=H(null),s=H("");let n=null;async function i(){try{t.value=await te("/api/status",{auth:!1}),s.value=""}catch(a){t.value=null,s.value=a.message||f("status.unreachable")}}const o=je(()=>{var a,l,g;return[{key:"apiServer",label:f("status.apiServer"),h:(a=t.value)==null?void 0:a.apiServer},{key:"pocketBase",label:f("status.pocketBase"),h:(l=t.value)==null?void 0:l.pocketBase},{key:"webApp",label:f("status.webApp"),h:(g=t.value)==null?void 0:g.webApp}]});ct(()=>{i(),n=setInterval(i,1e4)}),kn(()=>clearInterval(n));const r=a=>a==="ok"?"bg-success-soft text-success":"bg-danger-soft text-danger";return(a,l)=>(y(),T("div",dc,[u("div",pc,[u("div",fc,m(h(f)("status.title")),1),s.value?(y(),T("span",hc,[l[0]||(l[0]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Re(m(h(f)("status.unreachable")),1)])):B("",!0)]),s.value?(y(),T("div",gc,m(s.value),1)):t.value?(y(),T("table",mc,[u("tbody",null,[(y(!0),T(ne,null,$e(o.value,g=>(y(),T("tr",{key:g.key,class:"border-t border-subtle first:border-t-0"},[u("td",bc,m(g.label),1),u("td",vc,m(g.h.url||h(f)("status.thisProcess")),1),u("td",yc,m(g.h.latencyMs!=null?g.h.latencyMs+"ms":h(f)("common.empty")),1),u("td",_c,[u("span",{class:Ue(["dh-pill",r(g.h.status)])},[l[1]||(l[1]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Re(m(g.h.status),1)],2)])]))),128))])])):(y(),T("div",wc,m(h(f)("status.checking")),1))]))}},kc={class:"dh-card overflow-hidden"},Sc={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},Tc={class:"text-base font-bold tracking-[-0.02em] text-strong"},Ec={class:"mt-0.5 text-xs text-muted"},Pc={class:"flex flex-col gap-4 px-5 py-4"},Cc={class:"dh-label",for:"pb-url"},Ac={class:"grid gap-4 sm:grid-cols-2"},$c={class:"dh-label",for:"pb-email"},Oc={class:"dh-label",for:"pb-password"},Rc=["placeholder"],zc={key:0,class:"data text-xs text-muted"},Dc={key:1,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},Ic={key:2,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},jc={class:"flex items-center gap-2"},Uc=["disabled"],Nc=["disabled"],Mc={class:"eyebrow"},Lc={__name:"PocketBaseCard",setup(e){const t=H(null),s=H({url:"",adminEmail:"",adminPassword:""}),n=H(null),i=H(""),o=H(""),r=H(!1);async function a(){try{t.value=await te("/api/admin/pb-config"),s.value={url:t.value.url,adminEmail:t.value.adminEmail,adminPassword:""},n.value=t.value.probe}catch(d){i.value=d.message}}ct(a);async function l(){i.value="",o.value="",r.value=!0;try{n.value=await te("/api/admin/pb-config/test",{method:"POST",body:s.value}),o.value=n.value.superuser?f("pocketbase.testOk"):n.value.reachable?f("pocketbase.testReachableNoAuth"):f("pocketbase.testUnreachable")}catch(d){i.value=d.message}finally{r.value=!1}}async function g(){i.value="",o.value="",r.value=!0;try{const d=await te("/api/admin/pb-config",{method:"PUT",body:s.value});t.value=d.config,n.value=d.config.probe,s.value.adminPassword="",o.value=d.warning||f("pocketbase.savedNotice")}catch(d){i.value=d.message}finally{r.value=!1}}return(d,b)=>{var P,$;return y(),T("div",kc,[u("div",Sc,[u("div",null,[u("div",Tc,m(h(f)("pocketbase.title")),1),u("p",Ec,m(h(f)("pocketbase.subtitle")),1)]),n.value?(y(),T("span",{key:0,class:Ue(["dh-pill",n.value.superuser?"bg-success-soft text-success":n.value.reachable?"bg-warning-soft text-warning":"bg-danger-soft text-danger"])},[b[3]||(b[3]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Re(" "+m(n.value.superuser?h(f)("pocketbase.connected"):n.value.reachable?h(f)("pocketbase.noSuperuser"):h(f)("pocketbase.unreachable")),1)],2)):B("",!0)]),u("div",Pc,[u("div",null,[u("label",Cc,m(h(f)("pocketbase.baseUrl")),1),le(u("input",{id:"pb-url","onUpdate:modelValue":b[0]||(b[0]=F=>s.value.url=F),class:"dh-input",placeholder:"http://10.2.1.10:8027"},null,512),[[ge,s.value.url]])]),u("div",Ac,[u("div",null,[u("label",$c,m(h(f)("pocketbase.superuserEmail")),1),le(u("input",{id:"pb-email","onUpdate:modelValue":b[1]||(b[1]=F=>s.value.adminEmail=F),class:"dh-input",autocomplete:"off"},null,512),[[ge,s.value.adminEmail]])]),u("div",null,[u("label",Oc,m(h(f)("pocketbase.superuserPassword")),1),le(u("input",{id:"pb-password","onUpdate:modelValue":b[2]||(b[2]=F=>s.value.adminPassword=F),class:"dh-input",type:"password",autocomplete:"new-password",placeholder:(P=t.value)!=null&&P.adminConfigured?h(f)("pocketbase.passwordUnchanged"):h(f)("pocketbase.passwordNotSet")},null,8,Rc),[[ge,s.value.adminPassword]])])]),($=n.value)!=null&&$.detail?(y(),T("p",zc,m(n.value.detail),1)):B("",!0),o.value?(y(),T("p",Dc,m(o.value),1)):B("",!0),i.value?(y(),T("p",Ic,m(i.value),1)):B("",!0),u("div",jc,[u("button",{class:"dh-btn",disabled:r.value,onClick:g},m(h(f)("pocketbase.saveApply")),9,Uc),u("button",{class:"dh-btn-ghost",disabled:r.value,onClick:l},m(h(f)("pocketbase.testConnection")),9,Nc),b[4]||(b[4]=u("span",{class:"flex-1"},null,-1)),u("span",Mc,m(h(f)("pocketbase.persistedEnv")),1)])])])}}},Fc={class:"dh-card overflow-hidden"},Bc={class:"border-b border-subtle px-5 py-4"},Hc={class:"text-base font-bold tracking-[-0.02em] text-strong"},Vc={class:"mt-0.5 text-xs text-muted"},Gc={class:"flex flex-col gap-4 px-5 py-4"},Kc={class:"dh-label",for:"server-name"},Wc={class:"mt-1 text-xs text-muted"},qc={key:0,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},Zc={key:1,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},Jc={class:"flex items-center gap-2"},Yc=["disabled"],Xc={class:"eyebrow"},Qc={__name:"ServerCard",setup(e){const t=H({name:""}),s=H(""),n=H(""),i=H(!1);async function o(){try{const a=await te("/api/admin/server-config");t.value={name:a.name}}catch(a){s.value=a.message}}ct(o);async function r(){s.value="",n.value="",i.value=!0;try{const a=await te("/api/admin/server-config",{method:"PUT",body:{name:t.value.name}});t.value={name:a.config.name},n.value=a.warning||f("server.savedNotice")}catch(a){s.value=a.message}finally{i.value=!1}}return(a,l)=>(y(),T("div",Fc,[u("div",Bc,[u("div",Hc,m(h(f)("server.title")),1),u("p",Vc,m(h(f)("server.subtitle")),1)]),u("div",Gc,[u("div",null,[u("label",Kc,m(h(f)("server.name")),1),le(u("input",{id:"server-name","onUpdate:modelValue":l[0]||(l[0]=g=>t.value.name=g),class:"dh-input",maxlength:"64",placeholder:"DriverVault API Server",onKeyup:xo(r,["enter"])},null,544),[[ge,t.value.name]]),u("p",Wc,m(h(f)("server.nameHint")),1)]),n.value?(y(),T("p",qc,m(n.value),1)):B("",!0),s.value?(y(),T("p",Zc,m(s.value),1)):B("",!0),u("div",Jc,[u("button",{class:"dh-btn",disabled:i.value,onClick:r},m(h(f)("server.saveApply")),9,Yc),l[1]||(l[1]=u("span",{class:"flex-1"},null,-1)),u("span",Xc,m(h(f)("server.persistedEnv")),1)])])]))}},eu={class:"dh-card overflow-hidden"},tu={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},su={class:"text-base font-bold tracking-[-0.02em] text-strong"},nu={class:"mt-0.5 text-xs text-muted"},iu={class:"flex flex-col gap-4 px-5 py-4"},ou={class:"dh-label",for:"web-url"},ru={class:"dh-label",for:"web-origins"},au={class:"mt-1 text-xs text-muted"},lu={key:0,class:"data text-xs text-muted"},cu={key:1,class:"rounded-control bg-info-soft px-3 py-2 text-xs text-info"},uu={key:2,class:"rounded-control bg-danger-soft px-3 py-2 text-xs text-danger"},du={class:"flex items-center gap-2"},pu=["disabled"],fu=["disabled"],hu={class:"eyebrow"},gu={__name:"WebAppCard",setup(e){const t=H(null),s=H({url:"",origins:""}),n=H(null),i=H(""),o=H(""),r=H(!1),a=P=>P.split(",").map($=>$.trim()).filter(Boolean);function l(P){t.value=P,s.value={url:P.url,origins:(P.allowOrigins||[]).join(", ")},n.value=P.probe}async function g(){try{l(await te("/api/admin/webapp-config"))}catch(P){i.value=P.message}}ct(g);async function d(){i.value="",o.value="",r.value=!0;try{n.value=await te("/api/admin/webapp-config/test",{method:"POST",body:{url:s.value.url}}),o.value=n.value.status==="ok"?f("webapp.testOk"):f("webapp.testFailed")}catch(P){i.value=P.message}finally{r.value=!1}}async function b(){i.value="",o.value="",r.value=!0;try{const P=await te("/api/admin/webapp-config",{method:"PUT",body:{url:s.value.url,allowOrigins:a(s.value.origins)}});l(P.config),o.value=P.warning||f("webapp.savedNotice")}catch(P){i.value=P.message}finally{r.value=!1}}return(P,$)=>{var F;return y(),T("div",eu,[u("div",tu,[u("div",null,[u("div",su,m(h(f)("webapp.title")),1),u("p",nu,m(h(f)("webapp.subtitle")),1)]),n.value?(y(),T("span",{key:0,class:Ue(["dh-pill",n.value.status==="ok"?"bg-success-soft text-success":"bg-danger-soft text-danger"])},[$[2]||($[2]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Re(" "+m(n.value.status==="ok"?h(f)("webapp.reachable"):h(f)("webapp.unreachable")),1)],2)):B("",!0)]),u("div",iu,[u("div",null,[u("label",ou,m(h(f)("webapp.baseUrl")),1),le(u("input",{id:"web-url","onUpdate:modelValue":$[0]||($[0]=k=>s.value.url=k),class:"dh-input",placeholder:"http://localhost:8090"},null,512),[[ge,s.value.url]])]),u("div",null,[u("label",ru,m(h(f)("webapp.allowedOrigins")),1),le(u("input",{id:"web-origins","onUpdate:modelValue":$[1]||($[1]=k=>s.value.origins=k),class:"dh-input",placeholder:"http://localhost:8090, https://app.example.com"},null,512),[[ge,s.value.origins]]),u("p",au,[Re(m(h(gi)("webapp.originsHint","star").before),1),$[3]||($[3]=u("span",{class:"data"},"*",-1)),Re(m(h(gi)("webapp.originsHint","star").after),1)])]),(F=n.value)!=null&&F.error?(y(),T("p",lu,m(n.value.error),1)):B("",!0),o.value?(y(),T("p",cu,m(o.value),1)):B("",!0),i.value?(y(),T("p",uu,m(i.value),1)):B("",!0),u("div",du,[u("button",{class:"dh-btn",disabled:r.value,onClick:b},m(h(f)("webapp.saveApply")),9,pu),u("button",{class:"dh-btn-ghost",disabled:r.value,onClick:d},m(h(f)("webapp.testConnection")),9,fu),$[4]||($[4]=u("span",{class:"flex-1"},null,-1)),u("span",hu,m(h(f)("webapp.persistedEnv")),1)])])])}}},mu={class:"dh-card overflow-hidden"},bu={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},vu={class:"text-base font-bold tracking-[-0.02em] text-strong"},yu={class:"mt-0.5 text-xs text-muted"},_u={key:0,class:"border-b border-subtle bg-sunken px-5 py-4"},wu={class:"grid gap-3 sm:grid-cols-3"},xu={class:"dh-label"},ku={class:"dh-label"},Su={class:"dh-label"},Tu=["disabled"],Eu={key:1,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},Pu={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Cu={class:"flex items-center gap-3 px-5 py-3"},Au=["onClick"],$u={class:"font-semibold text-strong"},Ou={class:"dh-pill bg-sunken text-muted"},Ru={key:0,class:"text-xs text-muted"},zu=["disabled","onClick"],Du=["disabled","onClick"],Iu={key:0,class:"bg-sunken px-5 py-4"},ju={key:0,class:"data mb-3 text-xs text-muted"},Uu={key:1,class:"grid gap-3 sm:grid-cols-2"},Nu={class:"dh-label"},Mu={key:0,class:"text-danger"},Lu=["onUpdate:modelValue"],Fu={key:0,value:""},Bu=["value"],Hu=["onUpdate:modelValue","type","placeholder"],Vu={key:2,class:"mt-1 text-xs text-muted"},Gu={key:2,class:"text-xs text-muted"},Ku={key:3,class:"mt-4"},Wu={class:"eyebrow mb-1.5"},qu={class:"data flex flex-col gap-1 text-xs text-muted"},Zu={class:"text-strong"},Ju={key:0},Yu={key:1},Xu={key:4,class:"data mt-3 text-xs text-body"},Qu={class:"mt-4 flex items-center gap-2"},ed=["disabled","onClick"],td=["disabled","onClick"],sd=["disabled","onClick"],nd={key:5,class:"eyebrow mt-2"},id={__name:"PluginsCard",setup(e){const t=H([]),s=H(""),n=H(!1),i=H(null),o=Xt({}),r=Xt({}),a=H(!1),l=H({name:"",baseURL:"",provider:""});async function g(){try{const O=await te("/api/admin/plugins");t.value=O.plugins||[],s.value=""}catch(O){s.value=O.message}}ct(g);function d(O){var C;if(i.value===O.name){i.value=null;return}const E={};for(const I of O.configFields||[])E[I.key]=((C=O.config)==null?void 0:C[I.key])??"";o[O.name]=E,i.value=O.name}async function b(O,E){n.value=!0,r[O.name]="";try{const C=await te(`/api/admin/plugins/${encodeURIComponent(O.name)}`,{method:"PUT",body:{enabled:E,config:o[O.name]??{}}});r[O.name]=C.warning||f("plugins.saved"),await g()}catch(C){r[O.name]=C.message}finally{n.value=!1}}async function P(O){n.value=!0,r[O.name]=f("plugins.checking");try{const E=await te(`/api/admin/plugins/${encodeURIComponent(O.name)}/health`,{method:"POST"});r[O.name]=`${E.health.status}${E.health.detail?" — "+E.health.detail:""}`,await g()}catch(E){r[O.name]=E.message}finally{n.value=!1}}async function $(O){if(confirm(f("plugins.confirmRemove",{name:O.name}))){n.value=!0;try{await te(`/api/admin/plugins/${encodeURIComponent(O.name)}`,{method:"DELETE"}),i.value===O.name&&(i.value=null),await g()}catch(E){r[O.name]=E.message}finally{n.value=!1}}}async function F(){n.value=!0,s.value="";try{await te("/api/admin/plugins",{method:"POST",body:l.value}),l.value={name:"",baseURL:"",provider:""},a.value=!1,await g()}catch(O){s.value=O.message}finally{n.value=!1}}const k=O=>O==="ok"?"bg-success-soft text-success":O==="degraded"?"bg-warning-soft text-warning":"bg-danger-soft text-danger";return(O,E)=>(y(),T("div",mu,[u("div",bu,[u("div",null,[u("div",vu,m(h(f)("plugins.title")),1),u("p",yu,m(h(f)("plugins.subtitle")),1)]),u("button",{class:"dh-btn-ghost",onClick:E[0]||(E[0]=C=>a.value=!a.value)},m(a.value?h(f)("plugins.cancelRegister"):h(f)("plugins.registerExternal")),1)]),a.value?(y(),T("div",_u,[u("div",wu,[u("div",null,[u("label",xu,m(h(f)("plugins.name")),1),le(u("input",{"onUpdate:modelValue":E[1]||(E[1]=C=>l.value.name=C),class:"dh-input",placeholder:"acme-parts"},null,512),[[ge,l.value.name]])]),u("div",null,[u("label",ku,m(h(f)("plugins.baseUrl")),1),le(u("input",{"onUpdate:modelValue":E[2]||(E[2]=C=>l.value.baseURL=C),class:"dh-input",placeholder:"http://127.0.0.1:9100"},null,512),[[ge,l.value.baseURL]])]),u("div",null,[u("label",Su,m(h(f)("plugins.provider")),1),le(u("input",{"onUpdate:modelValue":E[3]||(E[3]=C=>l.value.provider=C),class:"dh-input",placeholder:"ACME Corp"},null,512),[[ge,l.value.provider]])])]),u("button",{class:"dh-btn mt-3",disabled:n.value||!l.value.name||!l.value.baseURL,onClick:F},m(h(f)("plugins.register")),9,Tu)])):B("",!0),s.value?(y(),T("p",Eu,m(s.value),1)):B("",!0),t.value.length?B("",!0):(y(),T("p",Pu,m(h(f)("plugins.empty")),1)),(y(!0),T(ne,null,$e(t.value,C=>(y(),T("div",{key:C.name,class:"border-t border-subtle first:border-t-0"},[u("div",Cu,[u("button",{class:"flex flex-1 items-center gap-3 text-left",onClick:I=>d(C)},[u("span",$u,m(C.name),1),u("span",Ou,m(C.kind||h(f)("plugins.builtin")),1),C.provider?(y(),T("span",Ru,m(C.provider),1)):B("",!0),C.health?(y(),T("span",{key:1,class:Ue(["dh-pill",k(C.health.status)])},[E[4]||(E[4]=u("span",{class:"h-1.5 w-1.5 rounded-full bg-current"},null,-1)),Re(m(C.health.status),1)],2)):B("",!0)],8,Au),u("span",{class:Ue(["dh-pill",C.enabled?"bg-success-soft text-success":"bg-sunken text-muted"])},m(C.enabled?h(f)("plugins.enabled"):h(f)("plugins.disabled")),3),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:I=>P(C)},m(h(f)("plugins.health")),9,zu),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:I=>d(C)},m(i.value===C.name?h(f)("plugins.close"):h(f)("plugins.configure")),9,Du)]),i.value===C.name?(y(),T("div",Iu,[C.baseURL?(y(),T("div",ju,m(C.baseURL),1)):B("",!0),(C.configFields||[]).length?(y(),T("div",Uu,[(y(!0),T(ne,null,$e(C.configFields,I=>(y(),T("div",{key:I.key},[u("label",Nu,[Re(m(I.label||I.key),1),I.required?(y(),T("span",Mu," *")):B("",!0)]),I.type==="select"?le((y(),T("select",{key:0,"onUpdate:modelValue":j=>o[C.name][I.key]=j,class:"dh-select"},[I.required?B("",!0):(y(),T("option",Fu,m(h(f)("plugins.notSet")),1)),(y(!0),T(ne,null,$e(I.options||[],j=>(y(),T("option",{key:j.value,value:j.value},m(j.label||j.value),9,Bu))),128))],8,Lu)),[[ks,o[C.name][I.key]]]):le((y(),T("input",{key:1,"onUpdate:modelValue":j=>o[C.name][I.key]=j,class:"dh-input",type:I.type==="password"?"password":I.type==="number"?"number":"text",placeholder:I.default||"",autocomplete:"off"},null,8,Hu)),[[qa,o[C.name][I.key]]]),I.help?(y(),T("p",Vu,m(I.help),1)):B("",!0)]))),128))])):(y(),T("p",Gu,m(h(f)("plugins.noConfig")),1)),(C.capabilities||[]).length?(y(),T("div",Ku,[u("div",Wu,m(h(f)("plugins.capabilities")),1),u("ul",qu,[(y(!0),T(ne,null,$e(C.capabilities,I=>(y(),T("li",{key:I.id},[u("span",Zu,m(I.id),1),I.method||I.endpoint?(y(),T("span",Ju," — "+m(I.method)+" "+m(I.endpoint),1)):B("",!0),I.description?(y(),T("span",Yu," · "+m(I.description),1)):B("",!0)]))),128))])])):B("",!0),r[C.name]?(y(),T("p",Xu,m(r[C.name]),1)):B("",!0),u("div",Qu,[u("button",{class:"dh-btn",disabled:n.value,onClick:I=>b(C,!0)},m(C.enabled?h(f)("plugins.save"):h(f)("plugins.saveEnable")),9,ed),C.enabled?(y(),T("button",{key:0,class:"dh-btn-ghost",disabled:n.value,onClick:I=>b(C,!1)},m(h(f)("plugins.disable")),9,td)):B("",!0),E[5]||(E[5]=u("span",{class:"flex-1"},null,-1)),C.kind==="external"?(y(),T("button",{key:1,class:"dh-btn-danger",disabled:n.value,onClick:I=>$(C)},m(h(f)("plugins.remove")),9,sd)):B("",!0)]),C.kind!=="external"?(y(),T("p",nd,m(h(f)("plugins.builtinNote")),1)):B("",!0)])):B("",!0)]))),128))]))}},od={class:"dh-card overflow-hidden"},rd={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},ad={class:"text-base font-bold tracking-[-0.02em] text-strong"},ld={class:"mt-0.5 text-xs text-muted"},cd={key:0,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},ud={key:1,class:"border-b border-subtle bg-sunken px-5 py-4"},dd={class:"grid gap-3 sm:grid-cols-2"},pd={class:"dh-label"},fd={class:"dh-label"},hd={class:"dh-label"},gd=["placeholder"],md={class:"dh-label"},bd=["value"],vd={key:0},yd={class:"dh-label"},_d={value:""},wd=["value"],xd={class:"mt-3 flex items-center gap-2"},kd=["disabled"],Sd=["disabled"],Td={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Ed={key:3,class:"w-full text-left text-sm"},Pd={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},Cd={class:"data px-5 py-2.5 text-xs text-strong"},Ad={key:0,class:"eyebrow ml-1"},$d={class:"px-5 py-2.5 text-body"},Od={class:"px-5 py-2.5 text-body"},Rd={class:"px-5 py-2.5"},zd={class:"px-5 py-2.5 text-right whitespace-nowrap"},Dd=["onClick"],Id=["disabled","onClick"],jd={__name:"UsersCard",setup(e){const t=H([]),s=H([]),n=H(""),i=H(!1),o=H(null),r=H({}),a=je(()=>Ce.value?["user","admin","superadmin"]:["user","admin"]);async function l(){try{const[k,O]=await Promise.all([te("/api/users"),te("/api/orgs")]);t.value=k.users||[],s.value=O.organizations||[],n.value=""}catch(k){n.value=k.message}}ct(l);function g(){var k;o.value="new",r.value={email:"",name:"",password:"",role:"user",organization:Ce.value?"":((k=de.value)==null?void 0:k.organization)||""}}function d(k){o.value=k.id,r.value={email:k.email,name:k.name||"",password:"",role:k.role,organization:k.organization||""}}function b(){o.value=null,n.value=""}async function P(){i.value=!0,n.value="";try{if(o.value==="new")await te("/api/users",{method:"POST",body:r.value});else{const k={...r.value};k.password||delete k.password,await te(`/api/users/${o.value}`,{method:"PATCH",body:k})}o.value=null,await l()}catch(k){n.value=k.message}finally{i.value=!1}}async function $(k){if(confirm(f("users.confirmDelete",{email:k.email}))){i.value=!0,n.value="";try{await te(`/api/users/${k.id}`,{method:"DELETE"}),await l()}catch(O){n.value=O.message}finally{i.value=!1}}}const F=k=>k==="superadmin"?"bg-info-soft text-info":k==="admin"?"bg-warning-soft text-warning":"bg-sunken text-muted";return(k,O)=>(y(),T("div",od,[u("div",rd,[u("div",null,[u("div",ad,m(h(f)("users.title")),1),u("p",ld,m(h(Ce)?h(f)("users.allOrgs"):h(f)("users.yourOrg")),1)]),u("button",{class:"dh-btn",onClick:g},m(h(f)("users.newUser")),1)]),n.value?(y(),T("p",cd,m(n.value),1)):B("",!0),o.value?(y(),T("div",ud,[u("div",dd,[u("div",null,[u("label",pd,m(h(f)("common.email")),1),le(u("input",{"onUpdate:modelValue":O[0]||(O[0]=E=>r.value.email=E),class:"dh-input",type:"email",autocomplete:"off"},null,512),[[ge,r.value.email]])]),u("div",null,[u("label",fd,m(h(f)("common.name")),1),le(u("input",{"onUpdate:modelValue":O[1]||(O[1]=E=>r.value.name=E),class:"dh-input",autocomplete:"off"},null,512),[[ge,r.value.name]])]),u("div",null,[u("label",hd,m(o.value==="new"?h(f)("users.password"):h(f)("users.passwordUnchanged")),1),le(u("input",{"onUpdate:modelValue":O[2]||(O[2]=E=>r.value.password=E),class:"dh-input",type:"password",autocomplete:"new-password",placeholder:h(f)("users.passwordPlaceholder")},null,8,gd),[[ge,r.value.password]])]),u("div",null,[u("label",md,m(h(f)("common.role")),1),le(u("select",{"onUpdate:modelValue":O[3]||(O[3]=E=>r.value.role=E),class:"dh-select"},[(y(!0),T(ne,null,$e(a.value,E=>(y(),T("option",{key:E,value:E},m(E),9,bd))),128))],512),[[ks,r.value.role]])]),h(Ce)?(y(),T("div",vd,[u("label",yd,m(h(f)("common.organization")),1),le(u("select",{"onUpdate:modelValue":O[4]||(O[4]=E=>r.value.organization=E),class:"dh-select"},[u("option",_d,m(h(f)("users.orgNone")),1),(y(!0),T(ne,null,$e(s.value,E=>(y(),T("option",{key:E.id,value:E.id},m(E.name),9,wd))),128))],512),[[ks,r.value.organization]])])):B("",!0)]),u("div",xd,[u("button",{class:"dh-btn",disabled:i.value,onClick:P},m(o.value==="new"?h(f)("common.create"):h(f)("common.save")),9,kd),u("button",{class:"dh-btn-ghost",disabled:i.value,onClick:b},m(h(f)("common.cancel")),9,Sd)])])):B("",!0),t.value.length?(y(),T("table",Ed,[u("thead",null,[u("tr",Pd,[u("th",null,m(h(f)("common.email")),1),u("th",null,m(h(f)("common.name")),1),u("th",null,m(h(f)("common.organization")),1),u("th",null,m(h(f)("common.role")),1),O[5]||(O[5]=u("th",null,null,-1))])]),u("tbody",null,[(y(!0),T(ne,null,$e(t.value,E=>{var C,I;return y(),T("tr",{key:E.id,class:"border-t border-subtle transition-colors hover:bg-sunken"},[u("td",Cd,[Re(m(E.email)+" ",1),E.id===((C=h(de))==null?void 0:C.id)?(y(),T("span",Ad,m(h(f)("users.you")),1)):B("",!0)]),u("td",$d,m(E.name||h(f)("common.empty")),1),u("td",Od,m(E.organizationName||h(f)("common.empty")),1),u("td",Rd,[u("span",{class:Ue(["dh-pill",F(E.role)])},m(E.role),3)]),u("td",zd,[u("button",{class:"dh-btn-ghost",onClick:j=>d(E)},m(h(f)("common.edit")),9,Dd),E.id!==((I=h(de))==null?void 0:I.id)?(y(),T("button",{key:0,class:"dh-btn-danger ml-1.5",disabled:i.value,onClick:j=>$(E)},m(h(f)("common.delete")),9,Id)):B("",!0)])])}),128))])])):(y(),T("p",Td,m(h(f)("users.empty")),1))]))}},Ud={class:"dh-card overflow-hidden"},Nd={class:"flex items-center justify-between border-b border-subtle px-5 py-4"},Md={class:"text-base font-bold tracking-[-0.02em] text-strong"},Ld={class:"mt-0.5 text-xs text-muted"},Fd={key:0,class:"border-b border-subtle px-5 py-3 text-xs text-danger"},Bd={key:1,class:"border-b border-subtle bg-sunken px-5 py-4"},Hd={class:"dh-label"},Vd=["placeholder"],Gd={class:"mt-3 flex items-center gap-2"},Kd=["disabled"],Wd=["disabled"],qd={key:2,class:"px-5 py-6 text-center text-sm text-muted"},Zd={key:3,class:"w-full text-left text-sm"},Jd={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},Yd={class:"px-5 py-2.5 font-medium text-strong"},Xd={class:"data px-5 py-2.5 text-xs text-muted"},Qd={class:"px-5 py-2.5 text-right whitespace-nowrap"},ep=["onClick"],tp=["disabled","onClick"],sp={__name:"OrgsCard",setup(e){const t=H([]),s=H(""),n=H(!1),i=H(null),o=H(""),r=je(()=>{var k;return((k=de.value)==null?void 0:k.organization)||""}),a=je(()=>Ce.value||!r.value);function l(k){return Ce.value||k.id===r.value}async function g(){if(!gs.value){t.value=[];return}try{const k=await te("/api/orgs");t.value=k.organizations||[],s.value=""}catch(k){s.value=k.message}}ct(g);function d(){i.value="new",o.value=""}function b(k){i.value=k.id,o.value=k.name}function P(){i.value=null,s.value=""}async function $(){n.value=!0,s.value="";try{i.value==="new"?(await te("/api/orgs",{method:"POST",body:{name:o.value}}),Ce.value||await Ss()):await te(`/api/orgs/${i.value}`,{method:"PATCH",body:{name:o.value}}),i.value=null,await g()}catch(k){s.value=k.message}finally{n.value=!1}}async function F(k){const O=!Ce.value&&k.id===r.value;if(confirm(f(O?"orgs.confirmDeleteOwn":"orgs.confirmDelete",{name:k.name}))){n.value=!0,s.value="";try{await te(`/api/orgs/${k.id}`,{method:"DELETE"}),O&&await Ss(),await g()}catch(C){s.value=C.message}finally{n.value=!1}}}return(k,O)=>(y(),T("div",Ud,[u("div",Nd,[u("div",null,[u("div",Md,m(h(Ce)?h(f)("orgs.title"):h(f)("common.organization")),1),u("p",Ld,m(h(Ce)?h(f)("orgs.subtitle"):r.value?h(f)("orgs.subtitleOwn"):h(f)("orgs.subtitleNone")),1)]),a.value?(y(),T("button",{key:0,class:"dh-btn",onClick:d},m(h(f)("orgs.newOrg")),1)):B("",!0)]),s.value?(y(),T("p",Fd,m(s.value),1)):B("",!0),i.value?(y(),T("div",Bd,[u("label",Hd,m(h(f)("common.name")),1),le(u("input",{"onUpdate:modelValue":O[0]||(O[0]=E=>o.value=E),class:"dh-input",placeholder:h(f)("orgs.namePlaceholder"),onKeyup:xo($,["enter"])},null,40,Vd),[[ge,o.value]]),u("div",Gd,[u("button",{class:"dh-btn",disabled:n.value||!o.value.trim(),onClick:$},m(i.value==="new"?h(f)("common.create"):h(f)("common.save")),9,Kd),u("button",{class:"dh-btn-ghost",disabled:n.value,onClick:P},m(h(f)("common.cancel")),9,Wd)])])):B("",!0),t.value.length?(y(),T("table",Zd,[u("thead",null,[u("tr",Jd,[u("th",null,m(h(f)("common.name")),1),u("th",null,m(h(f)("orgs.colId")),1),O[1]||(O[1]=u("th",null,null,-1))])]),u("tbody",null,[(y(!0),T(ne,null,$e(t.value,E=>(y(),T("tr",{key:E.id,class:"border-t border-subtle transition-colors hover:bg-sunken"},[u("td",Yd,m(E.name),1),u("td",Xd,m(E.id),1),u("td",Qd,[l(E)?(y(),T(ne,{key:0},[u("button",{class:"dh-btn-ghost",onClick:C=>b(E)},m(h(f)("common.rename")),9,ep),u("button",{class:"dh-btn-danger ml-1.5",disabled:n.value,onClick:C=>F(E)},m(h(f)("common.delete")),9,tp)],64)):B("",!0)])]))),128))])])):(y(),T("p",qd,m(a.value&&!h(Ce)?h(f)("orgs.createHint"):h(f)("orgs.empty")),1))]))}},np={class:"dh-card overflow-hidden"},ip={class:"border-b border-subtle px-5 py-4"},op={class:"flex items-center justify-between"},rp={class:"text-base font-bold tracking-[-0.02em] text-strong"},ap={class:"eyebrow"},lp={key:0,class:"mt-1.5 text-xs text-muted"},cp={class:"overflow-x-auto"},up={class:"w-full text-left text-sm"},dp={class:"[&>th]:eyebrow [&>th]:px-5 [&>th]:py-2.5 [&>th]:font-medium"},pp={class:"data border-t border-subtle px-5 py-2.5 text-xs whitespace-nowrap"},fp={class:"text-strong"},hp={class:"border-t border-subtle px-5 py-2.5 text-body"},ue={__name:"EndpointTable",props:{title:String,auth:String,endpoints:Array,note:String},setup(e){const t={GET:"text-success",POST:"text-brandtext",PUT:"text-info",PATCH:"text-warning",DELETE:"text-danger"};return(s,n)=>(y(),T("div",np,[u("div",ip,[u("div",op,[u("div",rp,m(e.title),1),u("span",ap,m(e.auth),1)]),e.note?(y(),T("p",lp,m(e.note),1)):B("",!0)]),u("div",cp,[u("table",up,[u("thead",null,[u("tr",dp,[u("th",null,m(h(f)("api.colEndpoint")),1),u("th",null,m(h(f)("api.colDescription")),1)])]),u("tbody",null,[(y(!0),T(ne,null,$e(e.endpoints,i=>(y(),T("tr",{key:i.method+i.path,class:"transition-colors hover:bg-sunken"},[u("td",pp,[u("span",{class:Ue(["font-semibold",t[i.method]])},m(i.method),3),u("span",fp,m(i.path),1)]),u("td",hp,m(i.desc),1)]))),128))])])])]))}},gp={class:"mx-auto flex max-w-4xl flex-col gap-6 px-6 pt-12 pb-16"},mp={class:"flex items-center gap-3"},bp={class:"inline-flex items-center gap-2.5 select-none"},vp={class:"h-8 w-8 shrink-0",viewBox:"0 0 48 48",fill:"none","aria-hidden":"true"},yp={transform:"translate(7 0) skewX(-13)"},_p=["fill"],wp=["fill"],xp=["fill"],kp={class:"eyebrow mt-1.5"},Sp={key:0,class:"data hidden text-xs text-muted sm:inline"},Tp={key:0},Ep={key:1,class:"dh-pill bg-info-soft text-info"},Pp=["value","aria-label"],Cp=["value"],Ap=["title"],$p={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.75",class:"h-4 w-4"},Op={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.75",class:"h-4 w-4"},Rp={key:0,class:"eyebrow py-16 text-center"},zp={class:"flex flex-wrap gap-1.5"},Dp=["onClick"],Ip={key:8,class:"eyebrow text-center"},jp={class:"eyebrow text-center"},Up="{records} is any of service-records, technical-checks, maintenance, fuel-entries, charging-sessions, car-documents, parts.",Np={__name:"App",setup(e){const t=H(!0),s=H("overview");ct(async()=>{await ec(),t.value=!1});const n=je(()=>{const pe=[{id:"overview",label:f("sections.overview")}];return gs.value&&pe.push({id:"users",label:f("sections.users")}),(gs.value||de.value)&&pe.push({id:"orgs",label:f("sections.orgs")}),Ce.value&&pe.push({id:"server",label:f("sections.server")},{id:"pocketbase",label:f("sections.pocketbase")},{id:"webapp",label:f("sections.webapp")},{id:"plugins",label:f("sections.plugins")}),pe.push({id:"api",label:f("sections.api")}),pe}),i=je(()=>Gl.map(pe=>{let se=pe;try{se=new Intl.DisplayNames([pe],{type:"language"}).of(pe)||pe}catch{}return{code:pe,label:se.charAt(0).toUpperCase()+se.slice(1)}}));function o(){Pn(),s.value="overview"}const r=je(()=>Ct.value==="dark"?["#60a5fa","#93c5fd","#ffffff"]:["var(--brand-700)","var(--brand-500)","var(--brand-400)"]),a=[{method:"GET",path:"/api/health",desc:"Liveness probe (no auth)"},{method:"GET",path:"/healthz",desc:"The same probe under the conventional container path"},{method:"GET",path:"/api/status",desc:"Health of PocketBase + Web App"},{method:"POST",path:"/api/auth/login",desc:"Exchange email + password for a PocketBase token"},{method:"GET",path:"/api/auth/validate",desc:"Check whether a token is still valid"}],l=[{method:"GET",path:"/api/auth/me",desc:"Identity of the bearer token"},{method:"GET",path:"/api/identity",desc:"Identity incl. role + organization"}],g=[{method:"GET",path:"/api/cars",desc:"List owned + shared cars"},{method:"POST",path:"/api/cars",desc:"Create a car"},{method:"GET",path:"/api/cars/{id}",desc:"Fetch one car"},{method:"PATCH",path:"/api/cars/{id}",desc:"Update a car"},{method:"PUT",path:"/api/cars/{id}/view",desc:"Save the car's layout — hidden tabs/fields and their order"},{method:"DELETE",path:"/api/cars/{id}",desc:"Delete a car (owner only)"},{method:"GET",path:"/api/cars/{id}/service-records",desc:"A car's service history"},{method:"GET",path:"/api/cars/{id}/technical-checks",desc:"A car's roadworthiness inspections"},{method:"GET",path:"/api/cars/{id}/parts",desc:"A car's parts catalog"},{method:"GET",path:"/api/cars/{id}/fuel-entries",desc:"A car's refuelings"},{method:"GET",path:"/api/cars/{id}/fuel-stats",desc:"Consumption + cost totals from the fuel log"},{method:"GET",path:"/api/cars/{id}/charging-sessions",desc:"A car's charging sessions"},{method:"GET",path:"/api/cars/{id}/charging-stats",desc:"Energy + cost totals from the charging log"},{method:"GET",path:"/api/cars/{id}/maintenance",desc:"A car's maintenance log"},{method:"GET",path:"/api/cars/{id}/documents",desc:"A car's documents"},{method:"GET",path:"/api/cars/{id}/reminders",desc:"A car's reminders"},{method:"GET",path:"/api/cars/{id}/provider",desc:"Live snapshot from the car's connected service"},{method:"POST",path:"/api/cars/{id}/provider",desc:"Link the car to a provider vehicle (an empty provider unlinks)"},{method:"POST",path:"/api/cars/{id}/provider/sync",desc:"Re-apply the provider's data to the car"},{method:"GET",path:"/api/cars/{id}/shares",desc:"Who a car is shared with (owner)"},{method:"POST",path:"/api/cars/{id}/shares",desc:"Share a car by email (owner)"},{method:"DELETE",path:"/api/cars/{id}/shares/{userId}",desc:"Revoke a share (owner)"}],d=[{method:"GET",path:"/api/service-records",desc:"List one car's service records (?car={id})"},{method:"POST",path:"/api/service-records",desc:"Log a service record"},{method:"GET",path:"/api/service-records/{id}",desc:"Fetch one record"},{method:"PATCH",path:"/api/service-records/{id}",desc:"Update a record"},{method:"DELETE",path:"/api/service-records/{id}",desc:"Delete a record"}],b=[{method:"GET",path:"/api/technical-checks",desc:"List one car's inspections (?car={id})"},{method:"POST",path:"/api/technical-checks",desc:"Log an inspection"},{method:"GET",path:"/api/technical-checks/{id}",desc:"Fetch one inspection"},{method:"PATCH",path:"/api/technical-checks/{id}",desc:"Update an inspection"},{method:"DELETE",path:"/api/technical-checks/{id}",desc:"Delete an inspection"}],P=[{method:"GET",path:"/api/parts",desc:"List one car's parts (?car={id})"},{method:"POST",path:"/api/parts",desc:"Add a part"},{method:"GET",path:"/api/parts/{id}",desc:"Fetch one part"},{method:"PATCH",path:"/api/parts/{id}",desc:"Update a part"},{method:"DELETE",path:"/api/parts/{id}",desc:"Delete a part"}],$=[{method:"GET",path:"/api/fuel-entries",desc:"List one car's refuelings (?car={id})"},{method:"POST",path:"/api/fuel-entries",desc:"Log a refueling"},{method:"GET",path:"/api/fuel-entries/{id}",desc:"Fetch one refueling"},{method:"PATCH",path:"/api/fuel-entries/{id}",desc:"Update a refueling"},{method:"DELETE",path:"/api/fuel-entries/{id}",desc:"Delete a refueling"}],F=[{method:"GET",path:"/api/charging-sessions",desc:"List one car's charging sessions (?car={id})"},{method:"POST",path:"/api/charging-sessions",desc:"Log a charging session"},{method:"GET",path:"/api/charging-sessions/{id}",desc:"Fetch one session"},{method:"PATCH",path:"/api/charging-sessions/{id}",desc:"Update a session"},{method:"DELETE",path:"/api/charging-sessions/{id}",desc:"Delete a session"}],k=[{method:"GET",path:"/api/maintenance",desc:"List one car's maintenance jobs (?car={id})"},{method:"POST",path:"/api/maintenance",desc:"Log a maintenance job"},{method:"GET",path:"/api/maintenance/{id}",desc:"Fetch one job"},{method:"PATCH",path:"/api/maintenance/{id}",desc:"Update a job"},{method:"DELETE",path:"/api/maintenance/{id}",desc:"Delete a job"}],O=[{method:"GET",path:"/api/car-documents",desc:"List one car's documents (?car={id})"},{method:"POST",path:"/api/car-documents",desc:"Add a document"},{method:"GET",path:"/api/car-documents/{id}",desc:"Fetch one document"},{method:"PATCH",path:"/api/car-documents/{id}",desc:"Update a document"},{method:"DELETE",path:"/api/car-documents/{id}",desc:"Delete a document"}],E=[{method:"GET",path:"/api/reminders",desc:"List one car's reminders (?car={id})"},{method:"POST",path:"/api/reminders",desc:"Create a reminder"},{method:"GET",path:"/api/reminders/{id}",desc:"Fetch one reminder"},{method:"PATCH",path:"/api/reminders/{id}",desc:"Update a reminder"},{method:"DELETE",path:"/api/reminders/{id}",desc:"Delete a reminder"},{method:"POST",path:"/api/reminders/{id}/complete",desc:"Mark done — a recurring reminder rolls forward from now"}],C=[{method:"POST",path:"/api/{records}/{id}/file",desc:"Attach a file, replacing any previous one (PDF or image, max 10 MB)"},{method:"GET",path:"/api/{records}/{id}/file",desc:"Download the attachment (car access re-checked on every request)"},{method:"DELETE",path:"/api/{records}/{id}/file",desc:"Detach and delete the file"}],I=[{method:"GET",path:"/api/vehicle-providers",desc:"Registered providers and whether the caller can use each one"},{method:"GET",path:"/api/vehicle-providers/{provider}/vehicles",desc:"Vehicles on the caller's provider account, as importable cars"},{method:"POST",path:"/api/vehicle-providers/{provider}/import",desc:"Create a car from a provider vehicle (409 if already imported)"}],j=[{method:"GET",path:"/api/integrations/toyota",desc:"Resolved Toyota Connected settings (secrets masked)"},{method:"PUT",path:"/api/integrations/toyota",desc:"Save the caller's own layer (user or org scope)"},{method:"POST",path:"/api/integrations/toyota/health",desc:"Live probe with the resolved credentials"},{method:"GET",path:"/api/integrations/toyota/vehicles",desc:"Raw MyToyota vehicle payload"},{method:"GET",path:"/api/integrations/anker-solix",desc:"Resolved Anker Solix settings (secrets masked)"},{method:"PUT",path:"/api/integrations/anker-solix",desc:"Save the caller's own layer (user or org scope)"},{method:"POST",path:"/api/integrations/anker-solix/health",desc:"Live probe with the resolved credentials"},{method:"GET",path:"/api/integrations/anker-solix/chargers",desc:"EV chargers on the linked Anker account"},{method:"GET",path:"/api/integrations/anker-solix/chargers/{sn}/control",desc:"Control mode, token state and live CSMS session for one charger"},{method:"POST",path:"/api/integrations/anker-solix/chargers/{sn}/control/token",desc:"(Re)issue the charger's control token"},{method:"DELETE",path:"/api/integrations/anker-solix/chargers/{sn}/control/token",desc:"Revoke the control token"},{method:"POST",path:"/api/integrations/anker-solix/chargers/{sn}/{action}",desc:"One OCPP command: start, stop, limit, clear-limit, availability, reset, unlock, trigger, config"}],re=[{method:"GET",path:"/ocpp/{serial}",desc:"WebSocket the charger dials out to; OCPP Basic auth with the serial + its control token"}],Ee=[{method:"GET",path:"/api/me",desc:"Current user profile"},{method:"PATCH",path:"/api/me",desc:"Update profile"},{method:"POST",path:"/api/me/password",desc:"Change password"},{method:"POST",path:"/api/me/avatar",desc:"Upload avatar"},{method:"GET",path:"/api/me/avatar",desc:"Fetch avatar"},{method:"DELETE",path:"/api/me/avatar",desc:"Remove avatar"},{method:"POST",path:"/api/me/verify/request",desc:"Request email verification"},{method:"GET",path:"/api/me/export",desc:"Export your data"},{method:"POST",path:"/api/me/import",desc:"Import data"},{method:"POST",path:"/api/me/delete",desc:"Request account deletion"},{method:"POST",path:"/api/me/delete/cancel",desc:"Cancel deletion request"},{method:"DELETE",path:"/api/me",desc:"Finalize account deletion"}],Pe=[{method:"GET",path:"/api/users",desc:"List users (scoped by role)"},{method:"POST",path:"/api/users",desc:"Create a user"},{method:"PATCH",path:"/api/users/{id}",desc:"Update email / name / role / org / password"},{method:"DELETE",path:"/api/users/{id}",desc:"Delete a user"},{method:"GET",path:"/api/orgs",desc:"List organizations"},{method:"POST",path:"/api/orgs",desc:"Create an organization (any user without one; creator becomes admin)"},{method:"PATCH",path:"/api/orgs/{id}",desc:"Rename an organization (own org; any as superadmin)"},{method:"DELETE",path:"/api/orgs/{id}",desc:"Delete an organization (own org; any as superadmin)"}],Le=[{method:"GET",path:"/api/admin/pb-config",desc:"PocketBase connection + live probe"},{method:"POST",path:"/api/admin/pb-config/test",desc:"Probe a candidate connection"},{method:"PUT",path:"/api/admin/pb-config",desc:"Apply + persist a connection"},{method:"GET",path:"/api/admin/server-config",desc:"This server's display name"},{method:"PUT",path:"/api/admin/server-config",desc:"Rename this server (applied + persisted)"},{method:"GET",path:"/api/admin/webapp-config",desc:"Web App URL + CORS origins, with a live probe"},{method:"POST",path:"/api/admin/webapp-config/test",desc:"Probe a candidate Web App address"},{method:"PUT",path:"/api/admin/webapp-config",desc:"Apply + persist Web App settings"},{method:"GET",path:"/api/admin/plugins",desc:"List plugins (secrets masked)"},{method:"POST",path:"/api/admin/plugins",desc:"Register an external plugin"},{method:"GET",path:"/api/admin/plugins/{name}",desc:"Fetch one plugin"},{method:"PUT",path:"/api/admin/plugins/{name}",desc:"Enable/disable + configure"},{method:"DELETE",path:"/api/admin/plugins/{name}",desc:"Remove an external plugin"},{method:"POST",path:"/api/admin/plugins/{name}/health",desc:"Run a health check now"}];return(pe,se)=>(y(),T("div",gp,[u("div",mp,[u("span",bp,[(y(),T("svg",vp,[u("g",yp,[u("rect",{x:"9",y:"16",width:"6",height:"16",rx:"3",fill:r.value[0]},null,8,_p),u("rect",{x:"19",y:"12",width:"6",height:"24",rx:"3",fill:r.value[1]},null,8,wp),u("rect",{x:"29",y:"8",width:"6",height:"32",rx:"3",fill:r.value[2]},null,8,xp)])])),se[2]||(se[2]=u("span",{class:"text-2xl leading-none font-extrabold tracking-[-0.03em] italic"},[u("span",{class:"text-strong"},"Driver"),u("span",{class:"text-brandtext"},"Vault")],-1))]),u("span",kp,m(h(f)("app.apiServer")),1),se[5]||(se[5]=u("div",{class:"flex-1"},null,-1)),h(de)?(y(),T("span",Sp,[Re(m(h(de).email),1),h(de).organizationName?(y(),T("span",Tp," · "+m(h(de).organizationName),1)):B("",!0)])):B("",!0),h(de)?(y(),T("span",Ep,m(h(de).role),1)):B("",!0),u("select",{class:"dh-select !w-auto !py-1 !text-xs",value:h(En),"aria-label":h(f)("sections.overview"),onChange:se[0]||(se[0]=ce=>h(Wl)(ce.target.value))},[(y(!0),T(ne,null,$e(i.value,ce=>(y(),T("option",{key:ce.code,value:ce.code},m(ce.label),9,Cp))),128))],40,Pp),u("button",{class:"dh-btn-ghost",title:h(Ct)==="dark"?h(f)("app.switchToLight"):h(f)("app.switchToDark"),onClick:se[1]||(se[1]=(...ce)=>h(fi)&&h(fi)(...ce))},[h(Ct)==="dark"?(y(),T("svg",$p,[...se[3]||(se[3]=[u("circle",{cx:"12",cy:"12",r:"4"},null,-1),u("path",{"stroke-linecap":"round",d:"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"},null,-1)])])):(y(),T("svg",Op,[...se[4]||(se[4]=[u("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"},null,-1)])])),Re(" "+m(h(f)("app.theme")),1)],8,Ap),h(zt)?(y(),T("button",{key:2,class:"dh-btn-ghost",onClick:o},m(h(f)("app.signOut")),1)):B("",!0)]),t.value?(y(),T("p",Rp,m(h(f)("app.loading")),1)):h(zt)?(y(),T(ne,{key:2},[u("nav",zp,[(y(!0),T(ne,null,$e(n.value,ce=>(y(),T("button",{key:ce.id,class:Ue(["dh-btn-ghost",s.value===ce.id?"border-accent text-brandtext":""]),onClick:It=>s.value=ce.id},m(ce.label),11,Dp))),128))]),s.value==="overview"?(y(),tt(xc,{key:0})):s.value==="users"?(y(),tt(jd,{key:1})):s.value==="orgs"?(y(),tt(sp,{key:2})):s.value==="server"?(y(),tt(Qc,{key:3})):s.value==="pocketbase"?(y(),tt(Lc,{key:4})):s.value==="webapp"?(y(),tt(gu,{key:5})):s.value==="plugins"?(y(),tt(id,{key:6})):s.value==="api"?(y(),T(ne,{key:7},[Y(ue,{title:h(f)("api.groupPublic"),auth:h(f)("api.authNone"),endpoints:a},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupIdentity"),auth:h(f)("api.authBearer"),endpoints:l},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupCars"),auth:h(f)("api.authBearer"),endpoints:g},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupService"),auth:h(f)("api.authBearer"),endpoints:d},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupTechnical"),auth:h(f)("api.authBearer"),endpoints:b},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupParts"),auth:h(f)("api.authBearer"),endpoints:P},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupFuel"),auth:h(f)("api.authBearer"),endpoints:$},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupCharging"),auth:h(f)("api.authBearer"),endpoints:F},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupMaintenance"),auth:h(f)("api.authBearer"),endpoints:k},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupDocuments"),auth:h(f)("api.authBearer"),endpoints:O},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupReminders"),auth:h(f)("api.authBearer"),endpoints:E},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupAttachments"),auth:h(f)("api.authBearer"),endpoints:C,note:Up},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupProviders"),auth:h(f)("api.authBearer"),endpoints:I},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupIntegrations"),auth:h(f)("api.authBearer"),endpoints:j},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupOcpp"),auth:h(f)("api.authCharger"),endpoints:re},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupAccount"),auth:h(f)("api.authBearer"),endpoints:Ee},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupManagement"),auth:h(f)("api.authManager"),endpoints:Pe},null,8,["title","auth"]),Y(ue,{title:h(f)("api.groupSuperadmin"),auth:h(f)("api.authSuperadmin"),endpoints:Le},null,8,["title","auth"])],64)):B("",!0),!h(gs)&&s.value==="overview"?(y(),T("p",Ip,m(h(f)("app.standardUserNote")),1)):B("",!0)],64)):(y(),tt(uc,{key:1})),u("p",jp,m(h(f)("app.footer")),1)]))}};sl(Np).mount("#app"); diff --git a/API Server/internal/api/dist/assets/index-D3MeNcl7.css b/API Server/internal/api/dist/assets/index-D3MeNcl7.css deleted file mode 100644 index f540d3d..0000000 --- a/API Server/internal/api/dist/assets/index-D3MeNcl7.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--spacing:.25rem;--container-sm:24rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius-control:12px;--radius-card:18px;--radius-pill:999px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.\!w-auto{width:auto!important}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-sm{max-width:var(--container-sm)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.overflow-hidden{overflow:hidden}.rounded-control{border-radius:12px}.rounded-full{border-radius:3.40282e38px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-accent{border-color:var(--accent)}.border-subtle{border-color:var(--border-subtle)}.bg-current{background-color:currentColor}.bg-danger-soft{background-color:var(--danger-100)}.bg-info-soft{background-color:var(--info-100)}.bg-success-soft{background-color:var(--success-100)}.bg-sunken{background-color:var(--surface-sunken)}.bg-warning-soft{background-color:var(--warning-100)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.\!py-1{padding-block:var(--spacing)!important}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.\!text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.03em\]{--tw-tracking:-.03em;letter-spacing:-.03em}.whitespace-nowrap{white-space:nowrap}.text-body{color:var(--text-body)}.text-brandtext{color:var(--text-brand)}.text-danger{color:var(--danger-600)}.text-info{color:var(--info-600)}.text-muted{color:var(--text-muted)}.text-strong{color:var(--text-strong)}.text-success{color:var(--success-600)}.text-warning{color:var(--warning-600)}.italic{font-style:italic}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}@media(hover:hover){.hover\:bg-sunken:hover{background-color:var(--surface-sunken)}}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&\>th\]\:px-5>th{padding-inline:calc(var(--spacing) * 5)}.\[\&\>th\]\:py-2\.5>th{padding-block:calc(var(--spacing) * 2.5)}.\[\&\>th\]\:font-medium>th{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}}:root{color-scheme:light;--brand-900:#0b1730;--brand-800:#0f1e3d;--brand-700:#1e40af;--brand-600:#2563eb;--brand-500:#3b82f6;--brand-400:#60a5fa;--brand-300:#93c5fd;--brand-200:#c7dbfb;--brand-100:#e8f0fd;--ink-900:#0f1e3d;--ink-700:#28374f;--ink-600:#3e4e68;--ink-500:#5c6b85;--ink-400:#7a8aa6;--ink-300:#b4bece;--ink-200:#d6deea;--ink-100:#e4e9f2;--ink-50:#eef2f8;--ink-25:#f7f9fc;--white:#fff;--success-600:#1f8a5b;--success-100:#e1f3ea;--warning-600:#d9822b;--warning-100:#fbeddd;--danger-600:#dc2a45;--danger-100:#fbe3e7;--info-600:#2563eb;--info-100:#e8f0fd;--surface-page:var(--ink-25);--surface-card:var(--white);--surface-sunken:var(--ink-50);--border-subtle:var(--ink-100);--border-default:var(--ink-200);--border-strong:var(--ink-300);--text-strong:var(--ink-900);--text-body:var(--ink-600);--text-muted:var(--ink-400);--text-brand:var(--brand-700);--accent:var(--brand-600);--accent-hover:var(--brand-700);--focus-ring:var(--brand-400);--shadow-xs:0 1px 2px #0f1e3d0f;--shadow-sm:0 1px 2px #0f1e3d0a, 0 2px 6px #0f1e3d0f;--shadow-md:0 1px 2px #0f1e3d0a, 0 12px 30px -12px #0f1e3d24;--font-display:"Archivo", system-ui, sans-serif;--font-sans:"Archivo", system-ui, sans-serif;--font-mono:"DM Mono", ui-monospace, "SF Mono", monospace}html.dark{color-scheme:dark;--success-100:#12352a;--warning-100:#3a2a16;--danger-100:#3a1620;--info-100:#122a4d;--surface-page:#0b1730;--surface-card:#13233f;--surface-sunken:#0f1e38;--border-subtle:#21324f;--border-default:#2c3f5e;--border-strong:#3c5173;--text-strong:#f2f6fc;--text-body:#b7c4d9;--text-muted:#7c8ca8;--text-brand:#93c5fd;--accent:#3b82f6;--accent-hover:#60a5fa;--focus-ring:#60a5fa;--success-600:#35b27a;--warning-600:#e0a03a;--danger-600:#e85c74;--shadow-xs:0 1px 2px #0006;--shadow-sm:0 1px 2px #0006, 0 2px 6px #0006;--shadow-md:0 1px 2px #00000059, 0 12px 30px -12px #0000008c}html,body,#app{height:100%}body{font-family:var(--font-sans);background:var(--surface-page);color:var(--text-body);-webkit-font-smoothing:antialiased;margin:0}.eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.16em;color:var(--text-muted);font-size:11px}.data{font-family:var(--font-mono);letter-spacing:.02em;font-variant-numeric:tabular-nums}.dh-btn-ghost{border-radius:var(--radius-control);border:1px solid var(--border-default);background:var(--surface-card);height:34px;color:var(--text-strong);font-family:var(--font-sans);cursor:pointer;justify-content:center;align-items:center;gap:8px;padding:0 12px;font-size:.8125rem;font-weight:600;transition:background-color .14s,border-color .14s;display:inline-flex}.dh-btn-ghost:hover{background:var(--surface-sunken);border-color:var(--border-strong)}.dh-btn-ghost:focus-visible{box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-btn{border-radius:var(--radius-control);background:var(--accent);color:#fff;height:34px;font-family:var(--font-sans);cursor:pointer;border:1px solid #0000;justify-content:center;align-items:center;gap:8px;padding:0 14px;font-size:.8125rem;font-weight:600;transition:background-color .14s;display:inline-flex}.dh-btn:hover:not(:disabled){background:var(--accent-hover)}.dh-btn:focus-visible{box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-btn:disabled,.dh-btn-ghost:disabled,.dh-btn-danger:disabled{opacity:.55;cursor:not-allowed}.dh-btn-danger{border-radius:var(--radius-control);border:1px solid var(--border-default);height:30px;color:var(--danger-600);font-family:var(--font-sans);cursor:pointer;background:0 0;justify-content:center;align-items:center;gap:6px;padding:0 10px;font-size:.75rem;font-weight:600;transition:background-color .14s,border-color .14s;display:inline-flex}.dh-btn-danger:hover:not(:disabled){background:var(--danger-100);border-color:var(--danger-600)}.dh-input,.dh-select{border-radius:var(--radius-control);border:1px solid var(--border-default);background:var(--surface-card);width:100%;height:36px;color:var(--text-strong);font-family:var(--font-sans);padding:0 10px;font-size:.8125rem;transition:border-color .14s}.dh-input::placeholder{color:var(--text-muted)}.dh-input:focus,.dh-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring);outline:none}.dh-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.16em;color:var(--text-muted);margin-bottom:5px;font-size:10px;display:block}.dh-pill{border-radius:var(--radius-pill);font-family:var(--font-mono);white-space:nowrap;align-items:center;gap:6px;padding:3px 9px;font-size:11px;font-weight:500;display:inline-flex}.dh-card{border:1px solid var(--border-subtle);background:var(--surface-card);border-radius:var(--radius-card);box-shadow:var(--shadow-sm)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false} diff --git a/API Server/internal/api/dist/index.html b/API Server/internal/api/dist/index.html index bf49adb..d948352 100644 --- a/API Server/internal/api/dist/index.html +++ b/API Server/internal/api/dist/index.html @@ -6,8 +6,8 @@ DriverVault · API Server - - + +
diff --git a/API Server/panel/src/App.vue b/API Server/panel/src/App.vue index b5638f9..1e65731 100644 --- a/API Server/panel/src/App.vue +++ b/API Server/panel/src/App.vue @@ -78,6 +78,7 @@ const barFills = computed(() => // registered in internal/api/server.go. const publicApi = [ { method: "GET", path: "/api/health", desc: "Liveness probe (no auth)" }, + { method: "GET", path: "/healthz", desc: "The same probe under the conventional container path" }, { method: "GET", path: "/api/status", desc: "Health of PocketBase + Web App" }, { method: "POST", path: "/api/auth/login", desc: "Exchange email + password for a PocketBase token" }, { method: "GET", path: "/api/auth/validate", desc: "Check whether a token is still valid" }, @@ -93,30 +94,128 @@ const carsApi = [ { method: "POST", path: "/api/cars", desc: "Create a car" }, { method: "GET", path: "/api/cars/{id}", desc: "Fetch one car" }, { method: "PATCH", path: "/api/cars/{id}", desc: "Update a car" }, + { method: "PUT", path: "/api/cars/{id}/view", desc: "Save the car's layout — hidden tabs/fields and their order" }, { method: "DELETE", path: "/api/cars/{id}", desc: "Delete a car (owner only)" }, { method: "GET", path: "/api/cars/{id}/service-records", desc: "A car's service history" }, + { method: "GET", path: "/api/cars/{id}/technical-checks", desc: "A car's roadworthiness inspections" }, { method: "GET", path: "/api/cars/{id}/parts", desc: "A car's parts catalog" }, + { method: "GET", path: "/api/cars/{id}/fuel-entries", desc: "A car's refuelings" }, + { method: "GET", path: "/api/cars/{id}/fuel-stats", desc: "Consumption + cost totals from the fuel log" }, + { method: "GET", path: "/api/cars/{id}/charging-sessions", desc: "A car's charging sessions" }, + { method: "GET", path: "/api/cars/{id}/charging-stats", desc: "Energy + cost totals from the charging log" }, + { method: "GET", path: "/api/cars/{id}/maintenance", desc: "A car's maintenance log" }, + { method: "GET", path: "/api/cars/{id}/documents", desc: "A car's documents" }, + { method: "GET", path: "/api/cars/{id}/reminders", desc: "A car's reminders" }, + { method: "GET", path: "/api/cars/{id}/provider", desc: "Live snapshot from the car's connected service" }, + { method: "POST", path: "/api/cars/{id}/provider", desc: "Link the car to a provider vehicle (an empty provider unlinks)" }, + { method: "POST", path: "/api/cars/{id}/provider/sync", desc: "Re-apply the provider's data to the car" }, { method: "GET", path: "/api/cars/{id}/shares", desc: "Who a car is shared with (owner)" }, { method: "POST", path: "/api/cars/{id}/shares", desc: "Share a car by email (owner)" }, { method: "DELETE", path: "/api/cars/{id}/shares/{userId}", desc: "Revoke a share (owner)" }, ]; const serviceApi = [ - { method: "GET", path: "/api/service-records", desc: "List service records" }, + { method: "GET", path: "/api/service-records", desc: "List one car's service records (?car={id})" }, { method: "POST", path: "/api/service-records", desc: "Log a service record" }, { method: "GET", path: "/api/service-records/{id}", desc: "Fetch one record" }, { method: "PATCH", path: "/api/service-records/{id}", desc: "Update a record" }, { method: "DELETE", path: "/api/service-records/{id}", desc: "Delete a record" }, ]; +const technicalApi = [ + { method: "GET", path: "/api/technical-checks", desc: "List one car's inspections (?car={id})" }, + { method: "POST", path: "/api/technical-checks", desc: "Log an inspection" }, + { method: "GET", path: "/api/technical-checks/{id}", desc: "Fetch one inspection" }, + { method: "PATCH", path: "/api/technical-checks/{id}", desc: "Update an inspection" }, + { method: "DELETE", path: "/api/technical-checks/{id}", desc: "Delete an inspection" }, +]; + const partsApi = [ - { method: "GET", path: "/api/parts", desc: "List parts" }, + { method: "GET", path: "/api/parts", desc: "List one car's parts (?car={id})" }, { method: "POST", path: "/api/parts", desc: "Add a part" }, { method: "GET", path: "/api/parts/{id}", desc: "Fetch one part" }, { method: "PATCH", path: "/api/parts/{id}", desc: "Update a part" }, { method: "DELETE", path: "/api/parts/{id}", desc: "Delete a part" }, ]; +const fuelApi = [ + { method: "GET", path: "/api/fuel-entries", desc: "List one car's refuelings (?car={id})" }, + { method: "POST", path: "/api/fuel-entries", desc: "Log a refueling" }, + { method: "GET", path: "/api/fuel-entries/{id}", desc: "Fetch one refueling" }, + { method: "PATCH", path: "/api/fuel-entries/{id}", desc: "Update a refueling" }, + { method: "DELETE", path: "/api/fuel-entries/{id}", desc: "Delete a refueling" }, +]; + +const chargingApi = [ + { method: "GET", path: "/api/charging-sessions", desc: "List one car's charging sessions (?car={id})" }, + { method: "POST", path: "/api/charging-sessions", desc: "Log a charging session" }, + { method: "GET", path: "/api/charging-sessions/{id}", desc: "Fetch one session" }, + { method: "PATCH", path: "/api/charging-sessions/{id}", desc: "Update a session" }, + { method: "DELETE", path: "/api/charging-sessions/{id}", desc: "Delete a session" }, +]; + +const maintenanceApi = [ + { method: "GET", path: "/api/maintenance", desc: "List one car's maintenance jobs (?car={id})" }, + { method: "POST", path: "/api/maintenance", desc: "Log a maintenance job" }, + { method: "GET", path: "/api/maintenance/{id}", desc: "Fetch one job" }, + { method: "PATCH", path: "/api/maintenance/{id}", desc: "Update a job" }, + { method: "DELETE", path: "/api/maintenance/{id}", desc: "Delete a job" }, +]; + +const documentsApi = [ + { method: "GET", path: "/api/car-documents", desc: "List one car's documents (?car={id})" }, + { method: "POST", path: "/api/car-documents", desc: "Add a document" }, + { method: "GET", path: "/api/car-documents/{id}", desc: "Fetch one document" }, + { method: "PATCH", path: "/api/car-documents/{id}", desc: "Update a document" }, + { method: "DELETE", path: "/api/car-documents/{id}", desc: "Delete a document" }, +]; + +const remindersApi = [ + { method: "GET", path: "/api/reminders", desc: "List one car's reminders (?car={id})" }, + { method: "POST", path: "/api/reminders", desc: "Create a reminder" }, + { method: "GET", path: "/api/reminders/{id}", desc: "Fetch one reminder" }, + { method: "PATCH", path: "/api/reminders/{id}", desc: "Update a reminder" }, + { method: "DELETE", path: "/api/reminders/{id}", desc: "Delete a reminder" }, + { method: "POST", path: "/api/reminders/{id}/complete", desc: "Mark done — a recurring reminder rolls forward from now" }, +]; + +// One optional file per record, on identical terms for every collection that +// takes one, so the three routes are documented once with {records} standing +// for any of them (see the note under the table). +const attachmentsApi = [ + { method: "POST", path: "/api/{records}/{id}/file", desc: "Attach a file, replacing any previous one (PDF or image, max 10 MB)" }, + { method: "GET", path: "/api/{records}/{id}/file", desc: "Download the attachment (car access re-checked on every request)" }, + { method: "DELETE", path: "/api/{records}/{id}/file", desc: "Detach and delete the file" }, +]; + +const attachmentsNote = + "{records} is any of service-records, technical-checks, maintenance, fuel-entries, charging-sessions, car-documents, parts."; + +const providersApi = [ + { method: "GET", path: "/api/vehicle-providers", desc: "Registered providers and whether the caller can use each one" }, + { method: "GET", path: "/api/vehicle-providers/{provider}/vehicles", desc: "Vehicles on the caller's provider account, as importable cars" }, + { method: "POST", path: "/api/vehicle-providers/{provider}/import", desc: "Create a car from a provider vehicle (409 if already imported)" }, +]; + +const integrationsApi = [ + { method: "GET", path: "/api/integrations/toyota", desc: "Resolved Toyota Connected settings (secrets masked)" }, + { method: "PUT", path: "/api/integrations/toyota", desc: "Save the caller's own layer (user or org scope)" }, + { method: "POST", path: "/api/integrations/toyota/health", desc: "Live probe with the resolved credentials" }, + { method: "GET", path: "/api/integrations/toyota/vehicles", desc: "Raw MyToyota vehicle payload" }, + { method: "GET", path: "/api/integrations/anker-solix", desc: "Resolved Anker Solix settings (secrets masked)" }, + { method: "PUT", path: "/api/integrations/anker-solix", desc: "Save the caller's own layer (user or org scope)" }, + { method: "POST", path: "/api/integrations/anker-solix/health", desc: "Live probe with the resolved credentials" }, + { method: "GET", path: "/api/integrations/anker-solix/chargers", desc: "EV chargers on the linked Anker account" }, + { method: "GET", path: "/api/integrations/anker-solix/chargers/{sn}/control", desc: "Control mode, token state and live CSMS session for one charger" }, + { method: "POST", path: "/api/integrations/anker-solix/chargers/{sn}/control/token", desc: "(Re)issue the charger's control token" }, + { method: "DELETE", path: "/api/integrations/anker-solix/chargers/{sn}/control/token", desc: "Revoke the control token" }, + { method: "POST", path: "/api/integrations/anker-solix/chargers/{sn}/{action}", desc: "One OCPP command: start, stop, limit, clear-limit, availability, reset, unlock, trigger, config" }, +]; + +const ocppApi = [ + { method: "GET", path: "/ocpp/{serial}", desc: "WebSocket the charger dials out to; OCPP Basic auth with the serial + its control token" }, +]; + const accountApi = [ { method: "GET", path: "/api/me", desc: "Current user profile" }, { method: "PATCH", path: "/api/me", desc: "Update profile" }, @@ -159,6 +258,7 @@ const superadminApi = [ { method: "DELETE", path: "/api/admin/plugins/{name}", desc: "Remove an external plugin" }, { method: "POST", path: "/api/admin/plugins/{name}/health", desc: "Run a health check now" }, ]; +