@camstack/addon-admin-ui 1.2.526 → 1.2.528

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 (165) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/assets/{AddonAssetIcon-Bk09xHqf.js → AddonAssetIcon-B1rn0DLw.js} +1 -1
  3. package/dist/assets/Addons-jOEeQSpu.js +5 -0
  4. package/dist/assets/{AdminPage-CYSYefaL.js → AdminPage-DmkuRREx.js} +1 -1
  5. package/dist/assets/{AdminSectionedPage-B4MRvqE8.js → AdminSectionedPage-DuWHEheV.js} +1 -1
  6. package/dist/assets/AiProfiles-BEeNwF2L.js +3 -0
  7. package/dist/assets/Build-Co5ZdxuK.js +40 -0
  8. package/dist/assets/Calendars-BtDHWxd-.js +1 -0
  9. package/dist/assets/{Cluster-Dkt_tVUy.js → Cluster-BIBo49N1.js} +1 -1
  10. package/dist/assets/{ComposedDeviceEditDialog-DJ5mqI6C.js → ComposedDeviceEditDialog-B4GFluaT.js} +1 -1
  11. package/dist/assets/CompositionBlockEditor-BpvjitmC.js +2 -0
  12. package/dist/assets/CompositionEditorPage-dKqEx-JR.js +1 -0
  13. package/dist/assets/Data-RjeL53U1.js +2 -0
  14. package/dist/assets/DeviceDetail-eIrghHfV.js +2 -0
  15. package/dist/assets/DeviceDoActionFields-NGMXRetO.js +1 -0
  16. package/dist/assets/Devices-BGUXCPk6.js +1 -0
  17. package/dist/assets/{EmbedPlayerPage-DlIQigBi.js → EmbedPlayerPage-D0lVyXps.js} +1 -1
  18. package/dist/assets/FormBuilder-C-ti9Mun.js +1 -0
  19. package/dist/assets/History-DFE__TwY.js +1 -0
  20. package/dist/assets/Identity-xGpm6dM2.js +1 -0
  21. package/dist/assets/IntegrationDetail-BV550NaL.js +1 -0
  22. package/dist/assets/IntegrationHub-zoj_qUVu.js +1 -0
  23. package/dist/assets/Integrations-BgOMB--y.js +1 -0
  24. package/dist/assets/Integrations-Dnahdxh6.js +1 -0
  25. package/dist/assets/Library-Dta_WXbr.js +1 -0
  26. package/dist/assets/Locations-qtdnIjEQ.js +3 -0
  27. package/dist/assets/{Logs-BxTfJ-wk.js → Logs-DY8msvrb.js} +1 -1
  28. package/dist/assets/{MaskShapeCanvas-DBEbXuH2.js → MaskShapeCanvas-HJuLPIJP.js} +1 -1
  29. package/dist/assets/{MotionZonesSettings-D3Xxjf5N.js → MotionZonesSettings-COMPKhfx.js} +1 -1
  30. package/dist/assets/MyAccess-ayWZOTHE.js +2 -0
  31. package/dist/assets/Network-DDRo1U4A.js +1 -0
  32. package/dist/assets/NodeAddonsSettingsPanel-Bin3whKR.js +1 -0
  33. package/dist/assets/Notifications-DxWf70ir.js +1 -0
  34. package/dist/assets/Pipeline-B1zEi2hO.js +1 -0
  35. package/dist/assets/{PrivacyMaskSettings-CswE6pks.js → PrivacyMaskSettings-C88JqmdE.js} +1 -1
  36. package/dist/assets/Recordings-BQZ9OaK2.js +1 -0
  37. package/dist/assets/{RemoteGrid-BjtzHkpg.js → RemoteGrid-CF92aN64.js} +1 -1
  38. package/dist/assets/ScanNetworkModal-DNtPeZ2B.js +1 -0
  39. package/dist/assets/{SceneMonitorEditor-C2X6jZvS.js → SceneMonitorEditor-mE7W6emU.js} +1 -1
  40. package/dist/assets/SessionsList-DqDv9LKK.js +2 -0
  41. package/dist/assets/Showroom-D8Shgmh7.js +1 -0
  42. package/dist/assets/System-Cl5e6KJW.js +1 -0
  43. package/dist/assets/{Templates-tilFwunF.js → Templates-D0V7IdcS.js} +1 -1
  44. package/dist/assets/{Terminal-DiMnsE8i.js → Terminal-BBAoUjfs.js} +5 -5
  45. package/dist/assets/Trans-DvLMqjNd.js +1 -0
  46. package/dist/assets/{Viewer-BwirleAM.js → Viewer-BTxcZ-BR.js} +1 -1
  47. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-w6FCrjgB.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CmowmspB.js} +1 -1
  48. package/dist/assets/{addon-icons-context-CHk3ePjj.js → addon-icons-context-DZZCjo9x.js} +1 -1
  49. package/dist/assets/{archive-BU_eXxQC.js → archive-Bu9T4BL0.js} +1 -1
  50. package/dist/assets/{assignment-candidates-B4bOK7k8.js → assignment-candidates-YAud75JK.js} +1 -1
  51. package/dist/assets/{authed-media-BYuQnqbF.js → authed-media-yW7W_8pm.js} +1 -1
  52. package/dist/assets/{bell-off-DCQedZIx.js → bell-off-E0Abr7jJ.js} +1 -1
  53. package/dist/assets/{board-model-t0EX_kXW.js → board-model-BgDnb_No.js} +1 -1
  54. package/dist/assets/{boxes-BZMO9uMf.js → boxes-BkzsIUkw.js} +1 -1
  55. package/dist/assets/circle-slash-pdaivo-U.js +1 -0
  56. package/dist/assets/client-BvflqtP1.js +711 -0
  57. package/dist/assets/{cloud-upload-CApwQ18P.js → cloud-upload-BIjzjy_K.js} +1 -1
  58. package/dist/assets/crop-CZJDrMcX.js +1 -0
  59. package/dist/assets/device-integration-icon-Dxf6i9YB.js +1 -0
  60. package/dist/assets/device-picker-model-2dkiqOI6.js +1 -0
  61. package/dist/assets/{dist-Hz1nnJDv.js → dist-DoqhrZoo.js} +1 -1
  62. package/dist/assets/dist-Gm_hHBN2.js +711 -0
  63. package/dist/assets/{file-up-cso0QIDs.js → file-up-Cyg6A2qN.js} +1 -1
  64. package/dist/assets/{format-Csy9sDox.js → format-D6gOZRRr.js} +1 -1
  65. package/dist/assets/{grip-vertical-DqjjXK1h.js → grip-vertical-CLVyc1HC.js} +1 -1
  66. package/dist/assets/{hard-drive-download-D-ykdsm5.js → hard-drive-download-Cd122TYb.js} +1 -1
  67. package/dist/assets/{hostInit-CTFssGi8.js → hostInit-DR1ykbVx.js} +1 -1
  68. package/dist/assets/i18n-C02pTNTJ.js +1 -0
  69. package/dist/assets/icons-BSJCF6qM.js +1 -0
  70. package/dist/assets/index-BrupW6X6.css +2 -0
  71. package/dist/assets/index-CoVcMsxX.js +4 -0
  72. package/dist/assets/{key-C_dbeH7F.js → key-D_zqd1r-.js} +1 -1
  73. package/dist/assets/{key-round-CPg0Y5qN.js → key-round-pNw827HU.js} +1 -1
  74. package/dist/assets/{layers-Cb-ro1vb.js → layers-CFNXRt4j.js} +1 -1
  75. package/dist/assets/{linked-devices-model-ZCUJsj_d.js → linked-devices-model-CPj1sFzr.js} +1 -1
  76. package/dist/assets/{list-ordered-V6P5uujF.js → list-ordered-Dy6tCUD8.js} +1 -1
  77. package/dist/assets/location-owned-usage-BhWswowa.js +1 -0
  78. package/dist/assets/{memory-stick-Mm_iVwSZ.js → memory-stick-Bt2KoB-0.js} +1 -1
  79. package/dist/assets/{message-square-plus-Bfam15lf.js → message-square-plus-rkd_X0vs.js} +1 -1
  80. package/dist/assets/{mf-entry-bootstrap-0-019f9c14.js → mf-entry-bootstrap-0-bba9c01e.js} +2 -2
  81. package/dist/assets/{mic-off-CeSZf8K2.js → mic-off-DWb36TX2.js} +1 -1
  82. package/dist/assets/{monitor-off-U-RK64kw.js → monitor-off-B2GWMMt_.js} +1 -1
  83. package/dist/assets/{monitor-smartphone-DezRerVw.js → monitor-smartphone-DJzvbVtx.js} +1 -1
  84. package/dist/assets/mount-2dkiqOI6.js +1 -0
  85. package/dist/assets/notification-schedule-field-XRy8SQoM.js +1 -0
  86. package/dist/assets/{player-overlays-DgedyCX9.js → player-overlays-DpZIxQHp.js} +1 -1
  87. package/dist/assets/{recycle-Dkb1d-SV.js → recycle-BWLoavmg.js} +1 -1
  88. package/dist/assets/remoteEntry-CD4F7fE2.js +1 -0
  89. package/dist/assets/{ruler-DzpBI-EP.js → ruler-C1SbVRl3.js} +1 -1
  90. package/dist/assets/{scan-eye-BmLTXsIf.js → scan-eye-Bv4PGTFl.js} +1 -1
  91. package/dist/assets/{scissors-lBRCylhQ.js → scissors-BsEkbrx_.js} +1 -1
  92. package/dist/assets/{search-x-BRhrXpKx.js → search-x-DE4DxdsF.js} +1 -1
  93. package/dist/assets/{send-DVJoNc0-.js → send-Dd0BBamd.js} +1 -1
  94. package/dist/assets/{settings-2-D6sp_FTm.js → settings-2-z3X6U2eo.js} +1 -1
  95. package/dist/assets/{shapes-CQn3wvpk.js → shapes-D-IaC6en.js} +1 -1
  96. package/dist/assets/{sigma-CKK8bLRa.js → sigma-CxBVWJ85.js} +1 -1
  97. package/dist/assets/{speaker-BYorOPbN.js → speaker-Dy79a571.js} +1 -1
  98. package/dist/assets/src-KDhMZ5Ob.js +67 -0
  99. package/dist/assets/sso-popup-BYo1cU_K.js +1 -0
  100. package/dist/assets/{step-inspector-model-DEfajBM3.js → step-inspector-model-DG2Cy9_m.js} +1 -1
  101. package/dist/assets/{table-2-BPB4V5Fg.js → table-2-IUuOvuT8.js} +1 -1
  102. package/dist/assets/{timer-reset-Cu_VSXbl.js → timer-reset-D1H0hoMf.js} +1 -1
  103. package/dist/assets/{unlink-BcrHT0zX.js → unlink-DTu1e00O.js} +1 -1
  104. package/dist/assets/{usb-DhXPqJtn.js → usb-CFK8z-TS.js} +1 -1
  105. package/dist/assets/{use-device-bound-caps-K47AcsQ5.js → use-device-bound-caps-DS4FtJtN.js} +1 -1
  106. package/dist/assets/{use-scenes-feed-DQrMGL5E.js → use-scenes-feed-CE-KFGxN.js} +1 -1
  107. package/dist/assets/{use-stationary-objects-yu-O0RPa.js → use-stationary-objects-CFLRkxjx.js} +1 -1
  108. package/dist/assets/useEventInvalidation-2dkiqOI6.js +1 -0
  109. package/dist/assets/useNodeUrlSelection-Pafi-8p7.js +1 -0
  110. package/dist/assets/user-round-BSVSJsjB.js +1 -0
  111. package/dist/assets/{user-x-DRSOzwTr.js → user-x-KWsBR0tG.js} +1 -1
  112. package/dist/assets/variable-BG_qKWYf.js +1 -0
  113. package/dist/assets/{video-5IaJhdjU.js → video-D0guHpd1.js} +1 -1
  114. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BtgDin-X.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-FCSZ5q7m.js} +2 -2
  115. package/dist/index.html +14 -10
  116. package/dist/server/addon.js +910 -116
  117. package/package.json +1 -1
  118. package/dist/assets/Addons-BwXNg54C.js +0 -5
  119. package/dist/assets/AiProfiles-CRZH6xR0.js +0 -3
  120. package/dist/assets/BrokerEditorDialog-D9rZCGl9.js +0 -1
  121. package/dist/assets/Build-BJaqr-_Y.js +0 -40
  122. package/dist/assets/Calendars-D4ed6Nqc.js +0 -1
  123. package/dist/assets/CompositionBlockEditor-BEondavu.js +0 -2
  124. package/dist/assets/CompositionEditorPage-4rHclFIA.js +0 -1
  125. package/dist/assets/Data-pZe3A7Va.js +0 -2
  126. package/dist/assets/DeviceDetail-3jKJ80IC.js +0 -2
  127. package/dist/assets/DeviceDoActionFields-1jte2ge2.js +0 -1
  128. package/dist/assets/Devices-Bq4yRli5.js +0 -1
  129. package/dist/assets/History-DTt-NAMR.js +0 -1
  130. package/dist/assets/Identity-C3GHYP7_.js +0 -1
  131. package/dist/assets/IntegrationDetail-EOwq3jVG.js +0 -1
  132. package/dist/assets/IntegrationHub-8GCewFBs.js +0 -1
  133. package/dist/assets/Integrations-BocurtE0.js +0 -1
  134. package/dist/assets/Integrations-Bt3Im7Mh.js +0 -1
  135. package/dist/assets/Library-DTn9Nkjs.js +0 -1
  136. package/dist/assets/Locations-chgnzdWz.js +0 -3
  137. package/dist/assets/MyAccess-BTEJNJtS.js +0 -2
  138. package/dist/assets/Network-plYS78UN.js +0 -1
  139. package/dist/assets/NodeAddonsSettingsPanel-Do_I93Mx.js +0 -1
  140. package/dist/assets/Notifications-mslnotOB.js +0 -1
  141. package/dist/assets/Pipeline-Cjj8XOuS.js +0 -1
  142. package/dist/assets/Recordings-BpB53ln_.js +0 -1
  143. package/dist/assets/ScanNetworkModal-BR3tzZcL.js +0 -1
  144. package/dist/assets/SessionsList-BOjlUhj5.js +0 -2
  145. package/dist/assets/Showroom-CHwcC6p6.js +0 -1
  146. package/dist/assets/System-CiZ0xcyP.js +0 -1
  147. package/dist/assets/circle-slash-DFl97Cbx.js +0 -1
  148. package/dist/assets/client-F3l12jEi.js +0 -674
  149. package/dist/assets/crop-gfwPOF8e.js +0 -1
  150. package/dist/assets/device-integration-icon-CXG5v8dp.js +0 -1
  151. package/dist/assets/device-picker-model-Fpx4y0MY.js +0 -1
  152. package/dist/assets/dist-B2m_6_7g.js +0 -674
  153. package/dist/assets/i18n-BH0PY6IL.js +0 -1
  154. package/dist/assets/icons-B9uR9qKs.js +0 -1
  155. package/dist/assets/index-CQ7TjSgs.js +0 -4
  156. package/dist/assets/index-DjwiZ7qT.css +0 -2
  157. package/dist/assets/location-owned-usage-C6DcC3IT.js +0 -1
  158. package/dist/assets/log-in-Cxvw8rxc.js +0 -1
  159. package/dist/assets/mount-Fpx4y0MY.js +0 -1
  160. package/dist/assets/remoteEntry-DpkkaSO3.js +0 -1
  161. package/dist/assets/src-B0EA_4Ed.js +0 -67
  162. package/dist/assets/useEventInvalidation-Fpx4y0MY.js +0 -1
  163. package/dist/assets/useNodeUrlSelection-BuraZwll.js +0 -1
  164. package/dist/assets/user-round-D6wDvac9.js +0 -1
  165. package/dist/assets/variable-cv0ONmJ-.js +0 -1
@@ -1 +0,0 @@
1
- import{C as e,K as t,R as n,S as r,V as i,Y as a,et as o,o as s,x as c}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Ai as l,D as u,Dn as d,En as f,Ht as p,In as m,Kn as h,L as g,Ln as _,Z as v,_n as y,ai as b,bt as x,dt as S,fn as C,gt as w,pr as T,qr as E,rn as ee,tn as D,ur as O,xn as te,zt as k}from"./player-overlays-DgedyCX9.js";import{ci as ne,dr as re,li as ie,ri as ae}from"./client-F3l12jEi.js";import{t as A}from"./boxes-BZMO9uMf.js";import{s as oe,u as j}from"./video-5IaJhdjU.js";import{t as se}from"./log-in-Cxvw8rxc.js";import{$s as ce,Ad as le,An as ue,Cc as de,Dn as fe,Fd as pe,Fo as me,Hi as M,Nr as he,On as ge,Or as _e,Qs as ve,Sc as ye,Tn as be,Ui as N,Zn as xe,_c as Se,ac as Ce,cc as we,di as P,ec as Te,fd as Ee,gc as De,hc as Oe,lc as ke,mc as Ae,oc as je,rc as Me,ri as F,vc as Ne,xc as Pe}from"./src-B0EA_4Ed.js";import{t as I}from"./i18n-BH0PY6IL.js";import{t as L}from"./useTranslation-BJr-n0es.js";import"./mount-Fpx4y0MY.js";import{T as Fe,a as R,hr as Ie,i as z,mr as Le,yr as Re}from"./index-CQ7TjSgs.js";import{t as ze}from"./AdminSectionedPage-B4MRvqE8.js";import{t as B}from"./AdminPage-CYSYefaL.js";import{t as Be}from"./NodeAddonsSettingsPanel-Do_I93Mx.js";import{n as V,r as Ve,t as H}from"./IntegrationHub-8GCewFBs.js";import{n as U,t as W}from"./addon-display-names-BkwMrExv.js";o();var G=5e3,K=`network-access`,He={connected:!1,endpoint:null};function Ue(){let{t:e}=L(),n=s(),i=N({capName:`network-access`},{refetchInterval:G}),o=M(void 0,{refetchInterval:G}),c=t(()=>W(o.data??[]),[o.data]),l=t(()=>(i.data??[]).map(e=>({addonId:e.addonId,displayName:c.get(e.addonId)??e.addonId,isActive:e.isActive})),[i.data,c]),[u,d]=a(null),[f,p]=a({}),m=(e,t)=>{let r=t?.addonId;n.invalidateQueries({queryKey:[[`networkAccess`,`getStatus`],{input:{addonId:r},type:`query`}]}),d(null),p(e=>{if(r===void 0||!(r in e))return e;let t={...e};return delete t[r],t})},h=(e,t)=>{d(null);let n=t?.addonId;if(n===void 0)return;let r=e instanceof Error?e.message:String(e);p(e=>({...e,[n]:r}))},g=ye({onSuccess:m,onError:h}),_=de({onSuccess:m,onError:h}),v=[{id:K,label:e(`system.remoteAccess.remoteAccess`,`Remote access`),install:{capability:K,label:e(`system.remoteAccess.addTunnel`,`Add tunnel`)},entries:l.map(e=>({id:e.addonId,name:e.displayName,fallbackIcon:j,...U(e.isActive),render:()=>r(V,{addonId:e.addonId,displayName:e.displayName,capName:K,isActive:e.isActive,badges:r(Ge,{addonId:e.addonId}),error:f[e.addonId]??null,primaryAction:r(Ke,{addonId:e.addonId,busyId:u,onStart:e=>{d(e),g.mutate({addonId:e})},onStop:e=>{d(e),_.mutate({addonId:e})}})})}))}];return r(H,{embedded:!0,icon:j,title:e(`system.remoteAccess.remoteAccess2`,`Remote Access`),subtitle:e(`system.remoteAccess.publicFacingTunnelsThatExpose`,`Public-facing tunnels that expose this hub to the internet (Cloudflare Tunnel, ngrok, …).`),groups:v,isLoading:i.isLoading,emptyTitle:e(`system.remoteAccess.noRemoteAccessProvidersInstalled`,`No remote-access providers installed`),emptyDescription:e(`system.remoteAccess.installATunnelAddonE`,`Install a tunnel addon (e.g. @camstack/addon-cloudflare) to expose this hub publicly.`)})}function We(e){let{data:t}=Pe({addonId:e},{refetchInterval:G,retry:!1}),n=t?ae.safeParse(t):null;return n?.success?n.data:He}function Ge({addonId:t}){let{t:n}=L(),i=We(t);return e(c,{children:[r(P,{variant:i.connected?`success`:`default`,className:Ve,children:i.connected?n(`system.remoteAccess.connected`,`Connected`):n(`system.remoteAccess.disconnected`,`Disconnected`)}),i.endpoint&&e(`a`,{href:i.endpoint.url,target:`_blank`,rel:`noopener noreferrer`,className:`flex min-w-0 items-center gap-1 break-all text-[11px] text-success hover:underline`,children:[r(E,{className:`h-3 w-3`}),i.endpoint.url]})]})}function Ke({addonId:t,busyId:n,onStart:i,onStop:a}){let{t:o}=L(),s=We(t),c=n===t;return s.connected?e(F,{size:`sm`,variant:`secondary`,disabled:c,onClick:()=>a(t),children:[c?r(T,{className:`h-3 w-3 animate-spin`}):r(D,{className:`h-3 w-3`}),o(`system.remoteAccess.stop`,`Stop`)]}):e(F,{size:`sm`,variant:`primary`,disabled:c,onClick:()=>i(t),children:[c?r(T,{className:`h-3 w-3 animate-spin`}):r(_,{className:`h-3 w-3`}),o(`system.remoteAccess.start`,`Start`)]})}o();var qe=3e4,q=`turn-provider`;function Je(e){let t=[];for(let n of e)typeof n.urls==`string`?t.push(n.urls):t.push(...n.urls);return t}function Ye(){let{t:n}=L(),i=N({capName:`turn-provider`},{refetchInterval:qe}),a=M(void 0,{refetchInterval:qe}),o=Ee(),s=o.data??[],c=t(()=>W(a.data??[]),[a.data]),l=t(()=>(i.data??[]).map(e=>({addonId:e.addonId,displayName:c.get(e.addonId)??e.addonId,isActive:e.isActive})),[i.data,c]),d=[{id:q,label:n(`system.turnServers.turnProviders`,`TURN providers`),install:{capability:q,label:n(`system.turnServers.addProvider`,`Add provider`)},entries:l.map(e=>({id:e.addonId,name:e.displayName,fallbackIcon:h,...U(e.isActive),render:()=>r(V,{addonId:e.addonId,displayName:e.displayName,capName:q,isActive:e.isActive,panels:[{id:`ice-servers`,title:n(`system.turnServers.discoveredIceServers`,`Discovered ICE servers`),icon:h,content:r(Xe,{addonId:e.addonId,enabled:e.isActive})}]})}))}];return r(H,{embedded:!0,icon:h,title:n(`system.turnServers.turnServers`,`TURN Servers`),subtitle:n(`system.turnServers.iceServersUsedForWebrtc`,`ICE servers used for WebRTC NAT traversal. Multiple providers can coexist — the WebRTC layer concatenates servers from all enabled providers per session.`),groups:d,isLoading:i.isLoading,emptyTitle:n(`system.turnServers.noTurnProvidersInstalled`,`No TURN providers installed`),emptyDescription:n(`system.turnServers.installATurnAddonE`,`Install a TURN addon (e.g. @camstack/addon-cloudflare) to enable WebRTC behind restrictive NATs.`),trailing:r(ge,{headingId:`turn-combined-ice`,title:n(`system.turnServers.combinedIceServerListAll`,`Combined ICE server list — all enabled providers`),icon:h,actions:r(F,{size:`sm`,variant:`secondary`,onClick:()=>o.refetch(),disabled:o.isFetching,children:n(`common.refresh`,`Refresh`)}),children:r(`div`,{className:u,children:s.length===0?r(`div`,{className:`text-xs text-foreground-subtle`,children:n(`system.turnServers.noServersFromEnabledProviders`,`No servers from enabled providers.`)}):r(`div`,{className:`flex flex-col gap-3`,children:s.map((t,n)=>{let i=Array.isArray(t.urls)?t.urls:[t.urls];return e(`div`,{className:`rounded border border-border bg-surface`,children:[(t.username||t.credential)&&e(`div`,{className:`px-3 py-1.5 border-b border-border text-[10px] font-mono text-foreground-subtle flex items-center gap-3`,children:[t.username&&e(`span`,{children:[r(`span`,{className:`text-foreground-subtle`,children:`user:`}),` `,r(`span`,{className:`text-foreground`,children:t.username})]}),t.credential&&e(`span`,{children:[r(`span`,{className:`text-foreground-subtle`,children:`credential:`}),` `,r(`span`,{className:`text-foreground`,children:`••••••••`})]})]}),r(`ul`,{className:`divide-y divide-border`,children:i.map(e=>r(`li`,{className:`px-3 py-1.5 font-mono text-xs text-foreground break-all`,children:e},e))})]},n)})})})})})}function Xe({addonId:e,enabled:n}){let i=Ee({addonId:e},{enabled:n,retry:!1}),a=t(()=>Je(i.data??[]),[i.data]),o=n?i.isLoading?`Loading…`:a.length===0?`This provider returned no servers.`:null:`Disabled — enable the provider to fetch its servers.`;return r(`div`,{className:`rounded-lg border border-border bg-surface p-2 sm:p-3`,children:o===null?r(`div`,{className:`flex flex-wrap gap-1`,children:a.map(e=>r(`span`,{className:`inline-block break-all rounded bg-foreground-subtle/10 px-1.5 py-0.5 font-mono text-[10px] text-foreground`,children:e},e))}):r(`div`,{className:`text-xs text-foreground-subtle`,children:o})})}o();var Ze={lan:h,wifi:x,docker:A,vpn:O,loopback:y,other:y},Qe={lan:`LAN`,wifi:`Wi-Fi`,docker:`Docker`,vpn:`VPN`,loopback:`Loopback`,other:`Other`},$e=[`lan`,`wifi`,`vpn`,`docker`,`other`,`loopback`];function et(n){let{t:i}=L(),{interfaces:a,disabled:o,hideLoopback:s,ipv4Only:c,emptyMessage:u}=n,d=t(()=>a.filter(e=>!(s&&e.kind===`loopback`||c&&e.family!==`IPv4`)),[a,s,c]),f=t(()=>{let e=new Map;for(let t of d){let n=e.get(t.kind)??[];n.push(t),e.set(t.kind,n)}return $e.filter(t=>e.has(t)).map(t=>({kind:t,items:e.get(t)}))},[d]),p=e=>n.mode===`single`?n.value===e:n.value.includes(e),m=e=>{if(o||e.kind===`loopback`)return;if(n.mode===`single`){n.onChange(n.value===e.address?null:e.address);return}let t=new Set(n.value);t.has(e.address)?t.delete(e.address):t.add(e.address),n.onChange([...t])};return d.length===0?r(`div`,{className:`text-xs text-foreground-subtle italic`,children:u??i(`shared.addressSelector.noAddressesAvailable`,`No addresses available.`)}):r(`div`,{className:`flex flex-col gap-3`,children:f.map(({kind:t,items:a})=>e(`div`,{className:`rounded-md border border-border overflow-hidden`,children:[e(`div`,{className:`flex items-center gap-2 px-3 py-1.5 bg-surface-hover/30 border-b border-border`,children:[r(Ze[t]??y,{className:`h-3.5 w-3.5 text-foreground-subtle`}),r(`span`,{className:`text-[11px] font-semibold uppercase tracking-wide text-foreground-subtle`,children:Qe[t]??t}),e(`span`,{className:`text-[10px] text-foreground-subtle`,children:[`· `,a.length]})]}),r(`ul`,{className:`divide-y divide-border`,children:a.map(t=>{let a=p(t.address),s=t.kind===`loopback`,c=!t.plausible&&!s;return e(`li`,{className:`flex items-center gap-3 px-3 py-2 ${s?`opacity-60 cursor-not-allowed`:o?`opacity-60`:c?`cursor-pointer hover:bg-surface-hover/30 bg-amber-500/[0.04]`:`cursor-pointer hover:bg-surface-hover/30`}`,onClick:()=>m(t),children:[r(`span`,{className:`flex items-center justify-center h-4 w-4 rounded ${n.mode===`single`?`rounded-full`:`rounded`} border ${a?`border-primary bg-primary text-primary-foreground`:`border-border bg-surface`}`,children:a&&r(l,{className:`h-3 w-3`})}),e(`div`,{className:`flex-1 min-w-0 ${c?`text-foreground-subtle`:``}`,children:[e(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[r(`span`,{className:`font-mono text-xs font-semibold ${c?`text-foreground-subtle`:`text-foreground`}`,children:t.name}),r(`span`,{className:`text-[10px] rounded px-1.5 py-0.5 bg-foreground-subtle/10 text-foreground-subtle font-mono`,children:t.family}),t.preferred&&r(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium bg-primary/15 text-primary`,children:i(`shared.addressSelector.autoPreferred`,`Auto-preferred`)}),s&&r(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium bg-foreground-subtle/15 text-foreground-subtle`,children:i(`shared.addressSelector.alwaysIncluded`,`Always included`)}),c&&e(`span`,{className:`inline-flex items-center gap-1 text-[10px] rounded-full px-2 py-0.5 font-medium bg-amber-500/15 text-amber-700 dark:text-amber-300`,title:t.plausibleReason||void 0,children:[r(k,{className:`h-2.5 w-2.5`}),i(`shared.addressSelector.unlikelyUsable`,`Unlikely usable`)]})]}),e(`div`,{className:`text-xs text-foreground-subtle mt-0.5 font-mono break-all`,children:[t.address,t.cidr&&t.cidr!==t.address?` (${t.cidr})`:``]})]})]},`${t.name}-${t.family}-${t.address}`)})})]},t))})}var J=[{role:`appConnections`,get title(){return I.t(`helpers.addressTableModel.appConnectionsTitle`)},single:!1,get help(){return I.t(`helpers.addressTableModel.appConnectionsHelp`)}},{role:`notificationTaps`,get title(){return I.t(`helpers.addressTableModel.notificationTapsTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.notificationTapsHelp`)}},{role:`publicEndpoint`,get title(){return I.t(`helpers.addressTableModel.publicEndpointTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.publicEndpointHelp`)}},{role:`internal`,get title(){return I.t(`helpers.addressTableModel.internalTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.internalHelp`)}}],tt=`A role with nothing ticked is automatic. Add a custom address when the hub is reached at an address it cannot see itself (NAT, reverse proxy, VPN, Docker bridge).`;function Y(e,t){return e.inUse.includes(t)}function nt(e,t){if(!e.eligible.includes(t))return{kind:`none`};if(e.kind===`app-link`)return Y(e,t)?{kind:`none`}:{kind:`set`,input:{role:t,baseUrl:null,enabled:!0}};if(e.flags.includes(t)||t===`appConnections`&&Y(e,t))return{kind:`set`,input:{role:t,baseUrl:e.baseUrl,enabled:!1}};let n={role:t,baseUrl:e.baseUrl,enabled:!0};return t===`publicEndpoint`&&e.baseUrl.startsWith(`http:`)?{kind:`confirm-http`,input:n,reason:ne}:{kind:`set`,input:n}}function rt(e){return J.map(({role:t,title:n})=>{if(t===`appConnections`){let r=e.roles.appConnections;return{role:t,title:n,inUse:r.resolved.length===0?`nothing reachable`:r.resolved.join(`, `),automatic:r.source!==`flagged`}}let r=e.roles[t];return{role:t,title:n,inUse:r.resolved===null?`nothing reachable`:t===`notificationTaps`&&r.source===`auto`?`CamStack app link`:r.resolved,automatic:r.source!==`flagged`}})}o();var it={"lan-ipv4":{labelKey:`system.addressesCard.kindIpv4`,className:`bg-emerald-500/15 text-emerald-700 dark:text-emerald-300`},"lan-ipv6":{labelKey:`system.addressesCard.kindIpv6`,className:`bg-violet-500/15 text-violet-700 dark:text-violet-300`},public:{labelKey:`system.addressesCard.kindPublic`,className:`bg-blue-500/15 text-blue-700 dark:text-blue-300`},"app-link":{labelKey:`system.addressesCard.kindAppLink`,className:`bg-amber-500/15 text-amber-700 dark:text-amber-300`},custom:{labelKey:`system.addressesCard.kindCustom`,className:`bg-sky-500/15 text-sky-700 dark:text-sky-300`},loopback:{labelKey:`system.addressesCard.kindLoopback`,className:`bg-foreground-subtle/15 text-foreground-subtle`}};function at({book:t,loading:n,saving:i,error:o,onSetRole:s,onAdd:c,onRemove:l}){let{t:u}=L(),[d,f]=a(``),[h,g]=a(``),[_,v]=a(null),[y,b]=a(null),x=()=>{let e=ie(d);if(!e.ok){v(e.reason);return}v(null),f(``),g(``),c(e.baseUrl,h.trim())},S=(e,t)=>{let n=nt(e,t.role);if(n.kind!==`none`){if(n.kind===`confirm-http`){b({input:n.input,reason:n.reason});return}b(null),s(n.input)}},C=[{key:`url`,header:u(`system.addressesCard.address`,`Address`),render:n=>e(`div`,{className:`min-w-0 py-0.5`,children:[r(`div`,{className:`font-mono text-[12px] break-all ${n.plausible?`text-foreground`:`text-foreground-subtle`}`,children:n.baseUrl}),e(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-1.5 text-[11px] text-foreground-subtle`,children:[r(`span`,{children:n.label}),n.kind===`app-link`&&e(`span`,{className:`font-mono`,children:[`hub=`,` `,t?.appLinkHub??u(`system.addressesCard.noneNoTunnelOrTailscale`,`none (no tunnel or Tailscale)`)]}),n.custom&&n.detected&&r(`span`,{children:u(`system.addressesCard.alsoAddedAsACustom`,`also added as a custom address`)}),n.kind!==`custom`&&n.interfaceKind!==`lan`&&n.interfaceKind!==`public`&&n.interfaceKind!==`other`&&r(`span`,{className:`uppercase tracking-wide`,children:n.interfaceKind}),!n.plausible&&n.interfaceKind!==`loopback`&&e(`span`,{className:`inline-flex items-center gap-1 text-amber-700 dark:text-amber-300`,title:n.plausibleReason||void 0,children:[r(k,{className:`h-2.5 w-2.5`}),u(`system.addressesCard.unlikelyUsable`,`Unlikely usable`)]})]})]})},{key:`kind`,header:u(`system.addressesCard.kind`,`Kind`),nowrap:!0,render:e=>{let t=it[e.kind]??it.loopback;return r(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium ${t.className}`,children:u(t.labelKey)})}},...J.map(t=>({key:t.role,headerRender:()=>r(`span`,{title:t.help,children:t.title}),align:`center`,nowrap:!0,width:`w-24`,render:n=>{let a=n.eligible.includes(t.role),o=n.flags.includes(t.role),s=Y(n,t.role);return e(`label`,{className:`inline-flex items-center justify-center gap-1 ${a?`cursor-pointer`:`cursor-not-allowed opacity-40`}`,title:a?s&&!o?u(`system.addressesCard.inUseAutomatically`,`{{title}}: in use automatically. {{help}}`,{title:t.title,help:t.help}):t.help:u(`system.addressesCard.thisAddressCannotBeUsed`,`This address cannot be used for this.`),children:[r(xe,{checked:a&&s,disabled:!a||i,onChange:()=>S(n,t),"aria-label":`${t.title}: ${n.baseUrl}`}),s&&!o&&a&&r(`span`,{className:`text-[9px] text-foreground-subtle`,children:u(`common.auto`)})]})}})),{key:`actions`,header:``,align:`right`,nowrap:!0,render:e=>e.custom?r(F,{size:`sm`,variant:`ghost`,disabled:i,onClick:()=>l(e.baseUrl),"aria-label":u(`system.addressesCard.remove`,`Remove {{baseUrl}}`,{baseUrl:e.baseUrl}),title:u(`system.addressesCard.removeThisCustomAddressIts`,`Remove this custom address (its roles turn automatic)`),children:r(p,{className:`h-3 w-3`})}):null}],w=t===void 0?[]:rt(t);return e(_e,{children:[e(`div`,{className:`px-4 py-3 border-b border-border flex flex-col gap-2`,children:[e(`div`,{children:[r(`div`,{className:`text-sm font-semibold`,children:u(`system.addressesCard.addresses`,`Addresses`)}),r(`div`,{className:`text-xs text-foreground-subtle max-w-3xl`,children:u(`system.addressesCard.everyAddressThisHubIs`,`Every address this hub is reached at, detected or added by you. Tick what each one is used for.`)}),e(`details`,{className:`mt-1.5 text-xs max-w-3xl`,"data-testid":`address-roles-help`,children:[r(`summary`,{className:`cursor-pointer select-none text-foreground-subtle hover:text-foreground`,children:u(`system.addressesCard.whatAreRoles`,`What are roles?`)}),r(`dl`,{className:`mt-1.5 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1`,children:J.map(t=>e(`div`,{className:`contents`,children:[r(`dt`,{className:`font-medium`,children:t.title}),r(`dd`,{className:`text-foreground-subtle`,children:t.help})]},t.role))}),r(`p`,{className:`mt-1.5 text-foreground-subtle`,children:tt})]})]}),w.length>0&&r(`div`,{className:`grid grid-cols-[auto_1fr_auto] gap-x-3 gap-y-1 items-baseline text-xs`,"data-testid":`address-roles-summary`,children:w.map(t=>e(`div`,{className:`contents`,children:[r(`span`,{className:`text-foreground-subtle`,children:t.title}),e(`span`,{className:`font-mono break-all`,"data-testid":`address-role-${t.role}`,children:[t.inUse,r(`span`,{className:`ml-1.5 font-sans text-foreground-subtle`,children:t.automatic?u(`system.addressesCard.automatic`,`(automatic)`):u(`system.addressesCard.setByYou`,`(set by you)`)})]}),t.automatic?r(`span`,{}):r(F,{size:`sm`,variant:`secondary`,disabled:i,onClick:()=>s({role:t.role,baseUrl:null,enabled:!1}),children:u(`system.addressesCard.useAutomatic`,`Use automatic`)})]},t.role))}),y!==null&&e(`div`,{className:`rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs flex flex-wrap items-center gap-2`,children:[r(k,{className:`h-3.5 w-3.5 text-amber-600`}),r(`span`,{className:`flex-1 min-w-[220px]`,children:y.reason}),r(F,{size:`sm`,variant:`secondary`,onClick:()=>{s({...y.input,acceptInsecureHttp:!0}),b(null)},children:u(`system.addressesCard.useHttpAnyway`,`Use http anyway`)}),r(F,{size:`sm`,variant:`ghost`,onClick:()=>b(null),children:u(`common.cancel`,`Cancel`)})]}),o!==null&&r(`div`,{className:`text-[11px] text-red-600 dark:text-red-400`,role:`alert`,children:o})]}),r(ue,{columns:C,rows:t?.rows??[],rowKey:e=>`${e.kind}-${e.baseUrl}`,minWidthPx:760,bordered:!1,emptyMessage:n?u(`common.loading`,`Loading…`):u(`system.addressesCard.noAddressesAvailable`,`No addresses available.`),rowClassName:e=>e.plausible?void 0:`opacity-80`}),e(`div`,{className:`px-4 py-3 border-t border-border flex flex-wrap items-start gap-2`,children:[e(`div`,{className:`flex-1 min-w-[220px]`,children:[r(pe,{value:d,onChange:e=>{f(e.target.value),v(null)},placeholder:`https://cams.example.com or https://192.0.2.20:4443`,"aria-label":u(`system.addressesCard.customAddress`,`Custom address`),disabled:i}),_!==null&&r(`div`,{className:`mt-1 text-[11px] text-red-600 dark:text-red-400`,children:_})]}),r(`div`,{className:`w-48`,children:r(pe,{value:h,onChange:e=>g(e.target.value),placeholder:u(`system.addressesCard.labelOptional`,`Label (optional)`),"aria-label":u(`system.addressesCard.customAddressLabel`,`Custom address label`),maxLength:80,disabled:i})}),e(F,{size:`sm`,variant:`secondary`,disabled:i||d.trim()===``,onClick:x,children:[r(m,{className:`h-3 w-3`}),u(`system.addressesCard.addCustomAddress`,`Add custom address`)]})]})]})}o();function ot(){let{t:n}=L(),o=s(),c=()=>{o.invalidateQueries({queryKey:[[`localNetwork`]]})},l=Me(void 0,{refetchInterval:3e4}),p=Te(void 0),m=ke({onSuccess:c}),h=je({onSuccess:e=>{w(e.addresses),c()}}),g=t(()=>l.data?.interfaces??[],[l.data]),_=ce({scheme:typeof window<`u`&&window.location.protocol===`https:`?`https`:`http`},{refetchInterval:3e4}),v=we({onSuccess:c}),y=ve({onSuccess:c}),b=Ce({onSuccess:c}),x=v.error?.message??y.error?.message??b.error?.message??null,S=v.isPending||y.isPending||b.isPending,[C,w]=a([]),[T,E]=a(!1);i(()=>{!T&&p.data&&(w(p.data.addresses),E(!0))},[p.data,T]);let D=p.data?.addresses??[],O=t(()=>{if(C.length!==D.length)return!0;let e=[...C].toSorted(),t=[...D].toSorted();return e.some((e,n)=>e!==t[n])},[C,D]);return e(B,{embedded:!0,children:[e(`div`,{className:`flex items-center justify-between gap-3 flex-wrap`,children:[r(`p`,{className:`text-xs text-foreground-subtle max-w-2xl`,children:n(`system.networkAddresses.pinWhichHostInterfacesExist`,`Pin which host interfaces exist, then tick what each address is used for. Add a custom address when this hub is reached at one it cannot detect.`)}),r(`div`,{className:`flex items-center gap-2 shrink-0`,children:e(F,{size:`sm`,variant:`secondary`,onClick:()=>{l.refetch(),p.refetch(),_.refetch()},disabled:l.isLoading,children:[r(d,{className:`h-3 w-3 ${l.isLoading?`animate-spin`:``}`}),n(`common.refresh`,`Refresh`)]})})]}),r(ge,{headingId:`network-allowed-addresses`,title:n(`system.networkAddresses.allowedAddresses`,`Allowed addresses`),actions:e(`div`,{className:`flex flex-wrap items-center gap-1`,children:[e(F,{size:`sm`,variant:`secondary`,onClick:()=>h.mutate(void 0),disabled:h.isPending||m.isPending,title:n(`system.networkAddresses.reRunTheAutoDetection`,`Re-run the auto-detection heuristic + overwrite the current allowlist with the best matches.`),children:[r(ee,{className:`h-3 w-3`}),h.isPending?n(`system.networkAddresses.detecting`,`Detecting…`):n(`system.networkAddresses.bestMatch`,`Best match`)]}),e(F,{size:`sm`,variant:`secondary`,onClick:()=>{w([])},disabled:C.length===0||m.isPending,children:[r(f,{className:`h-3 w-3`}),n(`system.networkAddresses.clear`,`Clear`)]}),O&&r(F,{size:`sm`,variant:`secondary`,onClick:()=>{w(D)},disabled:m.isPending,children:n(`system.networkAddresses.discard`,`Discard`)}),e(F,{size:`sm`,variant:`primary`,onClick:()=>{m.mutate({addresses:[...C]})},disabled:!O||m.isPending,children:[r(te,{className:`h-3 w-3`}),m.isPending?n(`system.networkAddresses.saving`,`Saving…`):n(`common.save`,`Save`)]})]}),children:e(`div`,{className:u,children:[r(`p`,{className:`mb-3 text-xs text-foreground-subtle`,children:C.length===0?n(`system.networkAddresses.autoEveryNonLoopbackNon`,`Auto — every non-loopback / non-link-local interface participates.`):n(`system.networkAddresses.pinned`,`{{value1}} pinned`,{value1:String(C.length)})}),r(et,{mode:`multiple`,interfaces:g,value:C,onChange:w,disabled:m.isPending,emptyMessage:l.isLoading?n(`system.networkAddresses.loadingInterfaces`,`Loading interfaces…`):n(`system.networkAddresses.noInterfacesDetected`,`No interfaces detected.`)})]})}),r(at,{book:_.data,loading:_.isLoading,saving:S,error:x,onSetRole:e=>v.mutate({...e}),onAdd:(e,t)=>y.mutate({baseUrl:e,label:t}),onRemove:e=>b.mutate({baseUrl:e})})]})}o();var st={mesh:`bg-violet-500/15 text-violet-700 dark:text-violet-300`,public:`bg-blue-500/15 text-blue-700 dark:text-blue-300`},X=5e3,Z=`mesh-network`,ct=3e4,lt={joined:!1,meshIp:``,magicDnsHostname:``,peerCount:0,endpoints:[],tenantName:``,magicDnsSuffix:``,userLogin:null,controlPlaneUrl:``,keyExpiry:null};function ut(){let{t:e}=L(),n=N({capName:`mesh-network`},{refetchInterval:X}),i=M(void 0,{refetchInterval:X}),a=t(()=>W(i.data??[]),[i.data]),o=t(()=>(n.data??[]).map(e=>({addonId:e.addonId,displayName:a.get(e.addonId)??e.addonId,isActive:e.isActive})),[n.data,a]),s=[{id:Z,label:e(`system.meshNetworks.meshNetworks`,`Mesh networks`),install:{capability:Z,label:e(`system.meshNetworks.addMesh`,`Add mesh`)},entries:o.map(t=>({id:t.addonId,name:t.displayName,fallbackIcon:h,...U(t.isActive),render:()=>r(V,{addonId:t.addonId,displayName:t.displayName,capName:Z,isActive:t.isActive,badges:r(dt,{addonId:t.addonId}),primaryAction:r(ft,{addonId:t.addonId}),panels:[{id:`status`,title:e(`system.meshNetworks.status`,`Status`),icon:A,content:r(pt,{addonId:t.addonId})}]})}))}];return r(H,{embedded:!0,icon:A,title:e(`system.meshNetworks.meshNetworks2`,`Mesh Networks`),subtitle:e(`system.meshNetworks.privateVpnMeshesThatConnect`,`Private VPN meshes that connect CamStack to your other devices (Tailscale, Headscale, …). Each provider can also expose this hub publicly via its ingress (Tailscale Funnel).`),groups:s,isLoading:n.isLoading,emptyTitle:e(`system.meshNetworks.noMeshNetworkProvidersInstalled`,`No mesh-network providers installed`),emptyDescription:e(`system.meshNetworks.installAMeshAddonE`,`Install a mesh addon (e.g. @camstack/addon-tailscale) to join this hub into a private VPN mesh.`)})}function Q(e){let{data:t,isLoading:n}=Ae({addonId:e},{refetchInterval:X,retry:!1}),r=t?re.safeParse(t):null;return{status:r?.success?r.data:lt,isLoading:n}}function dt({addonId:t}){let{t:n}=L(),{status:i}=Q(t);return e(c,{children:[r(P,{variant:i.joined?`success`:`default`,className:Ve,children:i.joined?n(`system.meshNetworks.joined`,`Joined`):n(`system.meshNetworks.notJoined`,`Not joined`)}),i.joined&&r(P,{className:`text-[10px]`,children:n(`common.peers`,{count:i.peerCount})})]})}function ft({addonId:t}){let{t:i}=L(),o=s(),[l,u]=a(!1),[d,f]=a(null),p=S(),{status:m}=Q(t),h=n(()=>{o.invalidateQueries({queryKey:[[`meshNetwork`]]})},[o]),g=Ne(),_=Oe({onSuccess:h}),v=Se({onSuccess:h}),y=n(async()=>{u(!0);let e={cancelled:!1};f(e);try{let n=await g.mutateAsync({addonId:t});if(e.cancelled)return;n.loginUrl&&window.open(n.loginUrl,`_blank`,`noopener,noreferrer`);let r=Date.now();for(;!e.cancelled&&(await yt(2e3),!e.cancelled);){let e=await p.trpcClient.meshNetwork.getStatus.query({addonId:t}).catch(()=>null),n=e?re.safeParse(e):null;if(n?.success&&n.data.joined){h();break}if(Date.now()-r>6e5)break}}finally{u(!1),f(null)}},[t,h,g,p]),b=n(()=>{d&&(d.cancelled=!0),u(!1),f(null)},[d]);return r(c,{children:m.joined?e(c,{children:[e(F,{size:`sm`,variant:`secondary`,disabled:_.isPending,onClick:()=>_.mutate({addonId:t}),children:[_.isPending?r(T,{className:`h-3 w-3 animate-spin`}):r(oe,{className:`h-3 w-3`}),i(`system.meshNetworks.disconnect`,`Disconnect`)]}),e(F,{size:`sm`,variant:`ghost`,disabled:v.isPending,onClick:()=>v.mutate({addonId:t}),children:[v.isPending?r(T,{className:`h-3 w-3 animate-spin`}):r(C,{className:`h-3 w-3`}),i(`system.meshNetworks.logOut`,`Log out`)]})]}):l?e(F,{size:`sm`,variant:`ghost`,onClick:b,children:[r(w,{className:`h-3 w-3 mr-1`}),` `,i(`common.cancel`)]}):e(c,{children:[e(F,{size:`sm`,variant:`primary`,onClick:()=>void y(),children:[r(se,{className:`h-3 w-3`}),i(`system.meshNetworks.connect`,`Connect`)]}),e(F,{size:`sm`,variant:`ghost`,disabled:v.isPending,onClick:()=>v.mutate({addonId:t}),children:[v.isPending?r(T,{className:`h-3 w-3 animate-spin`}):r(C,{className:`h-3 w-3`}),i(`system.meshNetworks.logOut`,`Log out`)]})]})})}function pt({addonId:t}){let{t:n}=L(),{status:i}=Q(t),a=De({addonId:t},{refetchInterval:ct,retry:!1});return e(`div`,{className:`rounded-lg border border-border bg-surface`,children:[e(`div`,{className:`space-y-4 p-2 sm:p-4`,children:[i.error&&r(he,{message:i.error}),r(mt,{status:i}),i.endpoints.length>0&&e(`div`,{className:`space-y-1.5`,children:[r(`div`,{className:`text-[11px] font-semibold text-foreground-subtle uppercase tracking-wide`,children:n(`system.meshNetworks.endpoints`,`Endpoints`)}),i.endpoints.map(t=>e(`div`,{className:`flex items-center gap-2 text-xs flex-wrap`,children:[e(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium ${st[t.scope]??`bg-foreground-subtle/15 text-foreground-subtle`}`,children:[t.scope===`public`?r(j,{className:`inline h-2.5 w-2.5 mr-0.5`}):null,t.label]}),e(`a`,{href:t.url,target:`_blank`,rel:`noopener noreferrer`,className:`text-emerald-700 dark:text-emerald-300 hover:underline break-all flex items-center gap-1`,children:[r(E,{className:`h-3 w-3 shrink-0`}),t.url]})]},t.id))]})]}),r(`div`,{className:`border-t border-border`,children:r(gt,{peers:a.data?.peers??[],loading:a.isLoading})})]})}function mt({status:t}){let{t:n}=L();return r(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-1.5`,children:[{label:n(`system.meshNetworks.tenant`,`Tenant`),value:t.tenantName||`—`},{label:n(`system.meshNetworks.user`,`User`),value:t.userLogin??`—`},{label:n(`system.meshNetworks.controlPlane`,`Control plane`),value:t.controlPlaneUrl||`—`},{label:n(`system.meshNetworks.meshIp`,`Mesh IP`),value:t.meshIp||`—`,mono:!0},{label:n(`system.meshNetworks.magicdns`,`MagicDNS`),value:t.magicDnsHostname||`—`,mono:!0},{label:n(`system.meshNetworks.dnsSuffix`,`DNS suffix`),value:t.magicDnsSuffix||`—`,mono:!0},{label:n(`system.meshNetworks.peers`,`Peers`),value:String(t.peerCount)},{label:n(`system.meshNetworks.keyExpiry`,`Key expiry`),value:t.keyExpiry?ht(t.keyExpiry):`—`}].map(t=>e(`div`,{className:`flex items-baseline justify-between gap-3 text-xs`,children:[r(`span`,{className:`text-foreground-subtle shrink-0`,children:t.label}),r(`span`,{className:`text-foreground truncate ${t.mono?`font-mono`:``}`,children:t.value})]},t.label))})}function ht(e){let t=e-Date.now();if(t<0)return I.t(`system.meshNetworks.expiredAgo`,{when:$(e)});let n=Math.floor(t/864e5);if(n>60)return new Date(e).toLocaleDateString();if(n>1)return I.t(`system.meshNetworks.expiryDays`,{count:n});let r=Math.floor(t/36e5);return r>1?I.t(`system.meshNetworks.expiryHours`,{count:r}):I.t(`system.meshNetworks.expiryMin`,{count:Math.max(1,Math.floor(t/6e4))})}function gt({peers:i,loading:a}){let{t:o}=L(),s=t(()=>i.map(e=>({...e,_id:e.id})),[i]),c=n(e=>{e&&navigator.clipboard?.writeText(e)},[]),l=t(()=>[{key:`hostname`,header:o(`system.meshNetworks.hostname`,`Hostname`),render:t=>e(`div`,{className:`flex flex-col`,children:[e(`div`,{className:`flex items-center gap-1.5`,children:[r(`span`,{className:`font-medium text-foreground`,children:t.hostname||o(`system.meshNetworks.unknown`,`(unknown)`)}),t.isSelf&&r(P,{variant:`info`,children:o(`common.self`)}),t.exitNodeOption&&r(P,{variant:`warning`,children:`exit-node`})]}),t.userLogin&&r(`div`,{className:`text-[10px] text-foreground-subtle truncate`,children:t.userLogin})]})},{key:`magicDns`,header:o(`system.meshNetworks.magicdns`,`MagicDNS`),render:t=>t.magicDns?e(`div`,{className:`flex items-center gap-1`,children:[r(`span`,{className:`font-mono text-xs truncate`,children:t.magicDns}),r(`button`,{onClick:()=>c(t.magicDns),className:`p-0.5 hover:bg-foreground-subtle/10 rounded`,"aria-label":o(`system.meshNetworks.copyMagicdns`,`Copy MagicDNS`),children:r(b,{className:`h-3 w-3 text-foreground-subtle`})})]}):r(`span`,{className:`text-foreground-subtle`,children:`—`})},{key:`addresses`,header:`IP`,render:t=>{let n=t.addresses[0]??``;return n?e(`div`,{className:`flex items-center gap-1`,children:[r(`span`,{className:`font-mono text-xs`,children:n}),r(`button`,{onClick:()=>c(n),className:`p-0.5 hover:bg-foreground-subtle/10 rounded`,"aria-label":o(`system.meshNetworks.copyIp`,`Copy IP`),children:r(b,{className:`h-3 w-3 text-foreground-subtle`})})]}):r(`span`,{className:`text-foreground-subtle`,children:`—`})}},{key:`connection`,header:o(`system.meshNetworks.connection`,`Connection`),render:t=>e(`div`,{className:`flex items-center gap-1.5`,children:[r(P,{variant:_t(t.connection),children:t.connection}),t.relay&&r(`span`,{className:`text-[10px] text-foreground-subtle font-mono`,children:t.relay})]})},{key:`routes`,header:o(`system.meshNetworks.routes`,`Routes`),render:e=>e.advertisedRoutes.length>0?r(`span`,{className:`text-[10px] font-mono text-foreground-subtle truncate`,children:e.advertisedRoutes.join(`, `)}):r(`span`,{className:`text-foreground-subtle`,children:`—`})},{key:`tx`,header:o(`system.meshNetworks.txRx`,`TX / RX`),render:t=>e(`span`,{className:`text-[10px] text-foreground-subtle font-mono`,children:[`↑ `,vt(t.txBytes),` · ↓ `,vt(t.rxBytes)]})},{key:`lastSeen`,header:o(`system.meshNetworks.lastSeen`,`Last seen`),render:e=>r(`span`,{className:`text-[10px] text-foreground-subtle`,children:e.lastSeenMs>0?$(e.lastSeenMs):`—`})}],[c,o]);return a&&i.length===0?e(`div`,{className:`p-4 text-xs text-foreground-subtle`,children:[r(T,{className:`h-3 w-3 animate-spin inline mr-1`}),` `,o(`systemPage.meshNetworks.loadingPeers`)]}):i.length===0?r(`div`,{className:`p-4 text-xs text-foreground-subtle`,children:o(`system.meshNetworks.noPeersVisibleYourTailnet`,`No peers visible — your tailnet may be empty or the host is not joined.`)}):r(`div`,{className:`p-4`,children:r(ue,{columns:l,rows:s,rowKey:e=>e._id,minWidthPx:820})})}function _t(e){return e===`direct`?`success`:e===`relay`?`warning`:`info`}function vt(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${(e/1024/1024/1024).toFixed(2)}GB`}function $(e){let t=Date.now()-e;return t<6e4?I.t(`system.meshNetworks.justNow`):t<36e5?I.t(`system.meshNetworks.agoMin`,{count:Math.round(t/6e4)}):t<864e5?I.t(`system.meshNetworks.agoHour`,{count:Math.round(t/36e5)}):I.t(`system.meshNetworks.agoDay`,{count:Math.round(t/864e5)})}function yt(e){return new Promise(t=>setTimeout(t,e))}var bt=`/system/identity?tab=certificates`;function xt(){let{t}=L();return r(B,{embedded:!0,children:e(`div`,{className:g,children:[r(Be,{nodeId:`hub`,addonIds:[`local-network`],level:`global`,title:t(`system.localAccess.lanHttp`,`LAN HTTP`),description:t(`system.localAccess.nativeAppsOnThisWi`,`Native apps on this Wi-Fi use http:// and skip the private certificate. The tunnel and this admin UI stay on HTTPS.`)}),e(`p`,{className:`text-xs text-foreground-subtle`,"data-testid":`https-certificate-hint`,children:[t(`system.localAccess.certificateMoved`,`The HTTPS certificate and the local CA are managed under`),` `,r(Le,{className:`underline`,to:bt,children:t(`system.localAccess.certificateMovedLink`,`Identity → Certificates`)}),`.`]})]})})}o();function St({value:n,onChange:i}){let{t:a}=L(),{data:o}=me({isCamera:!0,projection:`slim`}),s=t(()=>o===void 0?[{value:``,label:a(`system.networkDiagnostics.loadingCameras`,`Loading cameras…`)}]:o.length===0?[{value:``,label:a(`system.networkDiagnostics.noCameras`,`No cameras`)}]:[{value:``,label:a(`system.networkDiagnostics.pickACamera`,`Pick a camera`)},...o.toSorted((e,t)=>e.name.localeCompare(t.name)).map(e=>({value:String(e.id),label:`${e.name} (#${String(e.id)})`}))],[o,a]);return e(`label`,{className:`flex min-w-0 flex-col gap-1`,children:[r(`span`,{className:`text-[11px] text-foreground-subtle`,children:a(`system.networkDiagnostics.camera`,`Camera`)}),r(le,{value:n===null?``:String(n),disabled:o===void 0||o.length===0,onChange:e=>i(e.target.value===``?null:Number(e.target.value)),options:s})]})}function Ct(){let t=S(),[i,o]=a(null);return r(B,{embedded:!0,children:e(`div`,{className:g,"data-testid":`network-diagnostics`,children:[r(fe,{loadServers:n(async()=>t.trpcClient.turnProvider.getTurnServers.query(),[t])}),r(be,{trpc:t.trpcClient,serverUrl:v(),deviceId:i,cameraField:r(St,{value:i,onChange:o})})]})})}var wt=[`certificate`,`certificates`,`https`];function Tt(){let{t:e}=L(),[t]=Re();if(wt.includes(t.get(`tab`)??``))return r(Ie,{to:bt,replace:!0});let n=Fe(`/system/network`,{t:e,isAdmin:!0})??{icon:j,title:e(`system.network`,`Network`)};return r(ze,{icon:n.icon,title:n.title,defaultSection:`addresses`,sectionsLabel:`${n.title} sections`,sections:[{id:`local-access`,label:e(`systemPage.network.localAccess`,`Local access`),content:r(xt,{})},{id:`addresses`,label:e(`systemPage.network.networkAddresses`,`Network Addresses`),content:r(ot,{})},{id:R.remoteAccess.tab,label:e(`systemPage.network.remoteAccess`,`Remote Access`),content:r(Ue,{}),ownedParams:z},{id:R.mesh.tab,label:e(`systemPage.network.meshNetworks`,`Mesh Networks`),content:r(ut,{}),ownedParams:z},{id:R.turn.tab,label:e(`systemPage.network.turnServers`,`TURN Servers`),content:r(Ye,{}),ownedParams:z},{id:`diagnostics`,label:e(`systemPage.network.diagnostics`,`Diagnostics`),content:r(Ct,{})}]})}export{Tt as NetworkPage};
@@ -1 +0,0 @@
1
- import{C as e,J as t,K as n,R as r,S as i,V as a,W as o,Y as s,et as c,i as l,j as u,o as d,p as f,t as p}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{dt as m}from"./player-overlays-DgedyCX9.js";import{Mo as h}from"./client-F3l12jEi.js";import{Hi as g,Mi as _,ji as v,la as y,no as ee,xt as te}from"./src-B0EA_4Ed.js";import{t as ne}from"./useTranslation-BJr-n0es.js";import{F as re,I as ie,L as b,nr as x}from"./index-CQ7TjSgs.js";c();var S=u(function({addonId:e,schema:s,serverValues:c,onImmediateSave:l,onStateChange:u,onAction:d,disabled:f},p){let m=x({schema:s,serverValues:c,onImmediateSave:r(t=>l(e,t),[e,l]),onDeferredSave:r(()=>{},[])});o(p,()=>({flush:()=>{let e={};for(let t of m.pendingKeys)e[t]=m.values[t];return m.handleDiscard(m.pendingKeys),e},discard:()=>m.resetAll()}),[m]);let h=m.pendingKeys,g=h.join(`|`),_=n(()=>h.map(e=>`${e}=${JSON.stringify(m.values[e])}`).join(`,`),[h,m.values]),v=t(u);a(()=>{v.current=u},[u]),a(()=>{let t={};for(let e of h)t[e]=m.values[e];v.current({addonId:e,pendingKeys:h,pendingValues:t})},[e,g,_]);let y=n(()=>{if(d)return(t,n,r)=>d(e,t,n,r)},[e,d]);return i(b,{schema:s,values:m.values,onChange:m.handleChange,disabled:f,onAction:y})});function C(e){return`perNode`in e&&e.perNode===!0}function w(e,t){if(e.type===`group`){let n=T(e.fields,t);return n.length>0?{...e,fields:n}:null}if(e.type===`sub-tabs`){let n=e.tabs.map(e=>({...e,fields:T(e.fields,t)})).filter(e=>e.fields.length>0);return n.length>0?{...e,tabs:n}:null}return C(e)===(t===`perNode`)?e:null}function T(e,t){let n=[];for(let r of e){let e=w(r,t);e!==null&&n.push(e)}return n}function ae(e,t){let n=[];for(let r of e.sections){let e=T(r.fields,t);e.length!==0&&n.push({...r,fields:e})}return{...e,sections:n}}function oe(e,t){let n=e??`general`;return t?.[n]??n}function E(e){return typeof e!=`object`||!e||!(`key`in e)?null:typeof e.key==`string`?e.key:null}function se(e,t){let n=t.fieldKeys===void 0?null:new Set(t.fieldKeys),r=[];for(let i of e){let e=n===null?i.fields:i.fields.filter(e=>{let t=E(e);return t!==null&&n.has(t)});e.length!==0&&r.push({...i,fields:e,...t.tabAliases===void 0?{}:{tab:oe(i.tab,t.tabAliases)},...t.hideSectionChrome===!0?{title:``,description:void 0}:{}})}return r}c();function D(e,t){if(e.type===`separator`||e.type===`info`||e.type===`button`)return e;if(e.type===`group`){let n=e.fields.map(e=>D(e,t));return{...e,fields:n}}let n=e;t[e.key]=n.value;let{value:r,...i}=n;return i}function O(e,t){return{...e,fields:e.fields.map(e=>D(e,t))}}function ce(e){let t={};return{schema:{...e.tabs?{tabs:e.tabs}:{},sections:e.sections.map(e=>O(e,t))},values:t}}function k({nodeId:a,addonIds:o,level:c,deviceId:u,capability:b,sectionIds:x,omitSectionIds:S,fieldKeys:C,hideSectionChrome:w,tabAliases:T,tabLabelOverrides:E,sectionTab:D,fieldScope:O,surface:k,emptyMessage:ue,extraTabs:A,schemaTabExtras:j,title:M,description:N,selfTabbed:de,activeTab:P,onActiveTabChange:fe}){let{t:F}=ne(),I=d(),L=m().trpcClient,R=_(),z=v(),pe=ee(),me=y(),B=de===!0||!!(A&&A.length>0),[he,ge]=s(null);if(c===`device`&&!u)throw Error(`NodeAddonsSettingsPanel: deviceId is required when level === "device"`);if(k!==void 0){if(c!==`global`||u!==void 0)throw Error(`NodeAddonsSettingsPanel: integration-level settings are addon-wide — they cannot be mounted at device level or with a deviceId. A second page, never a second scope.`);if(a!==null)throw Error(`NodeAddonsSettingsPanel: an integration has no node behind it — pass nodeId={null}. Received ${JSON.stringify(a)}.`);if(O!==void 0)throw Error("NodeAddonsSettingsPanel: integration-level settings arrive already cluster-scoped from core — remove `fieldScope` rather than restating it.")}let V=a??`hub`,H=l({queries:o.map(e=>({queryKey:[[`addonSettings`,k===void 0?c===`global`?`getGlobalSettings`:`getDeviceSettings`:`getIntegrationSettings`],{addonId:e,nodeId:V,deviceId:u??null,cap:b??null,scope:O??null}],queryFn:async()=>{let t=e=>e!==null&&O!==void 0?ae(e,O):e;return k===void 0?c===`global`?{addonId:e,result:t(await L.addonSettings.getGlobalSettings.query({addonId:e,nodeId:V,...b?{cap:b}:{}}))}:{addonId:e,result:t(await L.addonSettings.getDeviceSettings.query({addonId:e,deviceId:u,nodeId:V}))}:{addonId:e,result:await L.addonSettings.getIntegrationSettings.query({addonId:e,nodeId:V})}},placeholderData:f}))}),_e=H.some(e=>e.isLoading),ve=H.map(e=>{if(!e.data)return`-`;if(e.data.result===null)return`${e.data.addonId}:n`;let t=[];for(let n of e.data.result.sections){t.push(`s:${n.id}:${n.tab??`general`}`);for(let e of n.fields){if(!(`key`in e))continue;let n=`options`in e&&Array.isArray(e.options)?e.options.map(e=>e.value).join(`,`):``,r=e.value,i=r===void 0?``:typeof r==`string`?r:JSON.stringify(r);t.push(`f:${e.key}:${n}:${i}`)}}return`${e.data.addonId}:${t.join(`|`)}`}).join(`||`),U=n(()=>{let e=new Set;for(let t of H){let n=t.data?.result?.sections;if(n)for(let t of n)e.add(oe(t.tab,T))}return[...e]},[T,ve+`::`+H.map(e=>(e.data?.result?.sections??[]).map(e=>e.tab??`general`).join(`,`)).join(`::`)]),W=n(()=>new Map((A??[]).map(e=>[e.id,e])),[A]),G=n(()=>{if(!B)return[];let e=[...new Set([...U,...(A??[]).map(e=>e.id),...(j??[]).map(e=>e.tabId)])],t=e=>{let t=W.get(e);if(t?.order!==void 0)return t.order;let n=h[e];return n?n.order:50};return e.toSorted((e,n)=>{let r=t(e),i=t(n);return r===i?e.localeCompare(n):r-i})},[B,U,A,W,j]),ye=n(()=>{let e=new Map,t=e=>h[e]?.label??e.charAt(0).toUpperCase()+e.slice(1);for(let n of U)e.set(n,t(n));for(let n of j??[])e.has(n.tabId)||e.set(n.tabId,t(n.tabId));for(let t of A??[])e.set(t.id,t.label);for(let[t,n]of Object.entries(E??{}))e.set(t,n);return e},[U,A,j,E]),K=P===void 0?he:P,q=B?K&&G.includes(K)?K:G[0]??null:null,be=e=>{ge(e),fe?.(e)},xe=q!==null&&W.has(q),J=B?q&&!xe?q:void 0:D,{data:Se}=g(void 0),Ce=n(()=>{let e=new Map;for(let t of Se??[]){let n=t.manifest?.id;if(!n)continue;let r=t.manifest?.name??t.manifest?.packageDisplayName??n;e.set(n,r)}return e},[Se]),we=t(new Map),Y=n(()=>{let e=x?new Set(x):null,t=S?new Set(S):null,n=n=>!(e!==null&&!e.has(n)||t!==null&&t.has(n)),r=[];for(let e of H){if(!e.data)continue;let t=e.data.result??we.current.get(e.data.addonId)??null;if(e.data.result!==null&&we.current.set(e.data.addonId,e.data.result),t===null)continue;let{schema:i,values:a}=ce(t),o={...C===void 0?{}:{fieldKeys:C},...w===void 0?{}:{hideSectionChrome:w},...T===void 0?{}:{tabAliases:T}},s=se(i.sections.filter(e=>n(e.id)),o);if(s.length===0)continue;let c={...t,sections:se(t.sections.filter(e=>n(e.id)),o)},l={...i,sections:s};r.push({addonId:e.data.addonId,schemaWithValues:c,schema:l,serverValues:a})}return r},[ve,x,S,C,w,T]),[X,Te]=s(new Map),Ee=r(e=>{Te(t=>{let n=new Map(t);return n.set(e.addonId,e),n})},[]),Z=t(new Map),De=r(e=>t=>{t?Z.current.set(e,t):Z.current.delete(e)},[]),Oe=r(async(e,t)=>{c===`global`?await R.mutateAsync({addonId:e,nodeId:V,patch:t}):await z.mutateAsync({addonId:e,deviceId:u,nodeId:V,patch:t}),I.invalidateQueries({queryKey:[[`addonSettings`]]})},[R,z,V,c,u,I]),ke=r(async(e,t,n,r)=>{let i=V;try{switch(t){case`reprobe-hwaccel`:await pe.mutateAsync({nodeId:i}),I.invalidateQueries({queryKey:[[`addonSettings`]]});return;case`reprobe-audio-engine`:await me.mutateAsync({nodeId:i}),I.invalidateQueries({queryKey:[[`addonSettings`]]});return;default:{let n=await L.addons.custom.mutate({addonId:e,action:t,input:r});return I.invalidateQueries({queryKey:[[`addonSettings`]]}),n}}}catch(n){throw console.error(`[NodeAddonsSettingsPanel] action failed`,{addonId:e,action:t,err:n}),n}},[pe,me,V,I,L]),Ae=r((e,t)=>{Oe(e,t)},[Oe]),Q=p({mutationFn:async()=>{let e=[];for(let t of Y){let n=X.get(t.addonId);!n||n.pendingKeys.length===0||e.push({addonId:t.addonId,patch:n.pendingValues})}return e.length===0?{saved:[]}:{saved:await Promise.all(e.map(async({addonId:e,patch:t})=>(c===`global`?await R.mutateAsync({addonId:e,nodeId:V,patch:t}):await z.mutateAsync({addonId:e,deviceId:u,nodeId:V,patch:t}),e)))}},onSuccess:({saved:e})=>{for(let t of e)Z.current.get(t)?.discard();I.invalidateQueries({queryKey:[[`addonSettings`]]})}}),je=r(()=>{for(let e of Z.current.values())e.discard()},[]),Me=n(()=>{let e=0;for(let t of Y){let n=X.get(t.addonId);n&&(e+=n.pendingKeys.length)}return e},[Y,X]),Ne=n(()=>{let e=new Map;for(let t of Y){let n=X.get(t.addonId);if(!n||n.pendingKeys.length===0)continue;let r=new Set(n.pendingKeys);for(let n of t.schema.sections){let t=n.tab??`general`;for(let i of n.fields)`key`in i&&r.has(i.key)&&e.set(t,(e.get(t)??0)+1)}}return e},[Y,X]);if(_e)return i(`div`,{className:`h-24 rounded-lg border border-border bg-surface animate-pulse`});let $=q&&xe?W.get(q):void 0;if(!B&&Y.length===0)return i(`div`,{className:`text-[11px] text-foreground-subtle italic`,children:ue??F(`settings.nodeAddonsSettingsPanel.noAddonsIn`,{scope:o.length>0?`[${o.join(`, `)}]`:F(`settings.nodeAddonsSettingsPanel.theCurrentSelection`,`the current selection`),level:c})});let Pe=Q.isPending;return e(`div`,{className:`space-y-4`,children:[(M||N)&&e(`div`,{className:`border-b border-border pb-2`,children:[M&&i(`h2`,{className:`text-sm font-semibold text-foreground`,children:M}),N&&i(`p`,{className:`text-[11px] text-foreground-subtle mt-0.5`,children:N})]}),B&&i(re,{tabs:G.map(e=>({id:e,label:ye.get(e)??e})),activeId:q,onChange:be,pendingByTab:Ne}),Q.isError&&e(`div`,{className:`rounded-md border border-red-500/40 bg-red-500/10 px-3 py-2 text-[11px] text-red-400`,children:[F(`settings.nodeAddonsSettingsPanel.saveFailed`,`Save failed:`),` `,String(Q.error?.message??Q.error)]}),i(te,{tabKey:$?`extra:${q??``}`:`tab:${q??``}`,children:$?$.content:(()=>{let t=J?Y.reduce((e,t)=>e+t.schemaWithValues.sections.filter(e=>(e.tab??`general`)===J).length,0):0,n=!!J&&t<=1,r=Y.map(e=>({...e,renderedWithValues:{...e.schemaWithValues,sections:e.schemaWithValues.sections.filter(e=>J?(e.tab??`general`)===J:!0).map(e=>n?{...e,title:``,description:void 0}:e)}})).filter(e=>e.renderedWithValues.sections.length>0).toSorted((e,t)=>{let n=e=>{let t=1/0;for(let n of e)typeof n.order==`number`&&n.order<t&&(t=n.order);return t},r=n(e.renderedWithValues.sections),i=n(t.renderedWithValues.sections);return r===i?0:r-i}),a=(j??[]).filter(e=>e.tabId===J),o=a.filter(e=>(e.placement??`before`)===`before`),s=a.filter(e=>e.placement===`after`);return r.length===0&&a.length===0?i(`div`,{className:`text-[11px] text-foreground-subtle italic`,children:ue??F(`settings.nodeAddonsSettingsPanel.nothingToConfigureHereFor`,`Nothing to configure here for this node.`)}):e(`div`,{className:`space-y-6`,children:[o.map((e,t)=>i(`div`,{children:e.content},`extra-before-${t}`)),r.length>0&&i(le,{entries:r,paneStates:X,displayNames:Ce,disabled:Pe,setPaneRef:De,onPaneStateChange:Ee,onImmediateSave:Ae,onAction:ke,inline:B||!!D}),s.map((e,t)=>i(`div`,{children:e.content},`extra-after-${t}`))]})})()}),!_e&&i(ie,{pendingCount:Me,onSave:()=>Q.mutate(),onDiscard:je,saving:Pe})]})}function le({entries:t,paneStates:r,displayNames:o,disabled:c,setPaneRef:l,onPaneStateChange:u,onImmediateSave:d,onAction:f,inline:p}){let m=n(()=>[...t].toSorted((e,t)=>{if(e.addonId===`system-config`)return-1;if(t.addonId===`system-config`)return 1;let n=o.get(e.addonId)??e.addonId,r=o.get(t.addonId)??t.addonId;return n.localeCompare(r)}),[t,o]),[h,g]=s(m[0]?.addonId??``);a(()=>{m.length!==0&&(m.find(e=>e.addonId===h)||g(m[0].addonId))},[m,h]);let _=m.find(e=>e.addonId===h)??m[0];if(!_)return null;let v=n(()=>f?(e,t,n,r)=>f(e,t,n,r):void 0,[f]),y=e=>i(S,{ref:l(e.addonId),addonId:e.addonId,schema:e.renderedWithValues,serverValues:e.serverValues,onImmediateSave:d,onStateChange:u,onAction:v,disabled:c},e.addonId);return m.length===1||p?i(`div`,{className:`flex flex-col gap-4`,children:m.map(y)}):e(`div`,{className:`flex flex-col gap-3`,children:[i(`div`,{className:`flex flex-wrap items-center gap-1 border-b border-border shrink-0`,children:m.map(t=>{let n=o.get(t.addonId)??t.addonId,a=t.addonId===_.addonId,s=(r.get(t.addonId)?.pendingKeys.length??0)>0;return e(`button`,{type:`button`,onClick:()=>g(t.addonId),className:`relative px-3 py-1.5 text-xs font-medium rounded-t-md transition-colors -mb-px border-b-2 whitespace-nowrap ${a?`text-primary border-primary bg-primary/5`:`text-foreground-subtle border-transparent hover:text-foreground hover:bg-surface-hover`}`,children:[n,s&&i(`span`,{className:`ml-1.5 inline-flex h-1.5 w-1.5 rounded-full bg-amber-400`})]},t.addonId)})}),i(`div`,{className:`space-y-2`,children:m.map(e=>i(`div`,{style:e.addonId===_.addonId?void 0:{display:`none`},children:y(e)},e.addonId))})]})}export{k as t};