@samyx/preview-stacks-ui 0.31.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/ActionButton.vue_vue_type_script_setup_true_lang-D8Xlp6c9.js +2 -0
- package/dist/assets/{ActionButton.vue_vue_type_script_setup_true_lang-C6PZurL0.js.map → ActionButton.vue_vue_type_script_setup_true_lang-D8Xlp6c9.js.map} +1 -1
- package/dist/assets/{AxesTab-BNAORqpJ.js → AxesTab-BWzsbFAx.js} +2 -2
- package/dist/assets/{AxesTab-BNAORqpJ.js.map → AxesTab-BWzsbFAx.js.map} +1 -1
- package/dist/assets/ConfigTab-ucr87rD6.js +2 -0
- package/dist/assets/{ConfigTab-8Ifz-gnA.js.map → ConfigTab-ucr87rD6.js.map} +1 -1
- package/dist/assets/{ConfigView-CPj8QeBo.js → ConfigView-BbRYGyvZ.js} +2 -2
- package/dist/assets/{ConfigView-CPj8QeBo.js.map → ConfigView-BbRYGyvZ.js.map} +1 -1
- package/dist/assets/ConflictNote.vue_vue_type_script_setup_true_lang-DDt6qe65.js +2 -0
- package/dist/assets/ConflictNote.vue_vue_type_script_setup_true_lang-DDt6qe65.js.map +1 -0
- package/dist/assets/DangerTab-BimKNJab.js +2 -0
- package/dist/assets/DangerTab-BimKNJab.js.map +1 -0
- package/dist/assets/DashboardView-DK0qDo-f.js +2 -0
- package/dist/assets/{DashboardView-CuDBbXnZ.js.map → DashboardView-DK0qDo-f.js.map} +1 -1
- package/dist/assets/DeploymentDetailView-BcImKApM.js +2 -0
- package/dist/assets/{DeploymentDetailView-qtlOQQ0z.js.map → DeploymentDetailView-BcImKApM.js.map} +1 -1
- package/dist/assets/DeploymentsView-Cx9BqQ8Q.js +2 -0
- package/dist/assets/DeploymentsView-Cx9BqQ8Q.js.map +1 -0
- package/dist/assets/DialogTrigger-nWkfUj3N.js +2 -0
- package/dist/assets/DialogTrigger-nWkfUj3N.js.map +1 -0
- package/dist/assets/{EquivalentCommand-DX5xFW-p.js → EquivalentCommand-D92xDU0_.js} +3 -3
- package/dist/assets/{EquivalentCommand-DX5xFW-p.js.map → EquivalentCommand-D92xDU0_.js.map} +1 -1
- package/dist/assets/{ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js → ErrorNote.vue_vue_type_script_setup_true_lang-DVbGiVTB.js} +2 -2
- package/dist/assets/{ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js.map → ErrorNote.vue_vue_type_script_setup_true_lang-DVbGiVTB.js.map} +1 -1
- package/dist/assets/HelpModal.vue_vue_type_script_setup_true_lang-CSOdBT2E.js +2 -0
- package/dist/assets/HelpModal.vue_vue_type_script_setup_true_lang-CSOdBT2E.js.map +1 -0
- package/dist/assets/JobDetailView-B1sXXVJ5.js +2 -0
- package/dist/assets/JobDetailView-B1sXXVJ5.js.map +1 -0
- package/dist/assets/JobsView-CC7lre3Q.css +1 -0
- package/dist/assets/JobsView-DjP5lXHk.js +2 -0
- package/dist/assets/JobsView-DjP5lXHk.js.map +1 -0
- package/dist/assets/LogViewer.vue_vue_type_script_setup_true_lang-Bhy_5cyC.js +3 -0
- package/dist/assets/{LogViewer.vue_vue_type_script_setup_true_lang-Sg8LzIyX.js.map → LogViewer.vue_vue_type_script_setup_true_lang-Bhy_5cyC.js.map} +1 -1
- package/dist/assets/{LoginView-Gpnnyg1m.js → LoginView-CIkI9Qm_.js} +2 -2
- package/dist/assets/{LoginView-Gpnnyg1m.js.map → LoginView-CIkI9Qm_.js.map} +1 -1
- package/dist/assets/LogsTab-D8zhR7Eb.js +6 -0
- package/dist/assets/{LogsTab-CZ0fNgsO.js.map → LogsTab-D8zhR7Eb.js.map} +1 -1
- package/dist/assets/{NotFoundView-BE2kvYuP.js → NotFoundView-aUtqh2Qi.js} +2 -2
- package/dist/assets/{NotFoundView-BE2kvYuP.js.map → NotFoundView-aUtqh2Qi.js.map} +1 -1
- package/dist/assets/NotifiersView-aRHInxVx.js +2 -0
- package/dist/assets/{NotifiersView-Df_CM6Bj.js.map → NotifiersView-aRHInxVx.js.map} +1 -1
- package/dist/assets/OverviewTab-ChCj5LAj.js +2 -0
- package/dist/assets/{OverviewTab-BSeic8dR.js.map → OverviewTab-ChCj5LAj.js.map} +1 -1
- package/dist/assets/PublicLogsView-DIWJH7qL.js +4 -0
- package/dist/assets/{PublicLogsView-BDyvxkgj.js.map → PublicLogsView-DIWJH7qL.js.map} +1 -1
- package/dist/assets/{RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js → RefreshButton.vue_vue_type_script_setup_true_lang-P7VwWcRa.js} +2 -2
- package/dist/assets/{RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js.map → RefreshButton.vue_vue_type_script_setup_true_lang-P7VwWcRa.js.map} +1 -1
- package/dist/assets/RegistriesView-D2aCsYIu.js +2 -0
- package/dist/assets/{RegistriesView-DMzsLFcT.js.map → RegistriesView-D2aCsYIu.js.map} +1 -1
- package/dist/assets/RelativeTime.vue_vue_type_script_setup_true_lang-NGvUfuKC.js +2 -0
- package/dist/assets/RelativeTime.vue_vue_type_script_setup_true_lang-NGvUfuKC.js.map +1 -0
- package/dist/assets/{RequiresTab-DkuxJsEj.js → RequiresTab-3BhU5BHd.js} +2 -2
- package/dist/assets/{RequiresTab-DkuxJsEj.js.map → RequiresTab-3BhU5BHd.js.map} +1 -1
- package/dist/assets/RouteTarget.vue_vue_type_script_setup_true_lang-Caee0wEB.js +2 -0
- package/dist/assets/RouteTarget.vue_vue_type_script_setup_true_lang-Caee0wEB.js.map +1 -0
- package/dist/assets/RoutingView-T9afX8_M.js +9 -0
- package/dist/assets/RoutingView-T9afX8_M.js.map +1 -0
- package/dist/assets/RoutingView-tn0RQdqM.css +0 -0
- package/dist/assets/RuntimeTab-Bh2gGuhj.js +2 -0
- package/dist/assets/RuntimeTab-Bh2gGuhj.js.map +1 -0
- package/dist/assets/RuntimeTab-By55qdsQ.css +1 -0
- package/dist/assets/SelectMenu.vue_vue_type_script_setup_true_lang-BtHqT6G1.js +2 -0
- package/dist/assets/{SelectMenu.vue_vue_type_script_setup_true_lang-DKYlHroe.js.map → SelectMenu.vue_vue_type_script_setup_true_lang-BtHqT6G1.js.map} +1 -1
- package/dist/assets/{SettingsView-CgwOmLat.js → SettingsView-DIKjdBdy.js} +2 -2
- package/dist/assets/{SettingsView-CgwOmLat.js.map → SettingsView-DIKjdBdy.js.map} +1 -1
- package/dist/assets/{SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js → SkeletonList.vue_vue_type_script_setup_true_lang-BmeRGmxf.js} +2 -2
- package/dist/assets/{SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js.map → SkeletonList.vue_vue_type_script_setup_true_lang-BmeRGmxf.js.map} +1 -1
- package/dist/assets/SpecDetailView-Bd4Hx-bI.js +2 -0
- package/dist/assets/{SpecDetailView-BlHaL1Y8.js.map → SpecDetailView-Bd4Hx-bI.js.map} +1 -1
- package/dist/assets/SpecsView-B9qQPzkG.js +2 -0
- package/dist/assets/{SpecsView-C-bS2Av2.js.map → SpecsView-B9qQPzkG.js.map} +1 -1
- package/dist/assets/{SsoMark.vue_vue_type_script_setup_true_lang-aKprkHCF.js → SsoMark.vue_vue_type_script_setup_true_lang-BBiCq_4w.js} +2 -2
- package/dist/assets/{SsoMark.vue_vue_type_script_setup_true_lang-aKprkHCF.js.map → SsoMark.vue_vue_type_script_setup_true_lang-BBiCq_4w.js.map} +1 -1
- package/dist/assets/{SsoView-BUz2EaVq.js → SsoView-CltdTdwt.js} +2 -2
- package/dist/assets/{SsoView-BUz2EaVq.js.map → SsoView-CltdTdwt.js.map} +1 -1
- package/dist/assets/StateBadge.vue_vue_type_script_setup_true_lang-nD6Zdx0q.js +2 -0
- package/dist/assets/StateBadge.vue_vue_type_script_setup_true_lang-nD6Zdx0q.js.map +1 -0
- package/dist/assets/{SubmitView-s5haxS9q.js → SubmitView-D-jg5Wxy.js} +5 -5
- package/dist/assets/{SubmitView-s5haxS9q.js.map → SubmitView-D-jg5Wxy.js.map} +1 -1
- package/dist/assets/SwarmView-CqFndUrV.js +2 -0
- package/dist/assets/{SwarmView-skNbhHws.js.map → SwarmView-CqFndUrV.js.map} +1 -1
- package/dist/assets/Teleport-I0XiM19H.js +4 -0
- package/dist/assets/{Teleport-CKfsIrp8.js.map → Teleport-I0XiM19H.js.map} +1 -1
- package/dist/assets/TerminalTab-Dleba0ru.js +3 -0
- package/dist/assets/{TerminalTab-CPuFkMzh.js.map → TerminalTab-Dleba0ru.js.map} +1 -1
- package/dist/assets/UsersView-Bd8B9pLD.css +1 -0
- package/dist/assets/UsersView-BrZbuuOg.js +2 -0
- package/dist/assets/UsersView-BrZbuuOg.js.map +1 -0
- package/dist/assets/VarEditor.vue_vue_type_script_setup_true_lang-uPHU_Ugp.js +2 -0
- package/dist/assets/VarEditor.vue_vue_type_script_setup_true_lang-uPHU_Ugp.js.map +1 -0
- package/dist/assets/VarIO-BVE8A4Ur.css +1 -0
- package/dist/assets/VarIO-BldCQ6Xx.js +15 -0
- package/dist/assets/VarIO-BldCQ6Xx.js.map +1 -0
- package/dist/assets/VariablesView-CQp0T7Q6.js +3 -0
- package/dist/assets/VariablesView-CQp0T7Q6.js.map +1 -0
- package/dist/assets/VariablesView-Ck3IyRCN.css +1 -0
- package/dist/assets/index-B1ONXQzZ.css +1 -0
- package/dist/assets/index-Cqe_7QZw.js +154 -0
- package/dist/assets/index-Cqe_7QZw.js.map +1 -0
- package/dist/assets/useDeployment-BDbkdxpo.js +2 -0
- package/dist/assets/{useDeployment-CV0kcdoc.js.map → useDeployment-BDbkdxpo.js.map} +1 -1
- package/dist/assets/useJobQueue-D5JkRJNX.js +2 -0
- package/dist/assets/useJobQueue-D5JkRJNX.js.map +1 -0
- package/dist/index.html +2 -2
- package/package.json +2 -1
- package/dist/assets/ActionButton.vue_vue_type_script_setup_true_lang-C6PZurL0.js +0 -2
- package/dist/assets/ConfigTab-8Ifz-gnA.js +0 -2
- package/dist/assets/ConflictNote.vue_vue_type_script_setup_true_lang-B0PJUns4.js +0 -2
- package/dist/assets/ConflictNote.vue_vue_type_script_setup_true_lang-B0PJUns4.js.map +0 -1
- package/dist/assets/DangerTab-BwXkb6Rr.js +0 -2
- package/dist/assets/DangerTab-BwXkb6Rr.js.map +0 -1
- package/dist/assets/DashboardView-CuDBbXnZ.js +0 -2
- package/dist/assets/DeploymentDetailView-qtlOQQ0z.js +0 -2
- package/dist/assets/DeploymentsView-CQwTTlTI.js +0 -2
- package/dist/assets/DeploymentsView-CQwTTlTI.js.map +0 -1
- package/dist/assets/HelpModal.vue_vue_type_script_setup_true_lang-ErbSSi6D.js +0 -2
- package/dist/assets/HelpModal.vue_vue_type_script_setup_true_lang-ErbSSi6D.js.map +0 -1
- package/dist/assets/JobDetailView-BgoEL7EB.js +0 -2
- package/dist/assets/JobDetailView-BgoEL7EB.js.map +0 -1
- package/dist/assets/JobsView-CVG0iuN4.js +0 -2
- package/dist/assets/JobsView-CVG0iuN4.js.map +0 -1
- package/dist/assets/LogViewer.vue_vue_type_script_setup_true_lang-Sg8LzIyX.js +0 -3
- package/dist/assets/LogsTab-CZ0fNgsO.js +0 -6
- package/dist/assets/NotifiersView-Df_CM6Bj.js +0 -2
- package/dist/assets/OverviewTab-BSeic8dR.js +0 -2
- package/dist/assets/PublicLogsView-BDyvxkgj.js +0 -4
- package/dist/assets/RegistriesView-DMzsLFcT.js +0 -2
- package/dist/assets/RelativeTime.vue_vue_type_script_setup_true_lang-D4NO-r5D.js +0 -2
- package/dist/assets/RelativeTime.vue_vue_type_script_setup_true_lang-D4NO-r5D.js.map +0 -1
- package/dist/assets/RoutingView-BEJ3iJ9c.js +0 -9
- package/dist/assets/RoutingView-BEJ3iJ9c.js.map +0 -1
- package/dist/assets/RuntimeTab-DY8ZYeng.css +0 -1
- package/dist/assets/RuntimeTab-bWJuLJcn.js +0 -2
- package/dist/assets/RuntimeTab-bWJuLJcn.js.map +0 -1
- package/dist/assets/SelectMenu.vue_vue_type_script_setup_true_lang-DKYlHroe.js +0 -2
- package/dist/assets/SpecDetailView-BlHaL1Y8.js +0 -2
- package/dist/assets/SpecsView-C-bS2Av2.js +0 -2
- package/dist/assets/StateBadge.vue_vue_type_script_setup_true_lang-C-7EQXcg.js +0 -2
- package/dist/assets/StateBadge.vue_vue_type_script_setup_true_lang-C-7EQXcg.js.map +0 -1
- package/dist/assets/SwarmView-skNbhHws.js +0 -2
- package/dist/assets/Teleport-CKfsIrp8.js +0 -4
- package/dist/assets/TerminalTab-CPuFkMzh.js +0 -3
- package/dist/assets/UsersView-Be77zCYE.css +0 -1
- package/dist/assets/UsersView-CIfFPshj.js +0 -2
- package/dist/assets/UsersView-CIfFPshj.js.map +0 -1
- package/dist/assets/VarEditor.vue_vue_type_script_setup_true_lang-JwR7DqO1.js +0 -2
- package/dist/assets/VarEditor.vue_vue_type_script_setup_true_lang-JwR7DqO1.js.map +0 -1
- package/dist/assets/VariablesView-ByeOvDGJ.css +0 -1
- package/dist/assets/VariablesView-DatC33mT.js +0 -2
- package/dist/assets/VariablesView-DatC33mT.js.map +0 -1
- package/dist/assets/index-B_k9b7xG.css +0 -1
- package/dist/assets/index-T3JGe9ku.js +0 -154
- package/dist/assets/index-T3JGe9ku.js.map +0 -1
- package/dist/assets/useDeployment-CV0kcdoc.js +0 -2
- package/dist/assets/useFormat-DIlTY5Dl.js +0 -2
- package/dist/assets/useFormat-DIlTY5Dl.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var ht=e=>{throw TypeError(e)};var fn=(e,t,n)=>t.has(e)||ht("Cannot "+n);var Ae=(e,t,n)=>(fn(e,t,"read from private field"),n?n.call(e):t.get(e)),gt=(e,t,n)=>t.has(e)?ht("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{j as Mt,k as pn,l as Ve,e as mn,r as hn,g as Vt,S as vt,P as Y,c as Ce,a as me,m as gn,u as yt,n as wt,i as vn,f as yn,F as wn,D as xn,o as xt,p as bn,h as Sn,b as Lt,q as Cn,T as _n}from"./Teleport-CKfsIrp8.js";import{j as E,k as q,a8 as Le,a9 as An,aa as Pn,ab as On,ac as En,K as he,ad as qn,d as k,ae as bt,J as de,af as Rn,ag as Tn,o as $,z as L,w as R,$ as V,u as w,ah as Ft,ai as we,R as $n,aj as Bn,ak as kn,c as Z,e as N,a2 as ne,D as Nt,al as In,a1 as it,g as Ee,r as zt,F as lt,a as xe,h as Oe,N as Dn,a0 as Pe,a6 as Ht,a3 as Wt,a4 as jt,am as Mn,f as Kt,an as Vn,ao as Ln,t as Ge}from"./index-T3JGe9ku.js";function St(e){return typeof e=="string"?`'${e}'`:new Fn().serialize(e)}const Fn=(function(){var t;class e{constructor(){gt(this,t,new Map)}compare(o,r){const i=typeof o,l=typeof r;return i==="string"&&l==="string"?o.localeCompare(r):i==="number"&&l==="number"?o-r:String.prototype.localeCompare.call(this.serialize(o,!0),this.serialize(r,!0))}serialize(o,r){if(o===null)return"null";switch(typeof o){case"string":return r?o:`'${o}'`;case"bigint":return`${o}n`;case"object":return this.$object(o);case"function":return this.$function(o)}return String(o)}serializeObject(o){const r=Object.prototype.toString.call(o);if(r!=="[object Object]")return this.serializeBuiltInType(r.length<10?`unknown:${r}`:r.slice(8,-1),o);const i=o.constructor,l=i===Object||i===void 0?"":i.name;if(l!==""&&globalThis[l]===i)return this.serializeBuiltInType(l,o);if(typeof o.toJSON=="function"){const a=o.toJSON();return l+(a!==null&&typeof a=="object"?this.$object(a):`(${this.serialize(a)})`)}return this.serializeObjectEntries(l,Object.entries(o))}serializeBuiltInType(o,r){const i=this["$"+o];if(i)return i.call(this,r);if(typeof(r==null?void 0:r.entries)=="function")return this.serializeObjectEntries(o,r.entries());throw new Error(`Cannot serialize ${o}`)}serializeObjectEntries(o,r){const i=Array.from(r).sort((a,s)=>this.compare(a[0],s[0]));let l=`${o}{`;for(let a=0;a<i.length;a++){const[s,u]=i[a];l+=`${this.serialize(s,!0)}:${this.serialize(u)}`,a<i.length-1&&(l+=",")}return l+"}"}$object(o){let r=Ae(this,t).get(o);return r===void 0&&(Ae(this,t).set(o,`#${Ae(this,t).size}`),r=this.serializeObject(o),Ae(this,t).set(o,r)),r}$function(o){const r=Function.prototype.toString.call(o);return r.slice(-15)==="[native code] }"?`${o.name||""}()[native]`:`${o.name}(${o.length})${r.replace(/\s*\n\s*/g,"")}`}$Array(o){let r="[";for(let i=0;i<o.length;i++)r+=this.serialize(o[i]),i<o.length-1&&(r+=",");return r+"]"}$Date(o){try{return`Date(${o.toISOString()})`}catch{return"Date(null)"}}$ArrayBuffer(o){return`ArrayBuffer[${new Uint8Array(o).join(",")}]`}$Set(o){return`Set${this.$Array(Array.from(o).sort((r,i)=>this.compare(r,i)))}`}$Map(o){return this.serializeObjectEntries("Map",o.entries())}}t=new WeakMap;for(const n of["Error","RegExp","URL"])e.prototype["$"+n]=function(o){return`${n}(${o})`};for(const n of["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"])e.prototype["$"+n]=function(o){return`${n}[${o.join(",")}]`};for(const n of["BigInt64Array","BigUint64Array"])e.prototype["$"+n]=function(o){return`${n}[${o.join("n,")}${o.length>0?"n":""}]`};return e})();function Nn(e,t){return e===t||St(e)===St(t)}function Ct(e,t=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY){return Math.min(n,Math.max(t,e))}function zn(e){const t=Mt({dir:E("ltr")});return q(()=>{var n;return(e==null?void 0:e.value)||((n=t.dir)==null?void 0:n.value)||"ltr"})}let Je=0;function Hn(){Le(e=>{if(!pn)return;const t=document.querySelectorAll("[data-reka-focus-guard]");document.body.insertAdjacentElement("afterbegin",t[0]??_t()),document.body.insertAdjacentElement("beforeend",t[1]??_t()),Je++,e(()=>{Je===1&&document.querySelectorAll("[data-reka-focus-guard]").forEach(n=>n.remove()),Je--})})}function _t(){const e=document.createElement("span");return e.setAttribute("data-reka-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}function Wn(e){return q(()=>{var t;return An(e)?!!((t=Ve(e))!=null&&t.closest("form")):!0})}function at(e){const t=Pn(),n=Object.keys((t==null?void 0:t.type.props)??{}).reduce((r,i)=>{const l=(t==null?void 0:t.type.props[i]).default;return l!==void 0&&(r[i]=l),r},{}),o=En(e);return q(()=>{const r={},i=(t==null?void 0:t.vnode.props)??{};return Object.keys(i).forEach(l=>{r[On(l)]=i[l]}),Object.keys({...n,...r}).reduce((l,a)=>(o.value[a]!==void 0&&(l[a]=o.value[a]),l),{})})}function jn(e,t){const n=at(e),o=t?mn(t):{};return q(()=>({...n.value,...o}))}function Kn(e){const t=E(),n=q(()=>{var r;return((r=t.value)==null?void 0:r.width)??0}),o=q(()=>{var r;return((r=t.value)==null?void 0:r.height)??0});return he(()=>{const r=Ve(e);if(r){t.value={width:r.offsetWidth,height:r.offsetHeight};const i=new ResizeObserver(l=>{if(!Array.isArray(l)||!l.length)return;const a=l[0];let s,u;if("borderBoxSize"in a){const p=a.borderBoxSize,f=Array.isArray(p)?p[0]:p;s=f.inlineSize,u=f.blockSize}else s=r.offsetWidth,u=r.offsetHeight;t.value={width:s,height:u}});return i.observe(r,{box:"border-box"}),()=>i.unobserve(r)}else t.value=void 0}),{width:n,height:o}}function Ut(e){const t=hn("",1e3);return{search:t,handleTypeaheadSearch:(r,i)=>{t.value=t.value+r;{const l=Vt(),a=i.map(d=>{var c,m;return{...d,textValue:((c=d.value)==null?void 0:c.textValue)??((m=d.ref.textContent)==null?void 0:m.trim())??""}}),s=a.find(d=>d.ref===l),u=a.map(d=>d.textValue),p=Yn(u,t.value,s==null?void 0:s.textValue),f=a.find(d=>d.textValue===p);return f&&f.ref.focus(),f==null?void 0:f.ref}},resetTypeahead:()=>{t.value=""}}}function Un(e,t){return e.map((n,o)=>e[(t+o)%e.length])}function Yn(e,t,n){const r=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let l=Un(e,Math.max(i,0));r.length===1&&(l=l.filter(u=>u!==n));const s=l.find(u=>u.toLowerCase().startsWith(r.toLowerCase()));return s!==n?s:void 0}function At(){const e=E(),t=q(()=>{var n,o;return["#text","#comment"].includes((n=e.value)==null?void 0:n.$el.nodeName)?(o=e.value)==null?void 0:o.$el.nextElementSibling:Ve(e)});return{primitiveElement:e,currentElement:t}}const Pt="data-reka-collection-item";function Te(e={}){const{key:t="",isProvider:n=!1}=e,o=`${t}CollectionProvider`;let r;if(n){const p=E(new Map);r={collectionRef:E(),itemMap:p},Tn(o,r)}else r=qn(o);const i=(p=!1)=>{const f=r.collectionRef.value;if(!f)return[];const d=Array.from(f.querySelectorAll(`[${Pt}]`)),m=Array.from(r.itemMap.value.values()).sort((y,x)=>d.indexOf(y.ref)-d.indexOf(x.ref));return p?m:m.filter(y=>y.ref.dataset.disabled!=="")},l=k({name:"CollectionSlot",inheritAttrs:!1,setup(p,{slots:f,attrs:d}){const{primitiveElement:c,currentElement:m}=At();return de(m,()=>{r.collectionRef.value=m.value}),()=>bt(vt,{ref:c,...d},f)}}),a=k({name:"CollectionItem",inheritAttrs:!1,props:{value:{validator:()=>!0}},setup(p,{slots:f,attrs:d}){const{primitiveElement:c,currentElement:m}=At();return Le(y=>{if(m.value){const x=Rn(m.value);r.itemMap.value.set(x,{ref:m.value,value:p.value}),y(()=>r.itemMap.value.delete(x))}}),()=>bt(vt,{...d,[Pt]:"",ref:c},f)}}),s=q(()=>Array.from(r.itemMap.value.values())),u=q(()=>r.itemMap.value.size);return{getItems:i,reactiveItems:s,itemMapSize:u,CollectionSlot:l,CollectionItem:a}}var Xn=k({__name:"VisuallyHidden",props:{feature:{type:String,required:!1,default:"focusable"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){return(t,n)=>($(),L(w(Y),{as:t.as,"as-child":t.asChild,"aria-hidden":t.feature==="focusable"?"true":void 0,"data-hidden":t.feature==="fully-hidden"?"":void 0,tabindex:t.feature==="fully-hidden"?"-1":void 0,style:{position:"absolute",border:0,width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",clipPath:"inset(50%)",whiteSpace:"nowrap",wordWrap:"normal",top:"-1px",left:"-1px"}},{default:R(()=>[V(t.$slots,"default")]),_:3},8,["as","as-child","aria-hidden","data-hidden","tabindex"]))}}),Gn=Xn;const[Yt,Jn]=Ce("PopperRoot");var Zn=k({inheritAttrs:!1,__name:"PopperRoot",setup(e){const t=E();return Jn({anchor:t,onAnchorChange:n=>t.value=n}),(n,o)=>V(n.$slots,"default")}}),Qn=Zn,eo=k({__name:"PopperAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=me(),r=Yt();return Ft(()=>{r.onAnchorChange(t.reference??o.value)}),(i,l)=>($(),L(w(Y),{ref:w(n),as:i.as,"as-child":i.asChild},{default:R(()=>[V(i.$slots,"default")]),_:3},8,["as","as-child"]))}}),to=eo;function no(e){return e!==null}function oo(e){return{name:"transformOrigin",options:e,fn(t){var x,_,g;const{placement:n,rects:o,middlewareData:r}=t,l=((x=r.arrow)==null?void 0:x.centerOffset)!==0,a=l?0:e.arrowWidth,s=l?0:e.arrowHeight,[u,p]=et(n),f={start:"0%",center:"50%",end:"100%"}[p],d=(((_=r.arrow)==null?void 0:_.x)??0)+a/2,c=(((g=r.arrow)==null?void 0:g.y)??0)+s/2;let m="",y="";return u==="bottom"?(m=l?f:`${d}px`,y=`${-s}px`):u==="top"?(m=l?f:`${d}px`,y=`${o.floating.height+s}px`):u==="right"?(m=`${-s}px`,y=l?f:`${c}px`):u==="left"&&(m=`${o.floating.width+s}px`,y=l?f:`${c}px`),{data:{x:m,y}}}}}function et(e){const[t,n="center"]=e.split("-");return[t,n]}const ro=["top","right","bottom","left"],ie=Math.min,Q=Math.max,ke=Math.round,Be=Math.floor,ee=e=>({x:e,y:e}),io={left:"right",right:"left",bottom:"top",top:"bottom"};function Xt(e,t,n){return Q(e,ie(t,n))}function te(e,t){return typeof e=="function"?e(t):e}function le(e){return e.split("-")[0]}function _e(e){return e.split("-")[1]}function st(e){return e==="x"?"y":"x"}function ut(e){return e==="y"?"height":"width"}function U(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function ct(e){return st(U(e))}function lo(e,t,n){n===void 0&&(n=!1);const o=_e(e),r=ct(e),i=ut(r);let l=r==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return t.reference[i]>t.floating[i]&&(l=Ie(l)),[l,Ie(l)]}function ao(e){const t=Ie(e);return[tt(e),t,tt(t)]}function tt(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const Ot=["left","right"],Et=["right","left"],so=["top","bottom"],uo=["bottom","top"];function co(e,t,n){switch(e){case"top":case"bottom":return n?t?Et:Ot:t?Ot:Et;case"left":case"right":return t?so:uo;default:return[]}}function fo(e,t,n,o){const r=_e(e);let i=co(le(e),n==="start",o);return r&&(i=i.map(l=>l+"-"+r),t&&(i=i.concat(i.map(tt)))),i}function Ie(e){const t=le(e);return io[t]+e.slice(t.length)}function po(e){var t,n,o,r;return{top:(t=e.top)!=null?t:0,right:(n=e.right)!=null?n:0,bottom:(o=e.bottom)!=null?o:0,left:(r=e.left)!=null?r:0}}function Gt(e){return typeof e!="number"?po(e):{top:e,right:e,bottom:e,left:e}}function De(e){const{x:t,y:n,width:o,height:r}=e;return{width:o,height:r,top:n,left:t,right:t+o,bottom:n+r,x:t,y:n}}function qt(e,t,n){let{reference:o,floating:r}=e;const i=U(t),l=ct(t),a=ut(l),s=le(t),u=i==="y",p=o.x+o.width/2-r.width/2,f=o.y+o.height/2-r.height/2,d=o[a]/2-r[a]/2;let c;switch(s){case"top":c={x:p,y:o.y-r.height};break;case"bottom":c={x:p,y:o.y+o.height};break;case"right":c={x:o.x+o.width,y:f};break;case"left":c={x:o.x-r.width,y:f};break;default:c={x:o.x,y:o.y}}const m=_e(t);return m&&(c[l]+=d*(m==="end"?1:-1)*(n&&u?-1:1)),c}async function mo(e,t){var n;t===void 0&&(t={});const{x:o,y:r,platform:i,rects:l,elements:a,strategy:s}=e,{boundary:u="clippingAncestors",rootBoundary:p="viewport",elementContext:f="floating",altBoundary:d=!1,padding:c=0}=te(t,e),m=Gt(c),x=a[d?f==="floating"?"reference":"floating":f],_=De(await i.getClippingRect({element:(n=await(i.isElement==null?void 0:i.isElement(x)))==null||n?x:x.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(a.floating)),boundary:u,rootBoundary:p,strategy:s})),g=f==="floating"?{x:o,y:r,width:l.floating.width,height:l.floating.height}:l.reference,C=await(i.getOffsetParent==null?void 0:i.getOffsetParent(a.floating)),h=await(i.isElement==null?void 0:i.isElement(C))&&await(i.getScale==null?void 0:i.getScale(C))||{x:1,y:1},S=De(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:a,rect:g,offsetParent:C,strategy:s}):g);return{top:(_.top-S.top+m.top)/h.y,bottom:(S.bottom-_.bottom+m.bottom)/h.y,left:(_.left-S.left+m.left)/h.x,right:(S.right-_.right+m.right)/h.x}}const ho=50,go=async(e,t,n)=>{const{placement:o="bottom",strategy:r="absolute",middleware:i=[],platform:l}=n,a=l.detectOverflow?l:{...l,detectOverflow:mo},s=await(l.isRTL==null?void 0:l.isRTL(t));let u=await l.getElementRects({reference:e,floating:t,strategy:r}),{x:p,y:f}=qt(u,o,s),d=o,c=0;const m={};for(let y=0;y<i.length;y++){const x=i[y];if(!x)continue;const{name:_,fn:g}=x,{x:C,y:h,data:S,reset:v}=await g({x:p,y:f,initialPlacement:o,placement:d,strategy:r,middlewareData:m,rects:u,platform:a,elements:{reference:e,floating:t}});p=C??p,f=h??f,m[_]={...m[_],...S},v&&c<ho&&(c++,typeof v=="object"&&(v.placement&&(d=v.placement),v.rects&&(u=v.rects===!0?await l.getElementRects({reference:e,floating:t,strategy:r}):v.rects),{x:p,y:f}=qt(u,d,s)),y=-1)}return{x:p,y:f,placement:d,strategy:r,middlewareData:m}},vo=e=>({name:"arrow",options:e,async fn(t){const{x:n,y:o,placement:r,rects:i,platform:l,elements:a,middlewareData:s}=t,{element:u,padding:p=0}=te(e,t)||{};if(u==null)return{};const f=Gt(p),d={x:n,y:o},c=ct(r),m=ut(c),y=await l.getDimensions(u),x=c==="y",_=x?"top":"left",g=x?"bottom":"right",C=x?"clientHeight":"clientWidth",h=i.reference[m]+i.reference[c]-d[c]-i.floating[m],S=d[c]-i.reference[c],v=await(l.getOffsetParent==null?void 0:l.getOffsetParent(u));let b=v?v[C]:0;(!b||!await(l.isElement==null?void 0:l.isElement(v)))&&(b=a.floating[C]||i.floating[m]);const A=h/2-S/2,P=b/2-y[m]/2-1,O=ie(f[_],P),I=ie(f[g],P),T=b-y[m]-I,B=b/2-y[m]/2+A,D=Xt(O,B,T),z=!s.arrow&&_e(r)!=null&&B!==D&&i.reference[m]/2-(B<O?O:I)-y[m]/2<0,F=z?B<O?B-O:B-T:0;return{[c]:d[c]+F,data:{[c]:D,centerOffset:B-D-F,...z&&{alignmentOffset:F}},reset:z}}}),yo=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n,o;const{placement:r,middlewareData:i,rects:l,initialPlacement:a,platform:s,elements:u}=t,{mainAxis:p=!0,crossAxis:f=!0,fallbackPlacements:d,fallbackStrategy:c="bestFit",fallbackAxisSideDirection:m="none",flipAlignment:y=!0,...x}=te(e,t);if((n=i.arrow)!=null&&n.alignmentOffset)return{};const _=le(r),g=U(a),C=le(a)===a,h=await(s.isRTL==null?void 0:s.isRTL(u.floating)),S=d||(C||!y?[Ie(a)]:ao(a)),v=m!=="none";!d&&v&&S.push(...fo(a,y,m,h));const b=[a,...S],A=await s.detectOverflow(t,x),P=[];let O=((o=i.flip)==null?void 0:o.overflows)||[];if(p&&P.push(A[_]),f){const D=lo(r,l,h);P.push(A[D[0]],A[D[1]])}if(O=[...O,{placement:r,overflows:P}],!P.every(D=>D<=0)){var I,T;const D=(((I=i.flip)==null?void 0:I.index)||0)+1,z=b[D];if(z&&(!(f==="alignment"?g!==U(z):!1)||O.every(M=>U(M.placement)===g?M.overflows[0]>0:!0)))return{data:{index:D,overflows:O},reset:{placement:z}};let F=(T=O.filter(W=>W.overflows[0]<=0).sort((W,M)=>W.overflows[1]-M.overflows[1])[0])==null?void 0:T.placement;if(!F)switch(c){case"bestFit":{var B;const W=(B=O.filter(M=>{if(v){const K=U(M.placement);return K===g||K==="y"}return!0}).map(M=>[M.placement,M.overflows.filter(K=>K>0).reduce((K,ye)=>K+ye,0)]).sort((M,K)=>M[1]-K[1])[0])==null?void 0:B[0];W&&(F=W);break}case"initialPlacement":F=a;break}if(r!==F)return{reset:{placement:F}}}return{}}}};function Rt(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Tt(e){return ro.some(t=>e[t]>=0)}const wo=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n,platform:o}=t,{strategy:r="referenceHidden",...i}=te(e,t);switch(r){case"referenceHidden":{const l=await o.detectOverflow(t,{...i,elementContext:"reference"}),a=Rt(l,n.reference);return{data:{referenceHiddenOffsets:a,referenceHidden:Tt(a)}}}case"escaped":{const l=await o.detectOverflow(t,{...i,altBoundary:!0}),a=Rt(l,n.floating);return{data:{escapedOffsets:a,escaped:Tt(a)}}}default:return{}}}}},Jt=new Set(["left","top"]);async function xo(e,t){const{placement:n,platform:o,elements:r}=e,i=await(o.isRTL==null?void 0:o.isRTL(r.floating)),l=le(n),a=_e(n),s=U(n)==="y",u=Jt.has(l)?-1:1,p=i&&s?-1:1,f=te(t,e);let{mainAxis:d,crossAxis:c,alignmentAxis:m}=typeof f=="number"?{mainAxis:f,crossAxis:0,alignmentAxis:null}:{mainAxis:f.mainAxis||0,crossAxis:f.crossAxis||0,alignmentAxis:f.alignmentAxis};return a&&typeof m=="number"&&(c=a==="end"?m*-1:m),s?{x:c*p,y:d*u}:{x:d*u,y:c*p}}const bo=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,o;const{x:r,y:i,placement:l,middlewareData:a}=t,s=await xo(t,e);return l===((n=a.offset)==null?void 0:n.placement)&&(o=a.arrow)!=null&&o.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:l}}}}},So=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:o,placement:r,platform:i}=t,{mainAxis:l=!0,crossAxis:a=!1,limiter:s={fn:g=>{let{x:C,y:h}=g;return{x:C,y:h}}},...u}=te(e,t),p={x:n,y:o},f=await i.detectOverflow(t,u),d=U(r),c=st(d);let m=p[c],y=p[d];const x=(g,C)=>Xt(C+f[g==="y"?"top":"left"],C,C-f[g==="y"?"bottom":"right"]);l&&(m=x(c,m)),a&&(y=x(d,y));const _=s.fn({...t,[c]:m,[d]:y});return{..._,data:{x:_.x-n,y:_.y-o,enabled:{[c]:l,[d]:a}}}}}},Co=function(e){return e===void 0&&(e={}),{options:e,fn(t){var n,o;const{x:r,y:i,placement:l,rects:a,middlewareData:s}=t,{offset:u=0,mainAxis:p=!0,crossAxis:f=!0}=te(e,t),d={x:r,y:i},c=U(l),m=st(c);let y=d[m],x=d[c];const _=te(u,t),g=typeof _=="number"?{mainAxis:_,crossAxis:0}:{mainAxis:(n=_.mainAxis)!=null?n:0,crossAxis:(o=_.crossAxis)!=null?o:0};if(p){const S=m==="y"?"height":"width",v=a.reference[m]-a.floating[S]+g.mainAxis,b=a.reference[m]+a.reference[S]-g.mainAxis;y<v?y=v:y>b&&(y=b)}if(f){var C,h;const S=m==="y"?"width":"height",v=Jt.has(le(l)),b=a.reference[c]-a.floating[S]+(v&&((C=s.offset)==null?void 0:C[c])||0)+(v?0:g.crossAxis),A=a.reference[c]+a.reference[S]+(v?0:((h=s.offset)==null?void 0:h[c])||0)-(v?g.crossAxis:0);x<b?x=b:x>A&&(x=A)}return{[m]:y,[c]:x}}}},_o=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:o,platform:r,elements:i}=t,{apply:l=()=>{},...a}=te(e,t),s=await r.detectOverflow(t,a),u=le(n),p=_e(n),f=U(n)==="y",{width:d,height:c}=o.floating;let m,y;u==="top"||u==="bottom"?(m=u,y=p===(await(r.isRTL==null?void 0:r.isRTL(i.floating))?"start":"end")?"left":"right"):(y=u,m=p==="end"?"top":"bottom");const x=c-s.top-s.bottom,_=d-s.left-s.right,g=ie(c-s[m],x),C=ie(d-s[y],_),h=t.middlewareData.shift,S=!h;let v=g,b=C;h!=null&&h.enabled.x&&(b=_),h!=null&&h.enabled.y&&(v=x),S&&!p&&(f?b=d-2*Q(s.left,s.right):v=c-2*Q(s.top,s.bottom)),await l({...t,availableWidth:b,availableHeight:v});const A=await r.getDimensions(i.floating);return d!==A.width||c!==A.height?{reset:{rects:!0}}:{}}}};function Fe(){return typeof window<"u"}function ge(e){return dt(e)?(e.nodeName||"").toLowerCase():"#document"}function H(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function oe(e){var t;return(t=(dt(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function dt(e){return Fe()?e instanceof Node||e instanceof H(e).Node:!1}function X(e){return Fe()?e instanceof Element||e instanceof H(e).Element:!1}function ae(e){return Fe()?e instanceof HTMLElement||e instanceof H(e).HTMLElement:!1}function $t(e){return!Fe()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof H(e).ShadowRoot}function Ne(e){const{overflow:t,overflowX:n,overflowY:o,display:r}=G(e);return/auto|scroll|overlay|hidden|clip/.test(t+o+n)&&r!=="inline"&&r!=="contents"}function Ao(e){return/^(table|td|th)$/.test(ge(e))}function ze(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const Po=/transform|translate|scale|rotate|perspective|filter/,Oo=/paint|layout|strict|content/,ce=e=>!!e&&e!=="none";let Ze;function ft(e){const t=X(e)?G(e):e;return ce(t.transform)||ce(t.translate)||ce(t.scale)||ce(t.rotate)||ce(t.perspective)||!pt()&&(ce(t.backdropFilter)||ce(t.filter))||Po.test(t.willChange||"")||Oo.test(t.contain||"")}function Eo(e){let t=fe(e);for(;ae(t)&&!qe(t);){if(ft(t))return t;if(ze(t))return null;t=fe(t)}return null}function pt(){return Ze==null&&(Ze=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),Ze}function qe(e){return/^(html|body|#document)$/.test(ge(e))}function G(e){return H(e).getComputedStyle(e)}function He(e){return X(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function fe(e){if(ge(e)==="html")return e;const t=e.assignedSlot||e.parentNode||$t(e)&&e.host||oe(e);return $t(t)?t.host:t}function Zt(e){const t=fe(e);return qe(t)?(e.ownerDocument||e).body:ae(t)&&Ne(t)?t:Zt(t)}function Re(e,t,n){var o;t===void 0&&(t=[]),n===void 0&&(n=!0);const r=Zt(e),i=r===((o=e.ownerDocument)==null?void 0:o.body),l=H(r);if(i){const a=nt(l);return t.concat(l,l.visualViewport||[],Ne(r)?r:[],a&&n?Re(a):[])}else return t.concat(r,Re(r,[],n))}function nt(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Qt(e){const t=G(e);let n=parseFloat(t.width)||0,o=parseFloat(t.height)||0;const r=ae(e),i=r?e.offsetWidth:n,l=r?e.offsetHeight:o,a=ke(n)!==i||ke(o)!==l;return a&&(n=i,o=l),{width:n,height:o,$:a}}function mt(e){return X(e)?e:e.contextElement}function Se(e){const t=mt(e);if(!ae(t))return ee(1);const n=t.getBoundingClientRect(),{width:o,height:r,$:i}=Qt(t);let l=(i?ke(n.width):n.width)/o,a=(i?ke(n.height):n.height)/r;return(!l||!Number.isFinite(l))&&(l=1),(!a||!Number.isFinite(a))&&(a=1),{x:l,y:a}}const qo=ee(0);function en(e){const t=H(e);return!pt()||!t.visualViewport?qo:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Ro(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===H(e)}function pe(e,t,n,o){t===void 0&&(t=!1),n===void 0&&(n=!1);const r=e.getBoundingClientRect(),i=mt(e);let l=ee(1);t&&(o?X(o)&&(l=Se(o)):l=Se(e));const a=Ro(i,n,o)?en(i):ee(0);let s=(r.left+a.x)/l.x,u=(r.top+a.y)/l.y,p=r.width/l.x,f=r.height/l.y;if(i&&o){const d=H(i),c=X(o)?H(o):o;let m=d,y=nt(m);for(;y&&c!==m;){const x=Se(y),_=y.getBoundingClientRect(),g=G(y),C=_.left+(y.clientLeft+parseFloat(g.paddingLeft))*x.x,h=_.top+(y.clientTop+parseFloat(g.paddingTop))*x.y;s*=x.x,u*=x.y,p*=x.x,f*=x.y,s+=C,u+=h,m=H(y),y=nt(m)}}return De({width:p,height:f,x:s,y:u})}function We(e,t){const n=He(e).scrollLeft;return t?t.left+n:pe(oe(e)).left+n}function tn(e,t){const n=e.getBoundingClientRect(),o=n.left+t.scrollLeft-We(e,n),r=n.top+t.scrollTop;return{x:o,y:r}}function To(e){let{elements:t,rect:n,offsetParent:o,strategy:r}=e;const i=r==="fixed",l=oe(o),a=t?ze(t.floating):!1;if(o===l||a&&i)return n;let s={scrollLeft:0,scrollTop:0},u=ee(1);const p=ee(0),f=ae(o);if((f||!i)&&((ge(o)!=="body"||Ne(l))&&(s=He(o)),f)){const c=pe(o);u=Se(o),p.x=c.x+o.clientLeft,p.y=c.y+o.clientTop}const d=l&&!f&&!i?tn(l,s):ee(0);return{width:n.width*u.x,height:n.height*u.y,x:n.x*u.x-s.scrollLeft*u.x+p.x+d.x,y:n.y*u.y-s.scrollTop*u.y+p.y+d.y}}function $o(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function Bo(e){const t=He(e),n=e.ownerDocument.body,o=Q(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),r=Q(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight);let i=-t.scrollLeft+We(e);const l=-t.scrollTop;return G(n).direction==="rtl"&&(i+=Q(e.clientWidth,n.clientWidth)-o),{width:o,height:r,x:i,y:l}}const ko=25;function Io(e,t,n){n===void 0&&(n="viewport");const o=n==="layoutViewport",r=H(e),i=oe(e),l=r.visualViewport;let a=i.clientWidth,s=i.clientHeight,u=0,p=0;if(l){const d=!pt()||t==="fixed";o?d||(u=-l.offsetLeft,p=-l.offsetTop):(a=l.width,s=l.height,d&&(u=l.offsetLeft,p=l.offsetTop))}if(We(i)<=0){const d=i.ownerDocument,c=d.body,m=getComputedStyle(c),y=d.compatMode==="CSS1Compat"&&parseFloat(m.marginLeft)+parseFloat(m.marginRight)||0,x=Math.abs(i.clientWidth-c.clientWidth-y),_=getComputedStyle(i).scrollbarGutter==="stable both-edges"?x/2:x;_<=ko&&(a-=_)}return{width:a,height:s,x:u,y:p}}function Do(e,t){const n=pe(e,!0,t==="fixed"),o=n.top+e.clientTop,r=n.left+e.clientLeft,i=Se(e),l=e.clientWidth*i.x,a=e.clientHeight*i.y,s=r*i.x,u=o*i.y;return{width:l,height:a,x:s,y:u}}function Bt(e,t,n){let o;if(t==="viewport"||t==="layoutViewport")o=Io(e,n,t);else if(t==="document")o=Bo(oe(e));else if(X(t))o=Do(t,n);else{const r=en(e);o={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return De(o)}function Mo(e,t){const n=t.get(e);if(n)return n;let o=Re(e,[],!1).filter(a=>X(a)&&ge(a)!=="body"),r=null;const i=G(e).position==="fixed";let l=i?fe(e):e;for(;X(l)&&!qe(l);){const a=G(l),s=ft(l),u=r?r.position:i?"fixed":"";!s&&(u==="fixed"||u==="absolute"&&a.position==="static")?o=o.filter(f=>f!==l):r=a,l=fe(l)}return t.set(e,o),o}function Vo(e){let{element:t,boundary:n,rootBoundary:o,strategy:r}=e;const l=[...n==="clippingAncestors"?ze(t)?[]:Mo(t,this._c):[].concat(n),o],a=Bt(t,l[0],r);let s=a.top,u=a.right,p=a.bottom,f=a.left;for(let d=1;d<l.length;d++){const c=Bt(t,l[d],r);s=Q(c.top,s),u=ie(c.right,u),p=ie(c.bottom,p),f=Q(c.left,f)}return{width:u-f,height:p-s,x:f,y:s}}function Lo(e){const{width:t,height:n}=Qt(e);return{width:t,height:n}}function Fo(e,t,n){const o=ae(t),r=oe(t),i=n==="fixed",l=pe(e,!0,i,t);let a={scrollLeft:0,scrollTop:0};const s=ee(0);if((o||!i)&&((ge(t)!=="body"||Ne(r))&&(a=He(t)),o)){const d=pe(t,!0,i,t);s.x=d.x+t.clientLeft,s.y=d.y+t.clientTop}!o&&r&&(s.x=We(r));const u=r&&!o&&!i?tn(r,a):ee(0),p=l.left+a.scrollLeft-s.x-u.x,f=l.top+a.scrollTop-s.y-u.y;return{x:p,y:f,width:l.width,height:l.height}}function Qe(e){return G(e).position==="static"}function kt(e,t){if(!ae(e)||G(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return oe(e)===n&&(n=n.ownerDocument.body),n}function nn(e,t){const n=H(e);if(ze(e))return n;if(!ae(e)){let r=fe(e);for(;r&&!qe(r);){if(X(r)&&!Qe(r))return r;r=fe(r)}return n}let o=kt(e,t);for(;o&&Ao(o)&&Qe(o);)o=kt(o,t);return o&&qe(o)&&Qe(o)&&!ft(o)?n:o||Eo(e)||n}const No=async function(e){const t=this.getOffsetParent||nn,n=this.getDimensions,o=await n(e.floating);return{reference:Fo(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:o.width,height:o.height}}};function zo(e){return G(e).direction==="rtl"}const Ho={convertOffsetParentRelativeRectToViewportRelativeRect:To,getDocumentElement:oe,getClippingRect:Vo,getOffsetParent:nn,getElementRects:No,getClientRects:$o,getDimensions:Lo,getScale:Se,isElement:X,isRTL:zo};function on(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function Wo(e,t,n){let o=null,r;const i=oe(e);function l(){var p;clearTimeout(r),(p=o)==null||p.disconnect(),o=null}function a(p,f){p===void 0&&(p=!1),f===void 0&&(f=1),l();const d=e.getBoundingClientRect(),{left:c,top:m,width:y,height:x}=d;if(p||t(),!y||!x)return;const _=Be(m),g=Be(i.clientWidth-(c+y)),C=Be(i.clientHeight-(m+x)),h=Be(c),v={rootMargin:-_+"px "+-g+"px "+-C+"px "+-h+"px",threshold:Q(0,ie(1,f))||1};let b=!0;function A(P){const O=P[0].intersectionRatio;if(!on(d,e.getBoundingClientRect()))return a();if(O!==f){if(!b)return a();O?a(!1,O):r=setTimeout(()=>{a(!1,1e-7)},1e3)}b=!1}try{o=new IntersectionObserver(A,{...v,root:i.ownerDocument})}catch{o=new IntersectionObserver(A,v)}o.observe(e)}const s=H(e),u=()=>a(n);return s.addEventListener("resize",u),a(!0),()=>{s.removeEventListener("resize",u),l()}}function jo(e,t,n,o){o===void 0&&(o={});const{ancestorScroll:r=!0,ancestorResize:i=!0,elementResize:l=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:s=!1}=o,u=mt(e),p=r||i?[...u?Re(u):[],...t?Re(t):[]]:[];p.forEach(_=>{r&&_.addEventListener("scroll",n),i&&_.addEventListener("resize",n)});const f=u&&a?Wo(u,n,i):null;let d=-1,c=null;l&&(c=new ResizeObserver(_=>{let[g]=_;g&&g.target===u&&c&&t&&(c.unobserve(t),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var C;(C=c)==null||C.observe(t)})),n()}),u&&!s&&c.observe(u),t&&c.observe(t));let m,y=s?pe(e):null;s&&x();function x(){const _=pe(e);y&&!on(y,_)&&n(),y=_,m=requestAnimationFrame(x)}return n(),()=>{var _;p.forEach(g=>{r&&g.removeEventListener("scroll",n),i&&g.removeEventListener("resize",n)}),f==null||f(),(_=c)==null||_.disconnect(),c=null,s&&cancelAnimationFrame(m)}}const Ko=bo,Uo=So,It=yo,Yo=_o,Xo=wo,Go=vo,Jo=Co,Zo=(e,t,n)=>{const o=new Map,r=n??{},i={...Ho,...r.platform,_c:o};return go(e,t,{...r,platform:i})};function Qo(e){return e!=null&&typeof e=="object"&&"$el"in e}function ot(e){if(Qo(e)){const t=e.$el;return dt(t)&&ge(t)==="#comment"?null:t}return e}function be(e){return typeof e=="function"?e():w(e)}function er(e){return{name:"arrow",options:e,fn(t){const n=ot(be(e.element));return n==null?{}:Go({element:n,padding:e.padding}).fn(t)}}}function rn(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Dt(e,t){const n=rn(e);return Math.round(t*n)/n}function tr(e,t,n){n===void 0&&(n={});const o=n.whileElementsMounted,r=q(()=>{var b;return(b=be(n.open))!=null?b:!0}),i=q(()=>be(n.middleware)),l=q(()=>{var b;return(b=be(n.placement))!=null?b:"bottom"}),a=q(()=>{var b;return(b=be(n.strategy))!=null?b:"absolute"}),s=q(()=>{var b;return(b=be(n.transform))!=null?b:!0}),u=q(()=>ot(e.value)),p=q(()=>ot(t.value)),f=E(0),d=E(0),c=E(a.value),m=E(l.value),y=$n({}),x=E(!1),_=q(()=>{const b={position:c.value,left:"0",top:"0"};if(!p.value)return b;const A=Dt(p.value,f.value),P=Dt(p.value,d.value);return s.value?{...b,transform:"translate("+A+"px, "+P+"px)",...rn(p.value)>=1.5&&{willChange:"transform"}}:{position:c.value,left:A+"px",top:P+"px"}});let g;function C(){if(u.value==null||p.value==null)return;const b=r.value;Zo(u.value,p.value,{middleware:i.value,placement:l.value,strategy:a.value}).then(A=>{f.value=A.x,d.value=A.y,c.value=A.strategy,m.value=A.placement,y.value=A.middlewareData,x.value=b!==!1})}function h(){typeof g=="function"&&(g(),g=void 0)}function S(){if(h(),o===void 0){C();return}if(u.value!=null&&p.value!=null){g=o(u.value,p.value,C);return}}function v(){r.value||(x.value=!1)}return de([i,l,a,r],C,{flush:"sync"}),de([u,p],S,{flush:"sync"}),de(r,v,{flush:"sync"}),Bn()&&kn(h),{x:we(f),y:we(d),strategy:we(c),placement:we(m),middlewareData:we(y),isPositioned:we(x),floatingStyles:_,update:C}}const nr={side:"bottom",sideOffset:0,sideFlip:!0,align:"center",alignOffset:0,alignFlip:!0,arrowPadding:0,hideShiftedArrow:!0,avoidCollisions:!0,collisionBoundary:()=>[],collisionPadding:0,sticky:"partial",hideWhenDetached:!1,positionStrategy:"fixed",updatePositionStrategy:"optimized",prioritizePosition:!1},[Yr,or]=Ce("PopperContent");var rr=k({inheritAttrs:!1,__name:"PopperContent",props:In({side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...nr}),emits:["placed"],setup(e,{emit:t}){const n=e,o=t,r=Yt(),{forwardRef:i,currentElement:l}=me(),a=E(),s=E(),{width:u,height:p}=Kn(s),f=q(()=>n.side+(n.align!=="center"?`-${n.align}`:"")),d=q(()=>typeof n.collisionPadding=="number"?n.collisionPadding:{top:0,right:0,bottom:0,left:0,...n.collisionPadding}),c=q(()=>Array.isArray(n.collisionBoundary)?n.collisionBoundary:[n.collisionBoundary]),m=q(()=>({padding:d.value,boundary:c.value.filter(no),altBoundary:c.value.length>0})),y=q(()=>({mainAxis:n.sideFlip,crossAxis:n.alignFlip})),x=gn(()=>[Ko({mainAxis:n.sideOffset+p.value,alignmentAxis:n.alignOffset}),n.prioritizePosition&&n.avoidCollisions&&It({...m.value,...y.value}),n.avoidCollisions&&Uo({mainAxis:!0,crossAxis:!!n.prioritizePosition,limiter:n.sticky==="partial"?Jo():void 0,...m.value}),!n.prioritizePosition&&n.avoidCollisions&&It({...m.value,...y.value}),Yo({...m.value,apply:({elements:T,rects:B,availableWidth:D,availableHeight:z})=>{const{width:F,height:W}=B.reference,M=T.floating.style;M.setProperty("--reka-popper-available-width",`${D}px`),M.setProperty("--reka-popper-available-height",`${z}px`),M.setProperty("--reka-popper-anchor-width",`${F}px`),M.setProperty("--reka-popper-anchor-height",`${W}px`)}}),s.value&&er({element:s.value,padding:n.arrowPadding}),oo({arrowWidth:u.value,arrowHeight:p.value}),n.hideWhenDetached&&Xo({strategy:"referenceHidden",...m.value})]),_=q(()=>n.reference??r.anchor.value),{floatingStyles:g,placement:C,isPositioned:h,middlewareData:S}=tr(_,a,{strategy:n.positionStrategy,placement:f,whileElementsMounted:(...T)=>jo(...T,{layoutShift:!n.disableUpdateOnLayoutShift,animationFrame:n.updatePositionStrategy==="always"}),middleware:x}),v=q(()=>et(C.value)[0]),b=q(()=>et(C.value)[1]);Ft(()=>{h.value&&o("placed")});const A=q(()=>{var B;const T=((B=S.value.arrow)==null?void 0:B.centerOffset)!==0;return n.hideShiftedArrow&&T}),P=E("");Le(()=>{l.value&&(P.value=window.getComputedStyle(l.value).zIndex)});const O=q(()=>{var T;return((T=S.value.arrow)==null?void 0:T.x)??0}),I=q(()=>{var T;return((T=S.value.arrow)==null?void 0:T.y)??0});return or({placedSide:v,onArrowChange:T=>s.value=T,arrowX:O,arrowY:I,shouldHideArrow:A}),(T,B)=>{var D,z,F;return $(),Z("div",{ref_key:"floatingRef",ref:a,"data-reka-popper-content-wrapper":"",style:Nt({...w(g),transform:w(h)?w(g).transform:"translate(0, -200%)",minWidth:"max-content",zIndex:P.value,"--reka-popper-transform-origin":[(D=w(S).transformOrigin)==null?void 0:D.x,(z=w(S).transformOrigin)==null?void 0:z.y].join(" "),...((F=w(S).hide)==null?void 0:F.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}})},[N(w(Y),ne({ref:w(i)},T.$attrs,{"as-child":n.asChild,as:T.as,"data-side":v.value,"data-align":b.value,style:{animation:w(h)?void 0:"none"}}),{default:R(()=>[V(T.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","style"])],4)}}}),ir=rr;function lr(e){const t=Mt({nonce:E()});return q(()=>{var n;return(e==null?void 0:e.value)||((n=t.nonce)==null?void 0:n.value)})}const ar=[" ","Enter","ArrowUp","ArrowDown"],sr=[" ","Enter"],j=10;function Me(e,t,n){return e===void 0?!1:Array.isArray(e)?e.some(o=>rt(o,t,n)):rt(e,t,n)}function rt(e,t,n){return e===void 0||t===void 0?!1:typeof e=="string"?e===t:typeof n=="function"?n(e,t):typeof n=="string"?(e==null?void 0:e[n])===(t==null?void 0:t[n]):Nn(e,t)}function ur(e){return e==null||e===""||Array.isArray(e)&&e.length===0}const cr={key:0,value:""},[ve,ln]=Ce("SelectRoot");var dr=k({inheritAttrs:!1,__name:"SelectRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1},defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},by:{type:[String,Function],required:!1},dir:{type:String,required:!1},multiple:{type:Boolean,required:!1},autocomplete:{type:String,required:!1},disabled:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","update:open"],setup(e,{emit:t}){const n=e,o=t,{required:r,disabled:i,multiple:l,dir:a}=it(n),s=yt(n,"modelValue",o,{defaultValue:n.defaultValue??(l.value?[]:void 0),passive:n.modelValue===void 0,deep:!0}),u=yt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0}),p=E(),f=E(),d=E({x:0,y:0}),c=q(()=>{var h;return l.value&&Array.isArray(s.value)?((h=s.value)==null?void 0:h.length)===0:wt(s.value)});Te({isProvider:!0});const m=zn(a),y=Wn(p),x=E(new Set),_=q(()=>Array.from(x.value).map(h=>h.value).join(";"));function g(h){if(l.value){const S=Array.isArray(s.value)?[...s.value]:[],v=S.findIndex(b=>rt(b,h,n.by));v===-1?S.push(h):S.splice(v,1),s.value=[...S]}else s.value=h}function C(h){return Array.from(x.value).find(S=>Me(h,S.value,n.by))}return ln({triggerElement:p,onTriggerChange:h=>{p.value=h},valueElement:f,onValueElementChange:h=>{f.value=h},contentId:"",modelValue:s,onValueChange:g,by:n.by,open:u,multiple:l,required:r,onOpenChange:h=>{u.value=h},dir:m,triggerPointerDownPosRef:d,disabled:i,isEmptyModelValue:c,optionsSet:x,onOptionAdd:h=>{const S=C(h.value);S&&x.value.delete(S),x.value.add(h)},onOptionRemove:h=>{const S=C(h.value);S&&x.value.delete(S)}}),(h,S)=>($(),L(w(Qn),null,{default:R(()=>[V(h.$slots,"default",{modelValue:w(s),open:w(u)}),w(y)&&h.name?($(),L(mr,{key:_.value,"aria-hidden":"true",tabindex:"-1",multiple:w(l),required:w(r),name:h.name,autocomplete:h.autocomplete,disabled:w(i),value:w(s)},{default:R(()=>[w(wt)(w(s))?($(),Z("option",cr)):Ee("v-if",!0),($(!0),Z(lt,null,zt(Array.from(x.value),v=>($(),Z("option",ne({key:v.value??""},{ref_for:!0},v),null,16))),128))]),_:1},8,["multiple","required","name","autocomplete","disabled","value"])):Ee("v-if",!0)]),_:3}))}}),fr=dr,pr=k({__name:"BubbleSelect",props:{autocomplete:{type:String,required:!1},autofocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},form:{type:String,required:!1},multiple:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1},size:{type:Number,required:!1},value:{type:null,required:!1}},setup(e){const t=e,n=E(),o=ve();de(()=>t.value,(i,l)=>{const a=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(a,"value").set;if(i!==l&&u&&n.value){const p=new Event("change",{bubbles:!0});u.call(n.value,i),n.value.dispatchEvent(p)}});function r(i){o.onValueChange(i.target.value)}return(i,l)=>($(),L(w(Gn),{"as-child":""},{default:R(()=>[xe("select",ne({ref_key:"selectElement",ref:n},t,{onInput:r}),[V(i.$slots,"default")],16)]),_:3}))}}),mr=pr,hr=k({__name:"SelectPopperPosition",props:{side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1,default:"start"},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1,default:j},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const n=at(e);return(o,r)=>($(),L(w(ir),ne(w(n),{style:{boxSizing:"border-box","--reka-select-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-select-content-available-width":"var(--reka-popper-available-width)","--reka-select-content-available-height":"var(--reka-popper-available-height)","--reka-select-trigger-width":"var(--reka-popper-anchor-width)","--reka-select-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:R(()=>[V(o.$slots,"default")]),_:3},16))}}),gr=hr;const vr={onViewportChange:()=>{},itemTextRefCallback:()=>{},itemRefCallback:()=>{}},[je,an]=Ce("SelectContent");var yr=k({__name:"SelectContentImpl",props:{position:{type:String,required:!1,default:"item-aligned"},bodyLock:{type:Boolean,required:!1,default:!0},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1,default:"start"},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:!0}},emits:["closeAutoFocus","escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,r=ve();Hn(),vn(n.bodyLock);const{CollectionSlot:i,getItems:l}=Te(),a=E();yn(a);const{search:s,handleTypeaheadSearch:u}=Ut(),p=E(),f=E(),d=E(),c=E(!1),m=E(!1),y=E(!1);function x(){f.value&&a.value&&xt([f.value,a.value])}de(c,()=>{x()});const{onOpenChange:_,triggerPointerDownPosRef:g}=r;Le(v=>{if(!a.value)return;let b={x:0,y:0};const A=O=>{var I,T;b={x:Math.abs(Math.round(O.pageX)-(((I=g.value)==null?void 0:I.x)??0)),y:Math.abs(Math.round(O.pageY)-(((T=g.value)==null?void 0:T.y)??0))}},P=O=>{var I;O.pointerType!=="touch"&&(b.x<=10&&b.y<=10?O.preventDefault():(I=a.value)!=null&&I.contains(O.target)||_(!1),document.removeEventListener("pointermove",A),g.value=null)};g.value!==null&&(document.addEventListener("pointermove",A),document.addEventListener("pointerup",P,{capture:!0,once:!0})),v(()=>{document.removeEventListener("pointermove",A),document.removeEventListener("pointerup",P,{capture:!0})})});function C(v){const b=v.ctrlKey||v.altKey||v.metaKey;if(v.key==="Tab"&&v.preventDefault(),!b&&v.key.length===1&&u(v.key,l()),["ArrowUp","ArrowDown","Home","End"].includes(v.key)){let P=[...l().map(O=>O.ref)];if(["ArrowUp","End"].includes(v.key)&&(P=P.slice().reverse()),["ArrowUp","ArrowDown"].includes(v.key)){const O=v.target,I=P.indexOf(O);P=P.slice(I+1)}setTimeout(()=>xt(P)),v.preventDefault()}}const h=q(()=>n.position==="popper"?n:{}),S=at(h.value);return an({content:a,viewport:p,onViewportChange:v=>{p.value=v},itemRefCallback:(v,b,A)=>{const P=!m.value&&!A,O=Me(r.modelValue.value,b,r.by);if(r.multiple.value){if(y.value)return;(O||P)&&(f.value=v,O&&(y.value=!0))}else(O||P)&&(f.value=v);P&&(m.value=!0)},selectedItem:f,selectedItemText:d,onItemLeave:()=>{var v;(v=a.value)==null||v.focus()},itemTextRefCallback:(v,b,A)=>{const P=!m.value&&!A;(Me(r.modelValue.value,b,r.by)||P)&&(d.value=v)},focusSelectedItem:x,position:n.position,isPositioned:c,searchRef:s}),(v,b)=>($(),L(w(i),null,{default:R(()=>[N(w(wn),{"as-child":"",onMountAutoFocus:b[6]||(b[6]=Oe(()=>{},["prevent"])),onUnmountAutoFocus:b[7]||(b[7]=A=>{var P;o("closeAutoFocus",A),!A.defaultPrevented&&((P=w(r).triggerElement.value)==null||P.focus({preventScroll:!0}),A.preventDefault())})},{default:R(()=>[N(w(xn),{"as-child":"","disable-outside-pointer-events":v.disableOutsidePointerEvents,onFocusOutside:b[2]||(b[2]=Oe(()=>{},["prevent"])),onDismiss:b[3]||(b[3]=A=>w(r).onOpenChange(!1)),onEscapeKeyDown:b[4]||(b[4]=A=>o("escapeKeyDown",A)),onPointerDownOutside:b[5]||(b[5]=A=>o("pointerDownOutside",A))},{default:R(()=>[($(),L(Dn(v.position==="popper"?gr:Cr),ne({...v.$attrs,...w(S)},{id:w(r).contentId,ref:A=>{if(!A)return;const P=w(Ve)(A);P!=null&&P.hasAttribute("data-reka-popper-content-wrapper")?a.value=P.firstElementChild:a.value=P},role:"listbox","data-state":w(r).open.value?"open":"closed",dir:w(r).dir.value,style:{display:"flex",flexDirection:"column",outline:"none"},onContextmenu:b[0]||(b[0]=Oe(()=>{},["prevent"])),onPlaced:b[1]||(b[1]=A=>c.value=!0),onKeydown:C}),{default:R(()=>[V(v.$slots,"default")]),_:3},16,["id","data-state","dir","onKeydown"]))]),_:3},8,["disable-outside-pointer-events"])]),_:3})]),_:3}))}}),wr=yr;const[xr,br]=Ce("SelectItemAlignedPosition");var Sr=k({inheritAttrs:!1,__name:"SelectItemAlignedPosition",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["placed"],setup(e,{emit:t}){const n=e,o=t,{getItems:r}=Te(),i=ve(),l=je(),a=E(!1),s=E(!0),u=E(),{forwardRef:p,currentElement:f}=me(),{viewport:d,selectedItem:c,selectedItemText:m,focusSelectedItem:y}=l;function x(){if(i.triggerElement.value&&i.valueElement.value&&u.value&&f.value&&(d!=null&&d.value)&&(c!=null&&c.value)&&(m!=null&&m.value)){const C=i.triggerElement.value.getBoundingClientRect(),h=f.value.getBoundingClientRect(),S=i.valueElement.value.getBoundingClientRect(),v=m.value.getBoundingClientRect();if(i.dir.value!=="rtl"){const J=v.left-h.left,re=S.left-J,se=C.left-re,ue=C.width+se,Ue=Math.max(ue,h.width),Ye=window.innerWidth-j,Xe=Ct(re,j,Math.max(j,Ye-Ue));u.value.style.minWidth=`${ue}px`,u.value.style.left=`${Xe}px`}else{const J=h.right-v.right,re=window.innerWidth-S.right-J,se=window.innerWidth-C.right-re,ue=C.width+se,Ue=Math.max(ue,h.width),Ye=window.innerWidth-j,Xe=Ct(re,j,Math.max(j,Ye-Ue));u.value.style.minWidth=`${ue}px`,u.value.style.right=`${Xe}px`}const b=r().map(J=>J.ref),A=window.innerHeight-j*2,P=d.value.scrollHeight,O=window.getComputedStyle(f.value),I=Number.parseInt(O.borderTopWidth,10),T=Number.parseInt(O.paddingTop,10),B=Number.parseInt(O.borderBottomWidth,10),D=Number.parseInt(O.paddingBottom,10),z=I+T+P+D+B,F=Math.min(c.value.offsetHeight*5,z),W=window.getComputedStyle(d.value),M=Number.parseInt(W.paddingTop,10),K=Number.parseInt(W.paddingBottom,10),ye=C.top+C.height/2-j,un=A-ye,Ke=c.value.offsetHeight/2,cn=c.value.offsetTop+Ke,$e=I+T+cn,dn=z-$e;if($e<=ye){const J=c.value===b.at(-1);u.value.style.bottom="0px";const re=f.value.clientHeight-d.value.offsetTop-d.value.offsetHeight,se=Math.max(un,Ke+(J?K:0)+re+B),ue=$e+se;u.value.style.height=`${ue}px`}else{const J=c.value===b[0];u.value.style.top="0px";const se=Math.max(ye,I+d.value.offsetTop+(J?M:0)+Ke)+dn;u.value.style.height=`${se}px`,d.value.scrollTop=$e-ye+d.value.offsetTop}u.value.style.margin=`${j}px 0`,u.value.style.minHeight=`${F}px`,u.value.style.maxHeight=`${A}px`,o("placed"),requestAnimationFrame(()=>a.value=!0)}}const _=E("");he(async()=>{await Pe(),x(),f.value&&(_.value=window.getComputedStyle(f.value).zIndex)});function g(C){C&&s.value===!0&&(x(),y==null||y(),s.value=!1)}return bn(i.triggerElement,()=>{x()}),br({contentWrapper:u,shouldExpandOnScrollRef:a,onScrollButtonChange:g}),(C,h)=>($(),Z("div",{ref_key:"contentWrapperElement",ref:u,style:Nt({display:"flex",flexDirection:"column",position:"fixed",zIndex:_.value})},[N(w(Y),ne({ref:w(p),style:{boxSizing:"border-box",maxHeight:"100%"}},{...C.$attrs,...n}),{default:R(()=>[V(C.$slots,"default")]),_:3},16)],4))}}),Cr=Sr,_r=k({inheritAttrs:!1,__name:"SelectProvider",props:{context:{type:Object,required:!0}},setup(e){return ln(e.context),an(vr),(n,o)=>V(n.$slots,"default")}}),Ar=_r;const Pr={key:1};var Or=k({inheritAttrs:!1,__name:"SelectContent",props:{forceMount:{type:Boolean,required:!1},position:{type:String,required:!1},bodyLock:{type:Boolean,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["closeAutoFocus","escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,r=jn(n,t),i=ve(),l=E();he(()=>{l.value=new DocumentFragment});const a=E(),s=q(()=>n.forceMount||i.open.value),u=E(s.value);let p;function f(){p&&(clearTimeout(p),p=void 0)}return de(s,(d,c,m)=>{f(),p=setTimeout(()=>{u.value=s.value,p=void 0}),m(f)}),Ht(f),(d,c)=>{var m;return s.value||u.value||(m=a.value)!=null&&m.present?($(),L(w(Sn),{key:0,ref_key:"presenceRef",ref:a,present:s.value},{default:R(()=>[N(wr,Wt(jt({...w(r),...d.$attrs})),{default:R(()=>[V(d.$slots,"default")]),_:3},16)]),_:3},8,["present"])):l.value?($(),Z("div",Pr,[($(),L(Mn,{to:l.value},[N(Ar,{context:w(i)},{default:R(()=>[V(d.$slots,"default")]),_:3},8,["context"])],8,["to"]))])):Ee("v-if",!0)}}}),Er=Or;const[sn,qr]=Ce("SelectItem");var Rr=k({__name:"SelectItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,{disabled:r}=it(n),i=ve(),l=je(),{forwardRef:a,currentElement:s}=me(),{CollectionItem:u}=Te(),p=q(()=>{var h;return Me((h=i.modelValue)==null?void 0:h.value,n.value,i.by)}),f=E(!1),d=E(n.textValue??""),c=Lt(void 0,"reka-select-item-text"),m="select.select";async function y(h){if(h.defaultPrevented)return;const S={originalEvent:h,value:n.value};Cn(m,x,S)}async function x(h){await Pe(),o("select",h),!h.defaultPrevented&&(r.value||(i.onValueChange(n.value),i.multiple.value||i.onOpenChange(!1)))}async function _(h){var S,v;await Pe(),!h.defaultPrevented&&(r.value?(S=l.onItemLeave)==null||S.call(l):(v=h.currentTarget)==null||v.focus({preventScroll:!0}))}async function g(h){var S;await Pe(),!h.defaultPrevented&&h.currentTarget===Vt()&&((S=l.onItemLeave)==null||S.call(l))}async function C(h){var v;await Pe(),!(h.defaultPrevented||((v=l.searchRef)==null?void 0:v.value)!==""&&h.key===" ")&&(sr.includes(h.key)&&y(h),h.key===" "&&h.preventDefault())}if(n.value==="")throw new Error("A <SelectItem /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return he(()=>{s.value&&l.itemRefCallback(s.value,n.value,n.disabled)}),qr({value:n.value,disabled:r,textId:c,isSelected:p,onItemTextChange:h=>{d.value=((d.value||(h==null?void 0:h.textContent))??"").trim()}}),(h,S)=>($(),L(w(u),{value:{textValue:d.value}},{default:R(()=>[N(w(Y),{ref:w(a),role:"option","aria-labelledby":w(c),"data-highlighted":f.value?"":void 0,"aria-selected":p.value,"data-state":p.value?"checked":"unchecked","aria-disabled":w(r)||void 0,"data-disabled":w(r)?"":void 0,tabindex:w(r)?void 0:-1,as:h.as,"as-child":h.asChild,onFocus:S[0]||(S[0]=v=>f.value=!0),onBlur:S[1]||(S[1]=v=>f.value=!1),onPointerup:y,onPointerdown:S[2]||(S[2]=v=>{v.currentTarget.focus({preventScroll:!0})}),onTouchend:S[3]||(S[3]=Oe(()=>{},["prevent","stop"])),onPointermove:_,onPointerleave:g,onKeydown:C},{default:R(()=>[V(h.$slots,"default")]),_:3},8,["aria-labelledby","data-highlighted","aria-selected","data-state","aria-disabled","data-disabled","tabindex","as","as-child"])]),_:3},8,["value"]))}}),Tr=Rr,$r=k({__name:"SelectItemIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,n=sn();return(o,r)=>w(n).isSelected.value?($(),L(w(Y),ne({key:0,"aria-hidden":"true"},t),{default:R(()=>[V(o.$slots,"default")]),_:3},16)):Ee("v-if",!0)}}),Br=$r,kr=k({inheritAttrs:!1,__name:"SelectItemText",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,n=ve(),o=je(),r=sn(),{forwardRef:i,currentElement:l}=me(),a=q(()=>{var s,u;return{value:r.value,disabled:r.disabled.value,textContent:((s=l.value)==null?void 0:s.textContent)??((u=r.value)==null?void 0:u.toString())??""}});return he(()=>{l.value&&(r.onItemTextChange(l.value),o.itemTextRefCallback(l.value,r.value,r.disabled.value),n.onOptionAdd(a.value))}),Ht(()=>{n.onOptionRemove(a.value)}),(s,u)=>($(),L(w(Y),ne({id:w(r).textId,ref:w(i)},{...t,...s.$attrs}),{default:R(()=>[V(s.$slots,"default")]),_:3},16,["id"]))}}),Ir=kr,Dr=k({__name:"SelectPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>($(),L(w(_n),Wt(jt(t)),{default:R(()=>[V(n.$slots,"default")]),_:3},16))}}),Mr=Dr,Vr=k({__name:"SelectTrigger",props:{disabled:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=ve(),{forwardRef:o,currentElement:r}=me(),i=q(()=>{var d;return((d=n.disabled)==null?void 0:d.value)||t.disabled});n.contentId||(n.contentId=Lt(void 0,"reka-select-content")),he(()=>{n.onTriggerChange(r.value)});const{getItems:l}=Te(),{search:a,handleTypeaheadSearch:s,resetTypeahead:u}=Ut();function p(){i.value||(n.onOpenChange(!0),u())}function f(d){p(),n.triggerPointerDownPosRef.value={x:Math.round(d.pageX),y:Math.round(d.pageY)}}return(d,c)=>($(),L(w(to),{"as-child":"",reference:d.reference},{default:R(()=>{var m,y,x,_;return[N(w(Y),{ref:w(o),role:"combobox",type:d.as==="button"?"button":void 0,"aria-controls":w(n).contentId,"aria-expanded":w(n).open.value||!1,"aria-required":(m=w(n).required)==null?void 0:m.value,"aria-autocomplete":"none",disabled:i.value,dir:(y=w(n))==null?void 0:y.dir.value,"data-state":(x=w(n))!=null&&x.open.value?"open":"closed","data-disabled":i.value?"":void 0,"data-placeholder":w(ur)((_=w(n).modelValue)==null?void 0:_.value)?"":void 0,"as-child":d.asChild,as:d.as,onClick:c[0]||(c[0]=g=>{var C;(C=g==null?void 0:g.currentTarget)==null||C.focus()}),onPointerdown:c[1]||(c[1]=g=>{if(g.pointerType==="touch")return g.preventDefault();const C=g.target;C.hasPointerCapture(g.pointerId)&&C.releasePointerCapture(g.pointerId),g.button===0&&g.ctrlKey===!1&&(f(g),g.preventDefault())}),onPointerup:c[2]||(c[2]=Oe(g=>{g.pointerType==="touch"&&f(g)},["prevent"])),onKeydown:c[3]||(c[3]=g=>{const C=w(a)!=="";!(g.ctrlKey||g.altKey||g.metaKey)&&g.key.length===1&&C&&g.key===" "||(w(s)(g.key,w(l)()),w(ar).includes(g.key)&&(p(),g.preventDefault()))})},{default:R(()=>[V(d.$slots,"default")]),_:3},8,["type","aria-controls","aria-expanded","aria-required","disabled","dir","data-state","data-disabled","data-placeholder","as-child","as"])]}),_:3},8,["reference"]))}}),Lr=Vr,Fr=k({__name:"SelectViewport",props:{nonce:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{nonce:n}=it(t),o=lr(n),r=je(),i=r.position==="item-aligned"?xr():void 0,{forwardRef:l,currentElement:a}=me();he(()=>{r==null||r.onViewportChange(a.value)});const s=E(0);function u(p){const f=p.currentTarget,{shouldExpandOnScrollRef:d,contentWrapper:c}=i??{};if(d!=null&&d.value&&(c!=null&&c.value)){const m=Math.abs(s.value-f.scrollTop);if(m>0){const y=window.innerHeight-j*2,x=Number.parseFloat(c.value.style.minHeight),_=Number.parseFloat(c.value.style.height),g=Math.max(x,_);if(g<y){const C=g+m,h=Math.min(y,C),S=C-h;c.value.style.height=`${h}px`,c.value.style.bottom==="0px"&&(f.scrollTop=S>0?S:0,c.value.style.justifyContent="flex-end")}}}s.value=f.scrollTop}return(p,f)=>($(),Z(lt,null,[N(w(Y),ne({ref:w(l),"data-reka-select-viewport":"",role:"presentation"},{...p.$attrs,...t},{style:{position:"relative",flex:1,overflow:"hidden auto"},onScroll:u}),{default:R(()=>[V(p.$slots,"default")]),_:3},16),N(w(Y),{as:"style",nonce:w(o)},{default:R(()=>f[0]||(f[0]=[Kt(" /* Hide scrollbars cross-browser and enable momentum scroll for touch devices */ [data-reka-select-viewport] { scrollbar-width:none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } [data-reka-select-viewport]::-webkit-scrollbar { display: none; } ")])),_:1,__:[0]},8,["nonce"])],64))}}),Nr=Fr;const zr={class:"selm-value"},Hr={key:0,class:"selm-hint"},Xr=k({__name:"SelectMenu",props:Ln({options:{},label:{},disabled:{type:Boolean},placeholder:{},id:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const t=Vn(e,"modelValue");return(n,o)=>($(),L(w(fr),{modelValue:t.value,"onUpdate:modelValue":o[0]||(o[0]=r=>t.value=r),disabled:e.disabled},{default:R(()=>[N(w(Lr),{id:e.id,class:"selm-trigger","aria-label":e.label},{default:R(()=>{var r;return[xe("span",zr,Ge(((r=e.options.find(i=>i.value===t.value))==null?void 0:r.label)??e.placeholder??"—"),1),o[1]||(o[1]=xe("svg",{viewBox:"0 0 24 24",width:"14",height:"14","aria-hidden":"true",class:"selm-caret"},[xe("path",{d:"m6 9 6 6 6-6",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1))]}),_:1},8,["id","aria-label"]),N(w(Mr),null,{default:R(()=>[N(w(Er),{class:"selm-list",position:"popper","side-offset":6},{default:R(()=>[N(w(Nr),null,{default:R(()=>[($(!0),Z(lt,null,zt(e.options,r=>($(),L(w(Tr),{key:r.value,value:r.value,class:"selm-opt"},{default:R(()=>[N(w(Ir),null,{default:R(()=>[Kt(Ge(r.label),1)]),_:2},1024),r.hint?($(),Z("span",Hr,Ge(r.hint),1)):Ee("",!0),N(w(Br),{class:"selm-tick"},{default:R(()=>[...o[2]||(o[2]=[xe("svg",{viewBox:"0 0 24 24",width:"14",height:"14","aria-hidden":"true"},[xe("path",{d:"m5 13 4 4L19 7",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"})],-1)])]),_:1})]),_:2},1032,["value"]))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue","disabled"]))}});export{Xr as _};
|
|
2
|
-
//# sourceMappingURL=SelectMenu.vue_vue_type_script_setup_true_lang-DKYlHroe.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as z,J as V,A,G as B,c as n,a as s,e as c,w as d,t as o,E as D,u as h,g as m,z as b,F as g,f as l,_ as N,r as I,j as v,k as L,l as R,o as t,V as U,p as E,C as S}from"./index-T3JGe9ku.js";import{s as j,c as $}from"./useFormat-DIlTY5Dl.js";import{_ as q}from"./SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js";import{_ as F}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";const T={class:"page-head"},G={class:"mute",style:{"font-size":"var(--t-sm)"}},H={style:{"font-size":"var(--t-xl)"}},J={class:"sub"},P={key:0},W={key:1},K={key:2},M={key:3,class:"mute"},O={key:1,class:"panel"},Q={class:"banner failed"},X={class:"panel"},Y={key:1,class:"kvlist"},Z={class:"k"},ee={class:"v"},se={key:0},te={key:1,class:"mute"},ne={class:"v"},ae={key:1,class:"mute"},oe={class:"v"},le={class:"v"},ie={key:0,class:"panel"},de={key:0,class:"banner plain"},re={key:1,class:"code"},ue={key:2,class:"mute"},ye=z({__name:"SpecDetailView",props:{name:{}},setup(y){const k=y,a=v(null),r=v(!0),u=v(""),p=v(!1);async function w(){r.value=!0,p.value=!1;const i=await E.getAuthed(`/api/specs/${encodeURIComponent(k.name)}`);if(r.value=!1,i.status===404){p.value=!0;return}if(!i.ok){u.value=S(i,"load this spec");return}u.value="",a.value=i.body}V(()=>k.name,w,{immediate:!0}),V(()=>U.token,w),A.deploymentsLoaded||B();const C=L(()=>A.deployments.filter(i=>i.specName===k.name));return(i,e)=>{var x;const f=R("RouterLink");return t(),n("div",null,[s("div",T,[s("div",null,[s("div",G,[c(f,{to:"/specs"},{default:d(()=>[...e[0]||(e[0]=[l("← specs",-1)])]),_:1})]),s("h1",H,o(y.name),1),s("div",J,[(x=a.value)!=null&&x.description?(t(),n("span",P,o(a.value.description),1)):p.value?(t(),n("span",W,"not found")):r.value?(t(),n("span",K,"loading…")):(t(),n("span",M,"no description"))])]),e[1]||(e[1]=s("span",{class:"grow"},null,-1)),a.value?(t(),n("span",{key:0,class:D(["badge",a.value.kind])},o(h(j)(a.value.kind)),3)):m("",!0)]),u.value?(t(),b(F,{key:0,text:u.value,title:"Could not load this spec."},null,8,["text"])):m("",!0),p.value?(t(),n("section",O,[s("div",Q,[s("b",null,"No spec named “"+o(y.name)+"”.",1),e[2]||(e[2]=s("p",null,"It may have been deleted, or this is an older link.",-1))])])):(t(),n(g,{key:2},[s("section",X,[r.value?(t(),b(q,{key:0,rows:4})):a.value?(t(),n("ul",Y,[s("li",null,[s("span",Z,[e[4]||(e[4]=l(" Needs ",-1)),c(N,{label:"what needs means"},{default:d(()=>[...e[3]||(e[3]=[l(" Variables the spec uses but does not set. Every deployment referencing it supplies these, which is how one spec serves many stacks — and a missing one is refused by name rather than filled in blank. ",-1)])]),_:1})]),s("span",ee,[a.value.requiredVars.length?(t(),n("b",se,o(a.value.requiredVars.join(", ")),1)):(t(),n("span",te,"nothing — every value is fixed by the spec"))])]),s("li",null,[e[6]||(e[6]=s("span",{class:"k"},"Used by",-1)),s("span",ne,[C.value.length?(t(),n(g,{key:0},[(t(!0),n(g,null,I(C.value,_=>(t(),b(f,{key:_.id,to:`/deployments/${encodeURIComponent(_.id)}`,style:{"margin-right":"10px"}},{default:d(()=>[l(o(_.id),1)]),_:2},1032,["to"]))),128)),c(N,{label:"why this matters"},{default:d(()=>[...e[5]||(e[5]=[l(" Deleting a spec while a deployment still references it is refused: that deployment could no longer be resolved, and one that cannot be resolved can never be torn down. ",-1)])]),_:1})],64)):(t(),n("span",ae,"no deployments reference it"))])]),s("li",null,[e[7]||(e[7]=s("span",{class:"k"},"Created",-1)),s("span",oe,o(h($)(a.value.createdAt)),1)]),s("li",null,[e[8]||(e[8]=s("span",{class:"k"},"Updated",-1)),s("span",le,o(h($)(a.value.updatedAt)),1)])])):m("",!0)]),a.value?(t(),n("section",ie,[e[13]||(e[13]=s("div",{class:"phead"},[s("h2",{class:"section"},"Source")],-1)),a.value.sourceWithheld?(t(),n("div",de,[e[12]||(e[12]=s("b",null,"Hidden without an access token.",-1)),s("p",null,[e[10]||(e[10]=l(" A spec's hooks are shell commands, and they often carry a password or an API token inline — so the server does not send the file to an unauthenticated reader. ",-1)),c(f,{to:"/settings"},{default:d(()=>[...e[9]||(e[9]=[l("Add your token",-1)])]),_:1}),e[11]||(e[11]=l(" to see it. ",-1))])])):a.value.source?(t(),n("pre",re,o(a.value.source),1)):(t(),n("p",ue,"The server returned no source for this spec."))])):m("",!0)],64))])}}});export{ye as default};
|
|
2
|
-
//# sourceMappingURL=SpecDetailView-BlHaL1Y8.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as q,A as k,G as L,c as a,a as t,f as l,e as i,w as y,_ as C,z as x,g as f,F as N,i as U,v as T,r as $,t as r,j as p,p as E,C as z,k as V,l as B,o as s,D,E as A,u as R}from"./index-T3JGe9ku.js";import{s as j}from"./useFormat-DIlTY5Dl.js";import{_ as F}from"./SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js";import{_ as I}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";import{_ as M}from"./RelativeTime.vue_vue_type_script_setup_true_lang-D4NO-r5D.js";import{E as P}from"./EquivalentCommand-DX5xFW-p.js";import{_ as G}from"./RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const K={class:"page-head"},W={class:"sub"},H={key:1,class:"panel"},J={key:2,class:"panel"},O={class:"field",style:{"max-width":"320px","margin-bottom":"var(--s4)"}},Q={class:"cards","data-testid":"specs.list"},X={class:"stagger"},Y={class:"name","data-label":"name"},Z={key:0,class:"mute",style:{"font-size":"var(--t-sm)"}},ee={"data-label":"kind"},te={"data-label":"needs"},se={key:0},ne={key:1,class:"mute"},oe={"data-label":"used by"},ae={key:0},le={key:1,class:"mute"},ie={class:"dim nowrap","data-label":"updated"},re={key:0},de={colspan:"5",class:"mute"},pe={key:2,class:"banner plain"},we=q({__name:"SpecsView",setup(ue){const u=p([]),v=p(!1),m=p(""),h=p(!1),c=p("");async function b(){const o=await E.get("/api/specs");if(v.value=!0,o.status===404){h.value=!0;return}if(!o.ok){m.value=z(o,"load specs");return}m.value="",u.value=o.body.specs??[]}b(),k.deploymentsLoaded||L();const _=V(()=>{const o=new Map;for(const e of k.deployments){if(!e.specName)continue;const d=o.get(e.specName)??[];d.push(e.id),o.set(e.specName,d)}return o}),w=V(()=>{const o=c.value.trim().toLowerCase();return o?u.value.filter(e=>e.name.toLowerCase().includes(o)||(e.description??"").toLowerCase().includes(o)):u.value});return(o,e)=>{const d=B("RouterLink");return s(),a("div",null,[t("div",K,[t("div",null,[e[3]||(e[3]=t("h1",null,"Specs",-1)),t("div",W,[e[2]||(e[2]=l(" Stored once, used by any number of deployments ",-1)),i(C,{label:"why store a spec"},{default:y(()=>[...e[1]||(e[1]=[l(" Without this, every deployment carries its own copy — 50 open pull requests meant 50 identical files, and fixing a teardown step meant re-submitting it 50 times. ",-1)])]),_:1})])]),e[4]||(e[4]=t("span",{class:"grow"},null,-1)),i(G,{run:b})]),m.value?(s(),x(I,{key:0,text:m.value,title:"Could not load the specs."},null,8,["text"])):f("",!0),h.value?(s(),a("section",H,[...e[5]||(e[5]=[t("div",{class:"banner plain"},[t("b",null,"This server has no stored specs."),t("p",null," It is an older build of pstack — every deployment carries its own copy of its spec, which still works. Upgrade the host to store specs and reference them by name. ")],-1)])])):(s(),a("section",J,[v.value?u.value.length?(s(),a(N,{key:1},[t("div",O,[e[6]||(e[6]=t("label",{for:"q"},"Search",-1)),U(t("input",{id:"q","onUpdate:modelValue":e[0]||(e[0]=n=>c.value=n),type:"search",placeholder:"name or description"},null,512),[[T,c.value]])]),t("table",Q,[t("thead",null,[t("tr",null,[e[9]||(e[9]=t("th",null,"Name",-1)),e[10]||(e[10]=t("th",null,"Kind",-1)),t("th",null,[e[8]||(e[8]=l(" needs ",-1)),i(C,{label:"what needs means"},{default:y(()=>[...e[7]||(e[7]=[l(" Variables the spec uses but does not set. Every deployment referencing it must supply these, which is how one spec serves many stacks. ",-1)])]),_:1})]),e[11]||(e[11]=t("th",null,"Used by",-1)),e[12]||(e[12]=t("th",null,"Updated",-1))])]),t("tbody",X,[(s(!0),a(N,null,$(w.value,(n,S)=>{var g;return s(),a("tr",{key:n.name,style:D({"--i":S})},[t("td",Y,[i(d,{to:`/specs/${encodeURIComponent(n.name)}`},{default:y(()=>[l(r(n.name),1)]),_:2},1032,["to"]),n.description?(s(),a("div",Z,r(n.description),1)):f("",!0)]),t("td",ee,[t("span",{class:A(["badge",n.kind])},r(R(j)(n.kind)),3)]),t("td",te,[n.requiredVars.length?(s(),a("span",se,r(n.requiredVars.join(", ")),1)):(s(),a("span",ne,"nothing"))]),t("td",oe,[(g=_.value.get(n.name))!=null&&g.length?(s(),a("span",ae,r(_.value.get(n.name).length)+" deployment(s) ",1)):(s(),a("span",le,"nothing yet"))]),t("td",ie,[i(M,{at:n.updatedAt},null,8,["at"])])],4)}),128)),w.value.length?f("",!0):(s(),a("tr",re,[t("td",de,"No spec matches “"+r(c.value)+"”.",1)]))])])],64)):(s(),a("div",pe,[e[16]||(e[16]=t("b",null,"No specs stored yet.",-1)),t("p",null,[e[14]||(e[14]=l(" A deployment can carry its own spec inline — see ",-1)),i(d,{to:"/submit"},{default:y(()=>[...e[13]||(e[13]=[l("Submit",-1)])]),_:1}),e[15]||(e[15]=l(" — and that is all you need for a one-off. Storing one here pays off when several deployments share it. ",-1))]),e[17]||(e[17]=t("p",{class:"mute"},"This page cannot store one yet — the command below does.",-1)),i(P,{what:"storing a spec",method:"PUT",path:"/api/specs/my-spec",body:{spec:"…the contents of your preview.yml…"},cli:"pstack validate -f preview.yml # then PUT it with the curl above"})])):(s(),x(F,{key:0,rows:3}))]))])}}});export{we as default};
|
|
2
|
-
//# sourceMappingURL=SpecsView-C-bS2Av2.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s}from"./useFormat-DIlTY5Dl.js";import{d as t,c as n,E as o,a as r,f as c,t as l,u as m,o as p}from"./index-T3JGe9ku.js";const u=t({__name:"StateBadge",props:{state:{}},setup(e){return(d,a)=>(p(),n("span",{class:o(["badge",e.state])},[a[0]||(a[0]=r("span",{class:"dot"},null,-1)),c(" "+l(m(s)(e.state)),1)],2))}});export{u as _};
|
|
2
|
-
//# sourceMappingURL=StateBadge.vue_vue_type_script_setup_true_lang-C-7EQXcg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StateBadge.vue_vue_type_script_setup_true_lang-C-7EQXcg.js","sources":["../../src/components/StateBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The job states, and only these. Kept in one component so the colour of `leaked` can never drift\n * from the colour of `failed` in one view and not another:\n *\n * ok green · failed red · leaked AMBER · running blue, pulsing · cancelled grey\n *\n * `cancelled` is deliberately quiet: someone meant to stop it, so it is not an alarm — but it is\n * not `ok` either, because whatever the job had already done was left exactly as it was.\n *\n * `leaked` must be unmistakably distinct from `failed`. They are different problems with different\n * owners — \"teardown errored\" versus \"teardown ran and something survived\" — which is why the CLI\n * gives leaked its own exit code, and why this app never renders them in the same colour.\n */\nimport type { JobState } from '../api/types';\nimport { sentence } from '../composables/useFormat';\n\ndefineProps<{ state: JobState }>();\n</script>\n\n<template>\n <span class=\"badge\" :class=\"state\">\n <span class=\"dot\" />\n {{ sentence(state) }}\n </span>\n</template>\n"],"names":["_createElementBlock","_normalizeClass","__props","_createElementVNode","_toDisplayString","_unref","sentence"],"mappings":"2MAqBEA,EAGO,OAAA,CAHD,MAAKC,EAAA,CAAC,QAAgBC,EAAA,KAAK,CAAA,CAAA,eAC/BC,EAAoB,OAAA,CAAd,MAAM,KAAA,EAAK,KAAA,EAAA,KAAG,IACpBC,EAAGC,EAAAC,CAAA,EAASJ,EAAA,KAAK,CAAA,EAAA,CAAA,CAAA"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as U,x as E,M as H,c as o,a as e,f as r,e as c,w as k,_ as F,z as w,g as i,t as l,F as y,r as N,j as u,O as S,o as s,D as I,E as D,u as g,p as V,C as P}from"./index-T3JGe9ku.js";import{s as _}from"./useFormat-DIlTY5Dl.js";import{_ as W}from"./ActionButton.vue_vue_type_script_setup_true_lang-C6PZurL0.js";import{_ as A}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";import{_ as M}from"./HelpModal.vue_vue_type_script_setup_true_lang-ErbSSi6D.js";import{_ as q}from"./RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js";import{_ as z}from"./SelectMenu.vue_vue_type_script_setup_true_lang-DKYlHroe.js";import{_ as G}from"./SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js";import"./Teleport-CKfsIrp8.js";const L={class:"page-head"},J={class:"sub"},K={key:2,class:"panel"},Q={class:"phead"},X={key:0,class:"mute",style:{"font-size":"var(--t-sm)"}},Y={class:"mono"},Z={key:0,class:"banner warn"},ee={key:1,class:"banner plain"},te={key:0,class:"banner warn"},ae={class:"mono"},se={key:1,class:"cards"},oe={class:"stagger"},ne={class:"name","data-label":"hostname"},le={key:0,class:"badge info",title:"the node this control plane runs on"},re={"data-label":"role"},ie={key:0,class:"mute",style:{"font-size":"var(--t-sm)"}},de={"data-label":"status"},ue={"data-label":"availability"},me={"data-label":"engine",class:"mono"},ve={"data-label":"id",class:"mono mute"},he={key:2,class:"mute"},ce={key:3,class:"panel"},pe={class:"kvlist",style:{"margin-bottom":"var(--s4)"}},be={class:"k mono"},fe={class:"v mute"},ke={class:"row",style:{"flex-wrap":"wrap",gap:"var(--s3)","align-items":"flex-end"}},we={class:"field inline"},ye={key:0,class:"field inline"},ge={class:"mute",style:{"font-size":"var(--t-sm)"}},_e={key:1,class:"banner leaked",style:{"margin-top":"var(--s3)"}},xe={class:"code",style:{"white-space":"pre-wrap","word-break":"break-all","max-height":"50vh",overflow:"auto"}},je={class:"row"},Oe=U({__name:"SwarmView",setup(Te){const n=u(null),p=u(""),x=u(!1);async function j(){const d=await V.get("/api/swarm");if(x.value=!0,!d.ok){p.value=P(d,"read the swarm");return}p.value="",n.value={...d.body,nodes:d.body.nodes??[],ports:d.body.ports??[]}}E(j,1e4);const v=u("command"),f=u("ubuntu"),m=u(""),b=u(!1),h=u(""),T=[{value:"command",label:"docker swarm join …",blurb:"One line, for a machine that already runs Docker."},{value:"script",label:"Shell script",blurb:"Installs Docker if missing (get.docker.com), then joins."},{value:"cloud-config",label:"cloud-config",blurb:"User-data for a fresh cloud machine: Docker from the distro, then join."},{value:"token",label:"Token only",blurb:"The bare join token, for your own tooling."}];async function B(){b.value=!0,h.value="",m.value="";const d=`format=${v.value}${v.value==="cloud-config"?`&distro=${encodeURIComponent(f.value)}`:""}`,t=await V.getText(`/api/swarm/join?${d}`);if(b.value=!1,t.status===403){h.value="The join token is admin-only. Sign in as an admin, or use the machine token.";return}if(t.status===409){h.value="This host is not a swarm manager, so there is nothing to join. Nothing was revealed.";return}if(!t.ok){h.value=t.text||`HTTP ${t.status}`;return}m.value=t.text}async function O(){try{await navigator.clipboard.writeText(m.value),S("ok","Copied.")}catch{S("error","Could not reach the clipboard — select the text and copy it.")}}return H(()=>{m.value=""}),(d,t)=>{var C,$;return s(),o("div",null,[e("div",L,[e("div",null,[e("h1",null,[t[4]||(t[4]=r(" Swarm ",-1)),c(M,{title:"How swarm mode works"},{default:k(()=>[...t[3]||(t[3]=[e("p",null,[e("b",null,"This host is the manager."),r(" Previews deploy as swarm stacks — the compose file you submit is converted on every deploy (profiles resolved, "),e("code",null,"restart"),r(" and limits moved under "),e("code",null,"deploy"),r(", Traefik labels onto the service) — and their tasks run on whichever node has room. ")],-1),e("p",null,[e("b",null,"A worker is one command away."),r(" Open the ports below between the machines, run the join material on the new one, and it appears in this table. Nothing else on this host changes: the control plane stays here, the axes and the leak gate never cared which node a container landed on. ")],-1),e("p",null,[e("b",null,"What a worker cannot do."),r(" A shell and stop/start reach only tasks on this node (docker's verbs are node-local); logs reach every node through the manager. A volume a task creates on a worker stays there when the stack is torn down — use named volumes only for data you can lose, and an axis for data you cannot. ")],-1)])]),_:1})]),e("div",J,[t[6]||(t[6]=r(" The nodes previews run on, and how to add one ",-1)),c(F,{label:"where this comes from"},{default:k(()=>[...t[5]||(t[5]=[e("code",null,"docker node ls",-1),r(" on this host, every ten seconds. Nothing is stored — a node that leaves disappears from here the moment docker stops listing it. ",-1)])]),_:1})])]),t[7]||(t[7]=e("span",{class:"grow"},null,-1)),c(q,{run:j})]),p.value?(s(),w(A,{key:0,text:p.value,title:"Could not read the swarm."},null,8,["text"])):i("",!0),!x.value&&!p.value?(s(),w(G,{key:1,rows:4})):n.value?(s(),o("section",K,[e("div",Q,[t[9]||(t[9]=e("h2",{class:"section"},"Nodes",-1)),t[10]||(t[10]=e("span",{class:"grow"},null,-1)),n.value.active&&n.value.managerAddr?(s(),o("span",X,[t[8]||(t[8]=r(" manager ",-1)),e("span",Y,l(n.value.managerAddr),1)])):i("",!0)]),n.value.reachable?n.value.active?(s(),o(y,{key:2},[n.value.error?(s(),o("div",te,[t[13]||(t[13]=e("b",null,"Docker reported a problem.",-1)),e("p",ae,l(n.value.error),1)])):i("",!0),n.value.nodes.length?(s(),o("table",se,[t[14]||(t[14]=e("thead",null,[e("tr",null,[e("th",null,"Hostname"),e("th",null,"Role"),e("th",null,"Status"),e("th",null,"Availability"),e("th",null,"Engine"),e("th",null,"Id")])],-1)),e("tbody",oe,[(s(!0),o(y,null,N(n.value.nodes,(a,R)=>(s(),o("tr",{key:a.id,style:I({"--i":R})},[e("td",ne,[r(l(a.hostname||"—")+" ",1),a.self?(s(),o("span",le,"this node")):i("",!0)]),e("td",re,[e("span",{class:D(["badge",a.role==="manager"?"isolated":""])},l(g(_)(a.role)),3),a.managerStatus?(s(),o("span",ie,l(a.managerStatus),1)):i("",!0)]),e("td",de,[e("span",{class:D(a.status==="ready"?"s-ok":"s-failed")},l(g(_)(a.status)),3)]),e("td",ue,l(g(_)(a.availability||"unknown")),1),e("td",me,l(a.engineVersion||"—"),1),e("td",ve,l(a.id.slice(0,12)),1)],4))),128))])])):(s(),o("p",he,"Docker lists no nodes — on a manager that should at least be this one."))],64)):(s(),o("div",ee,[t[12]||(t[12]=e("b",null,"Not a swarm manager.",-1)),e("p",null,l(n.value.note),1)])):(s(),o("div",Z,[...t[11]||(t[11]=[e("b",null,"Docker did not answer.",-1),e("p",null,"Nothing about the swarm is known right now — which is not the same as there being no swarm.",-1)])]))])):i("",!0),(C=n.value)!=null&&C.active?(s(),o("section",ce,[t[20]||(t[20]=e("div",{class:"phead"},[e("h2",{class:"section"},"Add a worker")],-1)),t[21]||(t[21]=e("p",{class:"dim"}," Open these between the new machine and every other node first — a worker that cannot reach them joins and then never receives a task. ",-1)),e("ul",pe,[(s(!0),o(y,null,N(n.value.ports,a=>(s(),o("li",{key:a.port},[e("span",be,l(a.port),1),e("span",fe,l(a.why),1)]))),128))]),e("div",ke,[e("div",we,[t[15]||(t[15]=e("label",{for:"join-format"},"Give me",-1)),c(z,{id:"join-format","model-value":v.value,label:"What to reveal",options:T.map(a=>({value:a.value,label:a.label})),"onUpdate:modelValue":t[0]||(t[0]=a=>v.value=a)},null,8,["model-value","options"])]),v.value==="cloud-config"?(s(),o("div",ye,[t[16]||(t[16]=e("label",{for:"join-distro"},"Distro",-1)),c(z,{id:"join-distro",modelValue:f.value,"onUpdate:modelValue":t[1]||(t[1]=a=>f.value=a),label:"Which Docker install steps",options:["ubuntu","debian","fedora","suse","arch","alpine"].map(a=>({value:a,label:a}))},null,8,["modelValue","options"])])):i("",!0),c(W,{variant:"primary",pending:b.value,disabled:b.value,onClick:B},{default:k(()=>[...t[17]||(t[17]=[r(" Reveal ",-1)])]),_:1},8,["pending","disabled"]),e("span",ge,l(($=T.find(a=>a.value===v.value))==null?void 0:$.blurb),1)]),h.value?(s(),w(A,{key:0,text:h.value,title:"Nothing was revealed."},null,8,["text"])):i("",!0),m.value?(s(),o("div",_e,[t[18]||(t[18]=e("b",null,"This is a secret — whoever has it can add a node that runs any task here.",-1)),t[19]||(t[19]=e("p",null,[r(" Shown once; it is not stored in this page and is forgotten when you leave. Rotate it on the manager with "),e("code",null,"docker swarm join-token --rotate worker"),r(" if it leaks. ")],-1)),e("pre",xe,l(m.value),1),e("div",je,[e("button",{onClick:O},"Copy"),e("button",{onClick:t[2]||(t[2]=a=>m.value="")},"Hide")])])):i("",!0)])):i("",!0)])}}});export{Oe as default};
|
|
2
|
-
//# sourceMappingURL=SwarmView-skNbhHws.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{ad as be,ag as Ee,ap as Oe,a9 as E,M as we,aq as re,aa as x,a8 as F,ar as Se,J as P,R as se,aj as Ae,ak as Pe,j as b,k as w,K as Ce,u as D,a0 as I,F as De,as as Te,ab as _e,at as Le,au as Ie,a6 as ie,av as Me,d as B,a1 as Fe,ae as $,aw as Ne,a2 as xe,ax as Be,o as Y,z as J,w as ae,$ as X,D as ke,W as ue,am as Re,g as je}from"./index-T3JGe9ku.js";function $e(e,t){const n=typeof e=="string"&&!t?`${e}Context`:t,o=Symbol(n);return[u=>{const a=be(o,u);if(a||a===null)return a;throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},u=>(Ee(o,u),u)]}function T(){let e=document.activeElement;if(e==null)return null;for(;e!=null&&e.shadowRoot!=null&&e.shadowRoot.activeElement!=null;)e=e.shadowRoot.activeElement;return e}function le(e,t,n){const o=n.originalEvent.target,s=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(s)}function Ue(e){return e==null}function Tt(e,t){var n;const o=se();return F(()=>{o.value=e()},{...t,flush:(n=t==null?void 0:t.flush)!==null&&n!==void 0?n:"sync"}),Se(o)}function Q(e,t){return Ae()?(Pe(e,t),!0):!1}function We(e){let t=!1,n;const o=re(!0);return((...s)=>(t||(n=o.run(()=>e(...s)),t=!0),n))}const _=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ke=e=>typeof e<"u",qe=Object.prototype.toString,ze=e=>qe.call(e)==="[object Object]",ee=He();function He(){var e,t,n;return _&&!!(!((e=window)===null||e===void 0||(e=e.navigator)===null||e===void 0)&&e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window)===null||t===void 0||(t=t.navigator)===null||t===void 0?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test((n=window)===null||n===void 0?void 0:n.navigator.userAgent))}function K(e){return Array.isArray(e)?e:[e]}function Ve(e){return x()}function Ge(e){if(!_)return e;let t=0,n,o;const s=()=>{t-=1,o&&t<=0&&(o.stop(),n=void 0,o=void 0)};return((...r)=>(t+=1,o||(o=re(!0),n=o.run(()=>e(...r))),Q(s),n))}function _t(e,t=1e4){return Oe((n,o)=>{let s=E(e),r;const u=()=>setTimeout(()=>{s=E(e),o()},E(t));return Q(()=>{clearTimeout(r)}),{get(){return n(),s},set(a){s=a,o(),clearTimeout(r),r=u()}}})}function Ye(e,t){Ve()&&we(e,t)}function Je(e,t,n){return P(e,t,{...n,immediate:!0})}const U=_?window:void 0;function N(e){var t;const n=E(e);return(t=n==null?void 0:n.$el)!==null&&t!==void 0?t:n}function ce(...e){const t=(o,s,r,u)=>(o.addEventListener(s,r,u),()=>o.removeEventListener(s,r,u)),n=w(()=>{const o=K(E(e[0])).filter(s=>s!=null);return o.every(s=>typeof s!="string")?o:void 0});return Je(()=>{var o,s;return[(o=(s=n.value)===null||s===void 0?void 0:s.map(r=>N(r)))!==null&&o!==void 0?o:[U].filter(r=>r!=null),K(E(n.value?e[1]:e[0])),K(D(n.value?e[2]:e[1])),E(n.value?e[3]:e[2])]},([o,s,r,u],a,f)=>{if(!(o!=null&&o.length)||!(s!=null&&s.length)||!(r!=null&&r.length))return;const v=ze(u)?{...u}:u,l=o.flatMap(i=>s.flatMap(c=>r.map(d=>t(i,c,d,v))));f(()=>{l.forEach(i=>i())})},{flush:"post"})}function de(){const e=se(!1),t=x();return t&&Ce(()=>{e.value=!0},t),e}function Xe(e){const t=de();return w(()=>(t.value,!!e()))}function Qe(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Ze(...e){let t,n,o={};e.length===3?(t=e[0],n=e[1],o=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],o=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=U,eventName:r="keydown",passive:u=!1,dedupe:a=!1}=o,f=Qe(t);return ce(s,r,l=>{l.repeat&&E(a)||f(l)&&n(l)},u)}function et(e){return JSON.parse(JSON.stringify(e))}function Lt(e,t,n={}){const{window:o=U,...s}=n;let r;const u=Xe(()=>o&&"ResizeObserver"in o),a=()=>{r&&(r.disconnect(),r=void 0)},f=P(w(()=>{const l=E(e);return Array.isArray(l)?l.map(i=>N(i)):[N(l)]}),l=>{if(a(),u.value&&o){r=new ResizeObserver(t);for(const i of l)i&&r.observe(i,s)}},{immediate:!0,flush:"post"}),v=()=>{a(),f()};return Q(v),{isSupported:u,stop:v}}function It(e,t,n,o={}){var s,r;const{clone:u=!1,passive:a=!1,eventName:f,deep:v=!1,defaultValue:l,shouldEmit:i}=o,c=x(),d=n||(c==null?void 0:c.emit)||(c==null||(s=c.$emit)===null||s===void 0?void 0:s.bind(c))||(c==null||(r=c.proxy)===null||r===void 0||(r=r.$emit)===null||r===void 0?void 0:r.bind(c==null?void 0:c.proxy));let y=f;t||(t="modelValue"),y=y||`update:${t.toString()}`;const h=p=>u?typeof u=="function"?u(p):et(p):p,g=()=>Ke(e[t])?h(e[t]):l,m=p=>{i?i(p)&&d(y,p):d(y,p)};if(a){const p=b(g());let S=!1;return P(()=>e[t],A=>{S||(S=!0,p.value=h(A),I(()=>S=!1))}),P(p,A=>{!S&&(A!==e[t]||v)&&m(A)},{deep:v}),p}else return w({get(){return g()},set(p){m(p)}})}function Z(e){return e?e.flatMap(t=>t.type===De?Z(t.children):[t]):[]}const[fe]=$e("ConfigProvider");function q(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function G(e,t,n=".",o){if(!q(t))return G(e,{},n,o);const s={...t};for(const r of Object.keys(e)){if(r==="__proto__"||r==="constructor")continue;const u=e[r];u!=null&&(o&&o(s,r,u,n)||(Array.isArray(u)&&Array.isArray(s[r])?s[r]=[...u,...s[r]]:q(u)&&q(s[r])?s[r]=G(u,s[r],(n?`${n}.`:"")+r.toString(),o):s[r]=u))}return s}function tt(e){return(...t)=>t.reduce((n,o)=>G(n,o,"",e),{})}const nt=tt(),ot=Ge(()=>{const e=b(new Map),t=b(),n=w(()=>{for(const u of e.value.values())if(u)return!0;return!1}),o=fe({scrollBody:b(!0)});let s=null;const r=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.documentElement.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",ee&&(s==null||s()),t.value=void 0};return P(n,(u,a)=>{var i;if(!_)return;if(!u){a&&r();return}t.value===void 0&&(t.value=document.body.style.overflow);const f=window.innerWidth-document.documentElement.clientWidth,v={padding:f,margin:0},l=(i=o.scrollBody)!=null&&i.value?typeof o.scrollBody.value=="object"?nt({padding:o.scrollBody.value.padding===!0?f:o.scrollBody.value.padding,margin:o.scrollBody.value.margin===!0?f:o.scrollBody.value.margin},v):v:{padding:0,margin:0};f>0&&(document.body.style.paddingRight=typeof l.padding=="number"?`${l.padding}px`:String(l.padding),document.body.style.marginRight=typeof l.margin=="number"?`${l.margin}px`:String(l.margin),document.documentElement.style.setProperty("--scrollbar-width",`${f}px`),document.body.style.overflow="hidden"),ee&&(s=ce(document,"touchmove",c=>rt(c),{passive:!1})),I(()=>{n.value&&(document.body.style.pointerEvents="none",document.body.style.overflow="hidden")})},{immediate:!0,flush:"sync"}),e});function Mt(e){const t=Math.random().toString(36).substring(2,7),n=ot();n.value.set(t,e??!1);const o=w({get:()=>n.value.get(t)??!1,set:s=>n.value.set(t,s)});return Ye(()=>{n.value.delete(t)}),o}function ve(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth<e.scrollWidth||t.overflowY==="auto"&&e.clientHeight<e.scrollHeight)return!0;{const n=e.parentNode;return!(n instanceof Element)||n.tagName==="BODY"?!1:ve(n)}}function rt(e){const t=e||window.event,n=t.target;return n instanceof Element&&ve(n)?!1:t.touches.length>1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}function Ft(e){const t=x(),n=t==null?void 0:t.type.emits,o={};return n!=null&&n.length||console.warn(`No emitted event found. Please check component: ${t==null?void 0:t.type.__name}`),n==null||n.forEach(s=>{o[Te(_e(s))]=(...r)=>e(s,...r)}),o}function pe(){const e=x(),t=b(),n=w(()=>o());Le(()=>{n.value!==o()&&Ie(t)});function o(){return t.value&&"$el"in t.value&&["#text","#comment"].includes(t.value.$el.nodeName)?t.value.$el.nextElementSibling:N(t)}const s=Object.assign({},e.exposed),r={};for(const a in e.props)Object.defineProperty(r,a,{enumerable:!0,configurable:!0,get:()=>e.props[a]});if(Object.keys(s).length>0)for(const a in s)Object.defineProperty(r,a,{enumerable:!0,configurable:!0,get:()=>s[a]});Object.defineProperty(r,"$el",{enumerable:!0,configurable:!0,get:()=>e.vnode.el}),e.exposed=r;function u(a){if(t.value=a,!!a&&(Object.defineProperty(r,"$el",{enumerable:!0,configurable:!0,get:()=>a instanceof Element?a:a.$el}),!(a instanceof Element)&&!Object.hasOwn(a,"$el"))){const f=a.$.exposed,v=Object.assign({},r);for(const l in f)Object.defineProperty(v,l,{enumerable:!0,configurable:!0,get:()=>f[l]});e.exposed=v}}return{forwardRef:u,currentRef:t,currentElement:n}}var st=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},M=new WeakMap,k=new WeakMap,R={},z=0,me=function(e){return e&&(e.host||me(e.parentNode))},it=function(e,t){return t.map(function(n){if(e.contains(n))return n;var o=me(n);return o&&e.contains(o)?o:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},at=function(e,t,n,o){var s=it(t,Array.isArray(e)?e:[e]);R[n]||(R[n]=new WeakMap);var r=R[n],u=[],a=new Set,f=new Set(s),v=function(i){!i||a.has(i)||(a.add(i),v(i.parentNode))};s.forEach(v);var l=function(i){!i||f.has(i)||Array.prototype.forEach.call(i.children,function(c){if(a.has(c))l(c);else try{var d=c.getAttribute(o),y=d!==null&&d!=="false",h=(M.get(c)||0)+1,g=(r.get(c)||0)+1;M.set(c,h),r.set(c,g),u.push(c),h===1&&y&&k.set(c,!0),g===1&&c.setAttribute(n,"true"),y||c.setAttribute(o,"true")}catch(m){console.error("aria-hidden: cannot operate on ",c,m)}})};return l(t),a.clear(),z++,function(){u.forEach(function(i){var c=M.get(i)-1,d=r.get(i)-1;M.set(i,c),r.set(i,d),c||(k.has(i)||i.removeAttribute(o),k.delete(i)),d||i.removeAttribute(n)}),z--,z||(M=new WeakMap,M=new WeakMap,k=new WeakMap,R={})}},ut=function(e,t,n){n===void 0&&(n="data-aria-hidden");var o=Array.from(Array.isArray(e)?e:[e]),s=st(e);return s?(o.push.apply(o,Array.from(s.querySelectorAll("[aria-live], script"))),at(o,s,n,"aria-hidden")):function(){return null}};function Nt(e){let t;P(()=>N(e),n=>{let o=!1;try{o=!!(n!=null&&n.closest("[popover]:not(:popover-open)"))}catch{}n&&!o?t=ut(n):t&&t()}),ie(()=>{t&&t()})}function xt(e,t="reka"){var s;let n;const o=fe({useId:void 0});return o.useId?n=o.useId():n=(s=Me)==null?void 0:s(),t?`${t}-${n}`:n}function lt(e,t){const n=b(e);function o(r){return t[n.value][r]??n.value}return{state:n,dispatch:r=>{n.value=o(r)}}}function ct(e,t){var g;const n=b({}),o=b("none"),s=b(e),r=e.value?"mounted":"unmounted";let u;const a=((g=t.value)==null?void 0:g.ownerDocument.defaultView)??U,{state:f,dispatch:v}=lt(r,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),l=m=>{var p;if(_){const S=new CustomEvent(m,{bubbles:!1,cancelable:!1});(p=t.value)==null||p.dispatchEvent(S)}};P(e,async(m,p)=>{var A;const S=p!==m;if(await I(),S){const W=o.value,L=j(t.value);m?(v("MOUNT"),l("enter"),L==="none"&&l("after-enter")):L==="none"||L==="undefined"||((A=n.value)==null?void 0:A.display)==="none"?(v("UNMOUNT"),l("leave"),l("after-leave")):p&&W!==L?(v("ANIMATION_OUT"),l("leave")):(v("UNMOUNT"),l("after-leave"))}},{immediate:!0});const i=m=>{const p=j(t.value),S=p.includes(CSS.escape(m.animationName)),A=f.value==="mounted"?"enter":"leave";if(m.target===t.value&&S&&(l(`after-${A}`),v("ANIMATION_END"),!s.value)){const W=t.value.style.animationFillMode;t.value.style.animationFillMode="forwards",u=a==null?void 0:a.setTimeout(()=>{var L;((L=t.value)==null?void 0:L.style.animationFillMode)==="forwards"&&(t.value.style.animationFillMode=W)})}m.target===t.value&&p==="none"&&v("ANIMATION_END")},c=m=>{m.target===t.value&&(o.value=j(t.value))},d=P(t,(m,p)=>{m?(n.value=getComputedStyle(m),m.addEventListener("animationstart",c),m.addEventListener("animationcancel",i),m.addEventListener("animationend",i)):(v("ANIMATION_END"),u!==void 0&&(a==null||a.clearTimeout(u)),p==null||p.removeEventListener("animationstart",c),p==null||p.removeEventListener("animationcancel",i),p==null||p.removeEventListener("animationend",i))},{immediate:!0}),y=P(f,()=>{const m=j(t.value);o.value=f.value==="mounted"?m:"none"});return ie(()=>{d(),y()}),{isPresent:w(()=>["mounted","unmountSuspended"].includes(f.value))}}function j(e){return e&&getComputedStyle(e).animationName||"none"}var Bt=B({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(e,{slots:t,expose:n}){var v;const{present:o,forceMount:s}=Fe(e),r=b(),{isPresent:u}=ct(o,r);n({present:u});let a=t.default({present:u.value});a=Z(a||[]);const f=x();if(a&&(a==null?void 0:a.length)>1){const l=(v=f==null?void 0:f.parent)!=null&&v.type.name?`<${f.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${l}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(i=>` - ${i}`).join(`
|
|
2
|
-
`)].join(`
|
|
3
|
-
`))}return()=>s.value||o.value||u.value?$(t.default({present:u.value})[0],{ref:l=>{const i=N(l);return typeof(i==null?void 0:i.hasAttribute)>"u"||(i!=null&&i.hasAttribute("data-reka-popper-content-wrapper")?r.value=i.firstElementChild:r.value=i),i}}):null}});const dt=B({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{var f;if(!n.default)return null;const o=Z(n.default()),s=o.findIndex(v=>v.type!==Ne);if(s===-1)return o;const r=o[s];(f=r.props)==null||delete f.ref;const u=r.props?xe(t,r.props):t,a=Be({...r,props:{}},u);return o.length===1?a:(o[s]=a,o)}}}),ft=["area","img","input"],ye=B({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:n}){const o=e.asChild?"template":e.as;return typeof o=="string"&&ft.includes(o)?()=>$(o,t):o!=="template"?()=>$(e.as,t,{default:n.default}):()=>$(dt,t,{default:n.default})}}),vt="dismissableLayer.pointerDownOutside",pt="dismissableLayer.focusOutside";function he(e,t){if(!(t instanceof Element))return!1;const n=t.closest("[data-dismissable-layer]"),o=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),s=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&(o===n||s.indexOf(o)<s.indexOf(n)))}function mt(e,t,n=!0){var u;const o=((u=t==null?void 0:t.value)==null?void 0:u.ownerDocument)??(globalThis==null?void 0:globalThis.document),s=b(!1),r=b(()=>{});return F(a=>{if(!_||!E(n))return;const f=async l=>{const i=l.target;if(!(!(t!=null&&t.value)||!i)){if(he(t.value,i)){s.value=!1;return}if(l.target&&!s.value){let d=function(){le(vt,e,c)};const c={originalEvent:l};l.pointerType==="touch"?(o.removeEventListener("click",r.value),r.value=d,o.addEventListener("click",r.value,{once:!0})):d()}else o.removeEventListener("click",r.value);s.value=!1}},v=window.setTimeout(()=>{o.addEventListener("pointerdown",f)},0);a(()=>{window.clearTimeout(v),o.removeEventListener("pointerdown",f),o.removeEventListener("click",r.value)})}),{onPointerDownCapture:()=>{E(n)&&(s.value=!0)}}}function yt(e,t,n=!0){var r;const o=((r=t==null?void 0:t.value)==null?void 0:r.ownerDocument)??(globalThis==null?void 0:globalThis.document),s=b(!1);return F(u=>{if(!_||!E(n))return;const a=async f=>{if(!(t!=null&&t.value))return;await I(),await I();const v=f.target;!t.value||!v||he(t.value,v)||f.target&&!s.value&&le(pt,e,{originalEvent:f})};o.addEventListener("focusin",a),u(()=>o.removeEventListener("focusin",a))}),{onFocusCapture:()=>{E(n)&&(s.value=!0)},onBlurCapture:()=>{E(n)&&(s.value=!1)}}}const O=ue({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,originalBodyPointerEvents:void 0,branches:new Set});var ht=B({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:s,currentElement:r}=pe(),u=w(()=>{var d;return((d=r.value)==null?void 0:d.ownerDocument)??globalThis.document}),a=w(()=>O.layersRoot),f=w(()=>r.value?Array.from(a.value).indexOf(r.value):-1),v=w(()=>O.layersWithOutsidePointerEventsDisabled.size>0),l=w(()=>{const d=Array.from(a.value),[y]=[...O.layersWithOutsidePointerEventsDisabled].slice(-1),h=d.indexOf(y);return f.value>=h}),i=mt(async d=>{const y=[...O.branches].some(h=>h==null?void 0:h.contains(d.target));!l.value||y||(o("pointerDownOutside",d),o("interactOutside",d),await I(),d.defaultPrevented||o("dismiss"))},r),c=yt(d=>{[...O.branches].some(h=>h==null?void 0:h.contains(d.target))||(o("focusOutside",d),o("interactOutside",d),d.defaultPrevented||o("dismiss"))},r);return Ze("Escape",d=>{f.value===a.value.size-1&&(o("escapeKeyDown",d),d.defaultPrevented||o("dismiss"))}),P([r,()=>n.disableOutsidePointerEvents],([d,y],h,g)=>{d&&(y&&(O.layersWithOutsidePointerEventsDisabled.size===0&&(O.originalBodyPointerEvents=u.value.body.style.pointerEvents,u.value.body.style.pointerEvents="none"),O.layersWithOutsidePointerEventsDisabled.add(d),g(()=>{O.layersWithOutsidePointerEventsDisabled.delete(d),O.layersWithOutsidePointerEventsDisabled.size===0&&!Ue(O.originalBodyPointerEvents)&&(u.value.body.style.pointerEvents=O.originalBodyPointerEvents)})),a.value.add(d))},{immediate:!0}),F(d=>{d(()=>{r.value&&(a.value.delete(r.value),O.layersWithOutsidePointerEventsDisabled.delete(r.value))})}),(d,y)=>(Y(),J(D(ye),{ref:D(s),"as-child":d.asChild,as:d.as,"data-dismissable-layer":"",style:ke({pointerEvents:v.value?l.value?"auto":"none":void 0}),onFocusCapture:D(c).onFocusCapture,onBlurCapture:D(c).onBlurCapture,onPointerdownCapture:D(i).onPointerDownCapture},{default:ae(()=>[X(d.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),kt=ht;const gt=We(()=>b([]));function bt(){const e=gt();return{add(t){const n=e.value[0];t!==n&&(n==null||n.pause()),e.value=te(e.value,t),e.value.unshift(t)},remove(t){var n;e.value=te(e.value,t),(n=e.value[0])==null||n.resume()}}}function te(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}const H="focusScope.autoFocusOnMount",V="focusScope.autoFocusOnUnmount",ne={bubbles:!1,cancelable:!0};function Et(e,{select:t=!1}={}){const n=T();for(const o of e)if(C(o,{select:t}),T()!==n)return!0}function Ot(e){const t=ge(e),n=oe(t,e),o=oe(t.reverse(),e);return[n,o]}function ge(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const s=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||s?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function oe(e,t){for(const n of e)if(!wt(n,{upTo:t}))return n}function wt(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function St(e){return e instanceof HTMLInputElement&&"select"in e}function C(e,{select:t=!1}={}){if(e&&e.focus){const n=T();e.focus({preventScroll:!0}),e!==n&&St(e)&&t&&e.select()}}var At=B({__name:"FocusScope",props:{loop:{type:Boolean,required:!1,default:!1},trapped:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,o=t,{currentRef:s,currentElement:r}=pe(),u=b(null),a=bt(),f=ue({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});F(l=>{if(!_)return;const i=r.value;if(!n.trapped)return;function c(g){if(f.paused||!i)return;const m=g.target;i.contains(m)?u.value=m:C(u.value,{select:!0})}function d(g){if(f.paused||!i)return;const m=g.relatedTarget;m!==null&&(i.contains(m)||C(u.value,{select:!0}))}function y(g){const m=u.value;if(m===null||!g.some(A=>A.removedNodes.length>0))return;i.contains(m)||C(i)}document.addEventListener("focusin",c),document.addEventListener("focusout",d);const h=new MutationObserver(y);i&&h.observe(i,{childList:!0,subtree:!0}),l(()=>{document.removeEventListener("focusin",c),document.removeEventListener("focusout",d),h.disconnect()})}),F(async l=>{const i=r.value;if(await I(),!i)return;a.add(f);const c=T();if(!i.contains(c)){const y=new CustomEvent(H,ne);i.addEventListener(H,h=>o("mountAutoFocus",h)),i.dispatchEvent(y),y.defaultPrevented||(Et(ge(i),{select:!0}),T()===c&&C(i))}l(()=>{i.removeEventListener(H,g=>o("mountAutoFocus",g));const y=new CustomEvent(V,ne),h=g=>{o("unmountAutoFocus",g)};i.addEventListener(V,h),i.dispatchEvent(y),i.setAttribute("data-focus-scope-unmounting",""),setTimeout(()=>{y.defaultPrevented||C(c??document.body,{select:!0}),i.removeEventListener(V,h),a.remove(f),i.removeAttribute("data-focus-scope-unmounting")},0)})});function v(l){if(!n.loop&&!n.trapped||f.paused)return;const i=l.key==="Tab"&&!l.altKey&&!l.ctrlKey&&!l.metaKey,c=T();if(i&&c){const d=l.currentTarget,[y,h]=Ot(d);y&&h?!l.shiftKey&&c===h?(l.preventDefault(),n.loop&&C(y,{select:!0})):l.shiftKey&&c===y&&(l.preventDefault(),n.loop&&C(h,{select:!0})):c===d&&l.preventDefault()}}return(l,i)=>(Y(),J(D(ye),{ref_key:"currentRef",ref:s,tabindex:"-1","as-child":l.asChild,as:l.as,onKeydown:v},{default:ae(()=>[X(l.$slots,"default")]),_:3},8,["as-child","as"]))}}),Rt=At;function jt(e){return e?"open":"closed"}function $t(e){const t=T();for(const n of e)if(n===t||(n.focus(),T()!==t))return}var Pt=B({__name:"Teleport",props:{to:{type:null,required:!1,default:"body"},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=de();return(n,o)=>D(t)||n.forceMount?(Y(),J(Re,{key:0,to:n.to,disabled:n.disabled,defer:n.defer},[X(n.$slots,"default")],8,["to","disabled","defer"])):je("v-if",!0)}}),Ut=Pt;export{kt as D,Rt as F,ye as P,dt as S,Ut as T,pe as a,xt as b,$e as c,jt as d,Ft as e,Nt as f,T as g,Bt as h,Mt as i,fe as j,_ as k,N as l,Tt as m,Ue as n,$t as o,Lt as p,le as q,_t as r,It as u};
|
|
4
|
-
//# sourceMappingURL=Teleport-CKfsIrp8.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-D6Mng-DB.js","assets/_commonjsHelpers-CqkleIqs.js","assets/addon-fit-CevVMrUA.js","assets/xterm-DYP7pi_n.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{d as F,J as O,M as H,c as m,a as t,f as a,e as E,w as M,_ as W,z as j,g as _,t as P,j as c,k as V,p as J,C as Q,Q as S,n as Y,R,o as p}from"./index-T3JGe9ku.js";import{_ as G}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";import{_ as U}from"./SelectMenu.vue_vue_type_script_setup_true_lang-DKYlHroe.js";import{_ as K}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./Teleport-CKfsIrp8.js";const X={class:"stack"},Z={class:"banner warn"},ee={class:"row wrap",style:{gap:"var(--s3)","align-items":"end"}},ne={class:"field"},oe={class:"field"},te=["disabled"],le={key:2,class:"badge ok"},se={key:1,class:"hint"},ae={key:2,class:"hint"},ie=["data-state"],re=F({__name:"TerminalTab",setup(ue){const k=Y(),C=V(()=>String(k.params.id)),B=["sh","bash","ash","zsh","fish"],$=c(null),f=c(""),u=c(""),y=c("sh"),n=c("idle"),h=c(""),v=c(null),w=R(null),I=R(null),b=R(null);let i=null;const D=V(()=>g.value.map(o=>({value:o.name,label:o.name,hint:o.service??void 0}))),g=V(()=>{var o;return((o=$.value)==null?void 0:o.containers.filter(e=>e.state==="running"))??[]});async function x(){var d;const o=await J.get(`/api/deployments/${encodeURIComponent(C.value)}/runtime`);if(!o.ok){f.value=Q(o,"list this deployment's containers");return}if(f.value="",$.value=o.body,u.value)return;const e=typeof k.query.container=="string"?k.query.container:"",l=g.value.find(T=>T.name===e);u.value=(l==null?void 0:l.name)??((d=g.value[0])==null?void 0:d.name)??""}x();async function q(){var N;if(n.value==="connecting"||n.value==="open")return;h.value="",n.value="connecting";const[{Terminal:o},{FitAddon:e}]=await Promise.all([S(()=>import("./xterm-D6Mng-DB.js").then(s=>s.x),__vite__mapDeps([0,1])),S(()=>import("./addon-fit-CevVMrUA.js").then(s=>s.a),__vite__mapDeps([2,1]))]);await S(()=>Promise.resolve({}),__vite__mapDeps([3])),(N=w.value)==null||N.dispose();const l=new o({convertEol:!0,fontSize:13,fontFamily:"var(--font-mono, ui-monospace, monospace)",cursorBlink:!0,theme:{background:"#0b0e14"}}),d=new e;l.loadAddon(d),v.value&&(v.value.innerHTML="",l.open(v.value),d.fit()),w.value=l,I.value=d,i==null||i.disconnect(),i=new ResizeObserver(()=>{try{d.fit()}catch{}}),v.value&&i.observe(v.value);const T=location.protocol==="https:"?"wss":"ws",z=new URLSearchParams({container:u.value,shell:y.value}),r=new WebSocket(`${T}://${location.host}/api/deployments/${encodeURIComponent(C.value)}/terminal?${z}`);r.binaryType="arraybuffer",b.value=r,r.onopen=()=>{n.value="open",l.focus()},r.onmessage=s=>l.write(typeof s.data=="string"?s.data:new Uint8Array(s.data)),r.onclose=s=>{n.value="closed",h.value=s.reason||(s.code===1006?"the connection dropped (the upgrade may have been refused)":`code ${s.code}`)},r.onerror=()=>{n.value==="connecting"&&(h.value="could not open the connection")},l.onData(s=>{r.readyState===WebSocket.OPEN&&r.send(s)})}function A(){var o;(o=b.value)==null||o.close(1e3,"closed by the operator")}function L(){var o,e;i==null||i.disconnect(),i=null,(o=b.value)==null||o.close(),b.value=null,(e=w.value)==null||e.dispose(),w.value=null}return O([u,y],()=>{(n.value==="open"||n.value==="connecting")&&A()}),O(C,()=>{L(),n.value="idle",x()}),H(L),(o,e)=>(p(),m("section",X,[t("div",Z,[e[3]||(e[3]=t("b",null,"No TTY.",-1)),e[4]||(e[4]=a(" The shell runs without a terminal device, so there is no prompt, no ",-1)),e[5]||(e[5]=t("code",null,"Ctrl-C",-1)),e[6]||(e[6]=a(", and no full-screen programs (",-1)),e[7]||(e[7]=t("code",null,"top",-1)),e[8]||(e[8]=a(", ",-1)),e[9]||(e[9]=t("code",null,"vim",-1)),e[10]||(e[10]=a("). Type a command and press Enter. ",-1)),E(W,{label:"why"},{default:M(()=>[...e[2]||(e[2]=[a(" A pseudo-terminal needs a wrapper (",-1),t("code",null,"script",-1),a(") whose flags differ across distributions, and it was never verified on a real host — so pstack ships the half it can stand behind. Everything an operator usually opens a shell for (",-1),t("code",null,"ls",-1),a(", ",-1),t("code",null,"cat",-1),a(", ",-1),t("code",null,"env",-1),a(", ",-1),t("code",null,"psql",-1),a(", a migration) works. ",-1)])]),_:1})]),f.value?(p(),j(G,{key:0,text:f.value,title:"Could not list this deployment's containers."},null,8,["text"])):_("",!0),t("div",ee,[t("label",ne,[e[11]||(e[11]=t("span",null,"Container",-1)),E(U,{modelValue:u.value,"onUpdate:modelValue":e[0]||(e[0]=l=>u.value=l),label:"Container",disabled:n.value==="open"||n.value==="connecting",options:D.value},null,8,["modelValue","disabled","options"])]),t("label",oe,[e[12]||(e[12]=t("span",null,"Shell",-1)),E(U,{modelValue:y.value,"onUpdate:modelValue":e[1]||(e[1]=l=>y.value=l),label:"Shell",disabled:n.value==="open"||n.value==="connecting",options:B.map(l=>({value:l,label:l}))},null,8,["modelValue","disabled","options"])]),n.value!=="open"?(p(),m("button",{key:0,class:"primary",disabled:!u.value||n.value==="connecting",onClick:q},P(n.value==="connecting"?"Connecting…":"Open shell"),9,te)):(p(),m("button",{key:1,onClick:A},"Close shell")),e[14]||(e[14]=t("span",{class:"grow"},null,-1)),n.value==="open"?(p(),m("span",le,[...e[13]||(e[13]=[t("span",{class:"dot pulse"},null,-1),a("connected",-1)])])):_("",!0)]),!g.value.length&&!f.value?(p(),m("p",se," Nothing is running for this deployment, so there is nothing to open a shell in. ")):_("",!0),n.value==="closed"&&h.value?(p(),m("p",ae,"Session ended — "+P(h.value)+".",1)):_("",!0),t("div",{ref_key:"host",ref:v,class:"terminal-host","data-state":n.value},null,8,ie),e[15]||(e[15]=t("p",{class:"hint"}," Every session is recorded — who, which container, when — and the record is written when the shell opens, so a session that dies with the process still leaves one. ",-1))]))}}),fe=K(re,[["__scopeId","data-v-2d8bfa2e"]]);export{fe as default};
|
|
3
|
-
//# sourceMappingURL=TerminalTab-CPuFkMzh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.stack-form[data-v-46dca32b]{margin-top:var(--s5);padding-top:var(--s4);border-top:1px solid var(--line-soft);display:flex;flex-direction:column;gap:var(--s3)}.stack-form h3[data-v-46dca32b]{font-size:var(--t-sm);color:var(--fg-dim)}td.right[data-v-46dca32b]{text-align:end}.two-up>.field[data-v-46dca32b]{flex:1 1 200px}td.right button[data-v-46dca32b]{margin-inline-start:var(--s2)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as q,c as n,a as e,f as y,e as i,w as b,_ as S,z as C,g as _,t as d,F as R,r as I,h as P,i as U,v as A,u as T,b as g,T as G,j as u,k as H,p as h,C as f,o,O as x}from"./index-T3JGe9ku.js";import{_ as D}from"./ActionButton.vue_vue_type_script_setup_true_lang-C6PZurL0.js";import{E as B}from"./EquivalentCommand-DX5xFW-p.js";import{_ as J}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";import{_ as E}from"./RelativeTime.vue_vue_type_script_setup_true_lang-D4NO-r5D.js";import{_ as F}from"./SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js";import{_ as K}from"./RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js";import{_ as Q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./useFormat-DIlTY5Dl.js";const X={class:"page-head"},Z={class:"sub"},ee={key:1,class:"banner ok"},se={class:"code"},te={class:"row"},ae={class:"grid-2"},oe={class:"panel"},ne={class:"phead"},le={class:"mute",style:{"font-size":"var(--t-xs)"}},re={key:1,class:"cards"},ie={class:"name","data-label":"user"},de={key:0,class:"badge info"},ue={class:"dim nowrap","data-label":"added"},pe={class:"right nowrap","data-label":""},ce=["onClick"],ve={key:2,class:"hint"},me={class:"row wrap two-up"},he={class:"field grow"},we={class:"field grow"},ke={class:"row"},fe=["disabled"],ye={class:"panel"},be={class:"phead"},_e={key:1,class:"cards"},ge={class:"name","data-label":"name"},$e={class:"dim nowrap","data-label":"last used"},Ce={key:1,class:"mute"},Ue={class:"right nowrap","data-label":""},Ae={key:2,class:"hint"},Te={class:"field"},xe={class:"row"},Ve=["disabled"],Ne={class:"sheet",role:"dialog","aria-modal":"true","aria-label":"Change password"},Pe={class:"hint"},Se={class:"field"},Re={class:"row"},Ie=["disabled"],De=q({__name:"UsersView",setup(Be){const $=u([]),V=u([]),N=u(!1),r=u(""),l=u({username:"",password:""}),c=u(""),p=u(null),w=u(""),k=u(null),O=H(()=>l.value.username.trim().length>0&&l.value.password.length>=8);async function v(){const[a,s]=await Promise.all([h.get("/api/users"),h.get("/api/tokens")]);if(N.value=!0,!a.ok){r.value=f(a,"load the accounts");return}r.value="",$.value=a.body.users??[],V.value=s.ok?s.body.tokens??[]:[]}v();async function j(){const a=await h.post("/api/users",{username:l.value.username.trim(),password:l.value.password});if(!a.ok){r.value=f(a,"create this account");return}x("ok",`Created ${a.body.user.username}.`),l.value={username:"",password:""},v()}async function z(a){const s=await h.del(`/api/users/${a.id}`);if(!s.ok){r.value=f(s,`delete ${a.username}`);return}x("ok",`Deleted ${a.username}.`),v()}async function L(){var t;const a=p.value;if(!a)return;const s=await h.put(`/api/users/${a.id}/password`,{password:w.value});if(!s.ok){r.value=f(s,`change the password for ${a.username}`);return}p.value=null,w.value="",x("ok",a.id===((t=g.user)==null?void 0:t.id)?"Password changed. You have been signed out everywhere — sign in again.":`Password changed. ${a.username} has been signed out everywhere.`),v()}async function M(){const a=await h.post("/api/tokens",{name:c.value.trim()});if(!a.ok){r.value=f(a,"create this token");return}k.value={what:`Personal token “${c.value.trim()}”`,value:a.body.token,note:"Send it as a bearer token. The server stores only a hash, so this is the only time it is shown."},c.value="",v()}async function W(a){const s=await h.del(`/api/tokens/${a.id}`);if(!s.ok){r.value=f(s,`revoke ${a.name}`);return}x("ok",`Revoked ${a.name}.`),v()}return(a,s)=>(o(),n("div",null,[e("div",X,[e("div",null,[s[9]||(s[9]=e("h1",null,"Users & access",-1)),e("div",Z,[s[8]||(s[8]=y(" Who can sign in, and the tokens they use from scripts ",-1)),i(S,{label:"how access works here"},{default:b(()=>[...s[7]||(s[7]=[y(" Three kinds of caller. The host token from the environment is the root credential CI holds. An account signs in with a password and gets a browser session. A personal token belongs to one account and is what a script uses — it can do anything that account can. ",-1)])]),_:1})])]),s[10]||(s[10]=e("span",{class:"grow"},null,-1)),i(K,{run:v})]),r.value?(o(),C(J,{key:0,text:r.value,title:"Something went wrong."},null,8,["text"])):_("",!0),k.value?(o(),n("div",ee,[e("b",null,d(k.value.what)+" — copy it now.",1),e("p",null,d(k.value.note),1),e("pre",se,d(k.value.value),1),e("div",te,[e("button",{onClick:s[0]||(s[0]=t=>k.value=null)},"I have stored it")])])):_("",!0),e("div",ae,[e("section",oe,[e("div",ne,[s[11]||(s[11]=e("h2",{class:"section"},"Accounts",-1)),s[12]||(s[12]=e("span",{class:"grow"},null,-1)),e("span",le,d($.value.length),1)]),N.value?$.value.length?(o(),n("table",re,[s[14]||(s[14]=e("thead",null,[e("tr",null,[e("th",null,"User"),e("th",null,"Added"),e("th",{"aria-label":"Actions"})])],-1)),e("tbody",null,[(o(!0),n(R,null,I($.value,t=>{var m;return o(),n("tr",{key:t.id},[e("td",ie,[e("b",null,d(t.username),1),t.id===((m=T(g).user)==null?void 0:m.id)?(o(),n("span",de,"you")):_("",!0)]),e("td",ue,[i(E,{at:t.createdAt},null,8,["at"])]),e("td",pe,[e("button",{class:"ghost sm",onClick:Y=>{p.value=t,w.value=""}},"Change password",8,ce),i(D,{class:"danger sm",confirm:`Delete ${t.username}?`,onRun:Y=>z(t)},{default:b(()=>[...s[13]||(s[13]=[y("Delete",-1)])]),_:1},8,["confirm","onRun"])])])}),128))])])):(o(),n("p",ve,"No accounts yet.")):(o(),C(F,{key:0,rows:3})),e("form",{class:"stack-form",onSubmit:P(j,["prevent"])},[s[18]||(s[18]=e("h3",null,"Add an account",-1)),e("div",me,[e("label",he,[s[15]||(s[15]=e("span",null,"Username",-1)),U(e("input",{"onUpdate:modelValue":s[1]||(s[1]=t=>l.value.username=t),type:"text",autocomplete:"off"},null,512),[[A,l.value.username]])]),e("label",we,[s[16]||(s[16]=e("span",null,"Password",-1)),U(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>l.value.password=t),type:"password",autocomplete:"new-password"},null,512),[[A,l.value.password]])])]),s[19]||(s[19]=e("p",{class:"hint"},"At least 8 characters.",-1)),e("div",ke,[e("button",{class:"primary",type:"submit",disabled:!O.value},"Add account",8,fe),s[17]||(s[17]=e("span",{class:"grow"},null,-1))]),i(B,{what:"this account creation",method:"POST",path:"/api/users",body:{username:l.value.username||"alice",password:"…"}},null,8,["body"])],32)]),e("section",ye,[e("div",be,[s[21]||(s[21]=e("h2",{class:"section"},"Your API tokens",-1)),i(S,{label:"when to use one"},{default:b(()=>[...s[20]||(s[20]=[y(" A script or a CI job signing in as you. It carries whatever you can do, so give each one a name you will recognise later and revoke the ones you stop using. ",-1)])]),_:1})]),N.value?V.value.length?(o(),n("table",_e,[s[23]||(s[23]=e("thead",null,[e("tr",null,[e("th",null,"Name"),e("th",null,"Last used"),e("th",{"aria-label":"Actions"})])],-1)),e("tbody",null,[(o(!0),n(R,null,I(V.value,t=>(o(),n("tr",{key:t.id},[e("td",ge,[e("b",null,d(t.name),1)]),e("td",$e,[t.lastUsedAt?(o(),C(E,{key:0,at:t.lastUsedAt},null,8,["at"])):(o(),n("span",Ce,"never"))]),e("td",Ue,[i(D,{class:"danger sm",confirm:`Revoke ${t.name}?`,onRun:m=>W(t)},{default:b(()=>[...s[22]||(s[22]=[y("Revoke",-1)])]),_:1},8,["confirm","onRun"])])]))),128))])])):(o(),n("p",Ae,d(T(g).root?"The host token is not an account, so it has no personal tokens.":"No tokens yet."),1)):(o(),C(F,{key:0,rows:2})),T(g).root?_("",!0):(o(),n("form",{key:3,class:"stack-form",onSubmit:P(M,["prevent"])},[s[25]||(s[25]=e("h3",null,"New token",-1)),e("label",Te,[s[24]||(s[24]=e("span",null,"What is it for",-1)),U(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>c.value=t),type:"text",placeholder:"ci-deploy",autocomplete:"off"},null,512),[[A,c.value]])]),e("div",xe,[e("button",{class:"primary",type:"submit",disabled:!c.value.trim()},"Create token",8,Ve)]),i(B,{what:"this token creation",method:"POST",path:"/api/tokens",body:{name:c.value||"ci-deploy"}},null,8,["body"])],32))])]),i(G,{name:"fade"},{default:b(()=>{var t;return[p.value?(o(),n("div",{key:0,class:"scrim",onClick:s[6]||(s[6]=P(m=>p.value=null,["self"]))},[e("div",Ne,[e("h3",null,"Change password for "+d(p.value.username),1),e("p",Pe," This signs "+d(p.value.id===((t=T(g).user)==null?void 0:t.id)?"you":"them")+" out everywhere — every session and personal token is revoked. ",1),e("label",Se,[s[26]||(s[26]=e("span",null,"New password",-1)),U(e("input",{"onUpdate:modelValue":s[4]||(s[4]=m=>w.value=m),type:"password",autocomplete:"new-password"},null,512),[[A,w.value]])]),e("div",Re,[e("button",{class:"primary",disabled:w.value.length<8,onClick:L}," Change password ",8,Ie),e("button",{class:"ghost",onClick:s[5]||(s[5]=m=>p.value=null)},"Cancel")])])])):_("",!0)]}),_:1})]))}}),qe=Q(De,[["__scopeId","data-v-46dca32b"]]);export{qe as default};
|
|
2
|
-
//# sourceMappingURL=UsersView-CIfFPshj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UsersView-CIfFPshj.js","sources":["../../src/views/UsersView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Accounts and personal API tokens.\n *\n * Accounts landed in 0.10.0 with no UI at all, so the only way to add a second operator was a curl\n * call — which is exactly the thing a control plane exists to spare people.\n *\n * TWO AUDIENCES, TWO SECTIONS, and the split is deliberate. **Accounts** are about other people and\n * are shared state; **tokens** are yours alone (the API scopes them to the caller and cannot show\n * anyone else's). Mixing them into one table would imply an admin can manage another person's\n * tokens, which is not true and would be a bad idea if it were.\n *\n * SECRETS ARE SHOWN ONCE, and the page says so in the same breath as showing them. Same discipline\n * as a notifier signing secret and a registry credential: there is no read path on the server, so\n * this is not a policy that could be relaxed later — the value genuinely stops existing.\n */\nimport { computed, ref } from 'vue';\nimport { api, problem } from '../api/client';\nimport { authState } from '../composables/useAuth';\nimport { toast } from '../composables/useToasts';\nimport ActionButton from '../components/ActionButton.vue';\nimport EquivalentCommand from '../components/EquivalentCommand.vue';\nimport ErrorNote from '../components/ErrorNote.vue';\nimport InfoHint from '../components/InfoHint.vue';\nimport RelativeTime from '../components/RelativeTime.vue';\nimport SkeletonList from '../components/SkeletonList.vue';\nimport RefreshButton from '../components/RefreshButton.vue';\n\ntype User = { id: number; username: string; role: string; createdAt: number };\ntype Token = { id: number; name: string; createdAt: number; lastUsedAt: number | null };\n\nconst users = ref<User[]>([]);\nconst tokens = ref<Token[]>([]);\nconst loaded = ref(false);\nconst listError = ref('');\n\nconst newUser = ref({ username: '', password: '' });\nconst newToken = ref('');\nconst pwFor = ref<User | null>(null);\nconst pwValue = ref('');\n\n/** Held only until dismissed — there is no way to show either of these again. */\nconst revealed = ref<{ what: string; value: string; note: string } | null>(null);\n\nconst canCreateUser = computed(\n () => newUser.value.username.trim().length > 0 && newUser.value.password.length >= 8,\n);\n\nasync function load(): Promise<void> {\n const [u, t] = await Promise.all([\n api.get<{ users: User[] }>('/api/users'),\n api.get<{ tokens: Token[] }>('/api/tokens'),\n ]);\n loaded.value = true;\n if (!u.ok) {\n listError.value = problem(u, 'load the accounts');\n return;\n }\n listError.value = '';\n users.value = u.body.users ?? [];\n // Root (PSTACK_TOKEN) is not a user, so it has no personal tokens — an error here is expected.\n tokens.value = t.ok ? (t.body.tokens ?? []) : [];\n}\nvoid load();\n\nasync function createUser(): Promise<void> {\n const r = await api.post<{ user: User }>('/api/users', {\n username: newUser.value.username.trim(),\n password: newUser.value.password,\n });\n if (!r.ok) {\n listError.value = problem(r, 'create this account');\n return;\n }\n toast('ok', `Created ${r.body.user.username}.`);\n newUser.value = { username: '', password: '' };\n void load();\n}\n\nasync function removeUser(u: User): Promise<void> {\n const r = await api.del(`/api/users/${u.id}`);\n // The server refuses to delete the last account. That is a rule worth surfacing verbatim rather\n // than as \"could not delete\" — it tells the operator what to do instead.\n if (!r.ok) {\n listError.value = problem(r, `delete ${u.username}`);\n return;\n }\n toast('ok', `Deleted ${u.username}.`);\n void load();\n}\n\nasync function changePassword(): Promise<void> {\n const u = pwFor.value;\n if (!u) return;\n const r = await api.put(`/api/users/${u.id}/password`, { password: pwValue.value });\n if (!r.ok) {\n listError.value = problem(r, `change the password for ${u.username}`);\n return;\n }\n pwFor.value = null;\n pwValue.value = '';\n // Not a footnote: the change signs that user out everywhere, and if it was YOU, the next request\n // is a 401. Saying so here is the difference between an expected step and an apparent bug.\n toast(\n 'ok',\n u.id === authState.user?.id\n ? `Password changed. You have been signed out everywhere — sign in again.`\n : `Password changed. ${u.username} has been signed out everywhere.`,\n );\n void load();\n}\n\nasync function createToken(): Promise<void> {\n const r = await api.post<{ token: string; id: number }>('/api/tokens', {\n name: newToken.value.trim(),\n });\n if (!r.ok) {\n listError.value = problem(r, 'create this token');\n return;\n }\n revealed.value = {\n what: `Personal token “${newToken.value.trim()}”`,\n value: r.body.token,\n note: 'Send it as a bearer token. The server stores only a hash, so this is the only time it is shown.',\n };\n newToken.value = '';\n void load();\n}\n\nasync function removeToken(t: Token): Promise<void> {\n const r = await api.del(`/api/tokens/${t.id}`);\n if (!r.ok) {\n listError.value = problem(r, `revoke ${t.name}`);\n return;\n }\n toast('ok', `Revoked ${t.name}.`);\n void load();\n}\n</script>\n\n<template>\n <div>\n <div class=\"page-head\">\n <div>\n <h1>Users & access</h1>\n <div class=\"sub\">\n Who can sign in, and the tokens they use from scripts\n <InfoHint label=\"how access works here\">\n Three kinds of caller. The host token from the environment is the root credential CI\n holds. An account signs in with a password and gets a browser session. A personal token\n belongs to one account and is what a script uses — it can do anything that account can.\n </InfoHint>\n </div>\n </div>\n <span class=\"grow\" />\n <RefreshButton :run=\"load\" />\n </div>\n\n <ErrorNote v-if=\"listError\" :text=\"listError\" title=\"Something went wrong.\" />\n\n <div v-if=\"revealed\" class=\"banner ok\">\n <b>{{ revealed.what }} — copy it now.</b>\n <p>{{ revealed.note }}</p>\n <pre class=\"code\">{{ revealed.value }}</pre>\n <div class=\"row\">\n <button @click=\"revealed = null\">I have stored it</button>\n </div>\n </div>\n\n <div class=\"grid-2\">\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Accounts</h2>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ users.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"3\" />\n <!-- `cards` + `data-label` per cell: below 640px the same markup renders as cards. Without\n it the row's two buttons pushed the table past the viewport and got clipped. -->\n <table v-else-if=\"users.length\" class=\"cards\">\n <thead>\n <tr>\n <th>User</th>\n <th>Added</th>\n <th aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"u in users\" :key=\"u.id\">\n <td class=\"name\" data-label=\"user\">\n <b>{{ u.username }}</b>\n <span v-if=\"u.id === authState.user?.id\" class=\"badge info\">you</span>\n </td>\n <td class=\"dim nowrap\" data-label=\"added\"><RelativeTime :at=\"u.createdAt\" /></td>\n <td class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"pwFor = u; pwValue = ''\">Change password</button>\n <ActionButton\n class=\"danger sm\"\n :confirm=\"`Delete ${u.username}?`\"\n @run=\"removeUser(u)\"\n >Delete</ActionButton\n >\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">No accounts yet.</p>\n\n <form class=\"stack-form\" @submit.prevent=\"createUser\">\n <h3>Add an account</h3>\n <div class=\"row wrap two-up\">\n <label class=\"field grow\">\n <span>Username</span>\n <input v-model=\"newUser.username\" type=\"text\" autocomplete=\"off\" />\n </label>\n <label class=\"field grow\">\n <span>Password</span>\n <input v-model=\"newUser.password\" type=\"password\" autocomplete=\"new-password\" />\n </label>\n </div>\n <p class=\"hint\">At least 8 characters.</p>\n <div class=\"row\">\n <button class=\"primary\" type=\"submit\" :disabled=\"!canCreateUser\">Add account</button>\n <span class=\"grow\" />\n </div>\n <EquivalentCommand\n what=\"this account creation\"\n method=\"POST\"\n path=\"/api/users\"\n :body=\"{ username: newUser.username || 'alice', password: '…' }\"\n />\n </form>\n </section>\n\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Your API tokens</h2>\n <InfoHint label=\"when to use one\">\n A script or a CI job signing in as you. It carries whatever you can do, so give each one\n a name you will recognise later and revoke the ones you stop using.\n </InfoHint>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" />\n <table v-else-if=\"tokens.length\" class=\"cards\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Last used</th>\n <th aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"t in tokens\" :key=\"t.id\">\n <td class=\"name\" data-label=\"name\"><b>{{ t.name }}</b></td>\n <td class=\"dim nowrap\" data-label=\"last used\">\n <RelativeTime v-if=\"t.lastUsedAt\" :at=\"t.lastUsedAt\" />\n <span v-else class=\"mute\">never</span>\n </td>\n <td class=\"right nowrap\" data-label=\"\">\n <ActionButton\n class=\"danger sm\"\n :confirm=\"`Revoke ${t.name}?`\"\n @run=\"removeToken(t)\"\n >Revoke</ActionButton\n >\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">\n {{ authState.root ? 'The host token is not an account, so it has no personal tokens.' : 'No tokens yet.' }}\n </p>\n\n <form v-if=\"!authState.root\" class=\"stack-form\" @submit.prevent=\"createToken\">\n <h3>New token</h3>\n <label class=\"field\">\n <span>What is it for</span>\n <input v-model=\"newToken\" type=\"text\" placeholder=\"ci-deploy\" autocomplete=\"off\" />\n </label>\n <div class=\"row\">\n <button class=\"primary\" type=\"submit\" :disabled=\"!newToken.trim()\">Create token</button>\n </div>\n <EquivalentCommand\n what=\"this token creation\"\n method=\"POST\"\n path=\"/api/tokens\"\n :body=\"{ name: newToken || 'ci-deploy' }\"\n />\n </form>\n </section>\n </div>\n\n <!-- Password change: a dialog, because it is a distinct decision about one row. -->\n <Transition name=\"fade\">\n <div v-if=\"pwFor\" class=\"scrim\" @click.self=\"pwFor = null\">\n <div class=\"sheet\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Change password\">\n <h3>Change password for {{ pwFor.username }}</h3>\n <p class=\"hint\">\n This signs {{ pwFor.id === authState.user?.id ? 'you' : 'them' }} out everywhere —\n every session and personal token is revoked.\n </p>\n <label class=\"field\">\n <span>New password</span>\n <input v-model=\"pwValue\" type=\"password\" autocomplete=\"new-password\" />\n </label>\n <div class=\"row\">\n <button class=\"primary\" :disabled=\"pwValue.length < 8\" @click=\"changePassword\">\n Change password\n </button>\n <button class=\"ghost\" @click=\"pwFor = null\">Cancel</button>\n </div>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n.stack-form {\n margin-top: var(--s5);\n padding-top: var(--s4);\n border-top: 1px solid var(--line-soft);\n display: flex;\n flex-direction: column;\n gap: var(--s3);\n}\n.stack-form h3 {\n font-size: var(--t-sm);\n color: var(--fg-dim);\n}\ntd.right {\n text-align: end;\n}\n/* Two fields share a line where there is room and stack where there is not — at 390px a pair of\n * half-width inputs is two inputs nobody can type into. */\n.two-up > .field {\n flex: 1 1 200px;\n}\ntd.right button {\n margin-inline-start: var(--s2);\n}\n</style>\n"],"names":["users","ref","tokens","loaded","listError","newUser","newToken","pwFor","pwValue","revealed","canCreateUser","computed","load","u","t","api","problem","createUser","r","toast","removeUser","changePassword","_a","authState","createToken","removeToken","_createElementBlock","_createElementVNode","_hoisted_1","_cache","_hoisted_2","_createVNode","InfoHint","RefreshButton","_createBlock","ErrorNote","_openBlock","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_Fragment","_renderList","_hoisted_11","_unref","_hoisted_12","_hoisted_13","RelativeTime","_hoisted_14","$event","_hoisted_15","ActionButton","_hoisted_16","SkeletonList","_hoisted_17","_hoisted_18","_vModelText","_hoisted_19","_hoisted_20","_hoisted_21","EquivalentCommand","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_Transition","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as k,c as r,a,F as f,r as h,o as c}from"./index-T3JGe9ku.js";const b=["value","aria-label","onInput"],V=["value","aria-label","onInput"],_=["aria-label","onClick"],x=k({__name:"VarEditor",props:{modelValue:{}},emits:["update:modelValue","change"],setup(d,{emit:p}){const s=d,t=p;function m(u,l){const o=s.modelValue.map((e,n)=>n===u?{...e,...l}:e);t("update:modelValue",o),t("change")}function i(){t("update:modelValue",[...s.modelValue,{k:"",v:""}]),t("change")}function v(u){const l=s.modelValue.filter((o,e)=>e!==u);t("update:modelValue",l.length?l:[{k:"",v:""}]),t("change")}return(u,l)=>(c(),r("div",null,[l[0]||(l[0]=a("div",{class:"kv head"},[a("span",null,"name"),a("span",null,"value"),a("span")],-1)),(c(!0),r(f,null,h(d.modelValue,(o,e)=>(c(),r("div",{key:e,class:"kv"},[a("input",{type:"text",value:o.k,"aria-label":`variable name ${e+1}`,placeholder:"PR",spellcheck:"false",autocomplete:"off",onInput:n=>m(e,{k:n.target.value.trim()})},null,40,b),a("input",{type:"text",value:o.v,"aria-label":`variable value ${e+1}`,placeholder:"7",spellcheck:"false",autocomplete:"off",onInput:n=>m(e,{v:n.target.value})},null,40,V),a("button",{class:"sm ghost","aria-label":`remove variable ${e+1}`,onClick:n=>v(e)},"−",8,_)]))),128)),a("button",{class:"sm",onClick:i},"+ variable")]))}});export{x as _};
|
|
2
|
-
//# sourceMappingURL=VarEditor.vue_vue_type_script_setup_true_lang-JwR7DqO1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VarEditor.vue_vue_type_script_setup_true_lang-JwR7DqO1.js","sources":["../../src/components/VarEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The free-form variable editor, shared by the Config tab and Submit.\n *\n * Free-form on purpose: the spec's `env:` block lists what it DECLARES, which is not the same as\n * what it NEEDS — `stack: pr-${PR}` consumes `PR` without declaring it anywhere. The authoritative\n * list of what is missing is the server's 400 text, not this form.\n */\nimport type { VarPair } from '../api/types';\n\nconst props = defineProps<{ modelValue: VarPair[] }>();\nconst emit = defineEmits<{ 'update:modelValue': [VarPair[]]; change: [] }>();\n\nfunction set(i: number, patch: Partial<VarPair>): void {\n const next = props.modelValue.map((e, n) => (n === i ? { ...e, ...patch } : e));\n emit('update:modelValue', next);\n emit('change');\n}\n\nfunction add(): void {\n emit('update:modelValue', [...props.modelValue, { k: '', v: '' }]);\n emit('change');\n}\n\nfunction remove(i: number): void {\n const next = props.modelValue.filter((_, n) => n !== i);\n // Never leave the editor with no rows: an empty list looks like a broken control.\n emit('update:modelValue', next.length ? next : [{ k: '', v: '' }]);\n emit('change');\n}\n</script>\n\n<template>\n <div>\n <div class=\"kv head\"><span>name</span><span>value</span><span /></div>\n <div v-for=\"(e, i) in modelValue\" :key=\"i\" class=\"kv\">\n <input\n type=\"text\"\n :value=\"e.k\"\n :aria-label=\"`variable name ${i + 1}`\"\n placeholder=\"PR\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n @input=\"set(i, { k: ($event.target as HTMLInputElement).value.trim() })\"\n />\n <input\n type=\"text\"\n :value=\"e.v\"\n :aria-label=\"`variable value ${i + 1}`\"\n placeholder=\"7\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n @input=\"set(i, { v: ($event.target as HTMLInputElement).value })\"\n />\n <button class=\"sm ghost\" :aria-label=\"`remove variable ${i + 1}`\" @click=\"remove(i)\">−</button>\n </div>\n <button class=\"sm\" @click=\"add\">+ variable</button>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","set","i","patch","next","add","remove","_","n","_createElementBlock","_createElementVNode","_openBlock","_Fragment","_renderList","e","$event","_hoisted_3"],"mappings":"kRAUA,MAAMA,EAAQC,EACRC,EAAOC,EAEb,SAASC,EAAIC,EAAWC,EAA+B,CACrD,MAAMC,EAAOP,EAAM,WAAW,IAAI,CAAC,EAAG,IAAO,IAAMK,EAAI,CAAE,GAAG,EAAG,GAAGC,CAAA,EAAU,CAAE,EAC9EJ,EAAK,oBAAqBK,CAAI,EAC9BL,EAAK,QAAQ,CACf,CAEA,SAASM,GAAY,CACnBN,EAAK,oBAAqB,CAAC,GAAGF,EAAM,WAAY,CAAE,EAAG,GAAI,EAAG,EAAA,CAAI,CAAC,EACjEE,EAAK,QAAQ,CACf,CAEA,SAASO,EAAOJ,EAAiB,CAC/B,MAAME,EAAOP,EAAM,WAAW,OAAO,CAACU,EAAGC,IAAMA,IAAMN,CAAC,EAEtDH,EAAK,oBAAqBK,EAAK,OAASA,EAAO,CAAC,CAAE,EAAG,GAAI,EAAG,EAAA,CAAI,CAAC,EACjEL,EAAK,QAAQ,CACf,mBAIEU,EAwBM,MAAA,KAAA,aAvBJC,EAAsE,MAAA,CAAjE,MAAM,WAAS,CAACA,EAAiB,YAAX,MAAI,EAAOA,EAAkB,YAAZ,OAAK,EAAOA,EAAQ,MAAA,CAAA,QAChEC,EAAA,EAAA,EAAAF,EAoBMG,EAAA,KAAAC,EApBgBf,EAAA,WAAU,CAAnBgB,EAAGZ,SAAhBO,EAoBM,MAAA,CApB6B,IAAKP,EAAG,MAAM,IAAA,GAC/CQ,EAQE,QAAA,CAPA,KAAK,OACJ,MAAOI,EAAE,EACT,8BAA6BZ,EAAC,CAAA,GAC/B,YAAY,KACZ,WAAW,QACX,aAAa,MACZ,QAAKa,GAAEd,EAAIC,EAAC,CAAA,EAAQa,EAAO,OAA4B,MAAM,MAAI,CAAA,CAAA,aAEpEL,EAQE,QAAA,CAPA,KAAK,OACJ,MAAOI,EAAE,EACT,+BAA8BZ,EAAC,CAAA,GAChC,YAAY,IACZ,WAAW,QACX,aAAa,MACZ,QAAKa,GAAEd,EAAIC,KAASa,EAAO,OAA4B,KAAA,CAAK,CAAA,aAE/DL,EAA+F,SAAA,CAAvF,MAAM,WAAY,gCAA+BR,EAAC,CAAA,GAAS,QAAKa,GAAET,EAAOJ,CAAC,CAAA,EAAG,IAAC,EAAAc,CAAA,CAAA,WAExFN,EAAmD,SAAA,CAA3C,MAAM,KAAM,QAAOL,CAAA,EAAK,YAAU,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
td.right[data-v-70e9a5af]{text-align:end}td.right button[data-v-70e9a5af]{margin-inline-start:var(--s2)}.two-up>.field[data-v-70e9a5af]{flex:1 1 200px;max-width:420px}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as O,c as r,a as e,f as o,e as d,w as p,_ as A,z as N,g as f,F as E,t as u,r as B,h as W,i as x,v as Z,a5 as H,I as G,j as v,k as V,p as C,C as M,o as n,O as I}from"./index-T3JGe9ku.js";import{_ as P}from"./ActionButton.vue_vue_type_script_setup_true_lang-C6PZurL0.js";import{E as J}from"./EquivalentCommand-DX5xFW-p.js";import{_ as K}from"./ErrorNote.vue_vue_type_script_setup_true_lang-CUZs06O0.js";import{_ as j}from"./RelativeTime.vue_vue_type_script_setup_true_lang-D4NO-r5D.js";import{_ as q}from"./SkeletonList.vue_vue_type_script_setup_true_lang-Bwex16vy.js";import{_ as Q}from"./RefreshButton.vue_vue_type_script_setup_true_lang-ZUc7pgOx.js";import{_ as X}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./useFormat-DIlTY5Dl.js";const Y={class:"page-head"},ee={class:"sub"},te={key:1,class:"panel"},ae={class:"grid-2"},se={class:"panel"},le={class:"phead"},ne={class:"mute",style:{"font-size":"var(--t-xs)"}},oe={key:1,class:"cards"},re={class:"name","data-label":"name"},ie={class:"break","data-label":"value"},ue={class:"dim nowrap","data-label":"updated"},de={class:"right nowrap","data-label":""},ce=["onClick"],ve={key:2,class:"hint"},me={class:"panel"},pe={class:"phead"},fe={class:"mute",style:{"font-size":"var(--t-xs)"}},he={key:1,class:"cards"},be={class:"name","data-label":"name"},_e={class:"dim nowrap","data-label":"updated"},ge={class:"right nowrap","data-label":""},ye=["onClick"],ke={key:2,class:"hint"},we={class:"panel"},$e={class:"section",style:{"margin-bottom":"var(--s3)"}},Ae={class:"row wrap two-up"},Ne={class:"field grow"},Ee=["disabled"],xe={class:"field grow"},Ve=["type","placeholder"],Ce={key:0,class:"s-failed",style:{"margin-top":"var(--s2)"}},Me={class:"row",style:{"margin-top":"var(--s3)"}},De={class:"check"},Se=["disabled"],Re={key:1,class:"hint"},Ue={class:"row",style:{"margin-top":"var(--s4)"}},ze=["disabled"],Te={key:1,class:"mute",style:{"font-size":"var(--t-sm)"}},Be=O({__name:"VariablesView",setup(Ie){const b=v([]),_=v(!1),c=v(""),D=v(!1),g=V(()=>b.value.filter(s=>!s.secret)),y=V(()=>b.value.filter(s=>s.secret)),a=v({name:"",value:"",secret:!1}),k=v(!1),i=v(null),S=/^[A-Za-z_][A-Za-z0-9_]*$/,F=V(()=>!k.value&&S.test(a.value.name)&&a.value.value.length>0);async function h(){const s=await C.get("/api/host-vars");if(_.value=!0,s.status===404){D.value=!0;return}if(!s.ok){c.value=M(s,"load the variables");return}c.value="",b.value=s.body.entries??[]}h();function R(s){i.value=s,a.value={name:s.name,value:s.value??"",secret:s.secret}}function w(){i.value=null,a.value={name:"",value:"",secret:!1}}async function L(){k.value=!0;const s=await C.put(`/api/host-vars/${a.value.name}`,{value:a.value.value,secret:a.value.secret});if(k.value=!1,!s.ok){c.value=M(s,`store ${a.value.name}`);return}c.value="",I("ok",`Stored ${a.value.name}.`),w(),h()}async function U(s){var m;const t=await C.del(`/api/host-vars/${s.name}`);if(!t.ok){c.value=M(t,`delete ${s.name}`);return}I("ok",`Deleted ${s.name}. Specs referencing it will fail to resolve until it exists again.`),((m=i.value)==null?void 0:m.name)===s.name&&w(),h()}return(s,t)=>{var m,z,T;return n(),r("div",null,[e("div",Y,[e("div",null,[t[5]||(t[5]=e("h1",null,"Variables & secrets",-1)),e("div",ee,[t[4]||(t[4]=o(" Host-level values every spec can reference ",-1)),d(A,{label:"how a spec uses these"},{default:p(()=>[...t[3]||(t[3]=[o(" Write ",-1),e("code",null,"${vars.NAME}",-1),o(" or ",-1),e("code",null,"${secrets.NAME}",-1),o(" anywhere a spec interpolates — the ",-1),e("code",null,"env:",-1),o(" block, hooks, compose settings. The spelling is deliberate: plain ",-1),e("code",null,"${NAME}",-1),o(' keeps meaning "whatever the request supplied", so the two can never collide. ',-1)])]),_:1})])]),t[6]||(t[6]=e("span",{class:"grow"},null,-1)),d(Q,{run:h})]),c.value?(n(),N(K,{key:0,text:c.value,title:"Something went wrong."},null,8,["text"])):f("",!0),D.value?(n(),r("section",te,[...t[7]||(t[7]=[e("div",{class:"banner plain"},[e("b",null,"This server has no variable store."),e("p",null,"It is an older build of pstack. Upgrade the host to use host-level variables.")],-1)])])):(n(),r(E,{key:2},[e("div",ae,[e("section",se,[e("div",le,[t[9]||(t[9]=e("h2",{class:"section"},"Variables",-1)),d(A,{label:"what belongs here"},{default:p(()=>[...t[8]||(t[8]=[o(" Configuration that is fine to read back: a region, an image tag, the log level a preview should run at. Referenced as ",-1),e("code",null,"${vars.NAME}",-1),o(". ",-1)])]),_:1}),t[10]||(t[10]=e("span",{class:"grow"},null,-1)),e("span",ne,u(g.value.length),1)]),_.value?g.value.length?(n(),r("table",oe,[t[12]||(t[12]=e("thead",null,[e("tr",null,[e("th",null,"Name"),e("th",null,"Value"),e("th",null,"Updated"),e("th",{"aria-label":"Actions"})])],-1)),e("tbody",null,[(n(!0),r(E,null,B(g.value,l=>(n(),r("tr",{key:l.name},[e("td",re,[e("code",null,u(l.name),1)]),e("td",ie,u(l.value),1),e("td",ue,[d(j,{at:l.updatedAt},null,8,["at"])]),e("td",de,[e("button",{class:"ghost sm",onClick:$=>R(l)},"Edit",8,ce),d(P,{class:"danger sm",confirm:`Delete ${l.name}?`,onRun:$=>U(l)},{default:p(()=>[...t[11]||(t[11]=[o(" Delete ",-1)])]),_:1},8,["confirm","onRun"])])]))),128))])])):(n(),r("p",ve,"No variables yet.")):(n(),N(q,{key:0,rows:2}))]),e("section",me,[e("div",pe,[t[14]||(t[14]=e("h2",{class:"section"},"Secrets",-1)),d(A,{label:"what makes a secret different"},{default:p(()=>[...t[13]||(t[13]=[o(" The value is write-only: no page and no API route ever returns it, and it is scrubbed from job and container logs by content. Referenced as ",-1),e("code",null,"${secrets.NAME}",-1),o(" — refused in ",-1),e("code",null,"stack:",-1),o(", because a stack name appears in container names and hostnames that cannot be redacted. ",-1)])]),_:1}),t[15]||(t[15]=e("span",{class:"grow"},null,-1)),e("span",fe,u(y.value.length),1)]),_.value?y.value.length?(n(),r("table",he,[t[17]||(t[17]=e("thead",null,[e("tr",null,[e("th",null,"Name"),e("th",null,"Updated"),e("th",{"aria-label":"Actions"})])],-1)),e("tbody",null,[(n(!0),r(E,null,B(y.value,l=>(n(),r("tr",{key:l.name},[e("td",be,[e("code",null,u(l.name),1)]),e("td",_e,[d(j,{at:l.updatedAt},null,8,["at"])]),e("td",ge,[e("button",{class:"ghost sm",onClick:$=>R(l)},"Replace",8,ye),d(P,{class:"danger sm",confirm:`Delete ${l.name}?`,onRun:$=>U(l)},{default:p(()=>[...t[16]||(t[16]=[o(" Delete ",-1)])]),_:1},8,["confirm","onRun"])])]))),128))])])):(n(),r("p",ke,"No secrets yet.")):(n(),N(q,{key:0,rows:2}))])]),e("section",we,[e("h2",$e,u(i.value?i.value.secret?`Replace the value of ${i.value.name}`:`Edit ${i.value.name}`:"Add a variable or secret"),1),e("form",{onSubmit:W(L,["prevent"])},[e("div",Ae,[e("label",Ne,[t[18]||(t[18]=e("span",null,"Name",-1)),x(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>a.value.name=l),type:"text",placeholder:"DB_PASSWORD",spellcheck:"false",autocomplete:"off",disabled:!!i.value},null,8,Ee),[[Z,a.value.name,void 0,{trim:!0}]])]),e("label",xe,[t[19]||(t[19]=e("span",null,"Value",-1)),x(e("input",{"onUpdate:modelValue":t[1]||(t[1]=l=>a.value.value=l),type:a.value.secret?"password":"text",placeholder:(m=i.value)!=null&&m.secret?"enter the new value":"eu-central",spellcheck:"false",autocomplete:"off"},null,8,Ve),[[H,a.value.value]])])]),a.value.name&&!S.test(a.value.name)?(n(),r("p",Ce," Letters, digits and _ only, not starting with a digit — it has to be referenceable in a spec. ")):f("",!0),e("div",Me,[e("label",De,[x(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>a.value.secret=l),type:"checkbox",disabled:((z=i.value)==null?void 0:z.secret)===!0},null,8,Se),[[G,a.value.secret]]),t[20]||(t[20]=o(" Secret — the value can never be read back ",-1))])]),(T=i.value)!=null&&T.secret?(n(),r("p",Re," A secret cannot be turned back into a readable variable — that would reveal a value stored write-only. Delete it and create a variable instead, re-entering the value. ")):f("",!0),e("div",Ue,[e("button",{class:"primary",type:"submit",disabled:!F.value},u(i.value?"Save":"Add"),9,ze),i.value?(n(),r("button",{key:0,type:"button",class:"ghost",onClick:w},"Cancel")):f("",!0),i.value?f("",!0):(n(),r("span",Te,[t[21]||(t[21]=o(" Reference it as ",-1)),e("code",null,"$"+u("{")+u(a.value.secret?"secrets":"vars")+"."+u(a.value.name||"NAME")+u("}"),1),t[22]||(t[22]=o(" in any spec ",-1))]))]),d(J,{what:"storing this value",method:"PUT",path:`/api/host-vars/${a.value.name||"NAME"}`,body:{value:a.value.secret?"…":a.value.value||"…",secret:a.value.secret}},null,8,["path","body"])],32)])],64))])}}}),Ge=X(Be,[["__scopeId","data-v-70e9a5af"]]);export{Ge as default};
|
|
2
|
-
//# sourceMappingURL=VariablesView-DatC33mT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VariablesView-DatC33mT.js","sources":["../../src/views/VariablesView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Host variables & secrets — the GitHub model, scoped to this host.\n *\n * TWO SECTIONS BECAUSE THEY ARE TWO CONTRACTS. A variable's value is configuration anyone may read\n * back; a secret's value goes IN through this form and never comes back OUT — the list shows its\n * name and when it changed, nothing else, because the server keeps no route that returns it. The\n * form says so at the moment of storing, not in documentation nobody reads.\n *\n * Specs reference these as `${vars.NAME}` and `${secrets.NAME}` — spelled differently from plain\n * `${NAME}` on purpose, so a spec that reads host state says so on its face.\n */\nimport { computed, ref } from 'vue';\nimport { api, problem } from '../api/client';\nimport { toast } from '../composables/useToasts';\nimport ActionButton from '../components/ActionButton.vue';\nimport EquivalentCommand from '../components/EquivalentCommand.vue';\nimport ErrorNote from '../components/ErrorNote.vue';\nimport InfoHint from '../components/InfoHint.vue';\nimport RelativeTime from '../components/RelativeTime.vue';\nimport SkeletonList from '../components/SkeletonList.vue';\nimport RefreshButton from '../components/RefreshButton.vue';\n\ntype Entry = { name: string; value: string | null; secret: boolean; updatedAt: number };\n\nconst entries = ref<Entry[]>([]);\nconst loaded = ref(false);\nconst listError = ref('');\nconst unsupported = ref(false);\n\nconst vars = computed(() => entries.value.filter((e) => !e.secret));\nconst secrets = computed(() => entries.value.filter((e) => e.secret));\n\nconst form = ref({ name: '', value: '', secret: false });\nconst saving = ref(false);\n/** Editing state: the row being replaced. For a secret this means re-entering the value. */\nconst editing = ref<Entry | null>(null);\n\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst canSave = computed(\n () => !saving.value && NAME.test(form.value.name) && form.value.value.length > 0,\n);\n\nasync function load(): Promise<void> {\n const r = await api.get<{ entries: Entry[] }>('/api/host-vars');\n loaded.value = true;\n if (r.status === 404) {\n unsupported.value = true;\n return;\n }\n if (!r.ok) {\n listError.value = problem(r, 'load the variables');\n return;\n }\n listError.value = '';\n entries.value = r.body.entries ?? [];\n}\nvoid load();\n\nfunction startEdit(e: Entry): void {\n editing.value = e;\n form.value = { name: e.name, value: e.value ?? '', secret: e.secret };\n}\n\nfunction cancelEdit(): void {\n editing.value = null;\n form.value = { name: '', value: '', secret: false };\n}\n\nasync function save(): Promise<void> {\n saving.value = true;\n const r = await api.put(`/api/host-vars/${form.value.name}`, {\n value: form.value.value,\n secret: form.value.secret,\n });\n saving.value = false;\n if (!r.ok) {\n listError.value = problem(r, `store ${form.value.name}`);\n return;\n }\n listError.value = '';\n toast('ok', `Stored ${form.value.name}.`);\n cancelEdit();\n void load();\n}\n\nasync function remove(e: Entry): Promise<void> {\n const r = await api.del(`/api/host-vars/${e.name}`);\n if (!r.ok) {\n listError.value = problem(r, `delete ${e.name}`);\n return;\n }\n toast('ok', `Deleted ${e.name}. Specs referencing it will fail to resolve until it exists again.`);\n if (editing.value?.name === e.name) cancelEdit();\n void load();\n}\n</script>\n\n<template>\n <div>\n <div class=\"page-head\">\n <div>\n <h1>Variables & secrets</h1>\n <div class=\"sub\">\n Host-level values every spec can reference\n <InfoHint label=\"how a spec uses these\">\n Write <code>${vars.NAME}</code> or <code>${secrets.NAME}</code> anywhere a spec\n interpolates — the <code>env:</code> block, hooks, compose settings. The spelling is\n deliberate: plain <code>${NAME}</code> keeps meaning \"whatever the request supplied\", so\n the two can never collide.\n </InfoHint>\n </div>\n </div>\n <span class=\"grow\" />\n <RefreshButton :run=\"load\" />\n </div>\n\n <ErrorNote v-if=\"listError\" :text=\"listError\" title=\"Something went wrong.\" />\n\n <section v-if=\"unsupported\" class=\"panel\">\n <div class=\"banner plain\">\n <b>This server has no variable store.</b>\n <p>It is an older build of pstack. Upgrade the host to use host-level variables.</p>\n </div>\n </section>\n\n <template v-else>\n <div class=\"grid-2\">\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Variables</h2>\n <InfoHint label=\"what belongs here\">\n Configuration that is fine to read back: a region, an image tag, the log level a\n preview should run at. Referenced as <code>${vars.NAME}</code>.\n </InfoHint>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ vars.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" />\n <table v-else-if=\"vars.length\" class=\"cards\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Value</th>\n <th>Updated</th>\n <th aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"e in vars\" :key=\"e.name\">\n <td class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td class=\"break\" data-label=\"value\">{{ e.value }}</td>\n <td class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Edit</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">No variables yet.</p>\n </section>\n\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Secrets</h2>\n <InfoHint label=\"what makes a secret different\">\n The value is write-only: no page and no API route ever returns it, and it is scrubbed\n from job and container logs by content. Referenced as <code>${secrets.NAME}</code> —\n refused in <code>stack:</code>, because a stack name appears in container names and\n hostnames that cannot be redacted.\n </InfoHint>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ secrets.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" />\n <table v-else-if=\"secrets.length\" class=\"cards\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Updated</th>\n <th aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"e in secrets\" :key=\"e.name\">\n <td class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Replace</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">No secrets yet.</p>\n </section>\n </div>\n\n <section class=\"panel\">\n <h2 class=\"section\" style=\"margin-bottom: var(--s3)\">\n {{ editing ? (editing.secret ? `Replace the value of ${editing.name}` : `Edit ${editing.name}`) : 'Add a variable or secret' }}\n </h2>\n\n <form @submit.prevent=\"save\">\n <div class=\"row wrap two-up\">\n <label class=\"field grow\">\n <span>Name</span>\n <input\n v-model.trim=\"form.name\"\n type=\"text\"\n placeholder=\"DB_PASSWORD\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :disabled=\"!!editing\"\n />\n </label>\n <label class=\"field grow\">\n <span>Value</span>\n <input\n v-model=\"form.value\"\n :type=\"form.secret ? 'password' : 'text'\"\n :placeholder=\"editing?.secret ? 'enter the new value' : 'eu-central'\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n />\n </label>\n </div>\n <p v-if=\"form.name && !NAME.test(form.name)\" class=\"s-failed\" style=\"margin-top: var(--s2)\">\n Letters, digits and _ only, not starting with a digit — it has to be referenceable in a spec.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s3)\">\n <label class=\"check\">\n <input v-model=\"form.secret\" type=\"checkbox\" :disabled=\"editing?.secret === true\" />\n Secret — the value can never be read back\n </label>\n </div>\n <p v-if=\"editing?.secret\" class=\"hint\">\n A secret cannot be turned back into a readable variable — that would reveal a value\n stored write-only. Delete it and create a variable instead, re-entering the value.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s4)\">\n <button class=\"primary\" type=\"submit\" :disabled=\"!canSave\">\n {{ editing ? 'Save' : 'Add' }}\n </button>\n <button v-if=\"editing\" type=\"button\" class=\"ghost\" @click=\"cancelEdit\">Cancel</button>\n <span v-if=\"!editing\" class=\"mute\" style=\"font-size: var(--t-sm)\">\n Reference it as <code>${{ '{' }}{{ form.secret ? 'secrets' : 'vars' }}.{{ form.name || 'NAME' }}{{ '}' }}</code> in any spec\n </span>\n </div>\n <EquivalentCommand\n what=\"storing this value\"\n method=\"PUT\"\n :path=\"`/api/host-vars/${form.name || 'NAME'}`\"\n :body=\"{ value: form.secret ? '…' : form.value || '…', secret: form.secret }\"\n />\n </form>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\ntd.right {\n text-align: end;\n}\ntd.right button {\n margin-inline-start: var(--s2);\n}\n.two-up > .field {\n /* A form caps itself even though the page does not — a 1300px-wide text input reads as a text\n editor, not a field. See docs/ui-rules.md. */\n flex: 1 1 200px;\n max-width: 420px;\n}\n</style>\n"],"names":["entries","ref","loaded","listError","unsupported","vars","computed","e","secrets","form","saving","editing","NAME","canSave","load","r","api","problem","startEdit","cancelEdit","save","toast","remove","_a","_createElementBlock","_createElementVNode","_hoisted_1","_cache","_hoisted_2","_createVNode","InfoHint","RefreshButton","_createBlock","ErrorNote","_openBlock","_hoisted_3","_Fragment","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","_renderList","_hoisted_9","_hoisted_10","_hoisted_11","RelativeTime","_hoisted_12","$event","_hoisted_13","ActionButton","_hoisted_14","SkeletonList","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_29","_vModelDynamic","_hoisted_31","_hoisted_32","_hoisted_33","_b","_vModelCheckbox","_c","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","EquivalentCommand"],"mappings":"o7DAyBA,MAAMA,EAAUC,EAAa,EAAE,EACzBC,EAASD,EAAI,EAAK,EAClBE,EAAYF,EAAI,EAAE,EAClBG,EAAcH,EAAI,EAAK,EAEvBI,EAAOC,EAAS,IAAMN,EAAQ,MAAM,OAAQO,GAAM,CAACA,EAAE,MAAM,CAAC,EAC5DC,EAAUF,EAAS,IAAMN,EAAQ,MAAM,OAAQO,GAAMA,EAAE,MAAM,CAAC,EAE9DE,EAAOR,EAAI,CAAE,KAAM,GAAI,MAAO,GAAI,OAAQ,GAAO,EACjDS,EAAST,EAAI,EAAK,EAElBU,EAAUV,EAAkB,IAAI,EAEhCW,EAAO,2BACPC,EAAUP,EACd,IAAM,CAACI,EAAO,OAASE,EAAK,KAAKH,EAAK,MAAM,IAAI,GAAKA,EAAK,MAAM,MAAM,OAAS,CAAA,EAGjF,eAAeK,GAAsB,CACnC,MAAMC,EAAI,MAAMC,EAAI,IAA0B,gBAAgB,EAE9D,GADAd,EAAO,MAAQ,GACXa,EAAE,SAAW,IAAK,CACpBX,EAAY,MAAQ,GACpB,MACF,CACA,GAAI,CAACW,EAAE,GAAI,CACTZ,EAAU,MAAQc,EAAQF,EAAG,oBAAoB,EACjD,MACF,CACAZ,EAAU,MAAQ,GAClBH,EAAQ,MAAQe,EAAE,KAAK,SAAW,CAAA,CACpC,CACKD,EAAA,EAEL,SAASI,EAAUX,EAAgB,CACjCI,EAAQ,MAAQJ,EAChBE,EAAK,MAAQ,CAAE,KAAMF,EAAE,KAAM,MAAOA,EAAE,OAAS,GAAI,OAAQA,EAAE,MAAA,CAC/D,CAEA,SAASY,GAAmB,CAC1BR,EAAQ,MAAQ,KAChBF,EAAK,MAAQ,CAAE,KAAM,GAAI,MAAO,GAAI,OAAQ,EAAA,CAC9C,CAEA,eAAeW,GAAsB,CACnCV,EAAO,MAAQ,GACf,MAAMK,EAAI,MAAMC,EAAI,IAAI,kBAAkBP,EAAK,MAAM,IAAI,GAAI,CAC3D,MAAOA,EAAK,MAAM,MAClB,OAAQA,EAAK,MAAM,MAAA,CACpB,EAED,GADAC,EAAO,MAAQ,GACX,CAACK,EAAE,GAAI,CACTZ,EAAU,MAAQc,EAAQF,EAAG,SAASN,EAAK,MAAM,IAAI,EAAE,EACvD,MACF,CACAN,EAAU,MAAQ,GAClBkB,EAAM,KAAM,UAAUZ,EAAK,MAAM,IAAI,GAAG,EACxCU,EAAA,EACKL,EAAA,CACP,CAEA,eAAeQ,EAAOf,EAAyB,OAC7C,MAAMQ,EAAI,MAAMC,EAAI,IAAI,kBAAkBT,EAAE,IAAI,EAAE,EAClD,GAAI,CAACQ,EAAE,GAAI,CACTZ,EAAU,MAAQc,EAAQF,EAAG,UAAUR,EAAE,IAAI,EAAE,EAC/C,MACF,CACAc,EAAM,KAAM,WAAWd,EAAE,IAAI,oEAAoE,IAC7FgB,EAAAZ,EAAQ,QAAR,YAAAY,EAAe,QAAShB,EAAE,MAAMY,EAAA,EAC/BL,EAAA,CACP,oCAIEU,EAwKM,MAAA,KAAA,CAvKJC,EAeM,MAfNC,EAeM,CAdJD,EAWM,MAAA,KAAA,CAVJE,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAgC,UAA5B,sBAAuB,EAAA,GAC3BA,EAQM,MARNG,GAQM,eARW,+CAEf,EAAA,GAAAC,EAKWC,EAAA,CALD,MAAM,yBAAuB,WAAC,IAChC,CAAA,GAAAH,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,GADgC,UAChC,EAAA,EAAAF,EAAyB,YAAnB,eAAY,EAAA,IAAO,OAAI,EAAA,EAAAA,EAA4B,YAAtB,kBAAe,EAAA,IAAO,uCAC5C,EAAA,EAAAA,EAAiB,YAAX,OAAI,EAAA,IAAO,sEAClB,EAAA,EAAAA,EAAoB,YAAd,UAAO,EAAA,IAAO,iFAExC,EAAA,CAAA,2BAGJA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBI,EAA6BE,EAAA,CAAb,IAAKjB,EAAI,CAAA,GAGVX,EAAA,WAAjB6B,EAA8EC,EAAA,OAAjD,KAAM9B,EAAA,MAAW,MAAM,uBAAA,6BAErCC,EAAA,OAAf8B,IAAAV,EAKU,UALVW,GAKU,CAAA,GAAAR,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJRF,EAGM,MAAA,CAHD,MAAM,gBAAc,CACvBA,EAAyC,SAAtC,oCAAkC,EACrCA,EAAoF,SAAjF,+EAA6E,CAAA,gBAIpFD,EA4IWY,EAAA,CAAA,IAAA,GAAA,CA3ITX,EA4EM,MA5ENY,GA4EM,CA3EJZ,EAoCU,UApCVa,GAoCU,CAnCRb,EAQM,MARNc,GAQM,CAPJZ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAkC,KAAA,CAA9B,MAAM,SAAA,EAAU,YAAS,EAAA,GAC7BI,EAGWC,EAAA,CAHD,MAAM,qBAAmB,WAAC,IAEG,CAAA,GAAAH,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,GAFH,0HAEG,EAAA,EAAAF,EAAyB,YAAnB,eAAY,EAAA,IAAO,KAChE,EAAA,CAAA,yBACAA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBA,EAA0E,OAA1Ee,GAA0EC,EAArBpC,EAAA,MAAK,MAAM,EAAA,CAAA,CAAA,GAG7CH,EAAA,MACHG,EAAA,MAAK,QAAvB6B,EAAA,EAAAV,EAsBQ,QAtBRkB,GAsBQ,eArBNjB,EAOQ,QAAA,KAAA,CANNA,EAKK,KAAA,KAAA,CAJHA,EAAa,UAAT,MAAI,EACRA,EAAc,UAAV,OAAK,EACTA,EAAgB,UAAZ,SAAO,EACXA,EAA2B,KAAA,CAAvB,aAAW,UAAS,CAAA,SAG5BA,EAYQ,QAAA,KAAA,QAXND,EAUKY,EAAA,KAAAO,EAVWtC,EAAA,MAALE,QAAXiB,EAUK,KAAA,CAVkB,IAAKjB,EAAE,IAAA,GAC5BkB,EAAiE,KAAjEmB,GAAiE,CAA9BnB,EAAyB,OAAA,KAAAgB,EAAhBlC,EAAE,IAAI,EAAA,CAAA,CAAA,GAClDkB,EAAuD,KAAvDoB,GAAuDJ,EAAflC,EAAE,KAAK,EAAA,CAAA,EAC/CkB,EAAmF,KAAnFqB,GAAmF,CAAvCjB,EAAkCkB,EAAA,CAAnB,GAAIxC,EAAE,SAAA,mBACjEkB,EAKK,KALLuB,GAKK,CAJHvB,EAA4D,SAAA,CAApD,MAAM,WAAY,QAAKwB,GAAE/B,EAAUX,CAAC,CAAA,EAAG,OAAI,EAAA2C,EAAA,EACnDrB,EAEesB,EAAA,CAFD,MAAM,YAAa,QAAO,UAAY5C,EAAE,IAAI,IAAM,MAAG0C,GAAE3B,EAAOf,CAAC,CAAA,aAAG,IAEhF,CAAA,GAAAoB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,GAFgF,WAEhF,EAAA,CAAA,uDAKRH,EAA4C,IAA5C4B,GAAuB,mBAAiB,QAxBxCpB,EAAyCqB,EAAA,OAAX,KAAM,CAAA,GAwBI,GAG1C5B,EAoCU,UApCV6B,GAoCU,CAnCR7B,EAUM,MAVN8B,GAUM,CATJ5B,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAgC,KAAA,CAA5B,MAAM,SAAA,EAAU,UAAO,EAAA,GAC3BI,EAKWC,EAAA,CALD,MAAM,iCAA+B,WAAC,IAEQ,CAAA,GAAAH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,GAFR,gJAEQ,EAAA,EAAAF,EAA4B,YAAtB,kBAAe,EAAA,IAAO,iBACvE,EAAA,EAAAA,EAAmB,YAAb,SAAM,EAAA,IAAO,4FAEhC,EAAA,CAAA,yBACAA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBA,EAA6E,OAA7E+B,GAA6Ef,EAAxBjC,EAAA,MAAQ,MAAM,EAAA,CAAA,CAAA,GAGhDN,EAAA,MACHM,EAAA,MAAQ,QAA1B0B,EAAA,EAAAV,EAoBQ,QApBRiC,GAoBQ,eAnBNhC,EAMQ,QAAA,KAAA,CALNA,EAIK,KAAA,KAAA,CAHHA,EAAa,UAAT,MAAI,EACRA,EAAgB,UAAZ,SAAO,EACXA,EAA2B,KAAA,CAAvB,aAAW,UAAS,CAAA,SAG5BA,EAWQ,QAAA,KAAA,QAVND,EASKY,EAAA,KAAAO,EATWnC,EAAA,MAALD,QAAXiB,EASK,KAAA,CATqB,IAAKjB,EAAE,IAAA,GAC/BkB,EAAiE,KAAjEiC,GAAiE,CAA9BjC,EAAyB,OAAA,KAAAgB,EAAhBlC,EAAE,IAAI,EAAA,CAAA,CAAA,GAClDkB,EAAmF,KAAnFkC,GAAmF,CAAvC9B,EAAkCkB,EAAA,CAAnB,GAAIxC,EAAE,SAAA,mBACjEkB,EAKK,KALLmC,GAKK,CAJHnC,EAA+D,SAAA,CAAvD,MAAM,WAAY,QAAKwB,GAAE/B,EAAUX,CAAC,CAAA,EAAG,UAAO,EAAAsD,EAAA,EACtDhC,EAEesB,EAAA,CAFD,MAAM,YAAa,QAAO,UAAY5C,EAAE,IAAI,IAAM,MAAG0C,GAAE3B,EAAOf,CAAC,CAAA,aAAG,IAEhF,CAAA,GAAAoB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,GAFgF,WAEhF,EAAA,CAAA,uDAKRH,EAA0C,IAA1CsC,GAAuB,iBAAe,QAtBtC9B,EAAyCqB,EAAA,OAAX,KAAM,CAAA,GAsBE,KAI1C5B,EA4DU,UA5DVsC,GA4DU,CA3DRtC,EAEK,KAFLuC,GAEKvB,EADA9B,EAAA,MAAWA,EAAA,MAAQ,OAAM,wBAA2BA,QAAQ,IAAI,GAAA,QAAaA,EAAA,MAAQ,IAAI,GAAA,0BAAA,EAAA,CAAA,EAG9Fc,EAsDO,OAAA,CAtDA,WAAgBL,EAAI,CAAA,SAAA,CAAA,CAAA,GACzBK,EAsBM,MAtBNwC,GAsBM,CArBJxC,EAUQ,QAVRyC,GAUQ,CATNvC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAiB,YAAX,OAAI,EAAA,KACVA,EAOE,QAAA,CANc,sBAAAE,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAsB,GAAAxC,EAAA,MAAK,KAAIwC,GACvB,KAAK,OACL,YAAY,cACZ,WAAW,QACX,aAAa,MACZ,WAAYtC,EAAA,KAAA,iBALCF,EAAA,MAAK,YAAX,CAAA,KAAR,EAAA,CAAwB,MAQ5BgB,EASQ,QATR0C,GASQ,CARNxC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAkB,YAAZ,QAAK,EAAA,KACXA,EAME,QAAA,CALS,sBAAAE,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAsB,GAAAxC,EAAA,MAAK,MAAKwC,GAClB,KAAMxC,EAAA,MAAK,OAAM,WAAA,OACjB,aAAac,EAAAZ,EAAA,QAAA,MAAAY,EAAS,OAAM,sBAAA,aAC7B,WAAW,QACX,aAAa,KAAA,cAJJ,CAAA6C,EAAA3D,EAAA,MAAK,KAAK,CAAA,OAQhBA,EAAA,MAAK,MAAI,CAAKG,EAAK,KAAKH,EAAA,MAAK,IAAI,OAA1Ce,EAEI,IAFJ6C,GAA4F,iGAE5F,YAEA5C,EAKM,MALN6C,GAKM,CAJJ7C,EAGQ,QAHR8C,GAGQ,GAFN9C,EAAoF,QAAA,CAApE,sBAAAE,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAsB,GAAAxC,EAAA,MAAK,OAAMwC,GAAE,KAAK,WAAY,WAAUuB,EAAA7D,EAAA,QAAA,YAAA6D,EAAS,UAAM,EAAA,cAAvD,CAAAC,EAAAhE,EAAA,MAAK,MAAM,CAAA,mBAAyD,8CAEtF,EAAA,EAAA,MAEOiE,EAAA/D,EAAA,QAAA,MAAA+D,EAAS,YAAlBlD,EAGI,IAHJmD,GAAuC,0KAGvC,YAEAlD,EAQM,MARNmD,GAQM,CAPJnD,EAES,SAAA,CAFD,MAAM,UAAU,KAAK,SAAU,UAAWZ,EAAA,KAAA,IAC7CF,EAAA,MAAO,OAAA,KAAA,EAAA,EAAAkE,EAAA,EAEElE,EAAA,WAAda,EAAsF,SAAA,OAA/D,KAAK,SAAS,MAAM,QAAS,QAAOL,CAAA,EAAY,QAAM,YAChER,EAAA,gBAAbuB,IAAAV,EAEO,OAFPsD,GAEO,iBAF2D,oBAChD,EAAA,GAAArD,EAAgG,OAAA,KAA1F,IAACgB,EAAG,GAAG,IAAMhC,EAAA,MAAK,OAAM,UAAA,MAAA,EAAwB,IAACgC,EAAGhC,EAAA,MAAK,gBAAoB,GAAG,EAAA,CAAA,kBAAU,gBAClH,EAAA,EAAA,MAEFoB,EAKEkD,EAAA,CAJA,KAAK,qBACL,OAAO,MACN,KAAI,kBAAoBtE,EAAA,MAAK,MAAI,MAAA,GACjC,KAAI,CAAA,MAAWA,EAAA,MAAK,OAAM,IAASA,EAAA,MAAK,OAAK,IAAA,OAAiBA,EAAA,MAAK,MAAA,CAAM"}
|