@vtechcom/hexcore 2.0.0-beta.1 → 2.0.0-beta.2
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/CHANGELOG.md +22 -2
- package/README.md +6 -3
- package/dist/cli/hexcore.js +113 -0
- package/dist/cli/hexcore.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/hydra/argv.js +10 -0
- package/dist/hydra/argv.js.map +1 -1
- package/dist/hydra/capabilities.js +3 -0
- package/dist/hydra/capabilities.js.map +1 -1
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts +12 -6
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts.map +1 -1
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js +119 -38
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js.map +1 -1
- package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js +119 -38
- package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js.map +1 -1
- package/package.json +2 -2
- package/web/200.html +20 -18
- package/web/404.html +20 -18
- package/web/_nuxt/{DgDlQiDU.js → B-lS44p0.js} +1 -1
- package/web/_nuxt/{CqsSss-D.js → B1NtJEdQ.js} +1 -1
- package/web/_nuxt/B1ZAR7mP.js +1 -0
- package/web/_nuxt/BFc_bxHc.js +1 -0
- package/web/_nuxt/BGGQYvrr.js +1 -0
- package/web/_nuxt/BPQ3VLAy.js +1 -0
- package/web/_nuxt/BV_QiRi8.js +1 -0
- package/web/_nuxt/BW_3NqYy.js +1 -0
- package/web/_nuxt/B_DikKgJ.js +1 -0
- package/web/_nuxt/B_Vrwblg.js +1 -0
- package/web/_nuxt/Bbbbx_yO.js +1 -0
- package/web/_nuxt/BeS-yS0C.js +1 -0
- package/web/_nuxt/{Onf26W-r.js → BfFJ09wD.js} +1 -1
- package/web/_nuxt/{rhEiP908.js → Bj1gglGt.js} +1 -1
- package/web/_nuxt/BkRxDbrA.js +1 -0
- package/web/_nuxt/Bmqx7s9K.js +1 -0
- package/web/_nuxt/BnZUk6sk.js +1 -0
- package/web/_nuxt/BqoV-QnQ.js +3 -0
- package/web/_nuxt/Bv47q1hu.js +1 -0
- package/web/_nuxt/Bz1eTnxX.js +1 -0
- package/web/_nuxt/{CkCrahXt.js → CAfY3dDF.js} +1 -1
- package/web/_nuxt/CBchb2Up.js +1 -0
- package/web/_nuxt/CEGGvSzA.js +1 -0
- package/web/_nuxt/CG6Dc4jp.js +1 -0
- package/web/_nuxt/{LGfPBi70.js → CH5xbifj.js} +1 -1
- package/web/_nuxt/CZFMOWPc.js +1 -0
- package/web/_nuxt/C_n__rkq.js +1 -0
- package/web/_nuxt/CaWYVaRD.js +1 -0
- package/web/_nuxt/ChS5Np24.js +1 -0
- package/web/_nuxt/Cp-IABpG.js +1 -0
- package/web/_nuxt/Cuk6v7N8.js +1 -0
- package/web/_nuxt/CzTJPvyS.js +1 -0
- package/web/_nuxt/D-Stn6KG.js +1 -0
- package/web/_nuxt/D7oLnXFd.js +1 -0
- package/web/_nuxt/DAHap_t6.js +1 -0
- package/web/_nuxt/DBL-cQio.js +1 -0
- package/web/_nuxt/DIi866IK.js +7 -0
- package/web/_nuxt/DMl_I_aT.js +1 -0
- package/web/_nuxt/Dd34_EaM.js +1 -0
- package/web/_nuxt/DlAUqK2U.js +1 -0
- package/web/_nuxt/DlHvzKYz.js +1 -0
- package/web/_nuxt/DmF-LwQa.js +1 -0
- package/web/_nuxt/DmPn-vCY.js +1 -0
- package/web/_nuxt/DsttYulo.js +1 -0
- package/web/_nuxt/{DL9i0ayn.js → DybEwxe5.js} +1 -1
- package/web/_nuxt/JXuauuVw.js +41 -0
- package/web/_nuxt/Yzrsuije.js +1 -0
- package/web/_nuxt/builds/latest.json +1 -1
- package/web/_nuxt/builds/meta/5b0a342e-aa78-42e7-89fa-ee280f32f47a.json +1 -0
- package/web/_nuxt/dhmyGJu2.js +1 -0
- package/web/_nuxt/entry.Q53uGRvC.css +1 -0
- package/web/_nuxt/error-404.DL126m4x.css +1 -0
- package/web/_nuxt/error-500.BUVIYHmG.css +1 -0
- package/web/_nuxt/{YUGC0nt0.js → hza_YA5H.js} +1 -1
- package/web/_nuxt/index.D8biniUe.css +1 -0
- package/web/_nuxt/vzCX1O3u.js +1 -0
- package/web/_nuxt/{CZK6xUH-.js → yhvT770r.js} +1 -1
- package/web/heads/index.html +20 -18
- package/web/heads/new/index.html +20 -18
- package/web/index.html +20 -18
- package/web/login/index.html +20 -18
- package/web/settings/index.html +20 -18
- package/web/setup/index.html +20 -18
- package/web/_nuxt/2MxohCD-.js +0 -1
- package/web/_nuxt/4pFXjB_u.js +0 -1
- package/web/_nuxt/B-v0dEQX.js +0 -1
- package/web/_nuxt/B4yE3U25.js +0 -1
- package/web/_nuxt/BFh8Ai0L.js +0 -1
- package/web/_nuxt/BgPn4NJH.js +0 -1
- package/web/_nuxt/Bj1xviSh.js +0 -1
- package/web/_nuxt/BnotlrL7.js +0 -1
- package/web/_nuxt/C1YRg2ic.js +0 -1
- package/web/_nuxt/CGD7MYQH.js +0 -1
- package/web/_nuxt/CQcG7Bu4.js +0 -1
- package/web/_nuxt/CS3KqpH_.js +0 -1
- package/web/_nuxt/CT-yt694.js +0 -1
- package/web/_nuxt/CcdyYRYz.js +0 -1
- package/web/_nuxt/CePNTU1S.js +0 -1
- package/web/_nuxt/CgPLsCeU.js +0 -5
- package/web/_nuxt/CnOqDT9k.js +0 -3
- package/web/_nuxt/Cr8dL64Q.js +0 -1
- package/web/_nuxt/D3CwzwU0.js +0 -1
- package/web/_nuxt/DDANn6-H.js +0 -1
- package/web/_nuxt/DDl9uKIA.js +0 -1
- package/web/_nuxt/DLNoK9BC.js +0 -1
- package/web/_nuxt/DLztFeOQ.js +0 -1
- package/web/_nuxt/DPihKXdt.js +0 -1
- package/web/_nuxt/DXyr6Naa.js +0 -1
- package/web/_nuxt/DeDg5p0D.js +0 -1
- package/web/_nuxt/DyPI7qJE.js +0 -30
- package/web/_nuxt/QZNQe_OX.js +0 -1
- package/web/_nuxt/Y8IJM-iz.js +0 -1
- package/web/_nuxt/builds/meta/7e461629-93e2-4694-b237-6d5c6a85c97c.json +0 -1
- package/web/_nuxt/builds/meta/dev.json +0 -1
- package/web/_nuxt/entry.BxsAxZxf.css +0 -1
- package/web/_nuxt/error-404.XbtAw-qw.css +0 -1
- package/web/_nuxt/error-500.CNHVltWM.css +0 -1
- package/web/_nuxt/rS90pPZ_.js +0 -1
- package/web/_nuxt/vSj9Ec0g.js +0 -1
- package/web/_nuxt/woNjBJMN.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as O,c as q,d as A,e as G,a as J}from"./BFc_bxHc.js";import{c as L}from"./Bj1gglGt.js";import{u as R,f as U}from"./Bz1eTnxX.js";import{u as j}from"./BnZUk6sk.js";import{e as z,f as K,J as Q,E as W,r as X,o as s,c as d,l as V,w as r,b as f,i as t,F as h,y as Y,d as v,t as _,k as C,a as $,q as g,n as w}from"./DIi866IK.js";const Z={class:"space-y-2"},ee={key:0,class:"space-y-2"},ae={class:"text-xs text-muted-foreground"},te={class:"text-foreground"},le={key:1,class:"text-xs text-muted-foreground"},k="__custom__",ie=z({__name:"HydraImageField",props:{modelValue:{},defaultImage:{}},emits:["update:modelValue"],setup(x,{emit:H}){const i=x,F=H,B=j(),{t:o,locale:E}=K(),{versionSummary:b}=R(),p=g(()=>{const e=B.hydraVersions;if(!e)return[];const l=e.profiles.map(a=>({value:a.image,label:a.label+(a.recommended?` · ${o("imageField.recommended")}`:""),summary:b(a.id,a.summary)})),m=i.defaultImage;if(m&&!l.some(a=>a.value===m)){const a=U(m);l.unshift({value:m,label:o("imageField.serverDefault",{image:m}),summary:a?b(a.id,a.summary):o("imageField.unknownSummary")})}return l}),n=w(!1),c=w("");Q(()=>{if(n.value)return;const e=i.modelValue;!e||!p.value.length||p.value.some(l=>l.value===e)||(n.value=!0,c.value=e)});const y=g({get:()=>n.value?k:i.modelValue,set:e=>{n.value=e===k,F("update:modelValue",n.value?c.value.trim():e)}});W(c,e=>{n.value&&F("update:modelValue",e.trim())});const N=g(()=>p.value.find(e=>e.value===i.modelValue)),I=g(()=>n.value&&i.modelValue?U(i.modelValue):void 0);return(e,l)=>{const m=q,a=O,S=G,T=A,D=J,P=L,M=X("i18n-t");return s(),d("div",Z,[(s(),V(D,{key:t(E),modelValue:t(y),"onUpdate:modelValue":l[0]||(l[0]=u=>C(y)?y.value=u:null)},{default:r(()=>[f(a,{id:"hydraNodeImage",class:"w-full"},{default:r(()=>[f(m,{placeholder:t(o)("imageField.custom")},null,8,["placeholder"])]),_:1}),f(T,null,{default:r(()=>[(s(!0),d(h,null,Y(t(p),u=>(s(),V(S,{key:u.value,value:u.value},{default:r(()=>[v(_(u.label),1)]),_:2},1032,["value"]))),128)),f(S,{value:k},{default:r(()=>[v(_(t(o)("imageField.custom")),1)]),_:1})]),_:1})]),_:1},8,["modelValue"])),t(n)?(s(),d("div",ee,[f(P,{modelValue:t(c),"onUpdate:modelValue":l[1]||(l[1]=u=>C(c)?c.value=u:null),placeholder:t(o)("imageField.customPlaceholder"),spellcheck:"false"},null,8,["modelValue","placeholder"]),$("p",ae,[t(I)?(s(),V(M,{key:0,keypath:"imageField.profileHint",scope:"global"},{label:r(()=>[$("b",te,_(t(I).label),1)]),_:1})):x.modelValue?(s(),d(h,{key:1},[v(_(t(o)("imageField.probeHint")),1)],64)):(s(),d(h,{key:2},[v(_(t(o)("imageField.emptyHint")),1)],64))])])):(s(),d("p",le,_(t(N)?.summary),1))])}}});export{ie as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as q,E as de,r as ie,a as ce,b as ue,_ as me,c as fe,d as be,e as pe,f as ge,R as _e}from"./D-Stn6KG.js";import{c as V,a as R,b as he,_ as J}from"./BV_QiRi8.js";import{_ as K}from"./DsttYulo.js";import{_ as ee,a as te}from"./ChS5Np24.js";import{_ as xe}from"./B_DikKgJ.js";import{L as ye,_ as Q,a as ve}from"./Bj1gglGt.js";import{_ as se}from"./BGGQYvrr.js";import{e as I,f as G,o as n,c as u,F as z,y as P,a as c,z as N,i as e,l as h,d as b,t as o,I as ke,D as H,b as t,m as $,q as L,r as $e,w as a,j as W,n as ae,u as we,v as Y,A as Ce}from"./DIi866IK.js";import{C as Te,_ as ne}from"./BW_3NqYy.js";import{I as Ne,C as Ae}from"./Bmqx7s9K.js";import{d as ze,a as Se,b as oe,c as le,p as Z}from"./DAHap_t6.js";import{C as re}from"./DlHvzKYz.js";import{u as Ie}from"./BnZUk6sk.js";import{u as Ue}from"./B1ZAR7mP.js";import{N as Re}from"./B-lS44p0.js";import"./BqoV-QnQ.js";import"./dhmyGJu2.js";import"./DmPn-vCY.js";const Be=V("LayoutGridIcon",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);const Le=V("PlusIcon",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);const Pe=V("TableIcon",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]);const De=V("XIcon",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),Ee={class:"flex w-full items-center"},He=I({__name:"HeadStepper",props:{steps:{}},setup(s){const{t:i}=G(),d={done:"bg-primary text-primary-foreground border-primary",active:"bg-primary text-primary-foreground border-primary",pending:"bg-muted text-muted-foreground border-border",failed:"bg-destructive text-destructive-foreground border-destructive"},m={done:"text-muted-foreground",active:"text-foreground font-medium",pending:"text-muted-foreground",failed:"text-destructive font-medium"};return(p,S)=>(n(),u("ol",{class:"grid",style:ke({gridTemplateColumns:`repeat(${s.steps.length}, minmax(0, 1fr))`})},[(n(!0),u(z,null,P(s.steps,(g,y)=>(n(),u("li",{key:g.key,class:"flex min-w-0 flex-col items-center gap-1.5"},[c("div",Ee,[c("span",{class:N(["h-0.5 flex-1 rounded-full",y===0?"bg-transparent":g.state==="failed"?"bg-destructive/30":s.steps[y-1]?.state==="done"?"bg-primary":"bg-border"])},null,2),c("span",{class:N(e(R)("grid size-5 shrink-0 place-items-center rounded-full border text-[10px] font-semibold",d[g.state]))},[g.state==="done"?(n(),h(e(Te),{key:0,class:"size-3"})):g.state==="failed"?(n(),h(e(De),{key:1,class:"size-3"})):(n(),u(z,{key:2},[b(o(y+1),1)],64))],2),c("span",{class:N(["h-0.5 flex-1 rounded-full",y===s.steps.length-1?"bg-transparent":s.steps[y+1]?.state==="failed"?"bg-destructive/30":g.state==="done"?"bg-primary":"bg-border"])},null,2)]),c("span",{class:N(e(R)("truncate text-center text-xs",m[g.state]))},o(g.state==="failed"?e(i)("presentation.steps.failed",{step:e(i)(`presentation.steps.${g.key}`)}):e(i)(`presentation.steps.${g.key}`)),3)]))),128))],4))}}),Fe={class:"min-w-0 text-sm"},Oe={class:"break-words text-muted-foreground"},Ge={class:"flex shrink-0 gap-2"},je=I({__name:"HeadActionBar",props:{bar:{}},setup(s){const i=he("flex items-start justify-between gap-4 border-t px-5 py-3.5",{variants:{tone:{success:"bg-success-soft/60",warning:"bg-warning-soft/60",error:"bg-destructive-soft/60",neutral:"bg-muted/50"}},defaultVariants:{tone:"neutral"}}),d={success:"text-success-soft-foreground",warning:"text-warning-soft-foreground",error:"text-destructive-soft-foreground",neutral:"text-foreground"},m=q();return(p,S)=>(n(),u("div",{class:N(e(R)(e(i)({tone:s.bar.tone})))},[c("div",Fe,[c("b",{class:N(e(R)("block font-semibold",d[s.bar.tone]))},o(e(m)(s.bar.title)),3),c("span",Oe,o(e(m)(s.bar.detail)),1)]),c("div",Ge,[H(p.$slots,"default")])],2))}}),Ve={class:"px-5 pb-4"},Me={class:"w-28 shrink-0 truncate text-xs font-semibold"},Xe={key:1,class:"text-xs text-muted-foreground"},qe={key:0,class:"mt-3 flex items-start gap-1.5 text-xs text-muted-foreground"},Je="https://docs.cardano.org/cardano-testnets/tools/faucet",Ke=I({__name:"HeadFundList",props:{nodes:{},balances:{},network:{}},setup(s){const i=s,{t:d,locale:m}=G(),p=L(()=>i.network!=="mainnet");function S(x){return i.balances?.find(w=>w.index===x)?.lovelace}function g(x){return x==null?"—":`${(Number(BigInt(x))/1e6).toLocaleString(m.value,{maximumFractionDigits:2})} ${i.network==="mainnet"?"ADA":"tADA"}`}function y(x){const w=S(x);return w==null?"text-muted-foreground":BigInt(w)>0n?"text-success":"text-warning"}return(x,w)=>{const _=ne;return n(),u("div",Ve,[(n(!0),u(z,null,P(s.nodes,l=>(n(),u("div",{key:l.id,class:"flex items-center gap-3 border-b py-2.5 last:border-b-0"},[c("span",Me,o(l.name),1),l.cardanoAddress?(n(),h(_,{key:0,value:l.cardanoAddress,truncate:22,label:e(d)("copy.labels.address"),class:"min-w-0"},null,8,["value","label"])):(n(),u("span",Xe,o(e(d)("fundList.noAddress")),1)),w[0]||(w[0]=c("span",{class:"flex-1"},null,-1)),c("span",{class:N(["w-24 shrink-0 text-right text-xs font-semibold tabular",y(l.index)])},o(g(S(l.index))),3)]))),128)),s.balances?$("",!0):(n(),u("p",qe,[t(e(Ne),{class:"mt-0.5 size-3.5 shrink-0"}),c("span",null,[b(o(e(d)("fundList.balancesUnknown"))+" ",1),e(p)?(n(),u("a",{key:0,href:Je,target:"_blank",rel:"noopener",class:"inline-flex items-center gap-0.5 font-medium text-primary hover:underline"},[b(o(e(d)("fundList.faucet"))+" ",1),t(e(de),{class:"size-3"})])):$("",!0)])]))])}}}),Qe={class:"flex items-start justify-between gap-4 px-5 pb-3.5 pt-4"},We={class:"min-w-0"},Ye={class:"flex flex-wrap items-center gap-2.5 font-semibold"},Ze={key:0,class:"mt-0.5 truncate text-sm text-muted-foreground"},et={class:"mt-2 flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-muted-foreground"},tt={class:"font-medium text-foreground"},st={class:"font-medium text-foreground tabular"},at={class:"font-medium text-foreground tabular"},nt={class:"font-medium text-foreground"},ot={class:"relative z-2 flex shrink-0 gap-2"},lt={class:"px-5 pb-3.5"},rt={key:0,class:"grid gap-2 px-5 pb-4 sm:grid-cols-2 lg:grid-cols-3"},dt={class:"block text-xs font-semibold"},it={class:"mb-1.5 block font-mono text-[11px] text-muted-foreground tabular"},ct=I({__name:"HeadCard",props:{head:{},balances:{},busy:{type:Boolean},dockerOk:{type:Boolean},utxoCount:{}},emits:["start","stop","restart","reset","remove"],setup(s,{emit:i}){const d=s,m=i,{t:p,locale:S}=G(),g=q(),y=L(()=>le(d.head,d.balances)),x=L(()=>ze(d.head,y.value)),w=L(()=>Se(d.head,y.value,d.utxoCount)),_=L(()=>oe(d.head,y.value,d.dockerOk??!0)),l=L(()=>d.head.status==="CONFIGURED"||d.head.status==="STOPPED");return(C,k)=>{const D=K,v=se,B=$e("i18n-t"),A=J,U=He,E=je,F=Ke,O=Q;return n(),h(O,{class:"group relative overflow-hidden py-0 gap-0 transition-colors hover:border-primary/40 hover:bg-muted/20"},{default:a(()=>[t(D,{to:`/heads/${s.head.id}`,class:"absolute inset-0 z-1 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring","aria-label":e(p)("headCard.open",{name:s.head.name}),tabindex:"-1","aria-hidden":"true"},null,8,["to","aria-label"]),c("div",Qe,[c("div",We,[c("h3",Ye,[t(D,{to:`/heads/${s.head.id}`,class:"relative z-2 inline-flex items-center gap-0.5 rounded outline-none hover:text-primary focus-visible:ring-2 focus-visible:ring-ring"},{default:a(()=>[b(o(s.head.name)+" ",1),t(e(re),{class:"size-4 text-muted-foreground/50 transition-transform group-hover:translate-x-0.5 group-hover:text-primary"})]),_:1},8,["to"]),t(v,{status:s.head.status},null,8,["status"]),s.head.status==="RUNNING"?(n(),h(v,{key:0,"hydra-state":s.head.hydraState},null,8,["hydra-state"])):$("",!0)]),s.head.description?(n(),u("p",Ze,o(s.head.description),1)):$("",!0),c("div",et,[t(B,{keypath:"headCard.nodes",tag:"span",scope:"global",plural:s.head.nodeCount},{count:a(()=>[c("b",tt,o(s.head.nodeCount),1)]),_:1},8,["plural"]),t(B,{keypath:"headCard.contestation",tag:"span",scope:"global"},{value:a(()=>[c("b",st,o(s.head.contestationPeriod)+"s",1)]),_:1}),t(B,{keypath:"headCard.deposit",tag:"span",scope:"global"},{value:a(()=>[c("b",at,o(s.head.depositPeriod)+"s",1)]),_:1}),t(B,{keypath:"headCard.created",tag:"span",scope:"global"},{when:a(()=>[c("b",nt,o(e(ie)(s.head.createdAt,e(S))),1)]),_:1})])]),c("div",ot,[e(_).canReset?(n(),h(A,{key:0,variant:"outline",size:"sm",disabled:s.busy,onClick:k[0]||(k[0]=T=>m("reset"))},{default:a(()=>[b(o(e(p)("actions.reset")),1)]),_:1},8,["disabled"])):$("",!0),s.head.status!=="RUNNING"?(n(),h(A,{key:1,size:"sm",disabled:!e(_).canStart||s.busy,title:e(g)(e(_).startBlockedReason),onClick:k[1]||(k[1]=T=>m("start"))},{default:a(()=>[s.busy?(n(),h(e(ye),{key:0,class:"size-4 animate-spin"})):$("",!0),b(" "+o(s.head.status==="FAILED"?e(p)("actions.retry"):e(p)("actions.start")),1)]),_:1},8,["disabled","title"])):(n(),u(z,{key:2},[t(A,{variant:"outline",size:"sm",disabled:!e(_).canRestart||s.busy,onClick:k[2]||(k[2]=T=>m("restart"))},{default:a(()=>[b(o(e(p)("actions.restart")),1)]),_:1},8,["disabled"]),t(A,{variant:"outline",size:"sm",disabled:!e(_).canStop||s.busy,onClick:k[3]||(k[3]=T=>m("stop"))},{default:a(()=>[b(o(e(p)("actions.stop")),1)]),_:1},8,["disabled"])],64))])]),c("div",lt,[t(U,{steps:e(x)},null,8,["steps"])]),e(l)?$("",!0):(n(),u("div",rt,[(n(!0),u(z,null,P(s.head.nodes,T=>(n(),u("div",{key:T.id,class:"rounded-md border bg-muted/40 px-3 py-2"},[c("span",dt,o(T.name),1),c("span",it," api "+o(T.apiPort)+" · p2p "+o(T.p2pPort),1),t(v,{status:T.status},null,8,["status"])]))),128))])),t(E,{bar:e(w),class:"relative z-2"},{default:a(()=>[s.head.status==="FAILED"||s.head.status==="RUNNING"?(n(),h(A,{key:0,variant:"outline",size:"sm","as-child":""},{default:a(()=>[t(D,{to:`/heads/${s.head.id}`},{default:a(()=>[b(o(s.head.status==="FAILED"?e(p)("headCard.viewLog"):e(p)("headCard.inspect")),1)]),_:1},8,["to"])]),_:1})):$("",!0),s.head.status!=="RUNNING"?(n(),h(A,{key:1,variant:s.head.status==="FAILED"?"destructive":"outline",size:"sm",disabled:s.busy||!e(_).canDelete,onClick:k[4]||(k[4]=T=>m("remove"))},{default:a(()=>[b(o(e(p)("actions.delete")),1)]),_:1},8,["variant","disabled"])):$("",!0)]),_:1},8,["bar"]),e(l)?(n(),h(F,{key:1,class:"relative z-2",nodes:s.head.nodes,balances:s.balances,network:s.head.network},null,8,["nodes","balances","network"])):$("",!0)]),_:1})}}}),ut={"data-slot":"table-container",class:"relative w-full overflow-auto"},mt=I({__name:"Table",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("div",ut,[c("table",{"data-slot":"table",class:N(e(R)("w-full caption-bottom text-sm",i.class))},[H(d.$slots,"default")],2)]))}}),ft=I({__name:"TableBody",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("tbody",{"data-slot":"table-body",class:N(e(R)("[&_tr:last-child]:border-0",i.class))},[H(d.$slots,"default")],2))}}),bt=I({__name:"TableCell",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("td",{"data-slot":"table-cell",class:N(e(R)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 *:[[role=checkbox]]:translate-y-0.5",i.class))},[H(d.$slots,"default")],2))}}),pt=I({__name:"TableRow",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("tr",{"data-slot":"table-row",class:N(e(R)("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",i.class))},[H(d.$slots,"default")],2))}}),gt=I({__name:"TableHead",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("th",{"data-slot":"table-head",class:N(e(R)("text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 *:[[role=checkbox]]:translate-y-0.5",i.class))},[H(d.$slots,"default")],2))}}),_t=I({__name:"TableHeader",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(s){const i=s;return(d,m)=>(n(),u("thead",{"data-slot":"table-header",class:N(e(R)("[&_tr]:border-b",i.class))},[H(d.$slots,"default")],2))}}),ht={key:0,class:"block max-w-72 truncate text-[11px] text-muted-foreground"},xt={key:1,class:"text-muted-foreground"},yt={class:"flex gap-1"},vt=["title"],kt={class:"grid gap-2"},$t={class:"w-32 shrink-0"},wt={class:"block text-xs font-semibold"},Ct={class:"block font-mono text-[11px] text-muted-foreground tabular"},Tt=I({__name:"HeadTable",props:{heads:{},dockerOk:{type:Boolean},busyIds:{}},emits:["start","stop","restart","reset","remove"],setup(s,{emit:i}){const d=s,m=i,{t:p}=G(),S=q(),g=ae(new Set);function y(_){const l=new Set(g.value);l.has(_)?l.delete(_):l.add(_),g.value=l}function x(_){return oe(_,le(_,null),d.dockerOk)}const w={RUNNING:"bg-success-soft text-success-soft-foreground",STARTING:"bg-warning-soft text-warning-soft-foreground",FAILED:"bg-destructive-soft text-destructive-soft-foreground",STOPPED:"bg-muted text-muted-foreground",CREATED:"bg-muted text-muted-foreground"};return(_,l)=>{const C=gt,k=pt,D=_t,v=bt,B=K,A=se,U=J,E=te,F=ee,O=ne,T=ft,M=mt,X=Q;return n(),h(X,{class:"overflow-hidden py-0"},{default:a(()=>[t(M,null,{default:a(()=>[t(D,null,{default:a(()=>[t(k,{class:"hover:bg-transparent"},{default:a(()=>[t(C,{class:"w-8"}),t(C,null,{default:a(()=>[b(o(e(p)("headTable.head")),1)]),_:1}),t(C,null,{default:a(()=>[b(o(e(p)("headTable.status")),1)]),_:1}),t(C,null,{default:a(()=>[b(o(e(p)("headTable.hydraState")),1)]),_:1}),t(C,null,{default:a(()=>[b(o(e(p)("headTable.nodes")),1)]),_:1}),t(C,{class:"hidden lg:table-cell"},{default:a(()=>[b(o(e(p)("headTable.contestation")),1)]),_:1}),t(C,{class:"text-right"},{default:a(()=>[b(o(e(p)("headTable.actions")),1)]),_:1})]),_:1})]),_:1}),t(T,null,{default:a(()=>[(n(!0),u(z,null,P(s.heads,f=>(n(),u(z,{key:f.id},[t(k,{class:"cursor-pointer","data-state":e(g).has(f.id)?"selected":void 0,onClick:r=>y(f.id)},{default:a(()=>[t(v,{class:"text-muted-foreground"},{default:a(()=>[e(g).has(f.id)?(n(),h(e(Ae),{key:0,class:"size-4"})):(n(),h(e(re),{key:1,class:"size-4"}))]),_:2},1024),t(v,null,{default:a(()=>[t(B,{to:`/heads/${f.id}`,class:"font-medium hover:text-primary",onClick:l[0]||(l[0]=W(()=>{},["stop"]))},{default:a(()=>[b(o(f.name),1)]),_:2},1032,["to"]),f.description?(n(),u("span",ht,o(f.description),1)):$("",!0)]),_:2},1024),t(v,null,{default:a(()=>[t(A,{status:f.status},null,8,["status"])]),_:2},1024),t(v,null,{default:a(()=>[f.status==="RUNNING"?(n(),h(A,{key:0,"hydra-state":f.hydraState},null,8,["hydra-state"])):(n(),u("span",xt,"—"))]),_:2},1024),t(v,null,{default:a(()=>[c("div",yt,[(n(!0),u(z,null,P(f.nodes,r=>(n(),u("span",{key:r.id,class:N(["grid size-5 place-items-center rounded text-[10px] font-semibold",w[r.status]??"bg-muted text-muted-foreground"]),title:`${r.name} — ${e(p)(`status.head.${r.status}`)}`},o(r.index),11,vt))),128))])]),_:2},1024),t(v,{class:"hidden text-muted-foreground lg:table-cell tabular"},{default:a(()=>[b(o(f.contestationPeriod)+"s ",1)]),_:2},1024),t(v,{class:"whitespace-nowrap text-right",onClick:l[1]||(l[1]=W(()=>{},["stop"]))},{default:a(()=>[f.status==="RUNNING"?(n(),u(z,{key:0},[t(U,{variant:"outline",size:"sm",disabled:s.busyIds.has(f.id),onClick:r=>m("restart",f)},{default:a(()=>[b(o(e(p)("actions.restart")),1)]),_:1},8,["disabled","onClick"]),t(U,{variant:"outline",size:"sm",class:"ml-2",disabled:s.busyIds.has(f.id),onClick:r=>m("stop",f)},{default:a(()=>[b(o(e(p)("actions.stop")),1)]),_:1},8,["disabled","onClick"])],64)):(n(),u(z,{key:1},[t(U,{size:"sm",disabled:!x(f).canStart||s.busyIds.has(f.id),title:e(S)(x(f).startBlockedReason),onClick:r=>m("start",f)},{default:a(()=>[b(o(f.status==="FAILED"?e(p)("actions.retry"):e(p)("actions.start")),1)]),_:2},1032,["disabled","title","onClick"]),t(U,{variant:"outline",size:"sm",class:"ml-2",disabled:s.busyIds.has(f.id),onClick:r=>m("reset",f)},{default:a(()=>[b(o(e(p)("actions.reset")),1)]),_:1},8,["disabled","onClick"]),t(U,{variant:"outline",size:"sm",class:"ml-2 text-destructive hover:bg-destructive-soft hover:text-destructive",disabled:s.busyIds.has(f.id),onClick:r=>m("remove",f)},{default:a(()=>[b(o(e(p)("actions.delete")),1)]),_:1},8,["disabled","onClick"])],64))]),_:2},1024)]),_:2},1032,["data-state","onClick"]),e(g).has(f.id)?(n(),h(k,{key:0,class:"hover:bg-transparent"},{default:a(()=>[t(v,{colspan:"7",class:"bg-muted/40 p-3"},{default:a(()=>[f.lastError?(n(),h(F,{key:0,variant:"destructive",class:"mb-2.5"},{default:a(()=>[t(E,{class:"text-xs"},{default:a(()=>[b(o(f.lastError),1)]),_:2},1024)]),_:2},1024)):$("",!0),c("div",kt,[(n(!0),u(z,null,P(f.nodes,r=>(n(),u("div",{key:r.id,class:"flex items-center gap-3 rounded-md border bg-card px-3 py-2.5"},[c("div",$t,[c("span",wt,o(r.name),1),c("span",Ct," api "+o(r.apiPort)+" · p2p "+o(r.p2pPort),1)]),r.cardanoAddress?(n(),h(O,{key:0,value:r.cardanoAddress,truncate:20,label:e(p)("copy.labels.address")},null,8,["value","label"])):$("",!0),l[2]||(l[2]=c("span",{class:"flex-1"},null,-1)),t(A,{status:r.status},null,8,["status"])]))),128))])]),_:2},1024)]),_:2},1024)):$("",!0)],64))),128))]),_:1})]),_:1})]),_:1})}}}),Nt={class:"mb-5 flex items-end justify-between gap-4"},At={class:"text-xl font-semibold tracking-tight"},zt={class:"text-sm text-muted-foreground"},St={class:"flex shrink-0 items-center gap-2"},It={key:2,class:"grid gap-4"},Ut={class:"mb-1 text-lg font-semibold"},Rt={class:"mx-auto mb-5 max-w-md text-sm text-muted-foreground"},Bt={key:4,class:"grid gap-4"},Zt=I({__name:"index",setup(s){const{t:i}=G();we({title:L(()=>`${i("headsPage.pageTitle")} · Hexcore`)});const d=Ie(),m=Ue();Y(()=>m.restore());const p=L(()=>d.heads.some(_=>_.status==="STARTING")?Z("STARTING"):Z("RUNNING")),S=ce(()=>d.load(),{interval:()=>p.value});Y(S.start);const g=ue(),y=ae(null);async function x(_,l){(l==="start"||l==="restart")&&(y.value=_);try{await d.runAction(_.id,l),m.success(i(`lifecycle.done.${l}`,{name:_.name}))}catch(C){m.error(i(`lifecycle.failed.${l}`,{name:_.name}),C instanceof Ce?C.message:void 0)}}const w=L(()=>!m.headsViewChosen&&m.headsView==="cards"&&d.heads.length>8);return(_,l)=>{const C=ge,k=pe,D=me,v=J,B=K,A=te,U=ee,E=xe,F=ve,O=Q,T=ct,M=Tt,X=fe,f=be;return n(),u("div",null,[c("div",Nt,[c("div",null,[c("h1",At,o(e(i)("headsPage.title")),1),c("p",zt,o(e(i)("headsPage.subtitle")),1)]),c("div",St,[t(D,{"model-value":e(m).headsView,class:"hidden sm:block","onUpdate:modelValue":l[0]||(l[0]=r=>e(m).setHeadsView(r))},{default:a(()=>[t(k,null,{default:a(()=>[t(C,{value:"cards"},{default:a(()=>[t(e(Be),{class:"size-4"}),b(" "+o(e(i)("headsPage.cards")),1)]),_:1}),t(C,{value:"table"},{default:a(()=>[t(e(Pe),{class:"size-4"}),b(" "+o(e(i)("headsPage.table")),1)]),_:1})]),_:1})]),_:1},8,["model-value"]),t(v,{variant:"outline",size:"sm",onClick:l[1]||(l[1]=r=>e(d).load())},{default:a(()=>[t(e(_e),{class:"size-4"}),b(" "+o(e(i)("common.refresh")),1)]),_:1}),t(v,{size:"sm","as-child":""},{default:a(()=>[t(B,{to:"/heads/new"},{default:a(()=>[t(e(Le),{class:"size-4"}),b(" "+o(e(i)("headsPage.newHead")),1)]),_:1})]),_:1})])]),e(S).stalled.value?(n(),h(U,{key:0,class:"mb-4 flex items-center justify-between gap-4"},{default:a(()=>[t(A,null,{default:a(()=>[b(o(e(i)("headsPage.stalled")),1)]),_:1}),t(v,{variant:"outline",size:"sm",onClick:l[2]||(l[2]=r=>e(S).retry())},{default:a(()=>[b(o(e(i)("headsPage.reconnect")),1)]),_:1})]),_:1})):$("",!0),e(w)?(n(),h(U,{key:1,class:"mb-4 flex items-center justify-between gap-4"},{default:a(()=>[t(A,null,{default:a(()=>[b(o(e(i)("headsPage.suggestTable",{count:e(d).heads.length})),1)]),_:1}),t(v,{variant:"outline",size:"sm",onClick:l[3]||(l[3]=r=>e(m).setHeadsView("table"))},{default:a(()=>[b(o(e(i)("headsPage.switchToTable")),1)]),_:1})]),_:1})):$("",!0),e(d).loading&&!e(d).loaded?(n(),u("div",It,[(n(),u(z,null,P(3,r=>t(O,{key:r},{default:a(()=>[t(F,{class:"space-y-3"},{default:a(()=>[t(E,{class:"h-5 w-48"}),t(E,{class:"h-4 w-full"}),t(E,{class:"h-4 w-3/5"})]),_:1})]),_:1})),64))])):e(d).heads.length===0?(n(),h(O,{key:3},{default:a(()=>[t(F,{class:"py-12 text-center"},{default:a(()=>[t(e(Re),{class:"mx-auto mb-3 size-10 text-muted-foreground/40"}),c("h2",Ut,o(e(i)("headsPage.empty.title")),1),c("p",Rt,o(e(i)("headsPage.empty.body")),1),t(v,{"as-child":""},{default:a(()=>[t(B,{to:"/heads/new"},{default:a(()=>[b(o(e(i)("headsPage.empty.cta")),1)]),_:1})]),_:1})]),_:1})]),_:1})):e(m).headsView==="cards"?(n(),u("div",Bt,[(n(!0),u(z,null,P(e(d).heads,r=>(n(),h(T,{key:r.id,head:r,busy:e(d).isBusy(r.id),"docker-ok":e(d).dockerOk,onStart:j=>x(r,"start"),onStop:j=>x(r,"stop"),onRestart:j=>x(r,"restart"),onReset:j=>e(g).askReset(r),onRemove:j=>e(g).askDelete(r)},null,8,["head","busy","docker-ok","onStart","onStop","onRestart","onReset","onRemove"]))),128))])):(n(),h(M,{key:5,heads:e(d).heads,"docker-ok":e(d).dockerOk,"busy-ids":e(d).busy,onStart:l[4]||(l[4]=r=>x(r,"start")),onStop:l[5]||(l[5]=r=>x(r,"stop")),onRestart:l[6]||(l[6]=r=>x(r,"restart")),onReset:l[7]||(l[7]=r=>e(g).askReset(r)),onRemove:l[8]||(l[8]=r=>e(g).askDelete(r))},null,8,["heads","docker-ok","busy-ids"])),t(X,{head:e(g).target.value,kind:e(g).kind.value,loading:e(g).busy.value,"onUpdate:kind":l[9]||(l[9]=r=>e(g).kind.value=r),onClose:l[10]||(l[10]=r=>e(g).close()),onConfirm:l[11]||(l[11]=r=>e(g).run())},null,8,["head","kind","loading"]),t(f,{"head-id":e(y)?.id??null,"head-name":e(y)?.name,onClose:l[12]||(l[12]=r=>y.value=null)},null,8,["head-id","head-name"])])}}});export{Zt as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as o}from"./BV_QiRi8.js";const e=o("ChevronRightIcon",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{e as C};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t={common:{optional:{t:0,b:{t:2,i:[{t:3}],s:"tuỳ chọn"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Huỷ"}},tryAgain:{t:0,b:{t:2,i:[{t:3}],s:"Thử lại"}},reset:{t:0,b:{t:2,i:[{t:3}],s:"đặt lại"}},resetAll:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại tất cả"}},details:{t:0,b:{t:2,i:[{t:3}],s:"Chi tiết"}},close:{t:0,b:{t:2,i:[{t:3}],s:"Đóng"}},confirm:{t:0,b:{t:2,i:[{t:3}],s:"Xác nhận"}},follow:{t:0,b:{t:2,i:[{t:3}],s:"Theo dõi"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Đang tải…"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Làm mới"}}},layout:{tagline:{t:0,b:{t:2,i:[{t:3}],s:"v2 · control-plane"}},nav:{heads:{t:0,b:{t:2,i:[{t:3}],s:"Hydra Head"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Cài đặt"}}},dockerHealthy:{t:0,b:{t:2,i:[{t:3}],s:"docker ổn định"}},dockerDown:{t:0,b:{t:2,i:[{t:3}],s:"docker không chạy"}},dockerUnreachable:{t:0,b:{t:2,i:[{t:3}],s:"Không kết nối được Docker."}},dockerUnreachableBody:{t:0,b:{t:2,i:[{t:3}],s:"Chưa thể khởi động hay dừng head cho tới khi Docker chạy lại."}},signOut:{t:0,b:{t:2,i:[{t:3}],s:"Đăng xuất"}},signOutAs:{t:0,b:{t:2,i:[{t:3,v:"Đăng xuất ("},{t:4,k:"user"},{t:3,v:")"}]}},language:{t:0,b:{t:2,i:[{t:3}],s:"Ngôn ngữ"}}},imageField:{recommended:{t:0,b:{t:2,i:[{t:3}],s:"khuyến nghị"}},serverDefault:{t:0,b:{t:2,i:[{t:3,v:"Mặc định của server · "},{t:4,k:"image"}]}},unknownSummary:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản chưa có profile — flag sẽ được đọc từ image ở lần khởi động đầu."}},custom:{t:0,b:{t:2,i:[{t:3}],s:"Image tuỳ chỉnh…"}},customPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"docker.io/you/hydra-node:2.4.1"}},profileHint:{t:0,b:{t:2,i:[{t:3,v:"Flag lấy theo profile "},{t:4,k:"label"},{t:3,v:" — chọn theo tag, nên image tự build không cần probe."}]}},probeHint:{t:0,b:{t:2,i:[{t:3}],s:"Chưa có profile nào khớp tag này. Flag sẽ được đọc từ hydra-node --help ở lần khởi động đầu."}},emptyHint:{t:0,b:{t:2,i:[{t:3}],s:"Để trống thì dùng image mặc định của server."}}},newHead:{pageTitle:{t:0,b:{t:2,i:[{t:3}],s:"Head mới"}},back:{t:0,b:{t:2,i:[{t:3}],s:"Quay lại danh sách head"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tạo Hydra Head"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Hexcore tự sinh mọi khoá head cần và cấp cho mỗi node một địa chỉ để nạp tiền."}},name:{t:0,b:{t:2,i:[{t:3}],s:"Tên"}},description:{t:0,b:{t:2,i:[{t:3}],s:"Mô tả"}},descriptionPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Head này dùng để làm gì"}},nodes:{t:0,b:{t:2,i:[{t:3}],s:"Số node"}},nodesHint:{t:0,b:{t:2,i:[{t:3}],s:"1 node đủ để chạy thử; head thật cần mỗi bên tham gia một node."}},backend:{label:{t:0,b:{t:2,i:[{t:3}],s:"Chain backend"}},blockfrost:{t:0,b:{t:2,i:[{t:3}],s:"Blockfrost — chỉ cần API key"}},cardanoNode:{t:0,b:{t:2,i:[{t:3}],s:"cardano-node — socket của node cục bộ"}},cardanoNodeUnavailable:{t:0,b:{t:2,i:[{t:3}],s:"cardano-node — không khả dụng"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline — không có layer 1"}}},noSocket:{title:{t:0,b:{t:2,i:[{t:3}],s:"Không có socket cardano-node"}},body:{t:0,b:{t:2,i:[{t:4,k:"reason"},{t:3,v:". Hãy dùng Blockfrost hoặc offline cho tới khi "},{t:4,k:"env"},{t:3,v:" trỏ tới một socket đọc được."}]}}},offlineInfo:{title:{t:0,b:{t:2,i:[{t:3}],s:"Head offline"}},body:{t:0,b:{t:2,i:[{t:3,v:"Không có layer 1. Các node vẫn kết nối peer với nhau — tối đa "},{t:4,k:"max"},{t:3,v:" node, cùng chạy trên máy này — và địa chỉ của mỗi node được cấp sẵn tiền trong UTxO khởi đầu thay vì phải nạp."}]}}},offlineUnsupported:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản hydra-node này không có chế độ offline. Hãy chọn phiên bản hoặc backend khác."}},blockfrost:{key:{t:0,b:{t:2,i:[{t:3}],s:"Blockfrost API key"}},placeholderOptional:{t:0,b:{t:2,i:[{t:3}],s:"Để trống: dùng key của server"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Dùng chung cho mọi node của head."}},requiredTitle:{t:0,b:{t:2,i:[{t:3}],s:"Server này chưa có Blockfrost key"}},requiredBody:{t:0,b:{t:2,i:[{t:3}],s:"Mỗi node đều cần một key."}},getKey:{t:0,b:{t:2,i:[{t:3}],s:"Lấy key miễn phí"}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Server này chưa có Blockfrost key mặc định, nên mỗi node đều cần một key."}},perNode:{t:0,b:{t:2,i:[{t:3}],s:"Dùng key riêng cho từng node"}},perNodeHint:{t:0,b:{t:2,i:[{t:3}],s:"Các node dùng chung key sẽ chia nhau giới hạn request của key đó."}},nodeKeyPlaceholder:{t:0,b:{t:2,i:[{t:3,v:"Key cho node "},{t:4,k:"index"}]}}},offline:{seed:{t:0,b:{t:2,i:[{t:3}],s:"Head seed"}},seedPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Sinh từ id của head — 64 ký tự hex"}},seedHint:{t:0,b:{t:2,i:[{t:3}],s:"Cố định sau khi head được tạo."}},customUtxo:{t:0,b:{t:2,i:[{t:3}],s:"Tự viết UTxO khởi đầu"}},customUtxoHint:{t:0,b:{t:2,i:[{t:3}],s:"Mặc định, địa chỉ của mỗi node được cấp sẵn tiền."}},seedAmount:{t:0,b:{t:2,i:[{t:3}],s:"Số tiền cấp sẵn (lovelace)"}},seedAmountHint:{t:0,b:{t:2,i:[{t:4,k:"perNode"},{t:3,v:" mỗi node — tổng "},{t:4,k:"total"},{t:3,v:" trong head."}]}},genesis:{t:0,b:{t:2,i:[{t:3}],s:"Shelley genesis"}},genesisPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Dán toàn bộ file shelley-genesis.json"}},genesisHint:{t:0,b:{t:2,i:[{t:3}],s:"Dán nguyên file hoặc để trống — file thiếu phần sẽ làm node dừng ngay khi khởi động."}}},keys:{import:{t:0,b:{t:2,i:[{t:3}],s:"Dùng khoá thanh toán Cardano có sẵn"}},importHint:{t:0,b:{t:2,i:[{t:3}],s:"Dùng lại một địa chỉ đã có test ADA. Khoá Hydra luôn được sinh mới."}},importHintOffline:{t:0,b:{t:2,i:[{t:3}],s:"UTxO khởi đầu được cấp vào địa chỉ của khoá này. Khoá Hydra luôn được sinh mới."}},nodeEmpty:{t:0,b:{t:2,i:[{t:3}],s:"để trống: sinh khoá mới cho node này"}},signingPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Khoá ký: .skey, cborHex, 64 ký tự hex hoặc ed25519_sk1…"}},verificationPlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Khoá xác minh (tuỳ chọn)"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Kiểm tra khoá"}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Khoá hợp lệ"}},validPair:{t:0,b:{t:2,i:[{t:3}],s:"Khoá hợp lệ — cặp khoá khớp nhau"}},balance:{t:0,b:{t:2,i:[{t:3,v:"Số dư "},{t:4,k:"amount"},{t:3,v:" trong "},{t:4,k:"count"},{t:3,v:" UTxO"}]}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Địa chỉ này chưa có tiền — hãy nạp trước khi khởi động."}},verifyFailed:{t:0,b:{t:2,i:[{t:3}],s:"Không kiểm tra được khoá này."}}},version:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản hydra-node"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Cố định suốt vòng đời head — muốn đổi phải reset head."}},fixedIn:{t:0,b:{t:2,i:[{t:3,v:"Đã sửa ở hydra-node "},{t:4,k:"version"},{t:3,v:"."}]}},notFixed:{t:0,b:{t:2,i:[{t:3}],s:"Chưa có bản phát hành nào sửa."}}},timing:{title:{t:0,b:{t:2,i:[{t:3}],s:"Thời gian"}},contestation:{t:0,b:{t:2,i:[{t:3}],s:"Contestation period (giây)"}},contestationHint:{t:0,b:{t:2,i:[{t:3}],s:"Mọi bên tham gia phải dùng cùng giá trị."}},deposit:{t:0,b:{t:2,i:[{t:3}],s:"Deposit period (giây)"}},depositHint:{t:0,b:{t:2,i:[{t:3}],s:"Cũng là thời gian chờ trước khi deposit tiêu được."}},rotate:{t:0,b:{t:2,i:[{t:3}],s:"Xoay vòng persistence sau (event)"}},rotateHint:{t:0,b:{t:2,i:[{t:3}],s:"Nhỏ hơn: file nhỏ hơn, khôi phục chậm hơn."}},offlineNote:{t:0,b:{t:2,i:[{t:3}],s:"Head offline không có deadline on-chain, nên không dùng hai giá trị period."}}},logging:{title:{t:0,b:{t:2,i:[{t:3}],s:"Log"}},quiet:{t:0,b:{t:2,i:[{t:3}],s:"Quiet — hydra-node không ghi log"}},quietWarning:{t:0,b:{t:2,i:[{t:3}],s:"Trình xem log sẽ trống, và khi khởi động thất bại chỉ còn exit status để biết nguyên nhân."}},maxSize:{t:0,b:{t:2,i:[{t:3}],s:"Kích thước log tối đa (MB mỗi file)"}},maxFiles:{t:0,b:{t:2,i:[{t:3}],s:"Số file xoay vòng giữ lại"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Mặc định Docker giữ log không giới hạn; hai giá trị này giữ cho head không làm đầy ổ đĩa."}}},params:{toggle:{t:0,b:{t:2,i:[{t:3}],s:"Tham số giao thức"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Luật ledger bên trong head. Không chỉnh thì head theo giá trị của chain."}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Đang đọc tham số hiện tại…"}},loadFailed:{t:0,b:{t:2,i:[{t:3}],s:"Không đọc được tham số giao thức hiện tại."}},sourceBlockfrost:{t:0,b:{t:2,i:[{t:3}],s:"Giá trị trực tiếp từ Blockfrost, đã áp mặc định L2 của Hydra."}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Tham số khác"}},extraTag:{t:0,b:{t:2,i:[{t:3}],s:"JSON tuỳ chọn"}},extraHint:{t:0,b:{t:2,i:[{t:3}],s:"Gộp sau cùng. Chỉ thay nguyên key ở cấp cao nhất."}},pinned:{t:0,b:{t:2,i:[{t:3,v:"Đang cố định "},{t:4,k:"count"},{t:3,v:" tham số: "},{t:4,k:"keys"},{t:3,v:". Các giá trị này giữ nguyên khi chain thay đổi."}]}},nothingPinned:{t:0,b:{t:2,i:[{t:3}],s:"Chưa cố định tham số nào — head theo giá trị của chain."}}},errors:{jsonObject:{t:0,b:{t:2,i:[{t:4,k:"what"},{t:3,v:" phải là một object JSON."}]}},jsonInvalid:{t:0,b:{t:2,i:[{t:4,k:"what"},{t:3,v:" không phải JSON hợp lệ: "},{t:4,k:"error"}]}},whatExtra:{t:0,b:{t:2,i:[{t:3}],s:"Tham số giao thức bổ sung"}},whatUtxo:{t:0,b:{t:2,i:[{t:3}],s:"UTxO khởi đầu"}},whatGenesis:{t:0,b:{t:2,i:[{t:3}],s:"Ledger genesis"}},createFailed:{t:0,b:{t:2,i:[{t:3}],s:"Không tạo được head."}}},toast:{created:{t:0,b:{t:2,i:[{t:3,v:"Đã tạo "},{t:4,k:"name"}]}},fundThenStart:{t:0,b:{t:2,i:[{t:3}],s:"Nạp tiền vào các địa chỉ của head, rồi khởi động."}},startOffline:{t:0,b:{t:2,i:[{t:3}],s:"Head này không cần nạp tiền — có thể khởi động ngay."}}},submit:{t:0,b:{t:2,i:[{t:3}],s:"Tạo head"}}},actions:{start:{t:0,b:{t:2,i:[{t:3}],s:"Khởi động"}},stop:{t:0,b:{t:2,i:[{t:3}],s:"Dừng"}},restart:{t:0,b:{t:2,i:[{t:3}],s:"Khởi động lại"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Thử lại"}},reset:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại"}},edit:{t:0,b:{t:2,i:[{t:3}],s:"Sửa"}},delete:{t:0,b:{t:2,i:[{t:3}],s:"Xoá"}}},lifecycle:{done:{start:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" đang chạy"}]}},stop:{t:0,b:{t:2,i:[{t:3,v:"Đã dừng "},{t:4,k:"name"}]}},restart:{t:0,b:{t:2,i:[{t:3,v:"Đã khởi động lại "},{t:4,k:"name"}]}}},failed:{start:{t:0,b:{t:2,i:[{t:3,v:"Không khởi động được "},{t:4,k:"name"}]}},stop:{t:0,b:{t:2,i:[{t:3,v:"Không dừng được "},{t:4,k:"name"}]}},restart:{t:0,b:{t:2,i:[{t:3,v:"Không khởi động lại được "},{t:4,k:"name"}]}}}},status:{head:{CREATED:{t:0,b:{t:2,i:[{t:3}],s:"Đã tạo"}},CONFIGURED:{t:0,b:{t:2,i:[{t:3}],s:"Đã cấu hình"}},STARTING:{t:0,b:{t:2,i:[{t:3}],s:"Đang khởi động"}},RUNNING:{t:0,b:{t:2,i:[{t:3}],s:"Đang chạy"}},STOPPED:{t:0,b:{t:2,i:[{t:3}],s:"Đã dừng"}},FAILED:{t:0,b:{t:2,i:[{t:3}],s:"Thất bại"}}},hydra:{IDLE:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}},INITIALIZING:{t:0,b:{t:2,i:[{t:3}],s:"Initializing"}},OPEN:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},CLOSED:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},FANOUT_POSSIBLE:{t:0,b:{t:2,i:[{t:3}],s:"Sẵn sàng fanout"}},FANNING_OUT:{t:0,b:{t:2,i:[{t:3}],s:"Đang fanout"}},FINAL:{t:0,b:{t:2,i:[{t:3}],s:"Final"}},UNKNOWN:{t:0,b:{t:2,i:[{t:3}],s:"Không xác định"}}}},presentation:{steps:{created:{t:0,b:{t:2,i:[{t:3}],s:"Đã tạo"}},fund:{t:0,b:{t:2,i:[{t:3}],s:"Nạp tiền"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Khởi động"}},open:{t:0,b:{t:2,i:[{t:3}],s:"Mở head"}},failed:{t:0,b:{t:2,i:[{t:4,k:"step"},{t:3,v:" thất bại"}]}}},bar:{degraded:{title:{t:0,b:{t:2,i:[{t:3,v:"Suy giảm — "},{t:4,k:"up"},{t:3,v:"/"},{t:4,k:"total"},{t:3,v:" node đang chạy"}]}},noneUp:{t:0,b:{t:2,i:[{t:3}],s:"Không node nào của head này đang chạy. Hãy khởi động lại, hoặc xem log của container."}},partyMissing:{t:0,b:{t:2,i:[{t:3}],s:"Head không đạt được đồng thuận khi thiếu một bên tham gia. Mở head để xem chi tiết."}}},failed:{title:{t:0,b:{t:2,i:[{t:3}],s:"Khởi động thất bại — mọi container đã được rollback"}},detail:{t:0,b:{t:2,i:[{t:4,k:"error"}]}},noDetail:{t:0,b:{t:2,i:[{t:3}],s:"Không có thêm thông tin nào được ghi lại."}}},starting:{title:{t:0,b:{t:2,i:[{t:3,v:"Đang khởi động "},{t:4,k:"count"},{t:3,v:" node"}]}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Đang chờ mọi node phản hồi trên cổng API. Bước này có thể mất vài phút."}}},unfunded:{title:{t:0,b:{t:2,i:[{t:3}],s:"Nạp tiền vào các địa chỉ này để tiếp tục"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Mỗi node cần test ADA để commit. Khoá đã được sinh sẵn — không cần cài thêm gì."}}},fundingUnknown:{title:{t:0,b:{t:2,i:[{t:3}],s:"Nạp tiền cho từng node trước khi khởi động"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Hiện chưa kiểm tra được số dư từ đây, nên hãy chắc chắn mỗi địa chỉ đã có test ADA trước khi khởi động head."}}},stopped:{t:0,b:{t:2,i:[{t:3}],s:"Đã dừng"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Sẵn sàng khởi động"}},readyOffline:{t:0,b:{t:2,i:[{t:3}],s:"Head offline — head mở với tập UTxO được ghi lúc khởi động, không cần nạp tiền."}},intact:{t:0,b:{t:2,i:[{t:3}],s:"Khoá và persistence vẫn còn nguyên."}},open:{title:{t:0,b:{t:2,i:[{t:3}],s:"Head đang mở"}},detail:{t:0,b:{t:2,i:[{t:3,v:"Đã kết nối cả "},{t:4,k:"count"},{t:3,v:" node."}]}},detailUtxo:{t:0,b:{t:2,i:[{t:3,v:"Đã kết nối cả "},{t:4,k:"count"},{t:3,v:" node · "},{t:4,k:"utxos"},{t:3,v:" UTxO trong snapshot L2."}]}}},initializing:{title:{t:0,b:{t:2,i:[{t:3}],s:"Đang chờ mọi bên commit"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Head đang khởi tạo. Mọi bên tham gia phải commit trước khi head mở."}}},idle:{title:{t:0,b:{t:2,i:[{t:3}],s:"Các node đang chạy"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Head chưa được khởi tạo."}}},closed:{title:{t:0,b:{t:2,i:[{t:3}],s:"Head đã đóng"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Contestation period đang chạy. Khi kết thúc mới fanout được."}}},fanout:{title:{t:0,b:{t:2,i:[{t:3}],s:"Có thể fanout"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Head đã đóng và tiền có thể được trả về L1."}}},final:{title:{t:0,b:{t:2,i:[{t:3}],s:"Head đã kết thúc"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Tiền đã được trả về L1."}}},unknown:{detail:{t:0,b:{t:2,i:[{t:3}],s:"Không xác định được trạng thái Hydra — có thể các node không thống nhất."}}}},blocked:{docker:{t:0,b:{t:2,i:[{t:3}],s:"Không kết nối được Docker — control-plane không tạo được container."}},unfunded:{t:0,b:{t:2,i:[{t:4,k:"node"},{t:3,v:" chưa có tiền."}]}},editRunning:{t:0,b:{t:2,i:[{t:3}],s:"Hãy dừng head trước khi đổi cài đặt."}},editRan:{t:0,b:{t:2,i:[{t:3}],s:"Head này đã từng chạy. Hãy đặt lại để xoá persistence, rồi mới sửa."}}},confirm:{delete:{title:{t:0,b:{t:2,i:[{t:3}],s:"Xoá head này?"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Xoá head"}}},resetKeys:{title:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại và sinh lại khoá?"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại tất cả"}}},reset:{title:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại persistence?"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại"}}}}},confirmDialog:{typeToConfirm:{t:0,b:{t:2,i:[{t:3,v:"Gõ "},{t:4,k:"text"},{t:3,v:" để xác nhận"}]}},typeToEnable:{t:0,b:{t:2,i:[{t:3,v:"Gõ "},{t:4,k:"text"},{t:3,v:" để bật nút này"}]}}},copy:{copy:{t:0,b:{t:2,i:[{t:3,v:"Sao chép "},{t:4,k:"what"}]}},copied:{t:0,b:{t:2,i:[{t:3}],s:"Đã sao chép"}},value:{t:0,b:{t:2,i:[{t:3}],s:"giá trị"}},labels:{address:{t:0,b:{t:2,i:[{t:3}],s:"địa chỉ"}},vkey:{t:0,b:{t:2,i:[{t:3}],s:"khoá xác minh"}},log:{t:0,b:{t:2,i:[{t:3}],s:"log"}},snippet:{t:0,b:{t:2,i:[{t:3}],s:"đoạn code"}},frame:{t:0,b:{t:2,i:[{t:3}],s:"frame"}},nodeUrl:{t:0,b:{t:2,i:[{t:3}],s:"URL của node"}},password:{t:0,b:{t:2,i:[{t:3}],s:"mật khẩu"}}}},headConfirm:{delete:{body:{t:0,b:{t:2,i:[{t:3,v:"Thao tác này xoá "},{t:4,k:"name"},{t:3,v:", các container và toàn bộ thư mục trạng thái của head — gồm cả các khoá đã sinh."}]}},warning:{t:0,b:{t:2,i:[{t:3}],s:"Số tiền còn nằm ở các địa chỉ của head này sẽ không truy cập được qua Hexcore nữa."}}},resetKeys:{body:{t:0,b:{t:2,i:[{t:3,v:"Thao tác này xoá persistence "},{t:4,k:"keys"},{t:3,v:", nên các địa chỉ Cardano sẽ hoàn toàn mới."}]}},keys:{t:0,b:{t:2,i:[{t:3}],s:"và sinh lại mọi khoá"}},warning:{t:0,b:{t:2,i:[{t:3}],s:"Test ADA đã gửi tới các địa chỉ hiện tại sẽ không truy cập được từ head này nữa."}}},reset:{body:{t:0,b:{t:2,i:[{t:3,v:"Xoá persistence Hydra của "},{t:4,k:"name"},{t:3,v:" để lần khởi động tiếp theo bắt đầu từ trạng thái sạch."}]}},kept:{t:0,b:{t:2,i:[{t:3}],s:"Khoá và các địa chỉ đã nạp tiền được giữ nguyên."}}},alsoKeys:{t:0,b:{t:2,i:[{t:3}],s:"Sinh lại cả khoá (địa chỉ mới)"}},toast:{deleted:{t:0,b:{t:2,i:[{t:3,v:"Đã xoá "},{t:4,k:"name"}]}},reset:{t:0,b:{t:2,i:[{t:3,v:"Đã xoá persistence của "},{t:4,k:"name"}]}},resetKeys:{t:0,b:{t:2,i:[{t:3,v:"Đã đặt lại "},{t:4,k:"name"}]}},resetKeysDetail:{t:0,b:{t:2,i:[{t:3}],s:"Đã sinh địa chỉ mới — hãy nạp tiền trước khi khởi động."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Thao tác thất bại"}}}},headsPage:{pageTitle:{t:0,b:{t:2,i:[{t:3}],s:"Hydra Head"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Các Hydra Head"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Mỗi head chạy một hoặc nhiều container hydra-node, cùng tạo thành một Head."}},cards:{t:0,b:{t:2,i:[{t:3}],s:"Thẻ"}},table:{t:0,b:{t:2,i:[{t:3}],s:"Bảng"}},newHead:{t:0,b:{t:2,i:[{t:3}],s:"Head mới"}},stalled:{t:0,b:{t:2,i:[{t:3}],s:"Mất kết nối với control-plane. Cập nhật trực tiếp đang tạm dừng."}},reconnect:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối lại"}},suggestTable:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" head — chế độ bảng hiển thị được nhiều hơn trên một màn hình."}]}},switchToTable:{t:0,b:{t:2,i:[{t:3}],s:"Chuyển sang bảng"}},empty:{title:{t:0,b:{t:2,i:[{t:3}],s:"Chưa có head nào"}},body:{t:0,b:{t:2,i:[{t:3}],s:"Khi tạo head, Hexcore tự sinh mọi khoá Hydra và Cardano cần thiết — chỉ cần chọn tên và số node tham gia."}},cta:{t:0,b:{t:2,i:[{t:3}],s:"Tạo head đầu tiên"}}}},headCard:{open:{t:0,b:{t:2,i:[{t:3,v:"Mở "},{t:4,k:"name"}]}},nodes:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" node"}]}},contestation:{t:0,b:{t:2,i:[{t:3,v:"contestation "},{t:4,k:"value"}]}},deposit:{t:0,b:{t:2,i:[{t:3,v:"deposit "},{t:4,k:"value"}]}},created:{t:0,b:{t:2,i:[{t:3,v:"tạo "},{t:4,k:"when"}]}},viewLog:{t:0,b:{t:2,i:[{t:3}],s:"Xem log"}},inspect:{t:0,b:{t:2,i:[{t:3}],s:"Xem chi tiết"}}},headTable:{head:{t:0,b:{t:2,i:[{t:3}],s:"Head"}},status:{t:0,b:{t:2,i:[{t:3}],s:"Trạng thái"}},hydraState:{t:0,b:{t:2,i:[{t:3}],s:"Trạng thái Hydra"}},nodes:{t:0,b:{t:2,i:[{t:3}],s:"Node"}},contestation:{t:0,b:{t:2,i:[{t:3}],s:"Contestation"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Thao tác"}}},fundList:{noAddress:{t:0,b:{t:2,i:[{t:3}],s:"chưa có địa chỉ"}},balancesUnknown:{t:0,b:{t:2,i:[{t:3}],s:"Hiện chưa đọc được số dư từ đây — hãy kiểm tra mỗi địa chỉ đã có tiền trước khi khởi động."}},faucet:{t:0,b:{t:2,i:[{t:3}],s:"Mở faucet"}}},detail:{head:{t:0,b:{t:2,i:[{t:3}],s:"Head"}},notFound:{t:0,b:{t:2,i:[{t:3}],s:"Không tìm thấy head"}},notFoundHint:{t:0,b:{t:2,i:[{t:3}],s:"Có thể head đã bị xoá."}},allHeads:{t:0,b:{t:2,i:[{t:3}],s:"Tất cả head"}},chips:{nodes:{t:0,b:{t:2,i:[{t:3}],s:"node"}},network:{t:0,b:{t:2,i:[{t:3}],s:"mạng"}},seed:{t:0,b:{t:2,i:[{t:3}],s:"seed"}},contestation:{t:0,b:{t:2,i:[{t:3}],s:"contestation"}},deposit:{t:0,b:{t:2,i:[{t:3}],s:"deposit"}},version:{t:0,b:{t:2,i:[{t:3}],s:"phiên bản"}},pinned:{t:0,b:{t:2,i:[{t:3}],s:"cố định"}},pinnedValue:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" tham số"}]}}},resetHint:{t:0,b:{t:2,i:[{t:3}],s:"Xoá persistence Hydra của head này và bắt đầu lại. Khoá và địa chỉ được giữ nguyên."}},deleteHead:{t:0,b:{t:2,i:[{t:3}],s:"Xoá head"}},lastError:{t:0,b:{t:2,i:[{t:3}],s:"Lỗi gần nhất"}},tabs:{node:{t:0,b:{t:2,i:[{t:3}],s:"Node"}},resources:{t:0,b:{t:2,i:[{t:3}],s:"Tài nguyên"}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log container"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Sự kiện của head"}}},console:{t:0,b:{t:2,i:[{t:3}],s:"Console"}},consoleHint:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối tới node này, xem các frame và gửi lệnh"}},consoleBlocked:{t:0,b:{t:2,i:[{t:3}],s:"Head phải đang chạy thì node mới phản hồi"}},identity:{t:0,b:{t:2,i:[{t:3}],s:"Định danh"}},ports:{t:0,b:{t:2,i:[{t:3}],s:"Cổng"}},address:{t:0,b:{t:2,i:[{t:3}],s:"Địa chỉ"}},liveState:{t:0,b:{t:2,i:[{t:3}],s:"Trạng thái trực tiếp"}},inSync:{t:0,b:{t:2,i:[{t:3}],s:"đã đồng bộ"}},catchingUp:{t:0,b:{t:2,i:[{t:3}],s:"đang bắt kịp"}},networkDown:{t:0,b:{t:2,i:[{t:3}],s:"mất mạng"}},peersLost:{t:0,b:{t:2,i:[{t:3,v:"mất peer: "},{t:4,k:"peers"}]}},snapshotUtxos:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" UTxO trong snapshot"}]}},connecting:{t:0,b:{t:2,i:[{t:3}],s:"Đang kết nối tới node…"}},notRunning:{t:0,b:{t:2,i:[{t:3}],s:"Head không chạy — chưa có gì để báo."}},log:{empty:{t:0,b:{t:2,i:[{t:3}],s:"(chưa có output)"}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Không đọc được log."}},failedWith:{t:0,b:{t:2,i:[{t:3,v:"Không đọc được log: "},{t:4,k:"error"}]}},tail:{t:0,b:{t:2,i:[{t:3}],s:"Số dòng cuối cần xem"}},lines:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" dòng"}]}}},noEvents:{t:0,b:{t:2,i:[{t:3}],s:"Chưa ghi nhận sự kiện nào."}}},boot:{title:{t:0,b:{t:2,i:[{t:3,v:"Đang khởi động "},{t:4,k:"name"}]}},headN:{t:0,b:{t:2,i:[{t:3,v:"head "},{t:4,k:"id"}]}},succeeded:{t:0,b:{t:2,i:[{t:3,v:"Sẵn sàng sau "},{t:4,k:"elapsed"},{t:3,v:" — mọi node đã gửi Greetings."}]}},failed:{t:0,b:{t:2,i:[{t:3,v:"Thất bại sau "},{t:4,k:"elapsed"},{t:3,v:". Các container đã được rollback, nên lần thử lại sẽ bắt đầu sạch."}]}},running:{t:0,b:{t:2,i:[{t:3,v:"Đã chạy "},{t:4,k:"elapsed"},{t:3,v:". Đóng bảng này không dừng quá trình khởi động."}]}},waiting:{t:0,b:{t:2,i:[{t:3}],s:"Đang chờ control-plane báo tiến độ…"}},noProgress:{t:0,b:{t:2,i:[{t:3}],s:"Chưa có tiến độ khởi động nào được ghi cho head này."}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log"}},closeKeepStarting:{t:0,b:{t:2,i:[{t:3}],s:"Đóng, vẫn tiếp tục khởi động"}}},resources:{title:{t:0,b:{t:2,i:[{t:3}],s:"Tài nguyên container"}},resample:{t:0,b:{t:2,i:[{t:3}],s:"Đo lại"}},running:{t:0,b:{t:2,i:[{t:3}],s:"Đang chạy"}},memory:{t:0,b:{t:2,i:[{t:3}],s:"Bộ nhớ"}},sampling:{t:0,b:{t:2,i:[{t:3}],s:"Đang đo…"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Không có gì để đo — head này không có container nào."}},nodeRunning:{t:0,b:{t:2,i:[{t:3}],s:"đang chạy"}},nodeStopped:{t:0,b:{t:2,i:[{t:3}],s:"đã dừng"}},threads:{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" luồng"}]}},noContainer:{t:0,b:{t:2,i:[{t:3}],s:"Không có container — đã dừng, hoặc không kết nối được Docker."}},sampled:{t:0,b:{t:2,i:[{t:3,v:"Đo lúc "},{t:4,k:"at"},{t:3,v:", "},{t:4,k:"every"},{t:3,v:" giây một lần · bộ nhớ không tính page cache."}]}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Không đọc được số liệu của container."}}},topology:{solo:{t:0,b:{t:2,i:[{t:3}],s:"Head một node — không có peer"}},peerUp:{t:0,b:{t:2,i:[{t:3}],s:"peer đã kết nối"}},peerDown:{t:0,b:{t:2,i:[{t:3}],s:"peer mất kết nối"}},inferred:{t:0,b:{t:2,i:[{t:3}],s:"suy ra từ khả năng kết nối tới node"}}},console:{subtitle:{t:0,b:{t:2,i:[{t:3,v:"Node "},{t:4,k:"index"},{t:3,v:" của "},{t:4,k:"head"},{t:3,v:" · cổng API "},{t:4,k:"port"}]}},status:{idle:{t:0,b:{t:2,i:[{t:3}],s:"chưa kết nối"}},connecting:{t:0,b:{t:2,i:[{t:3}],s:"đang kết nối"}},open:{t:0,b:{t:2,i:[{t:3}],s:"đã kết nối"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"đã đóng"}}},connectTab:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối"}},notRunning:{t:0,b:{t:2,i:[{t:3}],s:"Head này không chạy, nên không có node nào để kết nối. Khởi động head thì console sẽ tự kết nối."}},connect:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối"}},disconnect:{t:0,b:{t:2,i:[{t:3}],s:"Ngắt kết nối"}},filter:{t:0,b:{t:2,i:[{t:3}],s:"Lọc frame…"}},historyHint:{t:0,b:{t:2,i:[{t:3}],s:"Phát lại event log của node"}},snapshotUtxoHint:{t:0,b:{t:2,i:[{t:3}],s:"Kèm map UTxO trong Greetings"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Xoá các frame"}},noMatch:{t:0,b:{t:2,i:[{t:3}],s:"Không có frame nào khớp bộ lọc."}},nothingYet:{t:0,b:{t:2,i:[{t:3}],s:"Chưa nhận được gì."}},templateLabel:{t:0,b:{t:2,i:[{t:3}],s:"Nạp mẫu lệnh"}},templatePlaceholder:{t:0,b:{t:2,i:[{t:3}],s:"Lệnh…"}},templateHint:{t:0,b:{t:2,i:[{t:3}],s:"Mẫu lệnh được nạp vào ô soạn — đọc và sửa trước khi gửi."}},send:{t:0,b:{t:2,i:[{t:3}],s:"Gửi"}},notConnected:{t:0,b:{t:2,i:[{t:3}],s:"Chưa kết nối — chưa gửi gì cả."}},since:{v022:{t:0,b:{t:2,i:[{t:3}],s:"chỉ 0.22"}},v2:{t:0,b:{t:2,i:[{t:3}],s:"chỉ 2.x"}}},confirm:{title:{t:0,b:{t:2,i:[{t:3,v:"Gửi "},{t:4,k:"command"},{t:3,v:" tới "},{t:4,k:"node"},{t:3,v:"?"}]}},label:{t:0,b:{t:2,i:[{t:3,v:"Gửi "},{t:4,k:"command"}]}},body:{t:0,b:{t:2,i:[{t:3}],s:"Lệnh chỉ gửi tới một node, nhưng head là chung — các node khác sẽ làm theo. Không có cách nào thu hồi."}}},httpsAdvice:{t:0,b:{t:2,i:[{t:3}],s:"Trang này được phục vụ qua HTTPS, và trình duyệt chặn ws:// thường từ một trang bảo mật. Hãy kết nối tới node qua một proxy có TLS, hoặc mở Hexcore bằng http:// trên máy đang chạy Docker."}},invalid:{empty:{t:0,b:{t:2,i:[{t:3}],s:"Không có gì để gửi."}},notObject:{t:0,b:{t:2,i:[{t:3}],s:"Lệnh phải là một object JSON."}},noTag:{t:0,b:{t:2,i:[{t:3}],s:'Lệnh cần có "tag" — hydra-node dựa vào đó để xử lý.'}},json:{t:0,b:{t:2,i:[{t:3,v:"JSON không hợp lệ: "},{t:4,k:"error"}]}}},close:{byNode:{t:0,b:{t:2,i:[{t:3,v:"Node đã đóng kết nối: "},{t:4,k:"reason"},{t:3,v:" (mã "},{t:4,k:"code"},{t:3,v:")"}]}},clean:{t:0,b:{t:2,i:[{t:3,v:"Kết nối đã đóng (mã "},{t:4,k:"code"},{t:3,v:")."}]}},unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Không kết nối được tới node. Có thể container đã dừng, cổng API chưa được publish, hoặc có gì đó giữa trình duyệt và máy chủ đang chặn kết nối."}},lost:{t:0,b:{t:2,i:[{t:3,v:"Mất kết nối (mã "},{t:4,k:"code"},{t:3,v:")."}]}}},notes:{connecting:{t:0,b:{t:2,i:[{t:3,v:"đang kết nối tới "},{t:4,k:"url"}]}},connected:{t:0,b:{t:2,i:[{t:3}],s:"đã kết nối"}},cannotOpen:{t:0,b:{t:2,i:[{t:3,v:"Không mở được "},{t:4,k:"url"},{t:3,v:": "},{t:4,k:"error"}]}}}},connect:{title:{t:0,b:{t:2,i:[{t:3,v:"Kết nối tới "},{t:4,k:"node"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Hydra API của node này, đúng như console bên cạnh đang dùng. Cổng này chỉ thuộc về node này — mỗi node của head có một dải cổng riêng."}},url:{t:0,b:{t:2,i:[{t:3}],s:"URL WebSocket"}},sdkHint:{t:0,b:{t:2,i:[{t:4,k:"install"},{t:3,v:" — cũng là client mà control-plane dùng để theo dõi các node này."}]}},rawHint:{t:0,b:{t:2,i:[{t:3,v:"Không cần thư viện nào. hydra-node gửi mỗi frame là một object JSON không xuống dòng, mỗi object mang một "},{t:4,k:"tag"},{t:3,v:"."}]}},httpHint:{t:0,b:{t:2,i:[{t:3}],s:"Cùng cổng này trả lời HTTP cho những gì là truy vấn chứ không phải luồng dữ liệu."}},docs:{t:0,b:{t:2,i:[{t:3}],s:"Tài liệu hydra-sdk"}},docsHint:{t:0,b:{t:2,i:[{t:3}],s:"Build giao dịch, commit tiền và đọc snapshot — những phần mà console này cho thấy định dạng trên đường truyền, kèm kiểu dữ liệu."}}},editHead:{pageTitle:{t:0,b:{t:2,i:[{t:3,v:"Sửa "},{t:4,k:"name"}]}},back:{t:0,b:{t:2,i:[{t:3}],s:"Quay lại head"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Áp dụng ở lần khởi động tiếp theo. Số node, chain backend và các khoá đã sinh cố định từ lúc tạo."}},locked:{t:0,b:{t:2,i:[{t:3}],s:"Không thể sửa head này nữa"}},lockedRunning:{t:0,b:{t:2,i:[{t:3}],s:"Hãy dừng head trước — các container đang chạy với cài đặt hiện tại."}},lockedRan:{t:0,b:{t:2,i:[{t:3}],s:"Head đã từng chạy, nên persistence có thể không khớp với cài đặt mới. Hãy đặt lại để xoá persistence, rồi mới sửa."}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image hydra-node"}},imageHint:{t:0,b:{t:2,i:[{t:3}],s:"Đổi image an toàn khi head chưa từng chạy. Sau khi đã chạy, persistence trên đĩa được ghi bởi phiên bản cũ và một dòng phiên bản khác không tiếp tục được."}},quiet:{t:0,b:{t:2,i:[{t:3,v:"hydra-node chế độ quiet ("},{t:4,k:"flag"},{t:3,v:")"}]}},blockfrost:{replace:{t:0,b:{t:2,i:[{t:3}],s:"Thay API key"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Để trống thì giữ key hiện tại"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Key không bao giờ được gửi lại form này, nên ở đây không có gì để hiển thị — chỉ gõ key mới khi muốn thay. Key riêng của từng node không bị ảnh hưởng."}}},save:{t:0,b:{t:2,i:[{t:3}],s:"Lưu thay đổi"}},loadFailed:{t:0,b:{t:2,i:[{t:3}],s:"Không tải được head này."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Một số giá trị cần sửa."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Cập nhật thất bại."}},toast:{t:0,b:{t:2,i:[{t:3,v:"Đã cập nhật "},{t:4,k:"name"}]}},appliedNextStart:{t:0,b:{t:2,i:[{t:3}],s:"Áp dụng ở lần khởi động tiếp theo."}}},login:{pageTitle:{t:0,b:{t:2,i:[{t:3}],s:"Đăng nhập"}},tagline:{t:0,b:{t:2,i:[{t:3}],s:"Khởi động và vận hành Hydra Head"}},username:{t:0,b:{t:2,i:[{t:3}],s:"Tên đăng nhập"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Mật khẩu"}},submit:{t:0,b:{t:2,i:[{t:3}],s:"Đăng nhập"}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Không đăng nhập được. Control-plane có đang chạy không?"}},firstBoot:{t:0,b:{t:2,i:[{t:3,v:"Ở lần khởi động đầu, control-plane sinh một mật khẩu và in ra log đúng một lần, trừ khi đã đặt "},{t:4,k:"env"},{t:3,v:"."}]}}},setup:{title:{t:0,b:{t:2,i:[{t:3}],s:"Thiết lập Hexcore"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Trả lời bốn câu hỏi, rồi có thể khởi động một Hydra Head."}},unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Không kết nối được control-plane. Control-plane có còn chạy không?"}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Thiết lập thất bại. Control-plane có còn chạy không?"}},done:{title:{t:0,b:{t:2,i:[{t:3}],s:"Hexcore đã được cấu hình"}},body:{t:0,b:{t:2,i:[{t:3}],s:"Cài đặt đã lưu và có hiệu lực ngay — không cần khởi động lại."}},savePassword:{t:0,b:{t:2,i:[{t:3}],s:"Lưu mật khẩu này ngay"}},shownOnce:{t:0,b:{t:2,i:[{t:3}],s:"Mật khẩu chỉ hiện một lần và không khôi phục được — chỉ đặt lại được."}}},token:{required:{t:0,b:{t:2,i:[{t:3}],s:"Cần link thiết lập"}},body:{t:0,b:{t:2,i:[{t:3}],s:"Hãy mở URL được in trong terminal đã khởi động Hexcore — URL đó mang một token dùng một lần. Nếu không, bất kỳ ai truy cập được cổng này đều có thể chiếm tài khoản admin."}},label:{t:0,b:{t:2,i:[{t:3}],s:"Token thiết lập"}}},networks:{preprod:{t:0,b:{t:2,i:[{t:3}],s:"preprod — testnet thường dùng"}},preview:{t:0,b:{t:2,i:[{t:3}],s:"preview — testnet mới hơn"}},mainnet:{t:0,b:{t:2,i:[{t:3}],s:"mainnet — tiền thật"}}},backendQuestion:{t:0,b:{t:2,i:[{t:3}],s:"Head kết nối tới chain bằng cách nào?"}},backends:{offline:{label:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},blurb:{t:0,b:{t:2,i:[{t:3}],s:"Head tự mô phỏng layer 1. Hydra nhiều node thật, không cần chain, không phải chờ."}},needs:{t:0,b:{t:2,i:[{t:3}],s:"Không cần gì cả"}}},blockfrost:{label:{t:0,b:{t:2,i:[{t:3}],s:"Blockfrost"}},blurb:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối chain thật qua một API được host sẵn. Lựa chọn thường dùng cho head trên testnet."}},needs:{t:0,b:{t:2,i:[{t:3}],s:"Một API key miễn phí từ blockfrost.io"}}},cardanoNode:{label:{t:0,b:{t:2,i:[{t:3}],s:"cardano-node"}},blurb:{t:0,b:{t:2,i:[{t:3}],s:"Kết nối tới một node đang chạy sẵn. Gần tip nhất và đồng bộ nhanh nhất."}},needs:{t:0,b:{t:2,i:[{t:3}],s:"Một socket của node trên máy này"}}}},noCredential:{t:0,b:{t:2,i:[{t:3}],s:"không cần credential"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Cần: "},{t:4,k:"what"}]}},blockfrostHint:{t:0,b:{t:2,i:[{t:3,v:"Miễn phí tại blockfrost.io. Key phải là key "},{t:4,k:"network"},{t:3,v:" — key của mạng khác không báo lỗi rõ ràng, mà tạo ra một head không bao giờ thấy giao dịch của chính nó."}]}},socketPath:{t:0,b:{t:2,i:[{t:3}],s:"Đường dẫn socket cardano-node"}},password:{placeholder:{t:0,b:{t:2,i:[{t:3}],s:"để trống để tự sinh"}},confirm:{t:0,b:{t:2,i:[{t:3}],s:"Nhập lại mật khẩu"}},tooShort:{t:0,b:{t:2,i:[{t:3}],s:"Dùng ít nhất 8 ký tự."}},mismatch:{t:0,b:{t:2,i:[{t:3}],s:"Hai mật khẩu không khớp."}},generated:{t:0,b:{t:2,i:[{t:3}],s:"Để trống thì Hexcore sinh một mật khẩu mạnh và hiện một lần ở màn hình tiếp theo."}}},submit:{t:0,b:{t:2,i:[{t:3}],s:"Hoàn tất thiết lập"}},footer:{t:0,b:{t:2,i:[{t:3,v:"Mọi thứ ở đây đều đổi được sau trong Cài đặt. Quen dùng terminal? "},{t:4,k:"command"},{t:3,v:" hỏi đúng những câu này."}]}}},settings:{pageTitle:{t:0,b:{t:2,i:[{t:3}],s:"Cài đặt"}},intro:{t:0,b:{t:2,i:[{t:3,v:"Lưu trên control-plane và áp dụng không cần khởi động lại. Biến môi trường hoặc file "},{t:4,k:"env"},{t:3,v:" vẫn được ưu tiên hơn mọi giá trị đặt ở đây — bảng ở cuối trang cho biết giá trị nào."}]}},chain:{title:{t:0,b:{t:2,i:[{t:3}],s:"Chain"}},description:{t:0,b:{t:2,i:[{t:3}],s:"Mặc định cho head mới. Head đã có giữ nguyên cài đặt lúc tạo."}},network:{t:0,b:{t:2,i:[{t:3}],s:"Mạng Cardano"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"offline — không cần credential"}},blockfrost:{t:0,b:{t:2,i:[{t:3}],s:"Blockfrost project id"}},unchanged:{t:0,b:{t:2,i:[{t:3}],s:"giữ nguyên"}},keyStored:{t:0,b:{t:2,i:[{t:3}],s:"Đã lưu một key. Để trống để giữ key đó — key không bao giờ được gửi lại trình duyệt."}},mustStartWith:{t:0,b:{t:2,i:[{t:3,v:"Phải bắt đầu bằng "},{t:4,k:"network"},{t:3,v:"."}]}},socket:{t:0,b:{t:2,i:[{t:3}],s:"Socket cardano-node"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image hydra-node mặc định"}},imageHint:{t:0,b:{t:2,i:[{t:3}],s:"Mỗi head vẫn có thể cố định image riêng lúc tạo — nhờ vậy hai phiên bản chạy song song được."}},keyRequired:{t:0,b:{t:2,i:[{t:3}],s:"Backend Blockfrost cần project id trước khi tạo được head dùng backend này."}}},adminUsername:{t:0,b:{t:2,i:[{t:3}],s:"Tên đăng nhập admin"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Lưu cài đặt"}},saveHint:{t:0,b:{t:2,i:[{t:3}],s:"Áp dụng ngay, không cần khởi động lại."}},facts:{signedInAs:{t:0,b:{t:2,i:[{t:3}],s:"Đang đăng nhập với"}},version:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản control-plane"}},healthy:{t:0,b:{t:2,i:[{t:3}],s:"ổn định"}},unreachable:{t:0,b:{t:2,i:[{t:3}],s:"không kết nối được"}},auth:{t:0,b:{t:2,i:[{t:3}],s:"Xác thực"}},enabled:{t:0,b:{t:2,i:[{t:3}],s:"đang bật"}},disabled:{t:0,b:{t:2,i:[{t:3}],s:"đang tắt"}},available:{t:0,b:{t:2,i:[{t:3}],s:"khả dụng"}},notAvailable:{t:0,b:{t:2,i:[{t:3}],s:"không khả dụng"}},notSet:{t:0,b:{t:2,i:[{t:3}],s:"chưa đặt"}},stateDir:{t:0,b:{t:2,i:[{t:3}],s:"Thư mục trạng thái"}},maxNodes:{t:0,b:{t:2,i:[{t:3}],s:"Số node hoạt động tối đa"}}},provenance:{title:{t:0,b:{t:2,i:[{t:3}],s:"Nguồn của từng giá trị"}},description:{t:0,b:{t:2,i:[{t:3,v:"Lớp cao nhất được ưu tiên: biến môi trường, rồi file "},{t:4,k:"env"},{t:3,v:" cạnh server, rồi giá trị lưu ở đây, cuối cùng là mặc định có sẵn."}]}},pinned:{t:0,b:{t:2,i:[{t:3}],s:"Một số cài đặt đang bị khoá"}},pinnedBody:{t:0,b:{t:2,i:[{t:4,k:"keys"},{t:3,v:" lấy từ một lớp cao hơn, nên lưu giá trị khác ở đây không có tác dụng cho tới khi bỏ giá trị đó trên server."}]}},set:{t:0,b:{t:2,i:[{t:3}],s:"(đã đặt)"}},unset:{t:0,b:{t:2,i:[{t:3}],s:"(chưa đặt)"}}},source:{environment:{t:0,b:{t:2,i:[{t:3}],s:"biến môi trường"}},envFile:{t:0,b:{t:2,i:[{t:3}],s:"file .env"}},settingsFile:{t:0,b:{t:2,i:[{t:3}],s:"lưu ở đây"}},default:{t:0,b:{t:2,i:[{t:3}],s:"mặc định có sẵn"}}},wipe:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bắt đầu lại"}},description:{t:0,b:{t:2,i:[{t:3,v:"Cả hai thao tác đều giữ khoá ký Cardano, nên địa chỉ nào đã có test ADA vẫn còn nguyên. Muốn xoá cả khoá phải chạy "},{t:4,k:"command"},{t:3,v:" khi server đã dừng."}]}},config:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại cấu hình"}},configHint:{t:0,b:{t:2,i:[{t:3}],s:"Xoá mạng, backend và credential, rồi quay về trình thiết lập. Các head không bị ảnh hưởng."}},heads:{t:0,b:{t:2,i:[{t:3}],s:"Xoá mọi head"}},headsHint:{t:0,b:{t:2,i:[{t:3}],s:"Xoá mọi container và persistence Hydra. Cấu hình và tài khoản đăng nhập giữ nguyên."}},deleteAll:{t:0,b:{t:2,i:[{t:3}],s:"Xoá tất cả"}},configConfirm:{t:0,b:{t:2,i:[{t:3}],s:"Đặt lại cấu hình?"}},headsConfirm:{t:0,b:{t:2,i:[{t:3}],s:"Xoá mọi head?"}},configBody:{t:0,b:{t:2,i:[{t:3}],s:"Mạng, backend và các credential đã lưu bị xoá, và Hexcore quay về trình thiết lập."}},configKept:{t:0,b:{t:2,i:[{t:3}],s:"Các head, khoá và persistence của chúng được giữ nguyên."}},headsBody:{t:0,b:{t:2,i:[{t:3}],s:"Mọi head bị dừng, container bị xoá và persistence Hydra bị xoá."}},headsKept:{t:0,b:{t:2,i:[{t:3}],s:"Khoá ký được giữ lại, nên các địa chỉ đã nạp tiền vẫn tiêu được."}}},toast:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Đã lưu cài đặt"}},savedDetail:{t:0,b:{t:2,i:[{t:3}],s:"Đã áp dụng cho control-plane đang chạy — không cần khởi động lại."}},saveFailed:{t:0,b:{t:2,i:[{t:3}],s:"Không lưu được cài đặt"}},removed:{t:0,b:{t:2,i:[{t:3,v:"Đã xoá "},{t:4,k:"heads"},{t:3,v:" head và "},{t:4,k:"containers"},{t:3,v:" container"}]}},nothingDeleted:{t:0,b:{t:2,i:[{t:3}],s:"Chưa xoá gì cả"}}}},api:{timeout:{t:0,b:{t:2,i:[{t:3,v:"Request tới "},{t:4,k:"path"},{t:3,v:" quá thời gian chờ sau "},{t:4,k:"seconds"},{t:3,v:" giây."}]}},unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Không kết nối được control-plane. Control-plane có đang chạy không?"}},notJson:{t:0,b:{t:2,i:[{t:3,v:"Server trả về phản hồi không phải JSON ("},{t:4,k:"status"},{t:3,v:")."}]}},badEnvelope:{t:0,b:{t:2,i:[{t:3}],s:"Phản hồi của server không đúng định dạng mong đợi."}}},domain:{issues:{"hydra-2871":{title:{t:0,b:{t:2,i:[{t:3}],s:"Deposit có ít ADA hơn mức tối thiểu của output sẽ bị khoá và không được ghi nhận"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Datum inline của output deposit chứa UTxO được nạp, nên output cần nhiều ADA hơn chính UTxO đó — khoảng 1,5 ADA với UTxO thường, nhiều hơn nếu có token. `/commit` bù thêm ADA vào output nhưng datum vẫn giữ giá trị cũ, node từ chối deposit vì không khớp, và tiền nằm lại ở script deposit: không có `CommitRecorded`, không khôi phục được qua node. Hãy nạp dư hẳn so với mức tối thiểu — trường hợp hay gặp là UTxO chứa token chỉ vừa đủ ADA tối thiểu của nó."}}},"hydra-GHSA-cg83-6w6r-6hx3":{title:{t:0,b:{t:2,i:[{t:3}],s:"Bảo mật: một bên gian lận có thể khiến snapshot chuyển tiền của bên khác được ký"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Advisory nghiêm trọng GHSA-cg83-6w6r-6hx3. Khi xác nhận snapshot, node áp dụng lại giao dịch theo một đường bỏ qua kiểm tra chữ ký và Plutus, và giao dịch chưa kiểm tra vẫn lọt được vào đó. Vì vậy một bên trong head, chỉ với Hydra key của mình, có thể khiến các node trung thực ký một snapshot chuyển tiền của bên khác về cho mình, rồi Close và Fanout trả số tiền đó ra L1. Chỉ một bên khác trong head mới làm được việc này; head mà mọi node cùng chạy trong một Hexcore thì không có ai để khai thác. Hãy nâng lên 2.4.1 trước khi dùng chung head với người khác — chỉ cần node của mình chạy 2.4.1, vì mọi snapshot đều cần chữ ký của nó. Từ 2.3 lên phải close và fanout trước, vì 2.4 đổi script."}}},"hexcore-v2-7":{title:{t:0,b:{t:2,i:[{t:3}],s:"Image chính thức chỉ có amd64, không chạy được trên máy arm64"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Mọi image cardano-scaling phát hành trước 2.4.0 chỉ được build cho amd64. Trên Apple Silicon, image chạy qua Rosetta, và từ 2.2.0 node nạp toàn bộ trusted setup KZG vào bộ nhớ trước khi bật tracer hay mở API socket — dưới Rosetta, blst mất các đường tối ưu CPU nên node treo ở bước này mà không in ra gì, và head thất bại như một readiness timeout thông thường, log không có manh mối nào. Trên Linux arm64, daemon từ chối image nếu chưa cài qemu. Đã đo: warm-up mất 0,47 giây trên bản build lại cho arm64 từ cùng source, và chưa lần nào thấy hoàn tất dưới Rosetta. Hãy dùng bản chính thức 2.4.1 trở lên (có cả arm64), hoặc hydra-node 2.3.x (arm64) — cùng code, đúng kiến trúc — hoặc 2.1.x, bản có trước warm-up nhưng mang lỗi double spend."}}},"hydra-2629":{title:{t:0,b:{t:2,i:[{t:3}],s:"Cùng một UTxO có thể tiêu được ở cả L1 lẫn L2"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Sau khi recover một deposit incremental commit rồi side-load một snapshot, UTxO đã recover xuất hiện lại trong ledger L2 trong khi nó cũng đã về lại L1 — tức tiêu được hai lần. Được báo cáo trên 2.1.0, mạng preprod. Chỉ xảy ra khi dùng incremental commit kèm recover, nhưng hậu quả là double spend, nên head đã làm cả hai việc này cần được coi là đáng ngờ."}}},"hydra-2642":{title:{t:0,b:{t:2,i:[{t:3}],s:"Xoay vòng event log làm mất deposit đang chờ mà không báo"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Khi xoay vòng, node ghi một checkpoint và bỏ các event phía trước nó, nhưng đường replay lại bỏ sót `pendingDeposits` — nên deposit được ghi nhận trước một lần xoay vòng sẽ không khôi phục được sau khi restart, trừ khi xử lý thủ công. Lỗi này đặc biệt đáng lưu ý ở đây: mọi head Hexcore tạo đều đặt --persistence-rotate-after, nên xoay vòng không phải chuyện hiếm."}}},"hydra-2477":{title:{t:0,b:{t:2,i:[{t:3}],s:"hydra-node crash khi Blockfrost giới hạn request hoặc ngắt kết nối"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Một phản hồi 403 từ Blockfrost — chính là cách nó báo vượt giới hạn request — hoặc một kết nối bị ngắt sẽ làm node dừng hẳn. Node không retry và không tự chạy lại, nên head nằm im cho tới khi có người restart. Các node dùng chung một project id sẽ chạm giới hạn sớm nhất."}}},"hydra-2697":{title:{t:0,b:{t:2,i:[{t:3}],s:"Validator Increment và Decrement thiếu `mustNotMintOrBurn`"}},impact:{t:0,b:{t:2,i:[{t:3}],s:"Mọi bước chuyển trạng thái khác của head đều chặn mint hoặc burn; riêng hai bước này thì không. Upstream không tìm thấy cách khai thác — burn vẫn sẽ thất bại gián tiếp qua kiểm tra giá trị — nhưng đánh giá chuỗi lập luận đó là mong manh. Đây là lớp phòng thủ bổ sung, không phải lỗ hổng đã biết."}}}},params:{maxTxSize:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kích thước giao dịch tối đa (byte)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Giao dịch L2 lớn nhất mà head chấp nhận. Tăng giá trị này là cách thường dùng khi một batch không vừa."}}},maxValueSize:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kích thước value tối đa (byte)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Giới hạn kích thước value của một output sau khi serialize — tức số native asset tối đa một UTxO mang được."}}},maxBlockBodySize:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kích thước block body tối đa (byte)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Giới hạn lượng giao dịch trong một snapshot."}}},maxCollateralInputs:{label:{t:0,b:{t:2,i:[{t:3}],s:"Số input collateral tối đa"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Số input mà một giao dịch script được dùng làm collateral."}}},collateralPercentage:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tỷ lệ collateral (%)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Collateral cần có, tính theo phần trăm phí. Không có tác dụng khi phí bằng 0."}}},maxTxExecutionUnits_memory:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bộ nhớ thực thi tối đa mỗi giao dịch"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ngân sách bộ nhớ Plutus cho một giao dịch — giới hạn mà validator nặng chạm phải đầu tiên."}}},maxTxExecutionUnits_steps:{label:{t:0,b:{t:2,i:[{t:3}],s:"Số bước thực thi tối đa mỗi giao dịch"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ngân sách CPU Plutus cho một giao dịch."}}},maxBlockExecutionUnits_memory:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bộ nhớ thực thi tối đa mỗi block"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Tổng bộ nhớ Plutus trong một block."}}},maxBlockExecutionUnits_steps:{label:{t:0,b:{t:2,i:[{t:3}],s:"Số bước thực thi tối đa mỗi block"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Tổng CPU Plutus trong một block."}}},executionUnitPrices_priceMemory:{label:{t:0,b:{t:2,i:[{t:3}],s:"Giá mỗi đơn vị bộ nhớ"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Quy đổi bộ nhớ Plutus ra phí. Đặt giá trị này và giá CPU bằng 0 để script miễn phí trên L2."}}},executionUnitPrices_priceSteps:{label:{t:0,b:{t:2,i:[{t:3}],s:"Giá mỗi bước CPU"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Quy đổi CPU Plutus ra phí. Giữ theo giá trị của chain, trừ khi đặt về 0."}}},txFeeFixed:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phí cố định (lovelace)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Phần phí cố định. Đặt về 0 trên L2 — head muốn thu phí thì phải có nơi nhận số phí đó."}}},txFeePerByte:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phí mỗi byte (lovelace)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Phần phí tỷ lệ theo kích thước. Đặt về 0 trên L2."}}},utxoCostPerByte:{label:{t:0,b:{t:2,i:[{t:3}],s:"Chi phí UTxO mỗi byte (lovelace)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Min-ADA cho mỗi byte output. Đặt về 0 trên L2 để output nhỏ không bị từ chối trong head."}}},minFeeRefScriptCostPerByte:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phí reference script mỗi byte"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Phụ phí cho reference script, tính theo kích thước."}}},protocolVersion_major:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản giao thức (major)"}},hint:{t:0,b:{t:2,i:[{t:3,v:"Era ledger mà head dùng để kiểm tra giao dịch. "},{t:4,k:"current"},{t:3,v:" là era hiện tại; hạ xuống sẽ từ chối giao dịch được build cho chain đang chạy."}]}}},protocolVersion_minor:{label:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản giao thức (minor)"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản minor, gần như luôn là 0."}}}},paramGroups:{limits:{t:0,b:{t:2,i:[{t:3}],s:"Giới hạn ledger"}},plutus:{t:0,b:{t:2,i:[{t:3}],s:"Ngân sách thực thi Plutus"}},fees:{t:0,b:{t:2,i:[{t:3}],s:"Phí và deposit"}},version:{t:0,b:{t:2,i:[{t:3}],s:"Phiên bản giao thức"}}},versions:{"2_4":{summary:{t:0,b:{t:2,i:[{t:3}],s:"Bản phát hành hiện tại. Đã sửa advisory bảo mật về snapshot có trong 2.3–2.4.0, và image chính thức chạy native trên Apple Silicon lẫn Linux arm64."}}},"2_3-arm64":{summary:{t:0,b:{t:2,i:[{t:3}],s:"2.3.0 build lại cho arm64. Code và flag giống hệt, nhưng chạy native trên Apple Silicon thay vì treo dưới Rosetta. Image do cộng đồng build."}}},"2_3":{summary:{t:0,b:{t:2,i:[{t:3}],s:"Chịu được độ trễ của Blockfrost. Không có commit phase (ADR-33), event store dùng SQLite."}}},"2_1":{summary:{t:0,b:{t:2,i:[{t:3}],s:"Bản 2.x cũ nhất có đủ bộ flag. Mang lỗi double spend đã sửa ở 2.2.0 — chỉ dùng để thử nghiệm khi 2.3.0 không chạy được, không dùng cho head giữ tài sản thật."}}},"0_22":{summary:{t:0,b:{t:2,i:[{t:3}],s:"Giao thức cũ (có commit phase, script cũ). Chạy với ngân sách unsynced 60 giây, nằm trong khoảng trễ 50–80 giây của Blockfrost — nên dùng 2.4.x với Blockfrost."}}}},commands:{Init:{t:0,b:{t:2,i:[{t:3}],s:"Mở head. Ở v2 lệnh này mở head ngay — commit phase đã bị bỏ (ADR-33)."}},NewTx:{t:0,b:{t:2,i:[{t:3}],s:"Gửi một giao dịch layer 2. Cần giao dịch đã ký dưới dạng CBOR hex."}},Decommit:{t:0,b:{t:2,i:[{t:3}],s:"Đưa một UTxO ra khỏi head, về lại layer 1."}},Recover:{t:0,b:{t:2,i:[{t:3}],s:"Lấy lại một deposit đã thấy trên chain nhưng chưa vào snapshot nào."}},Contest:{t:0,b:{t:2,i:[{t:3}],s:"Phản đối một snapshot đóng head cũ hơn snapshot mà node này đang giữ."}},Fanout:{t:0,b:{t:2,i:[{t:3}],s:"Trả tập UTxO cuối cùng về layer 1. Chỉ dùng sau ReadyToFanout."}},SafeClose:{t:0,b:{t:2,i:[{t:3}],s:"Đóng head, nhưng từ chối nếu head còn giữ tài sản không phải ADA. Khi đó node trả về InvalidInput."}},Close:{t:0,b:{t:2,i:[{t:3}],s:"Kết thúc head và bắt đầu contestation period. Không thể hoàn tác."}},Abort:{t:0,b:{t:2,i:[{t:3}],s:"Huỷ một head còn đang khởi tạo. Đã bị bỏ ở v2 cùng với commit phase."}}}}};export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as Q,a as K,D as oe,e as x,P as X,T as ae,b as j}from"./BqoV-QnQ.js";import{d as se,u as D,P as F,r as I,a as b,e as le,_ as ne}from"./BV_QiRi8.js";import{e as m,S as re,D as f,i as e,n as q,o as p,l as _,w as u,L as y,v as G,b as C,E as T,q as E,B as R,X as H,j as S,m as U,O as ue,Q as $,R as w,c as L,z as J,f as ie,d as k,t as P,a as z,k as de,r as pe}from"./DIi866IK.js";import{g as N,a as ce,F as fe,b as _e,d as me}from"./dhmyGJu2.js";import{b as ve,c as ge,L as ye}from"./Bj1gglGt.js";const[A,De]=Q("DialogRoot");var Ce=m({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(a,{emit:s}){const t=a,o=se(t,"open",s,{defaultValue:t.defaultOpen,passive:t.open===void 0}),r=q(),c=q(),{modal:n,unmountOnHide:d}=re(t);return De({open:o,modal:n,unmountOnHide:d,openModal:()=>{o.value=!0},onOpenChange:i=>{o.value=i},onOpenToggle:()=>{o.value=!o.value},contentId:"",titleId:"",descriptionId:"",triggerElement:r,contentElement:c}),(i,g)=>f(i.$slots,"default",{open:e(o),close:()=>o.value=!1})}}),Oe=Ce,Ae=m({__name:"DialogClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(a){const s=a;D();const t=A();return(l,o)=>(p(),_(e(F),y(s,{type:l.as==="button"?"button":void 0,onClick:o[0]||(o[0]=r=>e(t).onOpenChange(!1))}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["type"]))}}),Be=Ae,qe=m({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,l=s,o=A(),{forwardRef:r,currentElement:c}=D();return o.titleId||=K(void 0,"reka-dialog-title"),o.descriptionId||=K(void 0,"reka-dialog-description"),G(()=>{o.contentElement=c,N()!==document.body&&(o.triggerElement.value=N())}),(n,d)=>(p(),_(e(fe),{"as-child":"",loop:"",trapped:t.trapFocus,present:t.present,onMountAutoFocus:d[5]||(d[5]=i=>l("openAutoFocus",i)),onUnmountAutoFocus:d[6]||(d[6]=i=>l("closeAutoFocus",i))},{default:u(()=>[C(e(oe),y({id:e(o).contentId,ref:e(r),as:n.as,"as-child":n.asChild,present:t.present,"disable-outside-pointer-events":n.disableOutsidePointerEvents,role:"dialog","aria-describedby":e(o).descriptionId,"aria-labelledby":e(o).titleId,"data-state":e(ce)(e(o).open.value)},n.$attrs,{onDismiss:d[0]||(d[0]=i=>e(o).onOpenChange(!1)),onEscapeKeyDown:d[1]||(d[1]=i=>l("escapeKeyDown",i)),onFocusOutside:d[2]||(d[2]=i=>l("focusOutside",i)),onInteractOutside:d[3]||(d[3]=i=>l("interactOutside",i)),onPointerDownOutside:d[4]||(d[4]=i=>l("pointerDownOutside",i))}),{default:u(()=>[f(n.$slots,"default")]),_:3},16,["id","as","as-child","present","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped","present"]))}}),W=qe,be=m({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,l=s,o=A(),r=x(l),{forwardRef:c,currentElement:n}=D(),d=E(()=>t.present?n.value:void 0);_e(d);const i=E(()=>{const{present:g,...v}=t;return v});return T(()=>t.present,(g,v)=>{!g&&v&&o.triggerElement.value?.focus()}),(g,v)=>(p(),_(W,y({...i.value,...e(r)},{ref:e(c),present:g.present,"trap-focus":e(o).open.value,"disable-outside-pointer-events":t.disableOutsidePointerEvents,onCloseAutoFocus:v[0]||(v[0]=O=>{O.defaultPrevented||(O.preventDefault(),e(o).triggerElement.value?.focus())}),onPointerDownOutside:v[1]||(v[1]=O=>{const B=O.detail.originalEvent,M=B.button===0&&B.ctrlKey===!0;(B.button===2||M)&&O.preventDefault()}),onFocusOutside:v[2]||(v[2]=O=>{O.preventDefault()})}),{default:u(()=>[f(g.$slots,"default")]),_:3},16,["present","trap-focus","disable-outside-pointer-events"]))}}),$e=be,we=m({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,o=x(s);D();const r=A(),c=q(!1),n=q(!1),d=E(()=>{const{present:i,...g}=t;return g});return T(()=>t.present,(i,g)=>{!i&&g&&(c.value||r.triggerElement.value?.focus(),c.value=!1,n.value=!1)}),(i,g)=>(p(),_(W,y({...d.value,...e(o)},{present:i.present,"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:g[0]||(g[0]=v=>{v.defaultPrevented||(c.value||e(r).triggerElement.value?.focus(),v.preventDefault()),c.value=!1,n.value=!1}),onInteractOutside:g[1]||(g[1]=v=>{v.defaultPrevented||(c.value=!0,v.detail.originalEvent.type==="pointerdown"&&(n.value=!0));const O=v.target;e(r).triggerElement.value?.contains(O)&&v.preventDefault(),v.detail.originalEvent.type==="focusin"&&n.value&&v.preventDefault()})}),{default:u(()=>[f(i.$slots,"default")]),_:3},16,["present"]))}}),he=we,Pe=m({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,l=s,o=A(),r=x(l),{forwardRef:c}=D();return(n,d)=>(p(),_(e(X),{present:n.forceMount||e(o).open.value,"force-mount":n.forceMount||!e(o).unmountOnHide.value},{default:u(({present:i})=>[e(o).modal.value?R((p(),_($e,y({key:0,ref:e(c),present:e(o).unmountOnHide.value||i},{...t,...e(r),...n.$attrs}),{default:u(()=>[f(n.$slots,"default")]),_:2},1040,["present"])),[[H,e(o).unmountOnHide.value||i]]):R((p(),_(he,y({key:1,ref:e(c),present:e(o).unmountOnHide.value||i},{...t,...e(r),...n.$attrs}),{default:u(()=>[f(n.$slots,"default")]),_:2},1040,["present"])),[[H,e(o).unmountOnHide.value||i]])]),_:3},8,["present","force-mount"]))}}),Ee=Pe,xe=m({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(a){const s=a;D();const t=A();return(l,o)=>(p(),_(e(F),y(s,{id:e(t).descriptionId}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["id"]))}}),Fe=xe,Ie=m({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1,default:!0}},setup(a){const s=a,t=A(),l=me(s.present);return T(()=>s.present,o=>l.value=o),D(),(o,r)=>(p(),_(e(F),{as:o.as,"as-child":o.asChild,"data-state":e(t).open.value?"open":"closed",style:{"pointer-events":"auto"},onPointerdown:r[0]||(r[0]=S(()=>{},["left","self","prevent"]))},{default:u(()=>[f(o.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),Te=Ie,Me=m({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(a){const s=A(),{forwardRef:t}=D();return(l,o)=>e(s)?.modal.value?(p(),_(e(X),{key:0,present:l.forceMount||e(s).open.value,"force-mount":l.forceMount||!e(s).unmountOnHide.value},{default:u(({present:r})=>[R(C(Te,y(l.$attrs,{ref:e(t),as:l.as,"as-child":l.asChild,present:e(s).unmountOnHide.value||r}),{default:u(()=>[f(l.$slots,"default")]),_:2},1040,["as","as-child","present"]),[[H,e(s).unmountOnHide.value||r]])]),_:3},8,["present","force-mount"])):U("v-if",!0)}}),ke=Me,Re=m({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(a){const s=a,t=A();return D(),(l,o)=>(p(),_(e(F),y(s,{id:e(t).titleId}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["id"]))}}),He=Re;const[Se,Ue]=Q("AlertDialogContent");var je=m({__name:"AlertDialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,o=x(s);D();const r=q();return Ue({onCancelElementChange:c=>{r.value=c}}),(c,n)=>(p(),_(e(Ee),y({...t,...e(o)},{role:"alertdialog",onPointerDownOutside:n[0]||(n[0]=S(()=>{},["prevent"])),onInteractOutside:n[1]||(n[1]=S(()=>{},["prevent"])),onOpenAutoFocus:n[2]||(n[2]=()=>{ue(()=>{r.value?.focus({preventScroll:!0})})})}),{default:u(()=>[f(c.$slots,"default")]),_:3},16))}}),Le=je,Ve=m({__name:"AlertDialogCancel",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(a){const s=a,t=Se(),{forwardRef:l,currentElement:o}=D();return G(()=>{t.onCancelElementChange(o.value)}),(r,c)=>(p(),_(e(Be),y(s,{ref:e(l)}),{default:u(()=>[f(r.$slots,"default")]),_:3},16))}}),Ke=Ve,ze=m({__name:"AlertDialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(a){const s=a;return D(),(t,l)=>(p(),_(e(Fe),$(w(s)),{default:u(()=>[f(t.$slots,"default")]),_:3},16))}}),Ne=ze,Qe=m({__name:"AlertDialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(a){const s=a;return D(),(t,l)=>(p(),_(e(ke),$(w(s)),{default:u(()=>[f(t.$slots,"default")]),_:3},16))}}),Xe=Qe,Ge=m({__name:"AlertDialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(a){const s=a;return(t,l)=>(p(),_(e(ae),$(w(s)),{default:u(()=>[f(t.$slots,"default")]),_:3},16))}}),Je=Ge,We=m({__name:"AlertDialogRoot",props:{open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1}},emits:["update:open"],setup(a,{emit:s}){const o=j(a,s);return D(),(r,c)=>(p(),_(e(Oe),y(e(o),{modal:!0}),{default:u(n=>[f(r.$slots,"default",$(w(n)))]),_:3},16))}}),Ye=We,Ze=m({__name:"AlertDialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(a){const s=a;return D(),(t,l)=>(p(),_(e(He),$(w(s)),{default:u(()=>[f(t.$slots,"default")]),_:3},16))}}),et=Ze;const tt=m({__name:"AlertDialog",props:{open:{type:Boolean},defaultOpen:{type:Boolean},unmountOnHide:{type:Boolean}},emits:["update:open"],setup(a,{emit:s}){const o=j(a,s);return(r,c)=>(p(),_(e(Ye),y({"data-slot":"alert-dialog"},e(o)),{default:u(n=>[f(r.$slots,"default",$(w(n)))]),_:3},16))}}),ot=m({__name:"AlertDialogCancel",props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(a){const s=a,t=I(s,"class");return(l,o)=>(p(),_(e(Ke),y(e(t),{class:e(b)(e(le)({variant:"outline"}),"mt-2 sm:mt-0",s.class)}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["class"]))}}),at=m({inheritAttrs:!1,__name:"AlertDialogContent",props:{forceMount:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(a,{emit:s}){const t=a,l=s,o=I(t,"class"),r=j(o,l);return(c,n)=>(p(),_(e(Je),null,{default:u(()=>[C(e(Xe),{"data-slot":"alert-dialog-overlay",class:"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80"}),C(e(Le),y({"data-slot":"alert-dialog-content"},{...c.$attrs,...e(r)},{class:e(b)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",t.class)}),{default:u(()=>[f(c.$slots,"default")]),_:3},16,["class"])]),_:3}))}}),st=m({__name:"AlertDialogDescription",props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(a){const s=a,t=I(s,"class");return(l,o)=>(p(),_(e(Ne),y({"data-slot":"alert-dialog-description"},e(t),{class:e(b)("text-muted-foreground text-sm",s.class)}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["class"]))}}),lt=m({__name:"AlertDialogFooter",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(a){const s=a;return(t,l)=>(p(),L("div",{"data-slot":"alert-dialog-footer",class:J(e(b)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",s.class))},[f(t.$slots,"default")],2))}}),nt=m({__name:"AlertDialogHeader",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(a){const s=a;return(t,l)=>(p(),L("div",{"data-slot":"alert-dialog-header",class:J(e(b)("flex flex-col gap-2 text-center sm:text-left",s.class))},[f(t.$slots,"default")],2))}}),rt=m({__name:"AlertDialogTitle",props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(a){const s=a,t=I(s,"class");return(l,o)=>(p(),_(e(et),y({"data-slot":"alert-dialog-title"},e(t),{class:e(b)("text-lg font-semibold",s.class)}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["class"]))}}),ut={class:"space-y-2 text-sm text-muted-foreground"},it={key:0,class:"space-y-2"},dt={class:"bg-muted text-foreground rounded px-1 py-0.5 font-mono"},vt=m({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},requireText:{},confirmLabel:{},loading:{type:Boolean}},emits:["update:open","confirm"],setup(a,{emit:s}){const t=a,{t:l}=ie(),o=s,r=q(""),c=E(()=>!t.requireText||r.value===t.requireText);return T(()=>t.open,n=>{n&&(r.value="")}),(n,d)=>{const i=rt,g=st,v=nt,O=pe("i18n-t"),B=ve,M=ge,V=ot,Y=ne,Z=lt,ee=at,te=tt;return p(),_(te,{open:a.open,"onUpdate:open":d[2]||(d[2]=h=>o("update:open",h))},{default:u(()=>[C(ee,null,{default:u(()=>[C(v,null,{default:u(()=>[C(i,null,{default:u(()=>[k(P(a.title),1)]),_:1}),C(g,{"as-child":""},{default:u(()=>[z("div",ut,[f(n.$slots,"default")])]),_:3})]),_:3}),a.requireText?(p(),L("div",it,[C(B,{for:"confirm-text",class:"text-xs font-normal text-muted-foreground"},{default:u(()=>[C(O,{keypath:"confirmDialog.typeToConfirm",scope:"global"},{text:u(()=>[z("code",dt,P(a.requireText),1)]),_:1})]),_:1}),C(M,{id:"confirm-text",modelValue:e(r),"onUpdate:modelValue":d[0]||(d[0]=h=>de(r)?r.value=h:null),autocomplete:"off",spellcheck:"false",placeholder:a.requireText},null,8,["modelValue","placeholder"])])):U("",!0),f(n.$slots,"options"),C(Z,null,{default:u(()=>[C(V,{disabled:a.loading},{default:u(()=>[k(P(e(l)("common.cancel")),1)]),_:1},8,["disabled"]),C(Y,{variant:"destructive",disabled:!e(c)||a.loading,title:e(c)?void 0:e(l)("confirmDialog.typeToEnable",{text:a.requireText}),onClick:d[1]||(d[1]=h=>o("confirm"))},{default:u(()=>[a.loading?(p(),_(e(ye),{key:0,class:"size-4 animate-spin"})):U("",!0),k(" "+P(a.confirmLabel??e(l)("common.confirm")),1)]),_:1},8,["disabled","title"])]),_:1})]),_:3})]),_:3},8,["open"])}}});export{Oe as D,vt as _,ke as a,Be as b,Ee as c,Fe as d,He as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as j,a8 as A,a9 as q,v as E,aa as U,ab as N,K as H,ac as I,a4 as P,r as _,ad as D,U as F,n as V,ae as O,af as z,i as f,p as M,q as x,ag as B,ah as W,ai as $,aj as G,ak as K,al as Q,am as J,M as X}from"./DIi866IK.js";const Y=(...t)=>t.find(r=>r!==void 0);function T(t){let r=t.replace(/[\u0000-\u001f\s]+/g,"");for(;r.toLowerCase().startsWith("view-source:");)r=r.slice(12);const c=r.indexOf(":");return c>0&&K(r.slice(0,c+1))?null:t}function Z(t){const r=t.componentName||"NuxtLink";function c(e){return typeof e=="string"&&e.startsWith("#")}function R(e,s,d){const a=d??t.trailingSlash;if(!e||a!=="append"&&a!=="remove")return e;if(typeof e=="string")return S(e,a);const i="path"in e&&e.path!==void 0?e.path:s(e).path;return{...e,name:void 0,path:S(i,a)}}function k(e){const s=A(),d=X(),a=x(()=>!!f(e.target)&&f(e.target)!=="_self"),i=x(()=>{const o=f(e.to)||f(e.href)||"";return typeof o=="string"&&B(o,{acceptRelative:!0})}),w=_("RouterLink"),y=w&&typeof w!="string"?w.useLink:void 0,v=x(()=>{if(f(e.external))return!0;const o=f(e.to)||f(e.href)||"";return typeof o=="object"?!1:o===""||i.value}),l=x(()=>{const o=f(e.to)||f(e.href)||"";return v.value?o:R(o,s.resolve,f(e.trailingSlash))}),b=v.value?void 0:y?.({...e,to:l,viewTransition:f(e.viewTransition)}),p=x(()=>{const o=f(e.trailingSlash)??t.trailingSlash;if(!l.value||i.value||c(l.value)){const h=l.value;return typeof h=="string"?T(h):h}if(v.value){const h=typeof l.value=="object"&&"path"in l.value?O(l.value):l.value,m=typeof h=="object"?s.resolve(h).href:h,u=typeof m=="string"?T(m):m;return u===null?null:S(u,o)}return typeof l.value=="object"?s.resolve(l.value)?.href??null:S(W(d.app.baseURL,l.value),o)});return{to:l,hasTarget:a,isAbsoluteUrl:i,isExternal:v,href:p,isActive:b?.isActive??x(()=>l.value===s.currentRoute.value.path),isExactActive:b?.isExactActive??x(()=>l.value===s.currentRoute.value.path),route:b?.route??x(()=>s.resolve(l.value)),async navigate(o){p.value!==null&&await M(p.value,{replace:f(e.replace),external:v.value||a.value})}}}return j({name:r,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},prefetchOn:{type:[String,Object],default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1},trailingSlash:{type:String,default:void 0,required:!1}},useLink:k,setup(e,{slots:s}){const d=A(),{to:a,href:i,navigate:w,isExternal:y,hasTarget:v,isAbsoluteUrl:l}=k(e),b=F(!1),p=V(null),o=u=>{p.value=e.custom?u?.$el?.nextElementSibling:u?.$el};function h(u){return!b.value&&(typeof e.prefetchOn=="string"?e.prefetchOn===u:e.prefetchOn?.[u]??t.prefetchOn?.[u])&&(e.prefetch??t.prefetch)!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!ae()}async function m(u=q()){if(b.value||i.value===null)return;b.value=!0;const g=typeof a.value=="string"?a.value:y.value?O(a.value):d.resolve(a.value).fullPath,n=y.value?new URL(g,window.location.href).href:g;await Promise.all([u.hooks.callHook("link:prefetch",n).catch(()=>{}),!y.value&&!v.value&&z(a.value,d).catch(()=>{})])}if(h("visibility")){const u=q();let g,n=null;E(()=>{const C=ee();U(()=>{g=N(()=>{p?.value?.tagName&&(n=C.observe(p.value,async()=>{n?.(),n=null,await m(u)}))})})}),H(()=>{g&&I(g),n?.(),n=null})}return()=>{if(!y.value&&!v.value&&!c(a.value)){const n={ref:o,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(h("interaction")&&(n.onPointerenter=m.bind(null,void 0),n.onFocus=m.bind(null,void 0)),b.value&&(n.class=e.prefetchedClass||t.prefetchedClass),n.rel=e.rel||void 0),P(_("RouterLink"),n,s.default)}const u=e.target||null,g=Y(e.noRel?"":e.rel,t.externalRelAttribute,l.value||v.value?"noopener noreferrer":"")||null;return e.custom?s.default?s.default({href:i.value,navigate:w,prefetch:m,get route(){if(!i.value)return;const n=new URL(i.value,window.location.href);return{path:n.pathname,fullPath:n.pathname,get query(){return D(n.search)},hash:n.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:i.value}},rel:g,target:u,isExternal:y.value||v.value,isActive:!1,isExactActive:!1}):null:P("a",{ref:p,href:i.value||null,rel:g,target:u,onClick:async n=>{if(!(y.value||v.value)){n.preventDefault();try{const C=$(i.value??"");return await(e.replace?d.replace(C):d.push(C))}finally{if(c(a.value)){const C=a.value.slice(1);let L=C;try{L=decodeURIComponent(C)}catch{}document.getElementById(L)?.focus()}}}}},s.default?.())}}})}const le=Z(G);function S(t,r){if(r!=="append"&&r!=="remove")return t;const c=r==="append"?Q:J;return B(t)&&!t.startsWith("http")?t:c(t,!0)}function ee(){const t=q();if(t._observer)return t._observer;let r=null;const c=new Map,R=(e,s)=>(r||=new IntersectionObserver(d=>{for(const a of d){const i=c.get(a.target);(a.isIntersecting||a.intersectionRatio>0)&&i&&i()}}),c.set(e,s),r.observe(e),()=>{c.delete(e),r?.unobserve(e),c.size===0&&(r?.disconnect(),r=null)});return t._observer={observe:R}}const te=/2g/;function ae(){const t=navigator.connection;return!!(t&&(t.saveData||te.test(t.effectiveType)))}export{le as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as e}from"./
|
|
1
|
+
import{c as e}from"./BV_QiRi8.js";const t=e("TriangleAlertIcon",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);export{t as T};
|