@astralyn/sash 0.1.0 → 0.1.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +22 -7
  3. package/THIRD_PARTY_NOTICES.md +9 -0
  4. package/dist/api.js +14 -45
  5. package/dist/app-state.js +99 -0
  6. package/dist/autostart/command.js +24 -0
  7. package/dist/autostart/context.js +43 -0
  8. package/dist/autostart/files.js +60 -0
  9. package/dist/autostart/installation.js +48 -0
  10. package/dist/autostart/start.js +47 -0
  11. package/dist/autostart/windows-registry.js +88 -0
  12. package/dist/autostart/windows.js +59 -0
  13. package/dist/autostart-contract.js +31 -0
  14. package/dist/autostart-entry.js +10 -0
  15. package/dist/autostart.js +69 -0
  16. package/dist/cli.js +11 -11
  17. package/dist/commands/auto.js +15 -0
  18. package/dist/commands/lifecycle.js +5 -31
  19. package/dist/commands/logs.js +11 -4
  20. package/dist/commands/shared.js +2 -4
  21. package/dist/commands/status.js +6 -7
  22. package/dist/commands/update.js +7 -3
  23. package/dist/commands/web.js +19 -27
  24. package/dist/contracts.js +171 -335
  25. package/dist/core-config-validation.js +22 -38
  26. package/dist/core-update.js +126 -762
  27. package/dist/core.js +20 -46
  28. package/dist/daemon/app.js +132 -113
  29. package/dist/daemon/context.js +13 -7
  30. package/dist/daemon/entry.js +21 -38
  31. package/dist/daemon/errors.js +6 -1
  32. package/dist/daemon/handlers/autostart.js +18 -0
  33. package/dist/daemon/handlers/core.js +32 -9
  34. package/dist/daemon/handlers/daemon.js +32 -6
  35. package/dist/daemon/handlers/profiles.js +12 -2
  36. package/dist/daemon/handlers/settings.js +9 -36
  37. package/dist/daemon/router.js +40 -27
  38. package/dist/daemon/scheduler.js +3 -1
  39. package/dist/daemon/server.js +6 -3
  40. package/dist/daemon/web-auth.js +52 -0
  41. package/dist/daemon-auth.js +2 -2
  42. package/dist/daemon-client.js +18 -2
  43. package/dist/daemon-http.js +7 -0
  44. package/dist/daemon-lifecycle.js +19 -196
  45. package/dist/github.js +7 -2
  46. package/dist/http.js +7 -5
  47. package/dist/log-follow.js +2 -1
  48. package/dist/mihomo-config.js +7 -9
  49. package/dist/paths.js +5 -7
  50. package/dist/profile-model.js +87 -0
  51. package/dist/profile-service.js +250 -587
  52. package/dist/profiles.js +43 -171
  53. package/dist/runtime-lifecycle.js +112 -194
  54. package/dist/runtime-owner.js +37 -76
  55. package/dist/sash-client.js +63 -21
  56. package/dist/settings-service.js +29 -228
  57. package/dist/settings.js +61 -285
  58. package/dist/status.js +24 -40
  59. package/dist/supervisor.js +1 -14
  60. package/dist/sysproxy/common.js +5 -45
  61. package/dist/sysproxy/factory.js +24 -65
  62. package/dist/sysproxy/snapshot.js +24 -257
  63. package/dist/sysproxy.js +1 -4
  64. package/dist/system-proxy-manager.js +37 -35
  65. package/dist/ui/assets/{ConnectionsView-DNGmZBSU.js → ConnectionsView-BgXQM6Z4.js} +1 -1
  66. package/dist/ui/assets/{LogsView-fSiaxQ13.js → LogsView-2f542P8z.js} +1 -1
  67. package/dist/ui/assets/{PaginationFooter-B3kHzRfB.js → PaginationFooter-cj1tcZej.js} +1 -1
  68. package/dist/ui/assets/ProfileEditorDialog-C9M8uKZC.css +1 -0
  69. package/dist/ui/assets/ProfileEditorDialog-DD4y4GBC.js +14 -0
  70. package/dist/ui/assets/ProfilesView-BXU2DOA7.css +1 -0
  71. package/dist/ui/assets/ProfilesView-DNnzYIEY.js +7 -0
  72. package/dist/ui/assets/{RulesView-D9vZBiJ1.js → RulesView-CtKvlckZ.js} +1 -1
  73. package/dist/ui/assets/SettingsView-BaeKFF_N.js +1 -0
  74. package/dist/ui/assets/SettingsView-CWjIe05v.css +1 -0
  75. package/dist/ui/assets/{0be242294f7d791af850c6df38ac78a0-2cL6Ntwf.woff2 → e2a57555d97d0b02b45d9418eb6ee295-D9nhF3rM.woff2} +0 -0
  76. package/dist/ui/assets/index-CBInDvdJ.js +19 -0
  77. package/dist/ui/assets/index-mOLy7fkB.css +1 -0
  78. package/dist/ui/assets/{theme-BNq4FkXS.js → theme-D40MF8cQ.js} +1 -1
  79. package/dist/ui/index.html +2 -2
  80. package/dist/web-bootstrap.js +113 -0
  81. package/docs/architecture-proposal.md +109 -0
  82. package/docs/autostart.md +101 -0
  83. package/docs/backend.md +92 -216
  84. package/docs/frontend.md +61 -97
  85. package/docs/usage.md +88 -186
  86. package/package.json +10 -6
  87. package/dist/commands/upgrade.js +0 -43
  88. package/dist/core-install-transaction.js +0 -114
  89. package/dist/core-update-coordination.js +0 -105
  90. package/dist/core-update-service.js +0 -245
  91. package/dist/managed-state-transaction.js +0 -377
  92. package/dist/offline-mutation.js +0 -58
  93. package/dist/profile-migration.js +0 -101
  94. package/dist/runtime-recovery.js +0 -31
  95. package/dist/sysproxy/darwin.js +0 -287
  96. package/dist/sysproxy/gnome.js +0 -181
  97. package/dist/sysproxy/legacy.js +0 -58
  98. package/dist/tun-guidance.js +0 -11
  99. package/dist/ui/assets/CodeEditorModal-6m0TJWyF.css +0 -1
  100. package/dist/ui/assets/CodeEditorModal-CFEnWsyh.js +0 -14
  101. package/dist/ui/assets/ProfileEditorDialog-BydoZthX.js +0 -1
  102. package/dist/ui/assets/ProfilesView-Btc1DOxE.js +0 -2
  103. package/dist/ui/assets/ProfilesView-ByqdFNHN.css +0 -1
  104. package/dist/ui/assets/SettingsFileDialog-CNFEAVs4.js +0 -1
  105. package/dist/ui/assets/SettingsView-BlDhZkXQ.js +0 -2
  106. package/dist/ui/assets/SettingsView-CngS3vBM.css +0 -1
  107. package/dist/ui/assets/index-B61V60w_.js +0 -19
  108. package/dist/ui/assets/index-bkyxJG8J.css +0 -1
@@ -1 +0,0 @@
1
- import{d as g,C as y,af as C,z as u,o as h,m as w,u as d,t,p as r,ai as x,y as m}from"./index-B61V60w_.js";import{C as B}from"./CodeEditorModal-CFEnWsyh.js";import"./theme-BNq4FkXS.js";const b=g({__name:"ProfileEditorDialog",props:{profileId:{},profileName:{},isRemote:{type:Boolean}},emits:["close"],setup(l,{emit:v}){const n=l,i=v,s=r(""),c=r(!0),a=r(!1),f=r(null);y(async()=>{try{const e=await C.getProfileContent(n.profileId);s.value=e.content}catch(e){f.value=u(e)}finally{c.value=!1}});async function p(e){if(!a.value){a.value=!0;try{await x(n.profileId,e),m.success(t("toast.profileSaved",{name:n.profileName})),i("close")}catch(o){m.error(t("toast.failed",{msg:u(o)}))}finally{a.value=!1}}}return(e,o)=>(h(),w(B,{title:l.profileName,"aria-label":d(t)("editor.title"),hint:l.isRemote?d(t)("editor.remoteWarning"):void 0,content:s.value,language:"yaml",loading:c.value,"load-error":f.value,saving:a.value,onSave:p,onClose:o[0]||(o[0]=E=>i("close"))},null,8,["title","aria-label","hint","content","loading","load-error","saving"]))}});export{b as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ProfileEditorDialog-BydoZthX.js","./index-B61V60w_.js","./index-bkyxJG8J.css","./CodeEditorModal-CFEnWsyh.js","./theme-BNq4FkXS.js","./CodeEditorModal-6m0TJWyF.css"])))=>i.map(i=>d[i]);
2
- import{d as R,K as ae,L as te,C as O,M as le,N as se,O as oe,o as u,m as K,T as ie,a as m,b as ne,e as s,Q as P,g as r,u as l,t as e,f as q,R as F,v as H,S as re,p as f,U as de,y as n,z as A,_ as Q,V as ce,c as _,I as h,n as L,E as ue,F as fe,r as me,s as C,h as N,W as pe,i as T,X as ve,Y as be,Z as ye,q as B,k as _e,l as he,$ as ge,a0 as ke,a1 as we,a2 as $e,A as Ce,a3 as Pe,a4 as Ie}from"./index-B61V60w_.js";const xe=["disabled","onKeydown"],Ae={class:"rename-actions"},Ee=["disabled"],Te=["disabled"],ze=R({__name:"ProfileRenameDialog",props:{profile:{}},emits:["close"],setup(S,{emit:V}){const b=S,d=V,y=ae(),g=`${y}-title`,I=`${y}-input`,z=f(null),p=f(null),k=b.profile.name,w=f(k),$=f(!1),{open:i,close:U}=te({container:z,initialFocus:()=>(p.value?.select(),p.value),onEscape:()=>d("close")});O(()=>{le(),i()}),se(()=>{U(),oe()});async function D(){const x=w.value.trim();if(!(!x||x===k||$.value)){$.value=!0;try{await de(b.profile.id,x),n.success(e("toast.settingSaved")),d("close")}catch(c){n.error(e("toast.failed",{msg:A(c)}))}finally{$.value=!1}}}return(x,c)=>(u(),K(ie,{to:"body"},[m(re,{name:"fade",appear:""},{default:ne(()=>[s("div",{class:"rename-overlay",onClick:c[2]||(c[2]=P(E=>d("close"),["self"]))},[s("div",{ref_key:"dialogElement",ref:z,class:"rename-dialog card",role:"dialog","aria-modal":"true","aria-labelledby":g},[s("h3",{id:g,class:"rename-title"},r(l(e)("profiles.renameTitle")),1),s("label",{class:"rename-label",for:I},r(l(e)("profiles.nameLabel")),1),q(s("input",{id:I,ref_key:"inputElement",ref:p,"onUpdate:modelValue":c[0]||(c[0]=E=>w.value=E),class:"input rename-input",type:"text",maxlength:"120",disabled:$.value,onKeydown:F(P(D,["prevent"]),["enter"])},null,40,xe),[[H,w.value]]),s("div",Ae,[s("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:$.value,onClick:c[1]||(c[1]=E=>d("close"))},r(l(e)("common.cancel")),9,Ee),s("button",{type:"button",class:"btn btn-primary btn-sm",disabled:$.value||!w.value.trim()||w.value.trim()===l(k),onClick:D},r(l(e)("common.save")),9,Te)])],512)])]),_:1})]))}}),De=Q(ze,[["__scopeId","data-v-67fe66f9"]]),Ue={class:"profiles-view"},Le=["aria-busy"],Fe={class:"dl-input-wrap"},Ve=["placeholder","aria-label","disabled"],Me=["title","aria-label","disabled"],Be={class:"dl-actions"},Ke=["disabled"],Se=["disabled"],Ne=["disabled"],Re=["aria-label"],Oe={key:0,class:"empty-panel"},qe=["aria-busy"],He=["aria-current","aria-disabled","title","onClick","onKeydown"],Qe={class:"profile-name-row"},We=["title"],Xe=["title"],Ye={key:0,class:"profile-usage"},Ze={class:"usage-nums"},je={class:"mono"},Ge={key:0,class:"mono usage-expire"},Je=["aria-label","aria-valuenow"],ea=["title"],aa={class:"profile-error-text"},ta={class:"profile-actions"},la=["title","aria-label","disabled","onClick"],sa=["title","aria-label","disabled","onClick"],oa=["title","aria-label","disabled","onClick"],ia=["title","aria-label","disabled","onClick"],na=R({__name:"ProfilesView",setup(S){const V=be(()=>ye(()=>import("./ProfileEditorDialog-BydoZthX.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),b=f(""),d=f(!1),y=f(!1),g=f(!1),I=f(""),z=f(null),p=f(null),k=f(null),w=B(()=>C.profiles),$=B(()=>C.profiles.some(t=>t.url!=="")),i=B(()=>C.operations.profileMutation);function U(t){if(!t.url)return e("profiles.localFile");try{return new URL(t.url).hostname||t.url}catch{return t.url}}function D(t){const o=new Date(t.updatedAt).getTime();return!Number.isFinite(o)||o<=0?e("profiles.neverUpdated"):_e(t.updatedAt,he.value)}function x(t){return(t.subInfo?.upload??0)+(t.subInfo?.download??0)}function c(t){const o=t.subInfo?.total??0;return o<=0?0:Math.min(100,Math.round(x(t)/o*100))}O(()=>{ce().catch(()=>{})});async function E(){const t=b.value.trim();if(!(!t||d.value)){d.value=!0;try{const o=await ge(t);b.value="",o.activated?n.success(e("toast.profileActivated",{name:o.profile.name,n:o.proxyCount??0})):n.success(e("toast.profileAdded",{name:o.profile.name}))}catch(o){n.error(e("toast.failed",{msg:A(o)}))}finally{d.value=!1}}}async function W(t){if(!I.value){I.value=t.id;try{await ke(t.id),n.success(e("toast.profileUpdated",{name:t.name}))}catch(o){n.error(e("toast.failed",{msg:A(o)}))}finally{I.value=""}}}async function X(){if(!y.value){y.value=!0;try{const t=await we();t.failed.length===0?n.success(e("toast.profilesUpdateAllOk",{n:t.updated})):n.error(e("toast.profilesUpdateAllPartial",{n:t.updated,f:t.failed.length}))}catch(t){n.error(e("toast.failed",{msg:A(t)}))}finally{y.value=!1}}}async function M(t){if(!(i.value||t.id===C.activeProfileId))try{const o=await $e(t.id);n.success(e("toast.profileActivated",{name:t.name,n:o.proxyCount}))}catch(o){n.error(e("toast.failed",{msg:A(o)}))}}function Y(t){i.value||(p.value=t)}async function Z(t){if(!(i.value||!await Ce({title:e("profiles.deleteConfirmTitle"),message:e("profiles.deleteConfirmMsg",{name:t.name}),confirmText:e("common.confirm"),cancelText:e("common.cancel"),danger:!0})))try{await Pe(t.id),n.success(e("toast.profileDeleted",{name:t.name}))}catch(a){n.error(e("toast.failed",{msg:A(a)}))}}function j(t){const o=t.target,a=o.files?.[0];o.value="",!(!a||g.value)&&(g.value=!0,(async()=>{try{const v=await a.text(),J=a.name.replace(/\.(ya?ml)$/i,"")||"imported",ee=await Ie(J,v);n.success(e("toast.profileImported",{name:ee.profile.name}))}catch(v){n.error(e("toast.failed",{msg:A(v)}))}finally{g.value=!1}})())}async function G(){try{const t=await navigator.clipboard.readText();t.trim()&&(b.value=t.trim())}catch{n.error(e("toast.pasteFailed"))}}return(t,o)=>(u(),_("div",Ue,[s("div",{class:"dl-panel","aria-busy":d.value||y.value||g.value||i.value},[s("div",Fe,[q(s("input",{"onUpdate:modelValue":o[0]||(o[0]=a=>b.value=a),type:"url",class:"input dl-input",placeholder:l(e)("profiles.downloadPlaceholder"),"aria-label":l(e)("profiles.downloadPlaceholder"),disabled:d.value||i.value,spellcheck:"false",onKeyup:F(E,["enter"])},null,40,Ve),[[H,b.value]]),s("button",{type:"button",class:"icon-btn dl-paste",title:l(e)("profiles.paste"),"aria-label":l(e)("profiles.paste"),disabled:d.value||i.value,onClick:G},[m(h,{name:"clipboard",size:15})],8,Me)]),s("div",Be,[s("button",{type:"button",class:"btn btn-secondary dl-action-primary",disabled:d.value||i.value||!b.value.trim(),onClick:E},[m(h,{name:"download",size:14}),s("span",null,r(d.value?l(e)("profiles.downloading"):l(e)("profiles.download")),1)],8,Ke),s("button",{type:"button",class:"btn btn-secondary",disabled:y.value||i.value||!$.value,onClick:X},[m(h,{name:"refresh",size:14,class:L({spin:y.value})},null,8,["class"]),s("span",null,r(l(e)("profiles.updateAll")),1)],8,Se),s("button",{type:"button",class:"btn btn-secondary",disabled:g.value||i.value,onClick:o[1]||(o[1]=a=>z.value?.click())},[m(h,{name:"upload",size:14}),s("span",null,r(l(e)("profiles.import")),1)],8,Ne)]),s("input",{ref_key:"fileInput",ref:z,type:"file",accept:".yaml,.yml",class:"hidden-file","aria-label":l(e)("profiles.import"),onChange:j},null,40,Re)],8,Le),w.value.length===0?(u(),_("div",Oe,[m(ue,{icon:"layers",title:l(e)("profiles.emptyTitle"),hint:l(e)("profiles.emptyHint")},null,8,["title","hint"])])):(u(),_("div",{key:1,class:"profiles-grid","aria-busy":i.value},[(u(!0),_(fe,null,me(w.value,a=>(u(),_("article",{key:a.id,class:L(["profile-card",{active:a.id===l(C).activeProfileId,busy:i.value}])},[s("div",{class:"profile-card-main",role:"button",tabindex:"0","aria-current":a.id===l(C).activeProfileId?"true":void 0,"aria-disabled":i.value||a.id===l(C).activeProfileId,title:a.id===l(C).activeProfileId?void 0:l(e)("profiles.clickToUse"),onClick:v=>M(a),onKeydown:[F(P(v=>M(a),["prevent"]),["enter"]),F(P(v=>M(a),["prevent"]),["space"])]},[s("div",Qe,[s("span",{class:"profile-name",title:a.name},r(a.name),9,We)]),s("div",{class:"profile-source",title:`${U(a)} · ${D(a)}`},r(U(a))+" · "+r(D(a)),9,Xe),a.subInfo?(u(),_("div",Ye,[s("div",Ze,[s("span",je,r(l(N)(x(a)))+" / "+r(l(N)(a.subInfo.total)),1),a.subInfo.expire?(u(),_("span",Ge,r(l(pe)(a.subInfo.expire)),1)):T("",!0)]),s("div",{class:"usage-bar",role:"progressbar","aria-label":l(e)("profiles.usageLabel"),"aria-valuemin":"0","aria-valuemax":"100","aria-valuenow":c(a)},[s("div",{class:L(["usage-fill",{"usage-fill-hot":c(a)>=90}]),style:ve({width:`${c(a)}%`})},null,6)],8,Je)])):T("",!0),a.lastError?(u(),_("div",{key:1,class:"profile-error",title:a.lastError,role:"status"},[m(h,{name:"alert",size:13}),s("span",aa,r(a.lastError),1)],8,ea)):T("",!0)],40,He),s("div",ta,[s("button",{type:"button",class:"icon-btn",title:l(e)("profiles.rename"),"aria-label":`${l(e)("profiles.rename")}: ${a.name}`,disabled:i.value,onClick:P(v=>k.value=a,["stop"])},[m(h,{name:"pencil",size:14})],8,la),s("button",{type:"button",class:"icon-btn",title:l(e)("profiles.edit"),"aria-label":`${l(e)("profiles.edit")}: ${a.name}`,disabled:i.value,onClick:P(v=>Y(a),["stop"])},[m(h,{name:"code",size:14})],8,sa),a.url?(u(),_("button",{key:0,type:"button",class:"icon-btn",title:l(e)("profiles.update"),"aria-label":`${l(e)("profiles.update")}: ${a.name}`,disabled:i.value,onClick:P(v=>W(a),["stop"])},[m(h,{name:"refresh",size:14,class:L({spin:I.value===a.id})},null,8,["class"])],8,oa)):T("",!0),s("button",{type:"button",class:"icon-btn danger-hover",title:l(e)("profiles.delete"),"aria-label":`${l(e)("profiles.delete")}: ${a.name}`,disabled:i.value,onClick:P(v=>Z(a),["stop"])},[m(h,{name:"trash",size:14})],8,ia)])],2))),128))],8,qe)),k.value?(u(),K(De,{key:2,profile:k.value,onClose:o[2]||(o[2]=a=>k.value=null)},null,8,["profile"])):T("",!0),p.value?(u(),K(l(V),{key:3,"profile-id":p.value.id,"profile-name":p.value.name,"is-remote":p.value.url!=="",onClose:o[3]||(o[3]=a=>p.value=null)},null,8,["profile-id","profile-name","is-remote"])):T("",!0)]))}}),da=Q(na,[["__scopeId","data-v-77f96f8d"]]);export{da as default};
@@ -1 +0,0 @@
1
- .rename-overlay[data-v-67fe66f9]{position:fixed;z-index:var(--z-rename);display:flex;align-items:center;justify-content:center;background:var(--bg-scrim);inset:0}.rename-dialog[data-v-67fe66f9]{width:min(360px,calc(100vw - 32px));padding:18px}.rename-title[data-v-67fe66f9]{margin:0 0 12px;font-size:16px}.rename-label[data-v-67fe66f9]{display:block;margin-bottom:6px;color:var(--text-secondary);font-size:14px}.rename-input[data-v-67fe66f9]{width:100%;margin-bottom:14px}.rename-actions[data-v-67fe66f9]{display:flex;gap:10px;justify-content:flex-end}.profiles-view[data-v-77f96f8d]{min-height:100%}.dl-panel[data-v-77f96f8d]{display:grid;min-height:80px;grid-template-columns:minmax(260px,1fr) auto;align-items:center;gap:8px;margin-bottom:15px;padding:12px 34px;background:var(--bg-app);border-bottom:1px solid var(--border)}.dl-input-wrap[data-v-77f96f8d]{position:relative;min-width:0}.dl-input[data-v-77f96f8d]{width:100%;min-height:46px;padding-right:42px;font-family:var(--font-mono);font-size:16px}.dl-paste[data-v-77f96f8d]{position:absolute;top:50%;right:4px;width:31px;height:30px;transform:translateY(-50%)}.dl-actions[data-v-77f96f8d]{display:flex;align-items:center;gap:7px}.dl-actions .btn[data-v-77f96f8d]{min-height:46px;padding-inline:12px}.hidden-file[data-v-77f96f8d]{display:none}.empty-panel[data-v-77f96f8d]{margin:0 34px;overflow:hidden;border:1px solid var(--border);border-radius:var(--radius-md)}.profiles-grid[data-v-77f96f8d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px 12px;padding:0 34px 44px}.profile-card[data-v-77f96f8d]{position:relative;display:block;min-width:0;min-height:72px;padding:10px 8px 10px 15px;overflow:hidden;cursor:pointer;background:var(--bg-panel);border:1px solid transparent;border-radius:var(--radius-sm);transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard)}.profile-card[data-v-77f96f8d]:before{position:absolute;inset:2px auto 2px 0;width:4px;border-radius:0 var(--radius-full) var(--radius-full) 0;content:"";background:var(--border-strong)}.profile-card[data-v-77f96f8d]:hover{background:var(--bg-hover);border-color:var(--border)}.profile-card.active[data-v-77f96f8d]{cursor:default;background:var(--bg-panel);border-color:transparent}.profile-card.active[data-v-77f96f8d]:before{background:var(--selection)}.profile-card.busy[data-v-77f96f8d]{cursor:wait}.profile-card-main[data-v-77f96f8d]{min-width:0;border-radius:var(--radius-sm);outline:none}.profile-card-main[data-v-77f96f8d]:focus-visible{box-shadow:0 0 0 3px var(--accent-ring)}.profile-name-row[data-v-77f96f8d]{display:flex;align-items:center;gap:8px;min-width:0;margin-right:140px}.profile-name[data-v-77f96f8d]{overflow:hidden;color:var(--text-primary);font-size:16px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.profile-source[data-v-77f96f8d]{margin-top:4px;overflow:hidden;color:var(--text-muted);font-size:14px;text-overflow:ellipsis;white-space:nowrap}.profile-usage[data-v-77f96f8d]{margin-top:7px}.usage-nums[data-v-77f96f8d]{display:flex;justify-content:space-between;gap:10px;color:var(--text-secondary);font-size:14px}.usage-expire[data-v-77f96f8d]{color:var(--text-muted)}.usage-bar[data-v-77f96f8d]{height:4px;margin-top:6px;overflow:hidden;background:var(--border);border-radius:var(--radius-full)}.usage-fill[data-v-77f96f8d]{height:100%;background:var(--selection);border-radius:var(--radius-full);transition:width var(--motion-normal) var(--ease-standard)}.usage-fill-hot[data-v-77f96f8d]{background:var(--danger)}.profile-error[data-v-77f96f8d]{display:flex;align-items:center;gap:6px;min-width:0;margin-top:10px;color:var(--danger);font-size:14px}.profile-error-text[data-v-77f96f8d]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-actions[data-v-77f96f8d]{position:absolute;top:8px;right:8px;display:flex;flex-shrink:0;gap:3px}.profile-actions .icon-btn[data-v-77f96f8d]{width:31px;height:31px}.danger-hover[data-v-77f96f8d]:hover:not(:disabled){color:var(--danger);background:var(--danger-soft)}.spin[data-v-77f96f8d]{animation:rotate .9s linear infinite}@media(max-width:820px){.dl-panel[data-v-77f96f8d]{grid-template-columns:1fr;padding-right:16px;padding-left:16px}.profiles-grid[data-v-77f96f8d]{padding-right:16px;padding-left:16px}.empty-panel[data-v-77f96f8d]{margin-right:16px;margin-left:16px}.dl-actions[data-v-77f96f8d]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.dl-actions .btn[data-v-77f96f8d]{min-width:0}}@media(max-width:760px){.profiles-grid[data-v-77f96f8d]{grid-template-columns:1fr}.profile-name-row[data-v-77f96f8d]{margin-right:172px}.profile-actions .icon-btn[data-v-77f96f8d]{width:40px;height:40px}}@media(max-width:480px){.dl-panel[data-v-77f96f8d]{gap:8px;padding:10px}.dl-actions[data-v-77f96f8d]{grid-template-columns:repeat(2,minmax(0,1fr))}.dl-action-primary[data-v-77f96f8d]{grid-column:1 / -1}.dl-actions .btn[data-v-77f96f8d],.dl-input[data-v-77f96f8d]{min-height:44px}.dl-paste[data-v-77f96f8d]{width:38px;height:38px}.profile-card[data-v-77f96f8d]{padding:14px 8px 14px 15px}.profile-name-row[data-v-77f96f8d]{margin-right:164px}.usage-nums[data-v-77f96f8d]{flex-direction:column;gap:2px}.profile-actions .icon-btn[data-v-77f96f8d]{width:38px;height:38px}}
@@ -1 +0,0 @@
1
- import{d as m,C as p,af as c,z as f,o as y,m as S,u as v,t as a,p as n,aj as _,y as o}from"./index-B61V60w_.js";import{C}from"./CodeEditorModal-CFEnWsyh.js";import"./theme-BNq4FkXS.js";const k=m({__name:"SettingsFileDialog",emits:["close"],setup(h,{emit:d}){const r=d,l=n(""),i=n(!0),s=n(!1),u=n(null);p(async()=>{try{const e=await c.getSettingsFile();l.value=e.content}catch(e){u.value=f(e)}finally{i.value=!1}});async function g(e){if(!s.value){s.value=!0;try{const t=await c.saveSettingsFile(e);await _(),t.restartRequired?o.success(a("toast.settingsSavedRestart")):o.success(a("toast.settingSaved")),r("close")}catch(t){o.error(a("toast.failed",{msg:f(t)}))}finally{s.value=!1}}}return(e,t)=>(y(),S(C,{title:v(a)("settings.fileTitle"),hint:v(a)("settings.fileHint"),content:l.value,language:"json",layout:"constrained",loading:i.value,"load-error":u.value,saving:s.value,onSave:g,onClose:t[0]||(t[0]=w=>r("close"))},null,8,["title","hint","content","loading","load-error","saving"]))}});export{k as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./SettingsFileDialog-CNFEAVs4.js","./index-B61V60w_.js","./index-bkyxJG8J.css","./CodeEditorModal-CFEnWsyh.js","./theme-BNq4FkXS.js","./CodeEditorModal-6m0TJWyF.css"])))=>i.map(i=>d[i]);
2
- import{d as B,o as u,c as m,e as s,g as a,i as f,a7 as M,_ as U,n as _,u as t,t as e,p as k,s as o,w as J,a8 as K,a as r,b as C,I as x,j as Q,P as W,m as X,l as T,f as tt,v as st,a9 as $,aa as et,Y as at,Z as nt,ab as it,q as P,ac as ot,ad as lt,ae as dt,y as h,af as A,ag as F,z as S,ah as ct}from"./index-B61V60w_.js";import{t as b,s as rt}from"./theme-BNq4FkXS.js";const ut={class:"ui-card"},gt={key:0,class:"ui-card-head"},_t={class:"ui-card-heading"},mt={key:0,class:"ui-card-title"},vt={key:1,class:"ui-card-desc"},pt={key:0,class:"ui-card-actions"},ht={class:"ui-card-body"},bt=B({__name:"UiCard",props:{title:{},desc:{}},setup(l){return(v,g)=>(u(),m("section",ut,[l.title||l.desc||v.$slots.actions?(u(),m("header",gt,[s("div",_t,[l.title?(u(),m("h2",mt,a(l.title),1)):f("",!0),l.desc?(u(),m("p",vt,a(l.desc),1)):f("",!0)]),v.$slots.actions?(u(),m("div",pt,[M(v.$slots,"actions",{},void 0)])):f("",!0)])):f("",!0),s("div",ht,[M(v.$slots,"default",{},void 0)])]))}}),D=U(bt,[["__scopeId","data-v-042826e5"]]),ft=["aria-checked","aria-label","disabled"],yt=B({__name:"UiSwitch",props:{modelValue:{type:Boolean},disabled:{type:Boolean},label:{}},emits:["update:modelValue"],setup(l){return(v,g)=>(u(),m("button",{type:"button",role:"switch","aria-checked":l.modelValue,"aria-label":l.label??t(e)("common.toggle"),class:_(["switch",{on:l.modelValue}]),disabled:l.disabled,onClick:g[0]||(g[0]=y=>v.$emit("update:modelValue",!l.modelValue))},[...g[1]||(g[1]=[s("span",{class:"knob","aria-hidden":"true"},null,-1)])],10,ft))}}),O=U(yt,[["__scopeId","data-v-306af9c5"]]),wt={class:"settings-grid"},kt={class:"setting-row"},Ct={class:"setting-info"},Tt={class:"setting-name"},$t={class:"setting-desc"},Dt=["aria-label"],Vt=["aria-pressed"],xt=["aria-pressed"],Pt=["aria-pressed"],St={class:"setting-row"},Bt={class:"setting-info"},Ut={class:"setting-name"},zt={class:"setting-desc"},It=["aria-label"],Lt=["aria-pressed"],Nt=["aria-pressed"],Et={class:"setting-row interrupt-row"},Rt={class:"setting-info"},Mt={class:"setting-name",for:"mixed-port"},At={class:"setting-desc"},Ft={class:"setting-action port-action"},Ot=["aria-label","disabled"],jt=["disabled"],qt=["disabled"],Ht={class:"setting-row"},Yt={class:"setting-info"},Zt={class:"setting-name"},Gt={class:"setting-desc"},Jt={class:"setting-action"},Kt={class:"setting-row caution-row"},Qt={class:"setting-info"},Wt={class:"setting-name"},Xt={class:"setting-desc"},ts={class:"setting-action"},ss=["title"],es={class:"setting-row danger-row"},as={class:"setting-info"},ns={class:"setting-name"},is={class:"setting-desc"},os={class:"setting-action"},ls=["disabled"],ds={class:"setting-row"},cs={class:"setting-info"},rs={class:"setting-name"},us={class:"setting-desc"},gs={class:"setting-action"},_s=["disabled"],ms={class:"info-grid"},vs={class:"info-item"},ps={class:"mono"},hs={class:"info-item"},bs={class:"mono"},fs={class:"info-item"},ys={class:"mono"},ws=B({__name:"SettingsView",setup(l){const v=at(()=>nt(()=>import("./SettingsFileDialog-CNFEAVs4.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),g=k(!1),y=k(o.status?.settings.mixedPort??7890),c=k(y.value),p=k(!1),{restarting:z,restartCore:I}=it(),w=k(!1);J(()=>o.status?.settings.mixedPort,n=>{if(n===void 0)return;const i=y.value;y.value=n,c.value=K(c.value,i,n,p.value)});const L=P(()=>ot(c.value,y.value)),N=P(()=>Number.isInteger(c.value)&&c.value>=1&&c.value<=65535&&L.value),j=P(()=>{switch(lt.value){case"inactive":return e("settings.tunInactiveDesc");case"unverified":return e("settings.tunUnverifiedDesc");case"unexpected-active":return e("settings.tunUnexpectedDesc");default:return e("settings.tunDesc")}});function V(n){n!==b.value&&rt(n)}function E(n){n!==T.value&&(dt(n),h.success(e("toast.langSwitched")))}function q(){c.value=y.value}async function H(){if(!(!N.value||p.value)){p.value=!0;try{const n=await A.patchSettings({mixedPort:c.value});o.status&&(o.status={...o.status,settings:n.settings}),await F(),h.success(e("toast.portSaved"))}catch(n){h.error(e("toast.failed",{msg:S(n)}))}finally{p.value=!1}}}async function R(n,i){try{await ct(n,i),h.success(e("toast.settingSaved"))}catch(d){h.error(e("toast.failed",{msg:S(d)}))}}function Y(n){R("allow-lan",n)}function Z(n){R("tun",n)}async function G(){if(!w.value){w.value=!0;try{const n=await A.reloadCoreConfig();await F(),h.success(e("toast.configReloaded",{n:n.proxyCount}))}catch(n){h.error(e("toast.failed",{msg:S(n)}))}finally{w.value=!1}}}return(n,i)=>(u(),m("div",null,[r(W,{title:t(e)("page.settings.title"),desc:t(e)("page.settings.desc")},{default:C(()=>[s("button",{type:"button",class:"btn btn-secondary btn-sm",onClick:i[0]||(i[0]=d=>g.value=!0)},[r(x,{name:"code",size:14}),Q(" "+a(t(e)("settings.editFile")),1)])]),_:1},8,["title","desc"]),g.value?(u(),X(t(v),{key:0,onClose:i[1]||(i[1]=d=>g.value=!1)})):f("",!0),s("div",wt,[r(D,{title:t(e)("settings.appearanceTitle"),class:"settings-card"},{default:C(()=>[s("div",kt,[s("div",Ct,[s("span",Tt,a(t(e)("settings.themeTitle")),1),s("span",$t,a(t(e)("settings.appearanceDesc")),1)]),s("div",{class:"segmented preference-control",role:"group","aria-label":t(e)("settings.appearanceTitle")},[s("button",{type:"button",class:_(["segmented-item",{active:t(b)==="system"}]),"aria-pressed":t(b)==="system",onClick:i[2]||(i[2]=d=>V("system"))},a(t(e)("theme.system")),11,Vt),s("button",{type:"button",class:_(["segmented-item",{active:t(b)==="light"}]),"aria-pressed":t(b)==="light",onClick:i[3]||(i[3]=d=>V("light"))},a(t(e)("theme.light")),11,xt),s("button",{type:"button",class:_(["segmented-item",{active:t(b)==="dark"}]),"aria-pressed":t(b)==="dark",onClick:i[4]||(i[4]=d=>V("dark"))},a(t(e)("theme.dark")),11,Pt)],8,Dt)]),s("div",St,[s("div",Bt,[s("span",Ut,a(t(e)("settings.langTitle")),1),s("span",zt,a(t(e)("settings.langDesc")),1)]),s("div",{class:"segmented preference-control language-control",role:"group","aria-label":t(e)("settings.langTitle")},[s("button",{type:"button",class:_(["segmented-item",{active:t(T)==="zh"}]),"aria-pressed":t(T)==="zh",onClick:i[5]||(i[5]=d=>E("zh"))}," 中文 ",10,Lt),s("button",{type:"button",class:_(["segmented-item",{active:t(T)==="en"}]),"aria-pressed":t(T)==="en",onClick:i[6]||(i[6]=d=>E("en"))}," English ",10,Nt)],8,It)])]),_:1},8,["title"]),r(D,{title:t(e)("settings.networkTitle"),class:"settings-card"},{default:C(()=>[s("div",Et,[s("div",Rt,[s("label",Mt,a(t(e)("settings.mixedPortTitle")),1),s("span",At,a(t(e)("settings.mixedPortDesc")),1)]),s("div",Ft,[tt(s("input",{id:"mixed-port","onUpdate:modelValue":i[7]||(i[7]=d=>c.value=d),type:"number",min:"1",max:"65535",class:"input input-sm port-input","aria-label":t(e)("settings.mixedPortTitle"),disabled:p.value||!t(o).status},null,8,Ot),[[st,c.value,void 0,{number:!0}]]),L.value?(u(),m("button",{key:0,type:"button",class:"btn btn-secondary btn-sm",disabled:p.value||!t(o).status,onClick:q},a(t(e)("common.reset")),9,jt)):f("",!0),s("button",{type:"button",class:"btn btn-secondary btn-sm interrupt-save",disabled:p.value||!N.value||!t(o).status,onClick:H},a(p.value?t(e)("common.loading"):t(e)("common.save")),9,qt)])]),s("div",Ht,[s("div",Yt,[s("span",Zt,a(t(e)("settings.allowLanTitle")),1),s("span",Gt,a(t(e)("settings.allowLanDesc")),1)]),s("div",Jt,[r(O,{"model-value":t(o).status?.settings.allowLan??!1,label:t(e)("settings.allowLanTitle"),disabled:t(o).operations.networkSetting||!t(o).status,"onUpdate:modelValue":Y},null,8,["model-value","label","disabled"])])]),s("div",Kt,[s("div",Qt,[s("span",Wt,a(t(e)("settings.tunTitle")),1),s("span",Xt,a(j.value),1)]),s("div",ts,[t($)?(u(),m("span",{key:0,class:_(["badge",t($).className]),title:t($).title},a(t($).text),11,ss)):f("",!0),r(O,{"model-value":t(o).status?.settings.tun??!1,label:t(e)("settings.tunTitle"),disabled:t(o).operations.networkSetting||!t(o).status,"onUpdate:modelValue":Z},null,8,["model-value","label","disabled"])])])]),_:1},8,["title"]),r(D,{title:t(e)("settings.coreTitle"),class:"settings-card"},{default:C(()=>[s("div",es,[s("div",as,[s("span",ns,a(t(e)("settings.restartTitle")),1),s("span",is,a(t(e)("settings.restartDesc")),1)]),s("div",os,[s("button",{type:"button",class:"btn btn-sm danger-action",disabled:t(z),onClick:i[8]||(i[8]=(...d)=>t(I)&&t(I)(...d))},[r(x,{name:"power",size:13,class:_({spin:t(z)})},null,8,["class"]),s("span",null,a(t(e)("settings.restartBtn")),1)],8,ls)])]),s("div",ds,[s("div",cs,[s("span",rs,a(t(e)("settings.reloadTitle")),1),s("span",us,a(t(e)("settings.reloadDesc")),1)]),s("div",gs,[s("button",{type:"button",class:"btn btn-secondary btn-sm",disabled:w.value,onClick:G},[r(x,{name:"refresh",size:13,class:_({spin:w.value})},null,8,["class"]),s("span",null,a(t(e)("settings.reloadBtn")),1)],8,_s)])])]),_:1},8,["title"]),r(D,{title:t(e)("settings.aboutTitle"),class:"settings-card runtime-card"},{default:C(()=>[s("dl",ms,[s("div",vs,[s("dt",null,a(t(e)("overview.daemonPort")),1),s("dd",ps,"127.0.0.1:"+a(t(o).status?.settings.daemonPort??19090),1)]),s("div",hs,[s("dt",null,a(t(e)("overview.controller")),1),s("dd",bs,a(t(o).status?.settings.controller||"-"),1)]),s("div",fs,[s("dt",null,a(t(e)("settings.coreVersion")),1),s("dd",ys,a(t(et)||"-"),1)])])]),_:1},8,["title"])])]))}}),Ts=U(ws,[["__scopeId","data-v-34dbfd82"]]);export{Ts as default};
@@ -1 +0,0 @@
1
- .ui-card[data-v-042826e5]{min-width:0}.ui-card-head[data-v-042826e5]{display:flex;min-height:28px;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:5px}.ui-card-heading[data-v-042826e5]{min-width:0}.ui-card-title[data-v-042826e5]{color:var(--text-primary);font-size:18px;font-weight:400;line-height:1.4}.ui-card-desc[data-v-042826e5]{margin-top:1px;color:var(--text-muted);font-size:14px;line-height:1.35}.ui-card-actions[data-v-042826e5]{display:flex;align-items:center;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;gap:7px}.ui-card-body[data-v-042826e5]{padding:6px 10px;background:var(--bg-panel);border-radius:3px}@media(max-width:520px){.ui-card-head[data-v-042826e5]{flex-wrap:wrap}.ui-card-body[data-v-042826e5]{padding:6px 8px}}.switch[data-v-306af9c5]{position:relative;width:34px;height:20px;flex-shrink:0;padding:0;border:0;border-radius:var(--radius-full);background:var(--switch-off);cursor:pointer;transition:background var(--motion-normal) var(--ease-standard),opacity var(--motion-fast) var(--ease-standard)}.switch[data-v-306af9c5]:hover:not(:disabled){background:color-mix(in srgb,var(--switch-off) 84%,var(--text-primary))}.switch.on[data-v-306af9c5]{background:var(--switch-on)}.switch.on[data-v-306af9c5]:hover:not(:disabled){background:color-mix(in srgb,var(--switch-on) 84%,#000000)}.switch[data-v-306af9c5]:disabled{cursor:not-allowed;opacity:.48}.knob[data-v-306af9c5]{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:var(--radius-full);background:var(--switch-knob);box-shadow:var(--shadow-switch);transition:background var(--motion-normal) var(--ease-standard),transform var(--motion-normal) var(--ease-spring)}.switch.on .knob[data-v-306af9c5]{transform:translate(14px)}.settings-grid[data-v-34dbfd82]{display:grid;width:min(1046px,100%);grid-template-columns:1fr;gap:12px;margin:0 auto}.settings-card[data-v-34dbfd82]{min-width:0}.preference-control[data-v-34dbfd82]{display:grid;width:min(360px,48%);grid-template-columns:repeat(3,minmax(0,1fr));flex-shrink:0;gap:0}.language-control[data-v-34dbfd82]{grid-template-columns:repeat(2,minmax(0,1fr))}.preference-control .segmented-item[data-v-34dbfd82]{min-height:27px;border:0;border-radius:0;font-size:14px}.preference-control .segmented-item[data-v-34dbfd82]:first-child{border-radius:5px 0 0 5px}.preference-control .segmented-item[data-v-34dbfd82]:last-child{border-radius:0 5px 5px 0}.setting-row[data-v-34dbfd82]{display:flex;min-height:43px;align-items:center;justify-content:space-between;gap:24px;padding:6px 5px;border-bottom:0;transition:background var(--motion-fast) var(--ease-standard)}.setting-row[data-v-34dbfd82]:first-child{margin-top:-2px}.setting-row[data-v-34dbfd82]:last-child{border-bottom:0}.setting-row[data-v-34dbfd82]:hover{background:var(--general-row-hover);border-radius:3px}.caution-row .setting-name[data-v-34dbfd82]{color:var(--warning)}.danger-row .setting-name[data-v-34dbfd82]{color:var(--danger)}.setting-info[data-v-34dbfd82]{display:flex;min-width:0;flex-direction:column;gap:2px}.setting-name[data-v-34dbfd82]{color:var(--text-primary);font-size:16px;font-weight:400}.setting-desc[data-v-34dbfd82]{max-width:630px;color:var(--text-muted);font-size:14px;line-height:1.35}.setting-action[data-v-34dbfd82]{display:flex;align-items:center;flex-shrink:0;gap:8px}.port-input[data-v-34dbfd82]{width:96px;font-family:var(--font-mono);appearance:textfield;-moz-appearance:textfield}.port-input[data-v-34dbfd82]::-webkit-outer-spin-button,.port-input[data-v-34dbfd82]::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.interrupt-save[data-v-34dbfd82]{color:var(--warning);background:transparent;border-color:var(--warning-border)}.danger-action[data-v-34dbfd82]{color:var(--danger);background:transparent;border-color:var(--danger-border)}.interrupt-save[data-v-34dbfd82]:hover:not(:disabled){background:var(--warning-soft)}.danger-action[data-v-34dbfd82]:hover:not(:disabled){background:var(--danger-soft)}.info-grid[data-v-34dbfd82]{display:grid;grid-template-columns:1fr}.info-item[data-v-34dbfd82]{display:flex;min-width:0;min-height:39px;align-items:center;justify-content:space-between;gap:12px;padding:6px 5px;border-bottom:0}.info-item[data-v-34dbfd82]:last-child{border-bottom:0}.info-item dt[data-v-34dbfd82]{flex-shrink:0;color:var(--text-secondary);font-size:16px}.info-item dd[data-v-34dbfd82]{min-width:0;overflow:hidden;color:var(--text-primary);font-size:16px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}@media(max-width:760px){.preference-control .segmented-item[data-v-34dbfd82],.setting-action .btn[data-v-34dbfd82]{min-height:40px}}@media(max-width:480px){.settings-grid[data-v-34dbfd82]{gap:12px}.preference-control[data-v-34dbfd82]{width:100%}.preference-control .segmented-item[data-v-34dbfd82]{min-height:40px;font-size:14px}.setting-row[data-v-34dbfd82]{min-height:0;align-items:stretch;flex-direction:column;gap:11px;padding:13px 8px}.setting-action[data-v-34dbfd82]{align-self:stretch;justify-content:flex-end}.port-action[data-v-34dbfd82]{display:grid;grid-template-columns:minmax(0,1fr) auto auto}.port-input[data-v-34dbfd82]{width:100%;min-height:44px;text-align:left}.setting-action .btn[data-v-34dbfd82]{min-height:44px}.info-item[data-v-34dbfd82]{min-height:0;align-items:flex-start;flex-direction:column;gap:3px;padding:10px 8px}.info-item dd[data-v-34dbfd82]{width:100%}}