tassello 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +112 -8
  3. package/dist/server/behavior_tree_files.d.ts +0 -1
  4. package/dist/server/behavior_tree_files.js +2 -25
  5. package/dist/server/diagnostics.d.ts +16 -0
  6. package/dist/server/diagnostics.js +200 -0
  7. package/dist/server/diagnostics_state.d.ts +23 -0
  8. package/dist/server/diagnostics_state.js +146 -0
  9. package/dist/server/disks.d.ts +14 -0
  10. package/dist/server/disks.js +152 -0
  11. package/dist/server/file_manager.d.ts +25 -0
  12. package/dist/server/file_manager.js +717 -0
  13. package/dist/server/http.js +248 -5
  14. package/dist/server/netpbm.d.ts +3 -0
  15. package/dist/server/netpbm.js +69 -0
  16. package/dist/server/pty.d.ts +26 -0
  17. package/dist/server/pty.js +150 -0
  18. package/dist/server/server.js +9 -2
  19. package/dist/server/session.d.ts +7 -1
  20. package/dist/server/session.js +67 -1
  21. package/dist/server/terminal_output.d.ts +25 -0
  22. package/dist/server/terminal_output.js +108 -0
  23. package/dist/server/terminals.d.ts +32 -0
  24. package/dist/server/terminals.js +366 -0
  25. package/dist/server/util.d.ts +4 -0
  26. package/dist/server/util.js +45 -1
  27. package/dist/shared/file_manager.d.ts +130 -0
  28. package/dist/shared/file_manager.js +7 -0
  29. package/dist/shared/protocol.d.ts +87 -2
  30. package/dist/shared/protocol.js +8 -0
  31. package/dist/types/client/api.d.ts +22 -0
  32. package/dist/types/client/connection.d.ts +22 -1
  33. package/dist/types/client/icons.d.ts +27 -0
  34. package/dist/types/client/sdk/index.d.ts +4 -3
  35. package/dist/types/shared/file_manager.d.ts +130 -0
  36. package/dist/types/shared/protocol.d.ts +87 -2
  37. package/dist/www/assets/Joystick.js +1 -1
  38. package/dist/www/assets/RobotModelView.js +2 -2
  39. package/dist/www/assets/TerminalView.css +1 -0
  40. package/dist/www/assets/TerminalView.js +17 -0
  41. package/dist/www/assets/dialogs.js +1 -0
  42. package/dist/www/assets/icons.js +1 -1
  43. package/dist/www/assets/index.css +1 -1
  44. package/dist/www/assets/index.js +59 -19
  45. package/dist/www/assets/keys.js +3 -0
  46. package/dist/www/assets/shared/tassello-sdk.js +1 -1
  47. package/dist/www/index.html +2 -0
  48. package/docs/plugins.md +20 -0
  49. package/package.json +6 -2
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime.js";import{t}from"./react.js";import{h as n}from"./icons.js";import{t as r}from"./jsx-runtime.js";var i=e(t(),1),a=e(r(),1);function o({title:e,onClose:t,children:r,wide:o=!1,resizable:s=!1}){return(0,i.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,a.jsx)(`div`,{className:`modal-backdrop`,onPointerDown:e=>e.target===e.currentTarget&&t(),children:(0,a.jsxs)(`div`,{className:`modal${o?` wide`:``}${s?` resizable`:``}`,role:`dialog`,"aria-modal":`true`,"aria-label":e,children:[(0,a.jsxs)(`header`,{className:`modal-header`,children:[(0,a.jsx)(`h2`,{children:e}),(0,a.jsx)(`button`,{type:`button`,className:`icon-button`,"aria-label":`Close`,onClick:t,children:(0,a.jsx)(n,{})})]}),r]})})}var s=1,c=(0,i.createContext)(null);function l(){let e=(0,i.useContext)(c);if(!e)throw Error(`useDialogs() outside of <DialogProvider>`);return e}function u({children:e}){let[t,n]=(0,i.useState)(null),r=(0,i.useMemo)(()=>({confirm:e=>new Promise(t=>n({id:s++,kind:`confirm`,resolve:t,...e})),prompt:e=>new Promise(t=>n({id:s++,kind:`prompt`,resolve:t,...e}))}),[]);return(0,a.jsxs)(c.Provider,{value:r,children:[e,t&&(0,a.jsx)(d,{request:t,onDone:()=>n(null)},t.id)]})}function d({request:e,onDone:t}){let[n,r]=(0,i.useState)(e.kind===`prompt`?e.initial??``:``),s=(0,i.useRef)(null);(0,i.useEffect)(()=>s.current?.select(),[]);let c=r=>{e.kind===`confirm`?e.resolve(r):e.resolve(r&&n.trim()?n.trim():null),t()};return(0,a.jsx)(o,{title:e.title,onClose:()=>c(!1),children:(0,a.jsxs)(`form`,{className:`modal-body`,onSubmit:e=>{e.preventDefault(),c(!0)},children:[e.kind===`confirm`?e.message&&(0,a.jsx)(`div`,{className:`dialog-message`,children:e.message}):(0,a.jsxs)(`label`,{className:`field`,children:[(0,a.jsx)(`span`,{className:`field-label`,children:e.label}),(0,a.jsx)(`input`,{ref:s,value:n,onChange:e=>r(e.target.value),autoFocus:!0})]}),(0,a.jsxs)(`div`,{className:`modal-actions`,children:[(0,a.jsx)(`button`,{type:`button`,className:`button`,onClick:()=>c(!1),children:`Cancel`}),(0,a.jsx)(`button`,{type:`submit`,className:`button ${e.kind===`confirm`&&e.danger?`danger`:`primary`}`,disabled:e.kind===`prompt`&&!n.trim(),autoFocus:e.kind===`confirm`,children:e.confirmLabel??`OK`})]})]})})}export{o as n,l as r,u as t};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime.js";import{t}from"./react.js";import{t as n}from"./jsx-runtime.js";var r=e(t(),1),i=[`image/jpeg`,`image/png`],a=1e4,o=`X-Dashboard-Client`,s=500,c=5e3,l=1e4,u=5e3,ee=2e3,d=2e4;function f(e,t){return`${e}/${t}`}var p=new class{status=`connecting`;clientId=null;hostname=``;clockOffsetMs=0;ws=null;retryMs=s;statusListeners=new Set;messageListeners=new Set;subscriptions=new Map;nextId=1;results=new Map;requests=new Map;commands=new Map;commandListeners=new Set;connect(){let e=new WebSocket(`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`);e.binaryType=`arraybuffer`,this.ws=e,e.onmessage=t=>{typeof t.data==`string`?this.onMessage(JSON.parse(t.data)):this.onFrame(e,t.data)},e.onclose=()=>{this.ws===e&&(this.ws=null,this.setStatus(`closed`),this.requests.forEach(e=>e(`Disconnected from the robot`)),this.requests.clear(),this.results.forEach(({reject:e})=>e(Error(`Disconnected from the robot`))),this.results.clear(),setTimeout(()=>this.connect(),this.retryMs),this.retryMs=Math.min(c,this.retryMs*2))}}send(e){return this.ws?.readyState!==WebSocket.OPEN||this.status!==`open`?!1:(this.ws.send(JSON.stringify(e)),!0)}onStatusChange=e=>(this.statusListeners.add(e),()=>this.statusListeners.delete(e));onServerMessage(e){return this.messageListeners.add(e),()=>this.messageListeners.delete(e)}subscribeImage(e,t){return this.subscribe({type:`image.subscribe`,...e},{stream:t})}subscribeGrid(e,t){return this.subscribe({type:`grid.subscribe`,...e},{stream:t})}subscribeTf(e,t){return this.subscribe({type:`tf.subscribe`,...e},{tf:t})}subscribePath(e,t){return this.subscribe({type:`path.subscribe`,...e},{path:t})}subscribeTopic(e,t){return this.subscribe({type:`topic.subscribe`,...e},{topic:t})}subscribeServices(e,t){return this.subscribe({type:`services.subscribe`,...e},{services:t})}subscribeLogs(e,t){return this.subscribe({type:`logs.subscribe`,...e},{logs:t})}subscribeBehaviorTree(e,t){return this.subscribe({type:`bt.subscribe`,...e},{behaviorTree:t})}recordBehaviorTree(e,t){let n=this.nextId++,r=this.send({type:`bt.record`,id:n,topic:e,path:t});return this.result(n,r,d)}subscribeBehaviorTreePlayback(e,t){return{id:this.nextId,unsubscribe:this.subscribe({type:`bt.playback`,...e},{behaviorTree:t})}}controlBehaviorTreePlayback(e,t){return this.send({type:`bt.playback.control`,id:e,...t})}subscribeBehaviorTreeFile(e,t){return this.subscribe({type:`bt.file.subscribe`,...e},{behaviorTreeFile:t})}saveBehaviorTreeFile(e,t,n,r=!1){let i=this.nextId++,a=this.send({type:`bt.file.save`,id:i,path:e,text:t,base:n,create:r});return this.result(i,a,l)}subscribeRosout(e,t){return this.subscribe({type:`rosout.subscribe`,...e},{rosout:t})}serviceAction(e,t,n){let r=this.nextId++;return this.send({type:`service.action`,id:r,unit:e,scope:t,verb:n})?new Promise(e=>this.requests.set(r,e)):Promise.resolve(`Not connected to the robot`)}publish(e,t,n){return this.send({type:`ros.publish`,topic:e,messageType:t,message:n})}callService(e,t,n={},r=u){let i=this.nextId++,a=this.send({type:`ros.call`,id:i,service:e,serviceType:t,request:n,timeoutMs:r});return this.result(i,a,r+ee)}request(e,t,n=null,r=l){let i=this.nextId++,a=this.send({type:`plugin.request`,id:i,plugin:e,method:t,params:n});return this.result(i,a,r)}subscribePlugin(e,t,n,r){return this.subscribe({type:`plugin.subscribe`,plugin:e,stream:t,params:n},{plugin:r})}subscribeArm(e,t){return{id:this.nextId,unsubscribe:this.subscribe({type:`arm.subscribe`,...e},{arm:t})}}onCommandsChange=e=>(this.commandListeners.add(e),()=>this.commandListeners.delete(e));serverNow(){return Date.now()+this.clockOffsetMs}commandState(e,t){return this.commands.get(f(e,t))}result(e,t,n){return t?new Promise((t,r)=>{let i=setTimeout(()=>{this.results.delete(e),r(Error(`No answer from the robot`))},n);this.results.set(e,{resolve:e=>{clearTimeout(i),t(e)},reject:e=>{clearTimeout(i),r(e)}})}):Promise.reject(Error(`Not connected to the robot`))}subscribe(e,t){let n=this.nextId++;return this.subscriptions.set(n,{request:e,...t}),this.send({...e,id:n}),()=>{this.subscriptions.delete(n),this.send({type:`unsubscribe`,id:n})}}setStatus(e){this.status=e,this.statusListeners.forEach(e=>e())}onMessage(e){switch(e.type){case`hello`:this.clientId=e.clientId,this.hostname=e.hostname,this.clockOffsetMs=e.time-Date.now(),this.retryMs=s,this.setStatus(`open`);for(let[e,{request:t}]of this.subscriptions)this.send({...t,id:e});break;case`commands`:this.commands=new Map(e.states.map(e=>[f(e.panelId,e.widgetId),e])),this.commandListeners.forEach(e=>e());break;case`command`:this.commands=new Map(this.commands).set(f(e.state.panelId,e.state.widgetId),e.state),this.commandListeners.forEach(e=>e());break;case`stream.status`:{let t=this.subscriptions.get(e.id);(t?.stream??t?.topic??t?.behaviorTree??t?.rosout)?.status(e.state,e.message),t?.plugin?.status?.(e.state,e.message);break}case`message`:this.subscriptions.get(e.id)?.topic?.message(e.messageType,e.message);break;case`tf`:this.subscriptions.get(e.id)?.tf?.(e);break;case`path`:this.subscriptions.get(e.id)?.path?.(e);break;case`services`:this.subscriptions.get(e.id)?.services?.(e);break;case`logs`:this.subscriptions.get(e.id)?.logs?.(e);break;case`service.result`:this.requests.get(e.id)?.(e.error),this.requests.delete(e.id);break;case`arm`:this.subscriptions.get(e.id)?.arm?.(e);break;case`result`:{let t=this.results.get(e.id);this.results.delete(e.id),e.ok?t?.resolve(e.value):t?.reject(Error(e.error));break}case`plugin.data`:this.subscriptions.get(e.id)?.plugin?.data(e.data);break;case`bt.tree`:this.subscriptions.get(e.id)?.behaviorTree?.tree(e);break;case`bt`:this.subscriptions.get(e.id)?.behaviorTree?.update(e);break;case`bt.recording`:this.subscriptions.get(e.id)?.behaviorTree?.recording?.(e.recording);break;case`bt.playback.state`:this.subscriptions.get(e.id)?.behaviorTree?.playback?.(e);break;case`bt.file`:this.subscriptions.get(e.id)?.behaviorTreeFile?.file(e);break;case`bt.models`:this.subscriptions.get(e.id)?.behaviorTreeFile?.models(e);break;case`rosout`:this.subscriptions.get(e.id)?.rosout?.update(e)}this.messageListeners.forEach(t=>t(e))}onFrame(e,t){let n=new DataView(t,0,11),r=n.getUint32(0),a=this.subscriptions.get(r)?.stream;if(!a)return;let o=n.getUint16(9),s={width:n.getUint16(5),height:n.getUint16(7),meta:o?JSON.parse(new TextDecoder().decode(new Uint8Array(t,11,o))):null},c=new Blob([new Uint8Array(t,11+o)],{type:i[n.getUint8(4)]??`image/jpeg`});Promise.resolve().then(()=>a.frame(c,s)).catch(()=>{}).finally(()=>{this.ws===e&&this.subscriptions.has(r)&&this.send({type:`frame.ack`,id:r})})}};function m(){return(0,r.useSyncExternalStore)(p.onStatusChange,()=>p.status)}function h(e,t,n=10){let[i,a]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(a(null),e.trim()&&t.trim())return p.subscribeTf({targetFrame:e.trim(),sourceFrame:t.trim(),rate:n},a)},[e,t,n]),i}function g(e,t=10){let[n,i]=(0,r.useState)({message:null,messageType:null,status:`waiting`,error:``});return(0,r.useEffect)(()=>{if(i({message:null,messageType:null,status:`waiting`,error:``}),e.trim())return p.subscribeTopic({topic:e.trim(),maxRate:t},{status:(e,t)=>i(n=>({...n,status:e,error:t})),message:(e,t)=>i({message:t,messageType:e,status:`streaming`,error:``})})},[e,t]),n}function _(e,t){return(0,r.useSyncExternalStore)(p.onCommandsChange,()=>p.commandState(e,t))}var v=e(n(),1);function y(e){return function(t){return(0,v.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,...t,children:e})}}var b=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`4`,y:`8`,width:`16`,height:`12`,rx:`3`}),(0,v.jsx)(`path`,{d:`M12 8V4M9 4h6`}),(0,v.jsx)(`circle`,{cx:`9`,cy:`14`,r:`1.2`,fill:`currentColor`,stroke:`none`}),(0,v.jsx)(`circle`,{cx:`15`,cy:`14`,r:`1.2`,fill:`currentColor`,stroke:`none`}),(0,v.jsx)(`path`,{d:`M2 13v3M22 13v3`})]})),x=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`3`,y:`3`,width:`8`,height:`10`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`13`,y:`3`,width:`8`,height:`6`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`3`,y:`15`,width:`8`,height:`6`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`13`,y:`11`,width:`8`,height:`10`,rx:`1.5`})]})),S=y((0,v.jsx)(`path`,{d:`M12 5v14M5 12h14`})),C=y((0,v.jsx)(`path`,{d:`M18 6 6 18M6 6l12 12`})),w=y((0,v.jsx)(`path`,{d:`M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6M10 11v5M14 11v5`})),T=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`8`,y:`8`,width:`12`,height:`12`,rx:`2`}),(0,v.jsx)(`path`,{d:`M4 16V6a2 2 0 0 1 2-2h10`})]})),E=y((0,v.jsx)(`path`,{d:`M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11`})),D=y((0,v.jsx)(`path`,{d:`m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13`})),O=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`path`,{d:`M5 3h11l3 3v13a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V3Z`}),(0,v.jsx)(`path`,{d:`M8 3v5h7V3M8 21v-7h8v7`})]})),k=y((0,v.jsx)(`path`,{d:`m8 7-5 5 5 5M16 7l5 5-5 5M14 4l-4 16`})),A=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`5`,cy:`12`,r:`1`,fill:`currentColor`}),(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`1`,fill:`currentColor`}),(0,v.jsx)(`circle`,{cx:`19`,cy:`12`,r:`1`,fill:`currentColor`})]})),j=y((0,v.jsx)(`path`,{d:`M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6`})),M=y((0,v.jsx)(`path`,{d:`M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z`})),N=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`path`,{d:`M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z`}),(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`})]})),P=y((0,v.jsx)(`path`,{d:`M3 3l18 18M10.6 5.1A9.9 9.9 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-3.2 4.1M6.6 6.6C3.9 8.4 2 12 2 12s3.5 7 10 7a9.6 9.6 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2`})),F=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`7`,y:`2`,width:`10`,height:`20`,rx:`2`}),(0,v.jsx)(`path`,{d:`M11 18h2`})]})),I=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`4`,y:`2`,width:`16`,height:`20`,rx:`2`}),(0,v.jsx)(`path`,{d:`M11 18h2`})]})),L=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`13`,rx:`2`}),(0,v.jsx)(`path`,{d:`M8 21h8M12 17v4`})]})),R=y((0,v.jsx)(`path`,{d:`M21 12a9 9 0 1 1-2.6-6.4L21 8M21 3v5h-5`})),z=y((0,v.jsx)(`path`,{d:`M7 4.5v15l12-7.5L7 4.5Z`,fill:`currentColor`})),B=y((0,v.jsx)(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`1.5`,fill:`currentColor`})),V=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`16`,rx:`2`}),(0,v.jsx)(`circle`,{cx:`8.5`,cy:`9.5`,r:`1.5`}),(0,v.jsx)(`path`,{d:`m21 16-5-5-9 9`})]})),te=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1.5`}),(0,v.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1.5`})]})),H=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`2`,y:`6`,width:`20`,height:`12`,rx:`6`}),(0,v.jsx)(`path`,{d:`M6 12h4M8 10v4`}),(0,v.jsx)(`circle`,{cx:`15.5`,cy:`11`,r:`1`,fill:`currentColor`,stroke:`none`}),(0,v.jsx)(`circle`,{cx:`17.5`,cy:`13.5`,r:`1`,fill:`currentColor`,stroke:`none`})]})),U=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`}),(0,v.jsx)(`path`,{d:`m6 9 3 3-3 3M12 15h5`})]})),W=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`path`,{d:`m22 8-6 4 6 4V8Z`}),(0,v.jsx)(`rect`,{x:`2`,y:`6`,width:`14`,height:`12`,rx:`2`})]})),G=y((0,v.jsx)(`path`,{d:`M9 4 3 6v14l6-2 6 2 6-2V4l-6 2-6-2ZM9 4v14M15 6v14`})),K=y((0,v.jsx)(`path`,{d:`M5 21V4M5 4h12l-2.5 4.5L17 13H5`})),q=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`7`}),(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`2.5`,fill:`currentColor`,stroke:`none`}),(0,v.jsx)(`path`,{d:`M12 2v3M12 19v3M2 12h3M19 12h3`})]})),J=y((0,v.jsx)(`path`,{d:`M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3`})),Y=y((0,v.jsx)(`path`,{d:`m3 11 19-9-9 19-2-8-8-2Z`})),X=y((0,v.jsx)(`path`,{d:`M12 3v8M6.3 6.8a8 8 0 1 0 11.4 0`})),Z=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`path`,{d:`M4 21h9M8 21v-4.5l5-6.5 5 2.5M18 12.5l2.5-3M18 12.5l2 3`}),(0,v.jsx)(`circle`,{cx:`8`,cy:`16.5`,r:`1.6`}),(0,v.jsx)(`circle`,{cx:`13`,cy:`10`,r:`1.6`})]})),Q=y((0,v.jsx)(`path`,{d:`M4 20 18 6M4 20h16M11 20a7 7 0 0 0-2.1-5`})),ne=y((0,v.jsx)(`path`,{d:`M12 2 3 7v10l9 5 9-5V7l-9-5ZM3 7l9 5 9-5M12 12v10`})),re=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,v.jsx)(`path`,{d:`M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01`})]})),ie=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`5`,rx:`1.2`}),(0,v.jsx)(`rect`,{x:`3`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,v.jsx)(`rect`,{x:`15`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,v.jsx)(`path`,{d:`M12 8v4M6 16v-4h12v4`})]})),ae=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`5`,rx:`1.2`}),(0,v.jsx)(`rect`,{x:`3`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,v.jsx)(`path`,{d:`M12 8v4M6 16v-4h7`}),(0,v.jsx)(`path`,{d:`M19.2 11.8a1.6 1.6 0 0 1 2.3 2.3L15.8 19.8l-3 .7.7-3Z`})]})),oe=y((0,v.jsx)(`path`,{d:`M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01`})),se=y((0,v.jsx)(`path`,{d:`M3 12a9 9 0 1 0 2.6-6.4L3 8M3 3v5h5M12 7v5l3 2`})),ce=y((0,v.jsx)(`path`,{d:`M4 12h15M13 6l6 6-6 6`})),le=y((0,v.jsx)(`path`,{d:`M8.5 8.5a3.5 3.5 0 1 1 5 3.2c-.9.4-1.5 1.3-1.5 2.3v.5M12 19.5h.01`})),ue=y((0,v.jsx)(`path`,{d:`M4 8h13M4 16h13M14 4l4 4-4 4M14 12l4 4-4 4`})),de=y((0,v.jsx)(`path`,{d:`M12 3v7M12 10l-6 7v4M12 10l6 7v4`})),fe=y((0,v.jsx)(`path`,{d:`m12 3 9 9-9 9-9-9 9-9Z`})),pe=y((0,v.jsx)(`path`,{d:`M13 2 4.5 13.5H11L10 22l8.5-11.5H12L13 2Z`})),$=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,v.jsx)(`path`,{d:`m8 12.5 2.8 2.8L16 9.8`})]})),me=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`4.5`,fill:`currentColor`,stroke:`none`})]})),he=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`6`,y:`5`,width:`4`,height:`14`,rx:`1`,fill:`currentColor`,stroke:`none`}),(0,v.jsx)(`rect`,{x:`14`,y:`5`,width:`4`,height:`14`,rx:`1`,fill:`currentColor`,stroke:`none`})]})),ge=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`16`,rx:`2`}),(0,v.jsx)(`path`,{d:`M7 4v16M17 4v16M3 9h4M3 15h4M17 9h4M17 15h4`})]})),_e=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,v.jsx)(`path`,{d:`M7 8h10M7 12h6M7 16h8`}),(0,v.jsx)(`circle`,{cx:`17.5`,cy:`16`,r:`1`,fill:`currentColor`,stroke:`none`})]})),ve=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`6`,cy:`6`,r:`2.5`}),(0,v.jsx)(`circle`,{cx:`18`,cy:`9`,r:`2.5`}),(0,v.jsx)(`circle`,{cx:`9`,cy:`18`,r:`2.5`}),(0,v.jsx)(`path`,{d:`M8.4 6.7 15.6 8.4M16.5 11.1l-5.6 5.1M6.6 8.4l1.8 7.1`})]})),ye=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`11`,cy:`11`,r:`6.5`}),(0,v.jsx)(`path`,{d:`m20 20-4.3-4.3`})]})),be=y((0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),(0,v.jsx)(`path`,{d:`m6 6 12 12`})]})),xe=y((0,v.jsx)(`path`,{d:`M3 5h18l-7 8.5V19l-4 2v-7.5L3 5Z`})),Se=y((0,v.jsx)(`path`,{d:`M12 3v12M7 10l5 5 5-5M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4`})),Ce=y((0,v.jsx)(`path`,{d:`M12 4v12M7 11l5 5 5-5M5 20h14`}));export{U as $,G as A,X as B,de as C,oe as D,V as E,he as F,R as G,le as H,M as I,ye as J,b as K,F as L,Y as M,ve as N,q as O,ue as P,x as Q,z as R,K as S,se as T,me as U,re as V,D as W,B as X,j as Y,I as Z,N as _,ce as a,_ as at,xe as b,W as c,g as ct,k as d,w as et,T as f,Se as g,fe as h,Ce as i,p as it,A as j,_e as k,$ as l,o as lt,L as m,te as n,ie as nt,be as o,m as ot,ne as p,O as q,Z as r,E as rt,pe as s,h as st,Q as t,ae as tt,C as u,a as ut,P as v,H as w,J as x,ge as y,S as z};
1
+ import{n as e}from"./rolldown-runtime.js";import{t}from"./react.js";import{t as n}from"./jsx-runtime.js";var r=e(t(),1),i=[`image/jpeg`,`image/png`],a=1e4,o=1e3,s=2e3,c=`X-Dashboard-Client`,l=500,ee=5e3,u=1e4,d=5e3,f=2e3,p=2e4,te=65536;function m(e,t){return`${e}/${t}`}var h=new class{status=`connecting`;clientId=null;hostname=``;clockOffsetMs=0;ws=null;retryMs=l;statusListeners=new Set;messageListeners=new Set;subscriptions=new Map;nextId=1;results=new Map;requests=new Map;commands=new Map;commandListeners=new Set;connect(){let e=new WebSocket(`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`);e.binaryType=`arraybuffer`,this.ws=e,e.onmessage=t=>{typeof t.data==`string`?this.onMessage(JSON.parse(t.data)):this.onFrame(e,t.data)},e.onclose=()=>{this.ws===e&&(this.ws=null,this.setStatus(`closed`),this.requests.forEach(e=>e(`Disconnected from the robot`)),this.requests.clear(),this.results.forEach(({reject:e})=>e(Error(`Disconnected from the robot`))),this.results.clear(),setTimeout(()=>this.connect(),this.retryMs),this.retryMs=Math.min(ee,this.retryMs*2))}}send(e){return this.ws?.readyState!==WebSocket.OPEN||this.status!==`open`?!1:(this.ws.send(JSON.stringify(e)),!0)}onStatusChange=e=>(this.statusListeners.add(e),()=>this.statusListeners.delete(e));onServerMessage(e){return this.messageListeners.add(e),()=>this.messageListeners.delete(e)}subscribeImage(e,t){return this.subscribe({type:`image.subscribe`,...e},{stream:t})}subscribeGrid(e,t){return this.subscribe({type:`grid.subscribe`,...e},{stream:t})}subscribeTf(e,t){return this.subscribe({type:`tf.subscribe`,...e},{tf:t})}subscribePath(e,t){return this.subscribe({type:`path.subscribe`,...e},{path:t})}subscribeTopic(e,t){return this.subscribe({type:`topic.subscribe`,...e},{topic:t})}subscribeServices(e,t){return this.subscribe({type:`services.subscribe`,...e},{services:t})}subscribeLogs(e,t){return this.subscribe({type:`logs.subscribe`,...e},{logs:t})}subscribeBehaviorTree(e,t){return this.subscribe({type:`bt.subscribe`,...e},{behaviorTree:t})}recordBehaviorTree(e,t){let n=this.nextId++,r=this.send({type:`bt.record`,id:n,topic:e,path:t});return this.result(n,r,p)}subscribeBehaviorTreePlayback(e,t){return{id:this.nextId,unsubscribe:this.subscribe({type:`bt.playback`,...e},{behaviorTree:t})}}controlBehaviorTreePlayback(e,t){return this.send({type:`bt.playback.control`,id:e,...t})}subscribeBehaviorTreeFile(e,t){return this.subscribe({type:`bt.file.subscribe`,...e},{behaviorTreeFile:t})}saveBehaviorTreeFile(e,t,n,r=!1){let i=this.nextId++,a=this.send({type:`bt.file.save`,id:i,path:e,text:t,base:n,create:r});return this.result(i,a,u)}subscribeRosout(e,t){return this.subscribe({type:`rosout.subscribe`,...e},{rosout:t})}subscribeDiagnostics(e,t){return this.subscribe({type:`diagnostics.subscribe`,...e},{diagnostics:t})}subscribeTerminal(e,t){return{id:this.nextId,unsubscribe:this.subscribe(()=>({type:`terminal.open`,...e,...t.shown()}),{terminal:t})}}terminalInput(e,t){for(let n=0;n<t.length;){let r=Math.min(t.length,n+te),i=t.charCodeAt(r-1);if(r<t.length&&i>=55296&&i<=56319&&r--,!this.send({type:`terminal.input`,id:e,data:t.slice(n,r)}))return!1;n=r}return!0}resizeTerminal(e,t,n){return this.send({type:`terminal.resize`,id:e,cols:t,rows:n})}ackTerminal(e,t,n){return this.send({type:`terminal.ack`,id:e,started:t,offset:n})}restartTerminal(e){return this.send({type:`terminal.restart`,id:e})}serviceAction(e,t,n){let r=this.nextId++;return this.send({type:`service.action`,id:r,unit:e,scope:t,verb:n})?new Promise(e=>this.requests.set(r,e)):Promise.resolve(`Not connected to the robot`)}publish(e,t,n){return this.send({type:`ros.publish`,topic:e,messageType:t,message:n})}callService(e,t,n={},r=d){let i=this.nextId++,a=this.send({type:`ros.call`,id:i,service:e,serviceType:t,request:n,timeoutMs:r});return this.result(i,a,r+f)}request(e,t,n=null,r=u){let i=this.nextId++,a=this.send({type:`plugin.request`,id:i,plugin:e,method:t,params:n});return this.result(i,a,r)}subscribePlugin(e,t,n,r){return this.subscribe({type:`plugin.subscribe`,plugin:e,stream:t,params:n},{plugin:r})}subscribeArm(e,t){return{id:this.nextId,unsubscribe:this.subscribe({type:`arm.subscribe`,...e},{arm:t})}}onCommandsChange=e=>(this.commandListeners.add(e),()=>this.commandListeners.delete(e));serverNow(){return Date.now()+this.clockOffsetMs}commandState(e,t){return this.commands.get(m(e,t))}result(e,t,n){return t?new Promise((t,r)=>{let i=setTimeout(()=>{this.results.delete(e),r(Error(`No answer from the robot`))},n);this.results.set(e,{resolve:e=>{clearTimeout(i),t(e)},reject:e=>{clearTimeout(i),r(e)}})}):Promise.reject(Error(`Not connected to the robot`))}subscribe(e,t){let n=this.nextId++;return this.subscriptions.set(n,{request:e,...t}),this.send({...typeof e==`function`?e():e,id:n}),()=>{this.subscriptions.delete(n),this.send({type:`unsubscribe`,id:n})}}setStatus(e){this.status=e,this.statusListeners.forEach(e=>e())}onMessage(e){switch(e.type){case`hello`:this.clientId=e.clientId,this.hostname=e.hostname,this.clockOffsetMs=e.time-Date.now(),this.retryMs=l,this.setStatus(`open`);for(let[e,{request:t}]of this.subscriptions)this.send({...typeof t==`function`?t():t,id:e});break;case`commands`:this.commands=new Map(e.states.map(e=>[m(e.panelId,e.widgetId),e])),this.commandListeners.forEach(e=>e());break;case`command`:this.commands=new Map(this.commands).set(m(e.state.panelId,e.state.widgetId),e.state),this.commandListeners.forEach(e=>e());break;case`stream.status`:{let t=this.subscriptions.get(e.id);(t?.stream??t?.topic??t?.behaviorTree??t?.rosout??t?.diagnostics??t?.terminal)?.status(e.state,e.message),t?.plugin?.status?.(e.state,e.message);break}case`message`:this.subscriptions.get(e.id)?.topic?.message(e.messageType,e.message);break;case`tf`:this.subscriptions.get(e.id)?.tf?.(e);break;case`path`:this.subscriptions.get(e.id)?.path?.(e);break;case`services`:this.subscriptions.get(e.id)?.services?.(e);break;case`logs`:this.subscriptions.get(e.id)?.logs?.(e);break;case`service.result`:this.requests.get(e.id)?.(e.error),this.requests.delete(e.id);break;case`arm`:this.subscriptions.get(e.id)?.arm?.(e);break;case`result`:{let t=this.results.get(e.id);this.results.delete(e.id),e.ok?t?.resolve(e.value):t?.reject(Error(e.error));break}case`plugin.data`:this.subscriptions.get(e.id)?.plugin?.data(e.data);break;case`bt.tree`:this.subscriptions.get(e.id)?.behaviorTree?.tree(e);break;case`bt`:this.subscriptions.get(e.id)?.behaviorTree?.update(e);break;case`bt.recording`:this.subscriptions.get(e.id)?.behaviorTree?.recording?.(e.recording);break;case`bt.playback.state`:this.subscriptions.get(e.id)?.behaviorTree?.playback?.(e);break;case`bt.file`:this.subscriptions.get(e.id)?.behaviorTreeFile?.file(e);break;case`bt.models`:this.subscriptions.get(e.id)?.behaviorTreeFile?.models(e);break;case`rosout`:this.subscriptions.get(e.id)?.rosout?.update(e);break;case`diagnostics`:this.subscriptions.get(e.id)?.diagnostics?.update(e);break;case`terminal.output`:this.subscriptions.get(e.id)?.terminal?.output(e);break;case`terminal.exit`:this.subscriptions.get(e.id)?.terminal?.exit(e)}this.messageListeners.forEach(t=>t(e))}onFrame(e,t){let n=new DataView(t,0,11),r=n.getUint32(0),a=this.subscriptions.get(r)?.stream;if(!a)return;let o=n.getUint16(9),s={width:n.getUint16(5),height:n.getUint16(7),meta:o?JSON.parse(new TextDecoder().decode(new Uint8Array(t,11,o))):null},c=new Blob([new Uint8Array(t,11+o)],{type:i[n.getUint8(4)]??`image/jpeg`});Promise.resolve().then(()=>a.frame(c,s)).catch(()=>{}).finally(()=>{this.ws===e&&this.subscriptions.has(r)&&this.send({type:`frame.ack`,id:r})})}};function g(){return(0,r.useSyncExternalStore)(h.onStatusChange,()=>h.status)}function _(e,t,n=10){let[i,a]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(a(null),e.trim()&&t.trim())return h.subscribeTf({targetFrame:e.trim(),sourceFrame:t.trim(),rate:n},a)},[e,t,n]),i}function v(e,t=10){let[n,i]=(0,r.useState)({message:null,messageType:null,status:`waiting`,error:``});return(0,r.useEffect)(()=>{if(i({message:null,messageType:null,status:`waiting`,error:``}),e.trim())return h.subscribeTopic({topic:e.trim(),maxRate:t},{status:(e,t)=>i(n=>({...n,status:e,error:t})),message:(e,t)=>i({message:t,messageType:e,status:`streaming`,error:``})})},[e,t]),n}function y(e,t){return(0,r.useSyncExternalStore)(h.onCommandsChange,()=>h.commandState(e,t))}var b=e(n(),1);function x(e){return function(t){return(0,b.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,...t,children:e})}}var S=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`4`,y:`8`,width:`16`,height:`12`,rx:`3`}),(0,b.jsx)(`path`,{d:`M12 8V4M9 4h6`}),(0,b.jsx)(`circle`,{cx:`9`,cy:`14`,r:`1.2`,fill:`currentColor`,stroke:`none`}),(0,b.jsx)(`circle`,{cx:`15`,cy:`14`,r:`1.2`,fill:`currentColor`,stroke:`none`}),(0,b.jsx)(`path`,{d:`M2 13v3M22 13v3`})]})),C=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`8`,height:`10`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`13`,y:`3`,width:`8`,height:`6`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`3`,y:`15`,width:`8`,height:`6`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`13`,y:`11`,width:`8`,height:`10`,rx:`1.5`})]})),w=x((0,b.jsx)(`path`,{d:`M12 5v14M5 12h14`})),T=x((0,b.jsx)(`path`,{d:`M18 6 6 18M6 6l12 12`})),E=x((0,b.jsx)(`path`,{d:`M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6M10 11v5M14 11v5`})),D=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`8`,y:`8`,width:`12`,height:`12`,rx:`2`}),(0,b.jsx)(`path`,{d:`M4 16V6a2 2 0 0 1 2-2h10`})]})),O=x((0,b.jsx)(`path`,{d:`M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11`})),k=x((0,b.jsx)(`path`,{d:`m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13`})),A=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`path`,{d:`M5 3h11l3 3v13a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V3Z`}),(0,b.jsx)(`path`,{d:`M8 3v5h7V3M8 21v-7h8v7`})]})),j=x((0,b.jsx)(`path`,{d:`m8 7-5 5 5 5M16 7l5 5-5 5M14 4l-4 16`})),M=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`5`,cy:`12`,r:`1`,fill:`currentColor`}),(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`1`,fill:`currentColor`}),(0,b.jsx)(`circle`,{cx:`19`,cy:`12`,r:`1`,fill:`currentColor`})]})),N=x((0,b.jsx)(`path`,{d:`M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6`})),P=x((0,b.jsx)(`path`,{d:`M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z`})),F=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`path`,{d:`M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z`}),(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`})]})),I=x((0,b.jsx)(`path`,{d:`M3 3l18 18M10.6 5.1A9.9 9.9 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-3.2 4.1M6.6 6.6C3.9 8.4 2 12 2 12s3.5 7 10 7a9.6 9.6 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2`})),L=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`7`,y:`2`,width:`10`,height:`20`,rx:`2`}),(0,b.jsx)(`path`,{d:`M11 18h2`})]})),R=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`4`,y:`2`,width:`16`,height:`20`,rx:`2`}),(0,b.jsx)(`path`,{d:`M11 18h2`})]})),z=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`13`,rx:`2`}),(0,b.jsx)(`path`,{d:`M8 21h8M12 17v4`})]})),B=x((0,b.jsx)(`path`,{d:`M21 12a9 9 0 1 1-2.6-6.4L21 8M21 3v5h-5`})),V=x((0,b.jsx)(`path`,{d:`M7 4.5v15l12-7.5L7 4.5Z`,fill:`currentColor`})),H=x((0,b.jsx)(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`1.5`,fill:`currentColor`})),U=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`16`,rx:`2`}),(0,b.jsx)(`circle`,{cx:`8.5`,cy:`9.5`,r:`1.5`}),(0,b.jsx)(`path`,{d:`m21 16-5-5-9 9`})]})),W=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1.5`}),(0,b.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1.5`})]})),G=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`2`,y:`6`,width:`20`,height:`12`,rx:`6`}),(0,b.jsx)(`path`,{d:`M6 12h4M8 10v4`}),(0,b.jsx)(`circle`,{cx:`15.5`,cy:`11`,r:`1`,fill:`currentColor`,stroke:`none`}),(0,b.jsx)(`circle`,{cx:`17.5`,cy:`13.5`,r:`1`,fill:`currentColor`,stroke:`none`})]})),K=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`}),(0,b.jsx)(`path`,{d:`m6 9 3 3-3 3M12 15h5`})]})),q=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`path`,{d:`m22 8-6 4 6 4V8Z`}),(0,b.jsx)(`rect`,{x:`2`,y:`6`,width:`14`,height:`12`,rx:`2`})]})),J=x((0,b.jsx)(`path`,{d:`M9 4 3 6v14l6-2 6 2 6-2V4l-6 2-6-2ZM9 4v14M15 6v14`})),Y=x((0,b.jsx)(`path`,{d:`M5 21V4M5 4h12l-2.5 4.5L17 13H5`})),X=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`7`}),(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`2.5`,fill:`currentColor`,stroke:`none`}),(0,b.jsx)(`path`,{d:`M12 2v3M12 19v3M2 12h3M19 12h3`})]})),Z=x((0,b.jsx)(`path`,{d:`M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3`})),Q=x((0,b.jsx)(`path`,{d:`m3 11 19-9-9 19-2-8-8-2Z`})),ne=x((0,b.jsx)(`path`,{d:`M12 3v8M6.3 6.8a8 8 0 1 0 11.4 0`})),re=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`path`,{d:`M4 21h9M8 21v-4.5l5-6.5 5 2.5M18 12.5l2.5-3M18 12.5l2 3`}),(0,b.jsx)(`circle`,{cx:`8`,cy:`16.5`,r:`1.6`}),(0,b.jsx)(`circle`,{cx:`13`,cy:`10`,r:`1.6`})]})),ie=x((0,b.jsx)(`path`,{d:`M4 20 18 6M4 20h16M11 20a7 7 0 0 0-2.1-5`})),ae=x((0,b.jsx)(`path`,{d:`M12 2 3 7v10l9 5 9-5V7l-9-5ZM3 7l9 5 9-5M12 12v10`})),oe=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01`})]})),se=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`5`,rx:`1.2`}),(0,b.jsx)(`rect`,{x:`3`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,b.jsx)(`rect`,{x:`15`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,b.jsx)(`path`,{d:`M12 8v4M6 16v-4h12v4`})]})),ce=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`5`,rx:`1.2`}),(0,b.jsx)(`rect`,{x:`3`,y:`16`,width:`6`,height:`5`,rx:`1.2`}),(0,b.jsx)(`path`,{d:`M12 8v4M6 16v-4h7`}),(0,b.jsx)(`path`,{d:`M19.2 11.8a1.6 1.6 0 0 1 2.3 2.3L15.8 19.8l-3 .7.7-3Z`})]})),le=x((0,b.jsx)(`path`,{d:`M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01`})),ue=x((0,b.jsx)(`path`,{d:`M3 12a9 9 0 1 0 2.6-6.4L3 8M3 3v5h5M12 7v5l3 2`})),de=x((0,b.jsx)(`path`,{d:`M4 12h15M13 6l6 6-6 6`})),fe=x((0,b.jsx)(`path`,{d:`M8.5 8.5a3.5 3.5 0 1 1 5 3.2c-.9.4-1.5 1.3-1.5 2.3v.5M12 19.5h.01`})),pe=x((0,b.jsx)(`path`,{d:`M4 8h13M4 16h13M14 4l4 4-4 4M14 12l4 4-4 4`})),me=x((0,b.jsx)(`path`,{d:`M12 3v7M12 10l-6 7v4M12 10l6 7v4`})),he=x((0,b.jsx)(`path`,{d:`m12 3 9 9-9 9-9-9 9-9Z`})),ge=x((0,b.jsx)(`path`,{d:`M13 2 4.5 13.5H11L10 22l8.5-11.5H12L13 2Z`})),_e=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,b.jsx)(`path`,{d:`m8 12.5 2.8 2.8L16 9.8`})]})),ve=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`4.5`,fill:`currentColor`,stroke:`none`})]})),ye=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`6`,y:`5`,width:`4`,height:`14`,rx:`1`,fill:`currentColor`,stroke:`none`}),(0,b.jsx)(`rect`,{x:`14`,y:`5`,width:`4`,height:`14`,rx:`1`,fill:`currentColor`,stroke:`none`})]})),be=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`16`,rx:`2`}),(0,b.jsx)(`path`,{d:`M7 4v16M17 4v16M3 9h4M3 15h4M17 9h4M17 15h4`})]})),xe=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,b.jsx)(`path`,{d:`M7 8h10M7 12h6M7 16h8`}),(0,b.jsx)(`circle`,{cx:`17.5`,cy:`16`,r:`1`,fill:`currentColor`,stroke:`none`})]})),Se=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`6`,cy:`6`,r:`2.5`}),(0,b.jsx)(`circle`,{cx:`18`,cy:`9`,r:`2.5`}),(0,b.jsx)(`circle`,{cx:`9`,cy:`18`,r:`2.5`}),(0,b.jsx)(`path`,{d:`M8.4 6.7 15.6 8.4M16.5 11.1l-5.6 5.1M6.6 8.4l1.8 7.1`})]})),Ce=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`6.5`}),(0,b.jsx)(`path`,{d:`m20 20-4.3-4.3`})]})),we=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),(0,b.jsx)(`path`,{d:`m6 6 12 12`})]})),Te=x((0,b.jsx)(`path`,{d:`M3 5h18l-7 8.5V19l-4 2v-7.5L3 5Z`})),Ee=x((0,b.jsx)(`path`,{d:`M12 3v12M7 10l5 5 5-5M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4`})),De=x((0,b.jsx)(`path`,{d:`M12 4v12M7 11l5 5 5-5M5 20h14`})),Oe=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,b.jsx)(`path`,{d:`M6.5 12.5h2.5l1.8-4.5 2.6 8 1.8-3.5h2.3`})]})),ke=x((0,b.jsx)(`path`,{d:`m7 15 5 5 5-5M7 9l5-5 5 5`})),Ae=x((0,b.jsx)(`path`,{d:`M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z`})),je=x((0,b.jsx)(`path`,{d:`M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7ZM12 10.5v5M9.5 13h5`})),Me=x((0,b.jsx)(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5ZM14 3v5h5`})),Ne=x((0,b.jsx)(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5ZM14 3v5h5M9 13h6M9 17h6`})),Pe=x((0,b.jsx)(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5ZM14 3v5h5M12 11.5v6M9 14.5h6`})),Fe=x((0,b.jsx)(`path`,{d:`M12 15V3M7 8l5-5 5 5M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4`})),Ie=x((0,b.jsx)(`path`,{d:`M12 20V5M6 11l6-6 6 6`})),Le=x((0,b.jsx)(`path`,{d:`M20 12H5M11 6l-6 6 6 6`})),Re=x((0,b.jsx)(`path`,{d:`m3 11 9-8 9 8M5 9.5V20h5v-6h4v6h5V9.5`})),ze=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`2.5`,y:`13`,width:`19`,height:`8`,rx:`2`}),(0,b.jsx)(`path`,{d:`M5.5 13 8 4h8l2.5 9M6.5 17h.01M10 17h.01`})]})),Be=x((0,b.jsx)(`path`,{d:`M6 3h12v18l-6-4.5L6 21V3Z`})),Ve=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`16`,rx:`2`}),(0,b.jsx)(`path`,{d:`M9 4v16`})]})),$=x((0,b.jsx)(`path`,{d:`M21 12A9 9 0 1 1 12 3v9h9ZM15 3.5A9 9 0 0 1 20.5 9H15V3.5Z`})),He=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,b.jsx)(`path`,{d:`M12 11v5.5M12 7.5h.01`})]})),Ue=x((0,b.jsx)(`path`,{d:`M3 6h18M3 12h15a3 3 0 0 1 0 6h-4M3 18h7M16 16l-2 2 2 2`})),We=x((0,b.jsx)(`path`,{d:`M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1`})),Ge=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`5`,y:`11`,width:`14`,height:`10`,rx:`2`}),(0,b.jsx)(`path`,{d:`M8 11V7a4 4 0 0 1 8 0v4`})]})),Ke=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`3`,y:`4`,width:`18`,height:`5`,rx:`1`}),(0,b.jsx)(`path`,{d:`M5 9v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9M10 13h4`})]})),qe=x((0,b.jsx)(`path`,{d:`m4 17 6-6-6-6M12 19h8`})),Je=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`2`,y:`5`,width:`20`,height:`14`,rx:`2`}),(0,b.jsx)(`path`,{d:`M6 9h.01M10 9h.01M14 9h.01M18 9h.01M8 12.5h.01M12 12.5h.01M16 12.5h.01M7 16h10`})]})),Ye=x((0,b.jsx)(`path`,{d:`M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3`})),Xe=x((0,b.jsx)(`path`,{d:`M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3`})),Ze=x((0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`rect`,{x:`8`,y:`2`,width:`8`,height:`4`,rx:`1`}),(0,b.jsx)(`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`})]})),Qe=x((0,b.jsx)(`path`,{d:`m3 19 5-13 5 13M5 14h6M16 9h6`})),$e=x((0,b.jsx)(`path`,{d:`m3 19 5-13 5 13M5 14h6M16 9h6M19 6v6`}));export{pe as $,Z as A,Ue as At,He as B,F as C,Qe as Ct,Ne as D,O as Dt,Pe as E,se as Et,G as F,v as Ft,Ge as G,We as H,ze as I,c as It,Ye as J,xe as K,ue as L,o as Lt,Ae as M,y as Mt,je as N,g as Nt,be as O,ke as Ot,me as P,_ as Pt,Se as Q,Re as R,a as Rt,Ee as S,$e as St,Me as T,ce as Tt,le as U,Je as V,X as W,M as X,Xe as Y,Q as Z,D as _,N as _t,De as a,w as at,Oe as b,C as bt,Ie as c,fe as ct,Be as d,B as dt,ye as et,q as f,S as ft,j as g,Ve as gt,T as h,qe as ht,re as i,V as it,Y as j,h as jt,Te as k,Fe as kt,we as l,ve as lt,Ze as m,Ce as mt,W as n,L as nt,Le as o,ne as ot,_e as p,A as pt,J as q,Ke as r,$ as rt,de as s,oe as st,ie as t,P as tt,ge as u,k as ut,ae as v,H as vt,I as w,E as wt,he as x,K as xt,z as y,R as yt,U as z,s as zt};
@@ -1 +1 @@
1
- :root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0d1016;--surface:#151a22;--surface-2:#1b212b;--surface-3:#242b37;--border:#29313e;--border-strong:#3a4352;--text:#e6e9ef;--text-muted:#8b95a7;--accent:#4f8cff;--accent-strong:#3a77ef;--accent-soft:#4f8cff29;--success:#2fbf71;--danger:#f05252;--danger-soft:#f0525224;--warning:#f0a020;--grid-line:#ffffff0d;--map-unknown:#586172;--shadow:0 10px 30px #0006;--radius:10px;--font:system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, sans-serif;--mono:ui-monospace, "SF Mono", "Cascadia Code", "Ubuntu Mono", Menlo, monospace}@media (prefers-color-scheme:light){:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#eef1f5;--surface:#fff;--surface-2:#f4f6f9;--surface-3:#e7ebf0;--border:#dce1e8;--border-strong:#c3cad5;--text:#172030;--text-muted:#5d6879;--accent:#2f6fed;--accent-strong:#1f5ad6;--accent-soft:#2f6fed1f;--grid-line:#0f172a12;--map-unknown:#a7afbb;--shadow:0 10px 30px #0f172a24}}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{touch-action:manipulation;background:var(--bg);color:var(--text);font:14px/1.4 var(--font);-webkit-font-smoothing:antialiased;overscroll-behavior:none}button,input,select,textarea{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}h1,h2{margin:0;font-weight:650}.button{border:1px solid var(--border-strong);background:var(--surface-2);white-space:nowrap;cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:6px;height:34px;padding:0 12px;font-weight:600;display:inline-flex}.button:hover{background:var(--surface-3)}.button:disabled{opacity:.5;cursor:default}.button.primary{border-color:var(--accent);background:var(--accent);color:#fff}.button.primary:hover{background:var(--accent-strong)}.button.danger{color:var(--danger)}.button.danger:hover{background:var(--danger-soft)}.modal-actions .button.danger{border-color:var(--danger);background:var(--danger);color:#fff}.icon-button{width:34px;height:34px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;display:inline-grid}.icon-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.icon-button:disabled{opacity:.35;cursor:default}.link-button{color:var(--accent);cursor:pointer;background:0 0;border:0;font-weight:600}input,select,textarea{border:1px solid var(--border);background:var(--surface-2);border-radius:7px;width:100%;min-width:0;padding:7px 9px}input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:3px solid var(--accent-soft);outline-offset:0}textarea{resize:vertical;min-height:84px;font:12.5px/1.45 var(--mono)}.app{flex-direction:column;height:100dvh;display:flex}.topbar{z-index:20;padding:8px 12px;padding-top:max(8px, env(safe-area-inset-top));border-bottom:1px solid var(--border);background:var(--surface);align-items:center;gap:8px;display:flex;position:relative}.brand{color:var(--accent);letter-spacing:.01em;align-items:center;gap:8px;margin-right:4px;font-weight:700;display:flex}.brand-name{color:var(--text)}.connection-dot{background:var(--warning);border-radius:50%;width:8px;height:8px}.connection-dot.open{background:var(--success);box-shadow:0 0 0 3px #2fbf7133}.connection-dot.closed{background:var(--danger);animation:1.2s ease-in-out infinite pulse}.panel-select{appearance:none;text-overflow:ellipsis;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b95a7' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;background-size:14px;flex:0 auto;width:auto;min-width:72px;max-width:280px;height:34px;padding:0 30px 0 10px;font-weight:600}.topbar-spacer{flex:1}.save-state{color:var(--text-muted);font-size:12px}.save-state.failed{color:var(--danger)}.mode-switch{border:1px solid var(--border);background:var(--surface-2);border-radius:9px;padding:2px;display:inline-flex}.mode-switch button{height:30px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:6px;padding:0 11px;font-weight:600;display:inline-flex}.mode-switch button[aria-pressed=true]{background:var(--surface-3);color:var(--text);box-shadow:0 1px 2px #0003}.app.editing .mode-switch button[aria-pressed=true]{background:var(--accent);color:#fff}.menu{position:relative}.menu-backdrop{z-index:25;position:fixed;inset:0}.menu-list{z-index:30;border:1px solid var(--border);background:var(--surface);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:4px;position:absolute;top:calc(100% + 6px);right:0}.menu-list button{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;width:100%;padding:8px 10px;display:block}.menu-list button:hover{background:var(--surface-3)}.menu-list button.danger{color:var(--danger)}.workspace{flex:1;min-height:0;display:flex;position:relative}.empty-state{max-width:440px;color:var(--text-muted);text-align:center;margin:auto;padding:24px}.empty-state h1{color:var(--text);margin-bottom:8px;font-size:20px}.empty-state p{margin:0 0 18px}.board-column{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.board-scroll{flex:1;min-width:0;min-height:0;padding:16px;overflow:auto}.board-scroll.columns{overflow-x:hidden}.board.preview{box-shadow:0 0 0 1px var(--border-strong), 0 0 0 9999px #0000001f;border-radius:4px;margin:0 auto}.layout-bar{border-bottom:1px solid var(--border);background:var(--surface);color:var(--text-muted);flex-wrap:wrap;align-items:center;gap:6px 14px;padding:8px 16px;font-size:12.5px;display:flex}.layout-bar strong{color:var(--text)}.layout-hidden{flex-wrap:wrap;align-items:center;gap:4px;display:inline-flex}.layout-chip{border:1px solid var(--border-strong);background:var(--surface-2);cursor:pointer;border-radius:999px;padding:1px 8px;font-size:12px}.layout-chip:hover{border-color:var(--accent);color:var(--accent)}.board{position:relative}.board.editing{outline:1px solid var(--grid-line);background-image:linear-gradient(to right, var(--grid-line) 1px, transparent 1px), linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);background-size:var(--cell) var(--cell)}.board-hint{width:min(420px,90%);color:var(--text-muted);text-align:center;pointer-events:none;position:absolute;top:40%;left:50%;transform:translate(-50%)}.drop-target{z-index:5;border:2px dashed var(--accent);border-radius:var(--radius);background:var(--accent-soft);pointer-events:none;position:absolute}.drop-target.invalid{border-color:var(--danger);background:var(--danger-soft)}.widget{display:flex;position:absolute}.widget-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden;box-shadow:0 1px 2px #0000002e}.widget-title{color:var(--text-muted);letter-spacing:.06em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;padding:7px 10px 0;font-size:11px;font-weight:650;overflow:hidden}.widget-body{flex:1;min-width:0;min-height:0;display:flex;position:relative}.widget-message{color:var(--text-muted);text-align:center;margin:auto;padding:12px;font-size:13px}.widget-message.error{color:var(--danger)}.widget.editing{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab}.widget.editing .widget-body{pointer-events:none}.widget.editing:hover .widget-card{border-color:var(--border-strong)}.widget.selected .widget-card{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent), 0 0 0 5px var(--accent-soft)}.widget.dragging{z-index:10;opacity:.88;cursor:grabbing}.widget.dragging .widget-card{box-shadow:var(--shadow)}.widget-chrome{pointer-events:none;position:absolute;inset:0}.widget-tag,.widget-buttons,.resize-handle:after{opacity:0;transition:opacity .12s}.widget.editing:hover .widget-tag,.widget.editing:hover .widget-buttons,.widget.editing:hover .resize-handle:after,.widget.selected .widget-tag,.widget.selected .widget-buttons,.widget.selected .resize-handle:after{opacity:1}@media (hover:none){.widget.editing .widget-tag,.widget.editing .widget-buttons,.widget.editing .resize-handle:after{opacity:1}}.widget-tag{background:var(--surface-3);max-width:calc(100% - 72px);color:var(--text-muted);white-space:nowrap;border-radius:6px;align-items:center;gap:5px;padding:3px 7px;font-size:11px;font-weight:600;display:inline-flex;position:absolute;top:6px;left:6px;overflow:hidden}.widget-buttons{gap:4px;display:flex;position:absolute;top:5px;right:5px}.widget-button{background:var(--surface-3);width:26px;height:26px;color:var(--text-muted);cursor:pointer;pointer-events:auto;border:0;border-radius:6px;place-items:center;display:grid}.widget-button:hover{background:var(--accent);color:#fff}.widget-button.remove:hover{background:var(--danger)}.resize-handle{touch-action:none;cursor:nwse-resize;pointer-events:auto;width:22px;height:22px;position:absolute;bottom:0;right:0}.resize-handle:after{border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);content:"";border-bottom-right-radius:3px;width:9px;height:9px;position:absolute;bottom:5px;right:5px}.properties{border-left:1px solid var(--border);background:var(--surface);flex-direction:column;flex:0 0 320px;width:320px;min-height:0;display:flex}@media (width<=720px){.properties{z-index:15;border-top:1px solid var(--border);width:auto;max-height:60%;box-shadow:var(--shadow);border-left:0;border-radius:14px 14px 0 0;position:absolute;bottom:0;left:0;right:0}}.properties-header{border-bottom:1px solid var(--border);color:var(--accent);align-items:center;gap:10px;padding:10px 10px 10px 16px;display:flex}.properties-header h2{color:var(--text);flex:1;font-size:15px}.properties-body{flex-direction:column;flex:1;gap:16px;padding:14px 16px;display:flex;overflow:auto}.properties-meta{color:var(--text-muted);margin:0;font-size:11.5px}.properties-footer{padding:12px 16px;padding-bottom:max(12px, env(safe-area-inset-bottom));border-top:1px solid var(--border);gap:8px;display:flex}.properties-footer .button{flex:1}.field{flex-direction:column;gap:5px;display:flex}.field-label{font-size:12px;font-weight:600}.field-help{color:var(--text-muted);margin:0;font-size:11.5px}.toggle{cursor:pointer;align-items:center;gap:10px;display:flex}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle-switch{border:1px solid var(--border-strong);background:var(--surface-3);border-radius:999px;flex:none;width:34px;height:20px;transition:background-color .15s;position:relative}.toggle-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #0000004d}.toggle input:checked+.toggle-switch{border-color:var(--accent);background:var(--accent)}.toggle input:checked+.toggle-switch:after{transform:translate(14px)}.toggle input:focus-visible+.toggle-switch{outline:2px solid var(--accent);outline-offset:2px}.color-field{align-items:center;gap:10px;display:flex}.color-field input{cursor:pointer;width:46px;height:32px;padding:2px}.color-field code{color:var(--text-muted);font:12px var(--mono)}.modal-backdrop{z-index:50;background:#05080c8c;justify-content:center;align-items:center;padding:16px;animation:.12s ease-out fade-in;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--border);background:var(--surface);width:min(420px,100%);max-height:calc(100dvh - 32px);box-shadow:var(--shadow);border-radius:14px;flex-direction:column;animation:.14s ease-out pop-in;display:flex}.modal.wide{width:min(560px,100%)}.modal.resizable{background:var(--surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M9 2 2 9M9 6 6 9' stroke='%238b95a7' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat right 4px bottom 4px / 11px;resize:both;width:min(720px,100%);min-width:min(340px,100%);max-width:100%;height:min(600px,100dvh - 32px);min-height:min(320px,100dvh - 32px);overflow:hidden}.modal.resizable>.modal-body{flex:1;min-height:0}.modal-header{align-items:center;padding:12px 10px 4px 18px;display:flex}.modal-header h2{flex:1;font-size:16px}.modal-body{flex-direction:column;gap:16px;padding:8px 18px 18px;display:flex;overflow:auto}.dialog-message{color:var(--text-muted)}.dialog-command{background:var(--surface-2);max-height:200px;color:var(--text);font:12px/1.45 var(--mono);white-space:pre-wrap;border-radius:6px;margin:0;padding:8px 10px;overflow:auto}.modal-actions{justify-content:flex-end;gap:8px;display:flex}.palette-scroll{min-height:0;padding-bottom:10px;overflow-y:auto}.palette{gap:8px;padding:8px 18px;display:grid}.palette-heading{color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;padding:10px 18px 0;font-size:12px;font-weight:600}.palette-item{border:1px solid var(--border);background:var(--surface-2);text-align:left;cursor:pointer;border-radius:10px;align-items:center;gap:14px;padding:12px 14px;display:flex}.palette-item:hover{border-color:var(--accent);background:var(--accent-soft)}.palette-icon{background:var(--accent-soft);width:44px;height:44px;color:var(--accent);border-radius:10px;flex:none;place-items:center;display:grid}.palette-text{flex-direction:column;gap:2px;display:flex}.palette-text span{color:var(--text-muted);font-size:13px}.notifications{bottom:max(16px, env(safe-area-inset-bottom));z-index:60;pointer-events:none;flex-direction:column;gap:8px;width:min(480px,100% - 32px);display:flex;position:fixed;left:50%;transform:translate(-50%)}.notification{border:1px solid var(--border-strong);background:var(--surface-3);box-shadow:var(--shadow);pointer-events:auto;border-radius:10px;align-items:center;gap:10px;padding:9px 8px 9px 14px;animation:.18s ease-out rise-in;display:flex}.notification.error{border-left:3px solid var(--danger)}.notification>span{overflow-wrap:anywhere;flex:1}.notification-close{width:26px;height:26px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;font-size:18px;line-height:1}.notification-close:hover{background:var(--surface-2)}.teleop{flex-direction:column;flex:1;gap:4px;min-width:0;min-height:0;padding:8px;display:flex}.teleop-pads{flex:1;justify-content:space-evenly;align-items:center;min-height:0;display:flex;container-type:size}.joystick-slot{flex-direction:column;align-items:center;gap:4px;display:flex}.joystick{aspect-ratio:1;border:1px solid var(--border-strong);background:radial-gradient(circle at 50% 42%, var(--surface-3), var(--surface-2) 72%);touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;border-radius:50%;width:min(100cqh - 22px,100cqw - 8px);position:relative;box-shadow:inset 0 2px 10px #00000040}.teleop-pads.two .joystick{width:min(100cqh - 22px,50cqw - 16px)}.joystick:before,.joystick:after{background:var(--border);content:"";position:absolute}.joystick:before{height:1px;top:50%;left:12%;right:12%}.joystick:after{width:1px;top:12%;bottom:12%;left:50%}.joystick-track{border:1px dashed var(--border-strong);border-radius:50%;position:absolute;inset:16%}.joystick.horizontal{box-shadow:none;background:0 0;border-color:#0000}.joystick.horizontal:after{display:none}.joystick.horizontal .joystick-track{border:1px solid var(--border-strong);background:radial-gradient(circle at 50% 30%, var(--surface-3), var(--surface-2));border-radius:999px;inset:37% 0;box-shadow:inset 0 2px 8px #00000038}.joystick.vertical{box-shadow:none;background:0 0;border-color:#0000}.joystick.vertical:before{display:none}.joystick.vertical .joystick-track{border:1px solid var(--border-strong);background:radial-gradient(circle at 30% 50%, var(--surface-3), var(--surface-2));border-radius:999px;inset:0 37%;box-shadow:inset 0 2px 8px #00000038}.joystick-knob{aspect-ratio:1;background:radial-gradient(circle at 35% 30%, #8db6ff, var(--accent) 58%, var(--accent-strong));pointer-events:none;border-radius:50%;width:32%;transition:left .16s ease-out,top .16s ease-out;position:absolute;transform:translate(-50%,-50%);box-shadow:0 4px 12px #00000059,inset 0 1px 1px #ffffff59}.joystick.active{cursor:grabbing}.joystick.active .joystick-knob{box-shadow:0 0 0 7px var(--accent-soft), 0 4px 14px #0006, inset 0 1px 1px #ffffff59;transition:none}.joystick.disabled{cursor:default}.joystick.disabled .joystick-knob{background:var(--border-strong)}.joystick-label{height:14px;color:var(--text-muted);font:11px/14px var(--mono)}.teleop-readout{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:center;gap:4px 12px;display:flex}.teleop-topic{opacity:.7}.teleop-readout .offline{color:var(--danger)}.command-button{flex-direction:column;flex:1;gap:6px;min-width:0;min-height:0;padding:5px;display:flex}.command-button-face{cursor:pointer;border:0;border-radius:7px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:1px;min-height:0;padding:4px 10px;font-size:15px;font-weight:650;transition:filter .15s,background-color .25s;display:flex;position:relative;overflow:hidden;box-shadow:inset 0 -2px #0000002e}.command-button-face:hover{filter:brightness(1.08)}.command-button-face:active{filter:brightness(.95)}.command-button-face.busy{background-image:repeating-linear-gradient(-45deg,#ffffff24 0 10px,#0000 10px 20px);background-size:28.28px 28.28px;animation:.9s linear infinite stripes}.command-button-label,.command-button-status{text-overflow:ellipsis;white-space:nowrap;max-width:100%;overflow:hidden}.command-button-status{opacity:.85;font-size:11px;font-weight:500}.command-button.with-output .command-button-face{flex:none;min-height:46px}.command-output{border:1px solid var(--border);background:var(--bg);min-height:0;color:var(--text-muted);font:11px/1.4 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;flex:1;margin:0;padding:6px 8px;overflow:auto}.camera{background:#000;flex:1;min-width:0;min-height:0;position:relative}.camera canvas{width:100%;height:100%;display:block;position:absolute;inset:0}.camera canvas.dimmed{opacity:.35}.camera-overlay{color:#9aa4b5;text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.camera-overlay.error{color:#ff8f8f}.camera-info{color:#e5e7eb;font:11px var(--mono);font-variant-numeric:tabular-nums;background:#0000008c;border-radius:4px;padding:2px 6px;position:absolute;bottom:8px;left:8px}.navigation{background:var(--map-unknown);flex:1;min-width:0;min-height:0;position:relative;overflow:hidden}.navigation canvas{touch-action:none;cursor:grab;width:100%;height:100%;display:block;position:absolute;inset:0}.navigation canvas:active{cursor:grabbing}.navigation canvas.placing{cursor:crosshair}.overlay-toolbar{border:1px solid var(--border);background:var(--surface);border-radius:10px;align-items:center;gap:2px;padding:3px;display:flex;position:absolute;top:8px;left:8px;box-shadow:0 2px 8px #0003}.overlay-button{width:32px;height:32px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:7px;place-items:center;display:grid}.overlay-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.overlay-button[aria-pressed=true]{background:var(--accent);color:#fff}.overlay-button:disabled{opacity:.4;cursor:default}.overlay-separator{background:var(--border);align-self:stretch;width:1px;margin:5px 3px}.nav-hint{color:#fff;text-align:center;pointer-events:none;background:#000000ad;border-radius:8px;max-width:calc(100% - 16px);padding:5px 10px;font-size:12px;position:absolute;top:54px;left:50%;transform:translate(-50%)}.nav-readout{color:#e5e7eb;max-width:calc(100% - 16px);font:11px var(--mono);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:pre;pointer-events:none;background:#00000094;border-radius:6px;padding:3px 8px;position:absolute;bottom:8px;left:8px;overflow:hidden}.nav-readout.stale{color:#f6c26b}.nav-readout.error{color:#ffbdbd}.nav-overlay{color:#f1f3f6;text-align:center;pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.nav-overlay.error{color:#ffd0d0}.robot-model{background:radial-gradient(ellipse at 50% 40%, var(--surface-3), var(--surface-2) 75%);flex:1;min-width:0;min-height:0;position:relative;overflow:hidden}.robot-canvas{position:absolute;inset:0}.robot-canvas canvas{touch-action:none;display:block}.robot-labels{pointer-events:none;position:absolute;inset:0}.robot-frame-label{color:#f1f3f6;font:10px/1.3 var(--mono);white-space:nowrap;background:#0000008c;border-radius:4px;padding:1px 5px}.robot-overlay{color:var(--text-muted);text-align:center;pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.robot-overlay.error{color:var(--danger)}.robot-loading{color:#e5e7eb;font:11px var(--mono);pointer-events:none;background:#0000008c;border-radius:6px;padding:3px 8px;position:absolute;top:10px;right:10px}.robot-notes{pointer-events:none;flex-wrap:wrap;gap:4px;display:flex;position:absolute;bottom:8px;left:8px;right:8px}.robot-motion,.robot-note{font:11px var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:6px;padding:2px 7px}.robot-motion{color:#231400;background:#f59e0b;font-weight:600}.robot-note{color:#ffd2a6;background:#0000008c}.services{flex:1;min-width:0;min-height:0;margin:0;padding:2px 4px;list-style:none;overflow:auto}.service+.service{border-top:1px solid var(--border)}.service-row{align-items:center;gap:10px;padding:7px 4px;display:flex}.service-dot{background:var(--border-strong);border-radius:50%;flex:none;width:10px;height:10px}.service-dot.on{background:var(--success);box-shadow:0 0 0 3px #2fbf712e}.service-dot.busy{background:var(--warning);animation:1s ease-in-out infinite pulse}.service-dot.failed{background:var(--danger)}.service-text{flex-direction:column;flex:1;min-width:0;display:flex}.service-name{white-space:nowrap;align-items:center;gap:6px;font-weight:600;display:flex;overflow:hidden}.service-tag{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 6px;font-size:10.5px;font-weight:600}.service-state{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.service-state.on{color:var(--success)}.service-state.busy{color:var(--warning)}.service-state.failed{color:var(--danger)}.service-actions{flex:none;gap:4px;display:flex}.service-button{border:1px solid var(--border);background:var(--surface-2);width:32px;height:32px;color:var(--text-muted);cursor:pointer;border-radius:8px;place-items:center;display:grid}.service-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.service-button.start{color:var(--success)}.service-button.stop{color:var(--danger)}.service-button[aria-pressed=true]{border-color:var(--accent);background:var(--accent);color:#fff}.service-button:disabled{opacity:.45;cursor:default}.service-output{height:160px;margin:0 4px 8px}.image-viewer{flex:1;min-width:0;min-height:0;position:relative}.image-viewer img{width:100%;height:100%;position:absolute;inset:0}.image-viewer img.failed{visibility:hidden}.image-viewer-error{place-items:center;display:grid;position:absolute;inset:0}.file-input{flex-direction:column;gap:8px;display:flex}.file-input-actions{flex-wrap:wrap;gap:6px;display:flex}.file-input-preview{border:1px solid var(--border);background:var(--surface-2);border-radius:6px;align-self:flex-start;max-width:100%;max-height:140px}.file-browser-path{align-items:center;gap:10px;min-width:0;display:flex}.file-browser-path code{min-width:0;color:var(--text-muted);font:12px var(--mono);overflow-wrap:anywhere}.file-browser-body{grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;height:min(360px,50dvh);display:grid}.modal.resizable .file-browser-body{flex:1;height:auto;min-height:120px}.file-browser-body.single{grid-template-columns:minmax(0,1fr)}@media (width<=560px){.file-browser-body:not(.single){grid-template-rows:minmax(0,1fr) 120px;grid-template-columns:1fr}}.file-browser-list{border:1px solid var(--border);border-radius:8px;margin:0;padding:4px;list-style:none;overflow:auto}.file-browser-entry{text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;width:max-content;min-width:100%;padding:6px 8px;display:flex}.file-browser-chosen{color:var(--text-muted);font:12px var(--mono);overflow-wrap:anywhere;margin:-6px 0 0}.file-browser-entry:hover{background:var(--surface-3)}.file-browser-entry.selected{background:var(--accent-soft);color:var(--accent)}.file-browser-empty{color:var(--text-muted);padding:8px}.file-browser-preview{border:1px solid var(--border);background:var(--surface-2);min-height:0;color:var(--text-muted);text-align:center;border-radius:8px;place-items:center;padding:8px;font-size:12px;display:grid}.file-browser-preview img{object-fit:contain;max-width:100%;max-height:100%}.field-help.error{color:var(--danger)}@media (width<=560px){.hide-narrow,.brand-name,.save-state{display:none}.topbar{gap:6px;padding-left:8px;padding-right:8px}.topbar .button{padding:0 9px}.mode-switch button{padding:0 8px}.app.editing .topbar{flex-wrap:wrap;row-gap:6px}}@keyframes pulse{50%{opacity:.35}}@keyframes stripes{to{background-position:28.28px 0}}@keyframes fade-in{0%{opacity:0}}@keyframes pop-in{0%{opacity:0;transform:scale(.97)}}@keyframes rise-in{0%{opacity:0;transform:translateY(8px)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.arm-teleop{flex-direction:column;flex:1;gap:6px;min-width:0;min-height:0;padding:8px;display:flex}.arm-banner{color:var(--warning);text-align:center;background:#f0a02024;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:600}.arm-pads{min-height:90px}.arm-joints{flex-direction:column;flex:1;justify-content:space-evenly;gap:2px;min-height:0;display:flex;overflow-y:auto}.arm-joints.compact{flex:none}.arm-joint{grid-template-columns:minmax(48px,72px) 1fr 64px;align-items:center;gap:8px;min-height:30px;display:grid}.arm-joint.undriven .arm-joint-name{color:var(--text-muted);text-decoration:line-through}.arm-joint-name{font:12px var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.jog-slider{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;height:28px;position:relative}.jog-slider-track{border:1px solid var(--border-strong);background:linear-gradient(90deg, var(--accent-soft), transparent 40% 60%, var(--accent-soft));border-radius:999px;height:8px;position:absolute;top:50%;left:2%;right:2%;transform:translateY(-50%)}.jog-slider-track:after{background:var(--border-strong);content:"";width:1px;position:absolute;top:-5px;bottom:-5px;left:50%}.jog-slider-knob{background:radial-gradient(circle at 35% 30%, #8db6ff, var(--accent) 58%, var(--accent-strong));pointer-events:none;border-radius:50%;width:20px;height:20px;transition:left .16s ease-out;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 2px 6px #00000059}.jog-slider.active{cursor:grabbing}.jog-slider.active .jog-slider-knob{box-shadow:0 0 0 6px var(--accent-soft), 0 2px 8px #0006;transition:none}.jog-slider.disabled{cursor:default}.jog-slider.disabled .jog-slider-knob{background:var(--border-strong)}.arm-joint-readout{font:12px var(--mono);font-variant-numeric:tabular-nums;flex-direction:column;align-items:flex-end;gap:3px;display:flex}.arm-joint-readout .relative{color:var(--warning);font-style:italic}.arm-range{background:var(--surface-3);border-radius:2px;width:100%;height:4px;position:relative}.arm-range.empty{visibility:hidden}.arm-range-zero{background:var(--text-muted);width:1px;position:absolute;top:-2px;bottom:-2px}.arm-range-position{background:var(--accent);border-radius:2px;width:4px;height:8px;position:absolute;top:-2px;transform:translate(-50%)}.arm-status{color:var(--text-muted);text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.arm-status.error{color:var(--danger)}.arm-status.active{color:var(--accent)}.bt{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.bt-banner{text-overflow:ellipsis;white-space:nowrap;flex:none;padding:4px 10px;font-size:11.5px;font-weight:600;overflow:hidden}.bt-banner.warning{color:var(--warning);background:#f0a02024}.bt-banner.error{background:var(--danger-soft);color:var(--danger)}.bt-main{flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.bt .overlay-toolbar{flex-wrap:wrap;max-width:calc(100% - 16px)}.bt-main.list{flex-direction:column}.bt-main.list>.overlay-toolbar{order:-1;align-self:flex-start;margin:8px 8px 2px;position:static}.overlay-button.recording{background:var(--danger);color:#fff;animation:1.4s ease-out infinite bt-recording}@keyframes bt-recording{0%{box-shadow:0 0 #f052528c}to{box-shadow:0 0 0 7px #f0525200}}.bt-graph{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;background-image:radial-gradient(circle,#8b95a738 1px,#0000 1.3px);background-size:24px 24px;position:absolute;inset:0;overflow:hidden}.bt-graph:active{cursor:grabbing}.bt-layer{transform-origin:0 0;position:absolute;top:0;left:0}.bt-links{position:absolute;inset:0;overflow:visible}.bt-links path{fill:none;stroke:var(--border-strong);stroke-width:1.5px}.bt-links path.running{stroke:var(--warning);stroke-width:2.5px}.bt-node{border:1px solid var(--border-strong);background:var(--surface-2);cursor:pointer;border-radius:8px;flex-direction:column;transition:border-color .2s,background-color .2s,box-shadow .2s;display:flex;position:absolute;box-shadow:0 1px 2px #0000002e}.bt-node-head{flex:none;align-items:center;gap:7px;height:38px;padding:0 10px;display:flex}.bt-kind{color:var(--text-muted);flex:none}.bt-node-labels{flex-direction:column;min-width:0;line-height:1.25;display:flex}.bt-node-type,.bt-node-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-node-type{font-size:12px;font-weight:650}.bt-node-name{color:var(--text-muted);font-size:11px}.bt-node-ports{border-top:1px solid var(--border);font:10.5px/15px var(--mono);margin:0;padding:4px 10px 6px}.bt-node-ports div,.bt-ports div{gap:8px;min-width:0;display:flex}.bt-node-ports dt,.bt-ports dt{color:var(--text-muted);flex:none}.bt-node-ports dd{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.bt-node-ports dd.entry,.bt-ports dd.entry{color:var(--accent)}.bt-node.running{border-color:var(--warning);background:linear-gradient(#f0a02029, #f0a02029), var(--surface-2);animation:1.6s ease-in-out infinite bt-glow;box-shadow:0 0 0 3px #f0a02038}.bt-node.success{border-color:var(--success);background:linear-gradient(#2fbf7129, #2fbf7129), var(--surface-2)}.bt-node.failure{border-color:var(--danger);background:linear-gradient(#f0525229, #f0525229), var(--surface-2)}.bt-node.skipped{opacity:.6;border-style:dashed}.bt-node.running .bt-kind{color:var(--warning)}.bt-node.success .bt-kind{color:var(--success)}.bt-node.failure .bt-kind{color:var(--danger)}.bt-node.was-success{border-color:#2fbf7180;box-shadow:inset 3px 0 #2fbf71bf,0 1px 2px #0000002e}.bt-node.was-failure{border-color:#f052528c;box-shadow:inset 3px 0 #f05252cc,0 1px 2px #0000002e}.bt-node.selected{outline:2px solid var(--accent);outline-offset:2px}.bt-fold{z-index:1;border:1px solid var(--border-strong);background:var(--surface);min-width:18px;height:18px;color:var(--text-muted);text-align:center;cursor:pointer;border-radius:9px;padding:0 5px;font-size:11px;font-weight:650;line-height:16px;position:absolute;bottom:-9px;left:50%;transform:translate(-50%)}.bt-fold.side{inset:50% 0 auto auto;transform:translate(50%,-50%)}.bt-fold:hover{border-color:var(--accent);color:var(--accent)}.bt-fold.running{border-color:var(--warning);color:var(--warning)}@keyframes bt-glow{50%{box-shadow:0 0 0 6px #f0a02014}}.bt-list{flex:1;min-height:0;padding:0 4px 6px;position:relative;overflow:auto;container-type:inline-size}.bt-list ul{margin:0;padding:0;list-style:none}.bt-list-heading{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:10px 8px 4px;font-size:11px;font-weight:650}.bt-row{border-radius:6px;align-items:center;display:flex}.bt-row.running{background:#f0a0201a}.bt-row.selected{background:var(--accent-soft)}.bt-row-indent{flex:none}.bt-row-fold{width:20px;height:26px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;flex:none;place-items:center;padding:0;display:grid}.bt-row-fold svg{transition:transform .12s}.bt-row-fold[aria-expanded=true] svg{transform:rotate(90deg)}.bt-row-main{text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:7px;min-width:0;height:30px;padding:0 8px 0 2px;display:flex}.bt-row-labels{white-space:nowrap;flex:1;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:hidden}.bt-row-type{text-overflow:ellipsis;flex:0 auto;min-width:2.5em;font-size:13px;font-weight:600;overflow:hidden}.bt-row-name{min-width:0;color:var(--text-muted);text-overflow:ellipsis;flex:0 100 auto;font-size:12px;overflow:hidden}.bt-row-status{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none;gap:8px;font-size:11.5px;display:flex}.bt-row.running .bt-row-status{color:var(--warning)}.bt-row.success .bt-row-status{color:var(--success)}.bt-row.failure .bt-row-status{color:var(--danger)}.bt-row-counts{font:11px var(--mono)}@container (width<=380px){.bt-row-counts{display:none}}.bt-row-counts .success,.bt-facts .success{color:var(--success)}.bt-row-counts .failure,.bt-facts .failure{color:var(--danger)}.bt-dot{background:var(--border-strong);border-radius:50%;flex:none;width:9px;height:9px}.bt-row.running .bt-dot,.bt-status.running .bt-dot{background:var(--warning);animation:1s ease-in-out infinite pulse}.bt-row.success .bt-dot,.bt-status.success .bt-dot{background:var(--success)}.bt-row.failure .bt-dot,.bt-status.failure .bt-dot,.bt-status.error .bt-dot{background:var(--danger)}.bt-row.was-success .bt-dot{box-shadow:inset 0 0 0 2px var(--success);background:0 0}.bt-row.was-failure .bt-dot{box-shadow:inset 0 0 0 2px var(--danger);background:0 0}.bt-pill{background:var(--surface-3);color:var(--text-muted);white-space:nowrap;border-radius:4px;padding:0 6px;font-size:10.5px;font-weight:650;line-height:17px;display:inline-block}.bt-pill.running{color:var(--warning);background:#f0a0202e}.bt-pill.success{color:var(--success);background:#2fbf7129}.bt-pill.failure{background:var(--danger-soft);color:var(--danger)}.bt-muted{color:var(--text-muted)}.bt-details{z-index:2;border:1px solid var(--border);background:var(--surface);width:min(300px,100% - 16px);box-shadow:var(--shadow);border-radius:10px;flex-direction:column;animation:.12s ease-out pop-in;display:flex;position:absolute;top:8px;bottom:8px;right:8px}.bt-details-header{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:6px 6px 6px 12px;display:flex}.bt-details-header .bt-kind{color:var(--accent)}.bt-details-title{flex-direction:column;flex:1;min-width:0;display:flex}.bt-details-title strong,.bt-details-title span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-details-title span{color:var(--text-muted);font-size:12px}.bt-details-body{flex-direction:column;gap:14px;padding:10px 12px 12px;font-size:12.5px;display:flex;overflow:auto}.bt-details-body h3{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:0 0 6px;font-size:11px;font-weight:650}.bt-path{flex-wrap:wrap;font-size:11.5px;display:flex}.bt-path button{color:var(--text-muted);cursor:pointer;background:0 0;border:0;padding:0}.bt-path button:hover{color:var(--accent)}.bt-path button+button:before{color:var(--border-strong);content:"›";margin:0 5px}.bt-facts{grid-template-columns:auto 1fr;align-items:baseline;gap:6px 12px;margin:0;display:grid}.bt-facts dt{color:var(--text-muted)}.bt-facts dd{margin:0}.bt-ports{font:11.5px/1.55 var(--mono);margin:0}.bt-ports dd{overflow-wrap:anywhere;margin:0}.bt-node-log{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.bt-node-log li{color:var(--text-muted);align-items:center;gap:5px;display:flex}.bt-node-log time,.bt-log time{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex:none}.bt-log{border-top:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 0 38%;min-height:90px;display:flex}.bt-log ol{flex:1;margin:0;padding:4px;list-style:none;overflow:auto}.bt-log button{width:100%;color:var(--text-muted);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;padding:2px 6px;font-size:11.5px;display:flex}.bt-log button:hover{background:var(--surface-3)}.bt-log-node{min-width:0;color:var(--text);text-overflow:ellipsis;overflow:hidden}.bt-log-empty{margin:auto;font-size:12px}.bt-status{border-top:1px solid var(--border);min-width:0;color:var(--text-muted);flex:none;align-items:center;gap:7px;padding:5px 10px;font-size:12px;display:flex}.bt-status-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-status.running{color:var(--text)}.bt-status.error{color:var(--danger)}.bt-rec{background:var(--danger-soft);color:var(--danger);letter-spacing:.04em;font-variant-numeric:tabular-nums;border-radius:4px;flex:none;margin-left:auto;padding:0 6px;font-size:10.5px;font-weight:650;line-height:17px}.bt-playback{border-top:1px solid var(--border);background:var(--surface-2);flex:none;align-items:center;gap:6px;padding:3px 4px 3px 2px;display:flex;container-type:inline-size}.bt-playback .icon-button{width:30px;height:30px}.bt-playback input[type=range]{min-width:48px;accent-color:var(--accent);cursor:pointer;background:0 0;border:0;flex:1;padding:0}.bt-playback input[type=range]:focus{outline:none}.bt-playback-time{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex:none}.bt-playback select{flex:none;width:auto;padding:3px 6px;font-size:12px}.bt-playback-error{min-width:0;color:var(--danger);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}@container (width<=300px){.bt-playback-time{display:none}}.bt-record-path{gap:8px;display:flex}.bt-record-path input,.dialog-message code{font:12.5px var(--mono)}.bte:focus,.bte:focus-visible{outline:none}.bte-banner{align-items:center;gap:10px;display:flex}.bte-banner>span{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.bte-banner .link-button{color:inherit;flex:none;padding:0;font-size:11.5px;text-decoration:underline}.bte-banner .link-button:disabled{opacity:.5;cursor:default}.bte-toolbar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none;align-items:center;gap:2px;padding:4px 6px;display:flex}.bte-tree-select{width:auto;min-width:90px;max-width:220px;height:32px;padding:0 8px;font-size:13px;font-weight:600}.bte-toolbar-end{flex:1}.bte-save{height:32px;padding:0 10px}.menu-list button.bte-narrow{display:none}.menu-list button:disabled{opacity:.45;cursor:default}@container (width<=520px){.bte-save-label,.bte-toolbar .bte-wide{display:none}.menu-list button.bte-narrow{display:block}.bte-tree-select{flex:80px}}.bte{container-type:inline-size}.bte-body{flex:1;min-height:0;display:flex;position:relative}.bte-palette{border-right:1px solid var(--border);background:var(--surface);flex-direction:column;flex:none;width:240px;min-height:0;display:flex}.bte-body.narrow .bte-palette{z-index:3;width:min(260px,100%);box-shadow:var(--shadow);animation:.12s ease-out pop-in;position:absolute;top:0;bottom:0;left:0}.bte-palette-header{gap:4px;padding:8px 6px 6px 8px;display:flex}.bte-palette-header input{height:32px;font-size:13px}.bte-palette-body{flex:1;min-height:0;padding:0 4px 6px;overflow:auto}.bte-palette-body ul,.bte-picker ul{margin:0;padding:0;list-style:none}.bte-palette-group{width:100%;color:var(--text-muted);letter-spacing:.06em;text-align:left;text-transform:uppercase;cursor:pointer;background:0 0;border:0;justify-content:space-between;margin-top:6px;padding:5px 6px;font-size:11px;font-weight:650;display:flex}.bte-palette-item{text-align:left;cursor:grab;touch-action:pan-y;background:0 0;border:0;border-radius:6px;align-items:center;gap:7px;width:100%;min-width:0;height:30px;padding:0 8px;display:flex}.bte-palette-item:hover{background:var(--surface-3)}.bte-palette-name{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.bte-palette-library{min-width:0;color:var(--text-muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:1 100 auto;font-size:11px;overflow:hidden}.bte-palette-empty{margin:12px 8px;font-size:12.5px}.bte-palette-footer{border-top:1px solid var(--border);flex-direction:column;gap:6px;padding:8px;display:flex}.bte-palette-footer .field-help{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bte-library{font:12px var(--mono);align-items:center;gap:4px;display:flex}.bte-library span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;line-height:26px;overflow:hidden}.bte-library .icon-button{width:26px;height:26px}.bte-canvas{flex:1;min-width:0}.bte-graph.dragging{cursor:grabbing}.bte-node.tree{border-style:dashed}.bte-node.unknown .bt-node-type{font-style:italic}.bte-node.problem{border-color:var(--danger)}.bte-problem{background:var(--danger);color:#fff;border-radius:50%;flex:none;place-items:center;width:16px;height:16px;margin-left:auto;font-size:11px;font-weight:800;display:grid}.bte-node.drop-into,.bte-slot.drop-into{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.bte-node.dragged{opacity:.35}.bte-slot{border:1.5px dashed var(--border-strong);color:var(--text-muted);text-align:center;border-radius:8px;place-items:center;padding:0 8px;font-size:11.5px;display:grid;position:absolute}.bte-drop-bar{background:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);pointer-events:none;border-radius:2px;position:absolute}.bte-ghost,.bte-palette-ghost{opacity:.85;box-shadow:var(--shadow);pointer-events:none}.bte-ghost.nowhere{opacity:.45}.bte-palette-ghost{z-index:40;min-width:120px;position:fixed}.bte-palette-ghost .bt-node-type{white-space:nowrap}.bte-properties .bt-details-header .bt-kind{color:var(--accent)}.bte-actions{border-bottom:1px solid var(--border);align-items:center;gap:1px;padding:4px 6px;display:flex}.bte-actions .icon-button{width:28px;height:28px}.bte-actions .icon-button.danger:hover:not(:disabled){background:var(--danger-soft);color:var(--danger)}.bte-actions-text{flex:1;justify-content:center;min-width:0;display:flex}.bte-actions-text .link-button{border-radius:6px;height:28px;padding:0 5px;font-size:12px}.bte-actions-text .link-button:hover:not(:disabled){background:var(--accent-soft)}.bte-actions-text .link-button:disabled{color:var(--text-muted);opacity:.45;cursor:default}.bte-problems{background:var(--danger-soft);color:var(--danger);border-radius:7px;margin:0;padding:6px 10px 6px 24px;font-size:12px}.bte-description{margin:0}.bte-properties input,.bte-properties textarea,.bte-properties select{font:12.5px var(--mono);padding:5px 8px}.bte-properties textarea{resize:vertical;min-height:0}.bte-properties input[aria-invalid=true]{border-color:var(--danger)}.bte-row,.bte-attribute{align-items:center;gap:6px;display:flex}.bte-attribute{margin-bottom:6px}.bte-attribute>input:first-child{flex:0 0 38%}.bte-attribute .icon-button{width:28px;height:28px}.bte-check{cursor:pointer;align-items:flex-start;gap:8px;font-size:12px;display:flex}.bte-check input{width:auto;margin-top:2px}.bte-port{margin-bottom:10px}.bte-port .field-label{align-items:baseline;gap:6px;min-width:0;display:flex}.bte-port-name{font:600 12px var(--mono)}.bte-direction{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 5px;font-size:10px;font-weight:650;line-height:16px}.bte-direction.output,.bte-direction.inout{background:var(--accent-soft);color:var(--accent)}.bte-port-type{min-width:0;font:11px var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bte-picker{flex-direction:column;gap:8px;display:flex}.bte-picker ul{max-height:min(50vh,420px);overflow:auto}.bte-xml{flex-direction:column;display:flex;position:absolute;inset:0}.bte-xml textarea{background:var(--surface);min-height:0;font:12.5px/1.5 var(--mono);white-space:pre;resize:none;tab-size:2;border:0;border-radius:0;flex:1;padding:10px 12px}.bte-xml textarea:focus{outline:0}.bte-xml-error{background:var(--danger-soft);color:var(--danger);font:12px var(--mono);flex:none;margin:0;padding:5px 10px}.bte-empty{flex-direction:column;align-items:center;gap:4px;display:flex}.bte-empty p{margin:0 0 8px}.bt-status.changed{color:var(--text)}.bt-status.changed .bt-dot{background:var(--warning)}.bte-problems-chip{background:var(--danger-soft);color:var(--danger);cursor:pointer;border:0;border-radius:4px;flex:none;margin-left:auto;padding:0 7px;font-size:11px;font-weight:650;line-height:18px}.logs{--log-debug:#5fb3a1;--log-info:var(--accent);--log-warn:var(--warning);--log-error:var(--danger);--log-fatal:#d56cff;--log-warn-soft:#f0a02017;--log-error-soft:#f052521c;--log-fatal-soft:#d56cff29;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;container-type:inline-size}.logs.cramped .logs-main{display:none}.logs.cramped .logs-details{border-top:0;flex:auto;max-height:none}@media (prefers-color-scheme:light){.logs{--log-debug:#2c8270;--log-warn:#a86400;--log-error:#cf2f2f;--log-fatal:#9327c4;--log-warn-soft:#f0a0201c;--log-error-soft:#f052521a;--log-fatal-soft:#9327c41f}}.logs .debug{--level:var(--log-debug)}.logs .info{--level:var(--log-info)}.logs .warn{--level:var(--log-warn);--level-soft:var(--log-warn-soft)}.logs .error{--level:var(--log-error);--level-soft:var(--log-error-soft)}.logs .fatal{--level:var(--log-fatal);--level-soft:var(--log-fatal-soft)}.logs-toolbar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none;align-items:center;gap:4px;padding:4px 6px;display:flex}.logs-toolbar-end{flex:1}.logs-levels{gap:3px;display:flex}.logs-level{border:1px solid var(--border);height:28px;color:var(--text-muted);white-space:nowrap;cursor:pointer;background:0 0;border-radius:7px;align-items:center;gap:5px;padding:0 7px;font-size:12px;font-weight:600;display:inline-flex}.logs-level:hover{background:var(--surface-3)}.logs-level[aria-pressed=true]{border-color:var(--level);color:var(--text)}.logs-level-dot{width:8px;height:8px;box-shadow:inset 0 0 0 1.5px var(--level);border-radius:50%;flex:none}.logs-level[aria-pressed=true] .logs-level-dot{background:var(--level)}.logs-level-count{color:var(--text-muted);font-variant-numeric:tabular-nums;font-weight:500}.logs-level-letter{display:none}.logs-tools{flex:300px;align-items:center;gap:4px;min-width:0;display:flex}.logs-tools .overlay-separator{margin-left:auto}.logs-search{flex:1 1 0;align-items:center;min-width:60px;max-width:240px;display:flex;position:relative}.logs-search svg{color:var(--text-muted);pointer-events:none;position:absolute;left:8px}.logs-search input{height:28px;padding:0 6px 0 27px;font-size:12.5px}.logs-search.invalid input{border-color:var(--danger);outline-color:var(--danger-soft)}.logs-regex{width:28px;height:28px;font:700 12px var(--mono);flex:none}.logs-main{flex:1 1 0;min-height:66px;display:flex;position:relative}.logs-nodes{border-right:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 0 210px;min-height:0;display:flex}.logs-nodes.overlay{z-index:2;width:min(260px,88%);box-shadow:var(--shadow);animation:.12s ease-out fade-in;position:absolute;inset:0 auto 0 0}.logs-nodes-header{min-height:30px;color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;flex:none;align-items:center;gap:6px;padding:2px 4px 0 10px;font-size:11px;font-weight:650;display:flex}.logs-nodes-header>span{flex:1}.logs-nodes-header .link-button{letter-spacing:0;text-transform:none;padding:0 4px;font-size:11.5px}.logs-nodes-header .link-button:disabled{color:var(--text-muted);opacity:.6;cursor:default}.logs-nodes-header .overlay-button{width:26px;height:26px}.logs-nodes ul{flex:1;margin:0;padding:0 4px 6px;list-style:none;overflow:auto}.logs-nodes-empty{color:var(--text-muted);margin:auto;font-size:12px}.logs-node{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;height:26px;padding:0 6px;font-size:12.5px;display:flex}.logs-node:hover{background:var(--surface-3)}.logs-node[aria-pressed=true]{background:var(--accent-soft);box-shadow:inset 2px 0 var(--accent)}.logs-node-dot{background:var(--success);border-radius:50%;flex:none;width:7px;height:7px}.logs-node.gone .logs-node-dot{box-shadow:inset 0 0 0 1.5px var(--border-strong);background:0 0}.logs-node-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.logs-node.gone .logs-node-name{color:var(--text-muted)}.logs-node-badge{background:var(--level-soft);color:var(--level);font-variant-numeric:tabular-nums;border-radius:4px;flex:none;padding:0 5px;font-size:10.5px;font-weight:650;line-height:16px}.logs-node-count{min-width:3ch;color:var(--text-muted);text-align:right;font-variant-numeric:tabular-nums;flex:none;font-size:11px}.logs-list{min-width:0;font:12px var(--mono);overscroll-behavior:contain;flex:1;position:relative;overflow:auto}.logs-list:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.logs-rows{position:relative}.logs-empty{color:var(--text-muted);font:13px var(--font);text-align:center;place-items:center;margin:0;padding:12px;display:grid;position:absolute;inset:0}.log-row{height:var(--log-row);background:var(--level-soft,none);line-height:var(--log-row);white-space:nowrap;cursor:default;border-left:3px solid #0000;align-items:center;gap:8px;padding:0 8px 0 7px;display:flex;position:absolute;left:0;right:0}.log-row:hover{background:var(--surface-2)}.log-row.selected{background:var(--accent-soft)}.log-row.warn,.log-row.error,.log-row.fatal{border-left-color:var(--level)}.log-time{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none}.log-level{width:5ch;color:var(--level);flex:none;font-weight:700}.log-node{width:var(--log-node);color:var(--text-muted);text-overflow:ellipsis;flex:none;overflow:hidden}.log-msg{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.log-row.debug .log-msg{color:var(--text-muted)}.log-row.warn .log-msg,.log-row.error .log-msg,.log-row.fatal .log-msg{color:var(--level)}.log-row.fatal .log-msg{font-weight:700}.log-more{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 4px;font-size:10.5px;line-height:16px}.logs-list.compact .log-row{border-bottom:1px solid var(--border);grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-areas:"level node more time""msg msg msg msg";align-content:center;gap:1px 8px;line-height:16px;display:grid}.logs-list.compact .log-level{grid-area:level;width:auto;font-size:10.5px}.logs-list.compact .log-node{grid-area:node;width:auto;font-size:11px}.logs-list.compact .log-more{grid-area:more}.logs-list.compact .log-time{grid-area:time;font-size:10.5px}.logs-list.compact .log-msg{grid-area:msg}.logs-details{border-top:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 auto;min-height:0;max-height:45%;display:flex;overflow:hidden}.logs-details-header{flex:none;align-items:center;gap:8px;min-width:0;padding:3px 4px 3px 10px;display:flex}.logs-pill{background:var(--level-soft,var(--surface-3));color:var(--level);font:700 10.5px/18px var(--mono);border-radius:4px;flex:none;padding:0 6px}.logs-details-node{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12.5px;overflow:hidden}.logs-details-msg{border:1px solid var(--border);border-left:3px solid var(--level);background:var(--bg);min-height:24px;font:12px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;flex:0 auto;margin:0 10px;padding:6px 8px;overflow:auto}.logs-details-facts{flex-wrap:wrap;flex:none;gap:2px 16px;margin:6px 10px 8px;font-size:11.5px;display:flex}.logs-details-facts div{gap:6px;min-width:0;display:flex}.logs-details-facts dt{color:var(--text-muted)}.logs-details-facts dd{min-width:0;font-family:var(--mono);overflow-wrap:anywhere;margin:0}.logs-status{border-top:1px solid var(--border);min-width:0;color:var(--text-muted);flex:none;align-items:center;gap:7px;padding:5px 10px;font-size:12px;display:flex}.logs-status-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.logs-dot{background:var(--border-strong);border-radius:50%;flex:none;width:9px;height:9px}.logs-status.streaming .logs-dot{background:var(--success)}.logs-status.paused{color:var(--text)}.logs-status.paused .logs-dot{background:var(--warning);animation:1s ease-in-out infinite pulse}.logs-status.error{color:var(--danger)}.logs-status.error .logs-dot{background:var(--danger)}@container (width<=560px){.logs-level-name{display:none}.logs-level-letter{color:var(--level);display:inline}.logs-level-dot{display:none}.logs-level{gap:4px;padding:0 6px}.logs-level[aria-pressed=false] .logs-level-letter{color:var(--text-muted)}.logs-tools .overlay-button{width:28px;height:28px}.logs-tools .overlay-separator{display:none}}
1
+ :root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0d1016;--surface:#151a22;--surface-2:#1b212b;--surface-3:#242b37;--border:#29313e;--border-strong:#3a4352;--text:#e6e9ef;--text-muted:#8b95a7;--accent:#4f8cff;--accent-strong:#3a77ef;--accent-soft:#4f8cff29;--success:#2fbf71;--danger:#f05252;--danger-soft:#f0525224;--warning:#f0a020;--grid-line:#ffffff0d;--map-unknown:#586172;--shadow:0 10px 30px #0006;--radius:10px;--font:system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, sans-serif;--mono:ui-monospace, "SF Mono", "Cascadia Code", "Ubuntu Mono", Menlo, monospace}@media (prefers-color-scheme:light){:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#eef1f5;--surface:#fff;--surface-2:#f4f6f9;--surface-3:#e7ebf0;--border:#dce1e8;--border-strong:#c3cad5;--text:#172030;--text-muted:#5d6879;--accent:#2f6fed;--accent-strong:#1f5ad6;--accent-soft:#2f6fed1f;--grid-line:#0f172a12;--map-unknown:#a7afbb;--shadow:0 10px 30px #0f172a24}}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{touch-action:manipulation;background:var(--bg);color:var(--text);font:14px/1.4 var(--font);-webkit-font-smoothing:antialiased;overscroll-behavior:none}button,input,select,textarea{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}h1,h2{margin:0;font-weight:650}.button{border:1px solid var(--border-strong);background:var(--surface-2);white-space:nowrap;cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:6px;height:34px;padding:0 12px;font-weight:600;display:inline-flex}.button:hover{background:var(--surface-3)}.button:disabled{opacity:.5;cursor:default}.button.primary{border-color:var(--accent);background:var(--accent);color:#fff}.button.primary:hover{background:var(--accent-strong)}.button.danger{color:var(--danger)}.button.danger:hover{background:var(--danger-soft)}.modal-actions .button.danger{border-color:var(--danger);background:var(--danger);color:#fff}.icon-button{width:34px;height:34px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;display:inline-grid}.icon-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.icon-button:disabled{opacity:.35;cursor:default}.link-button{color:var(--accent);cursor:pointer;background:0 0;border:0;font-weight:600}input,select,textarea{border:1px solid var(--border);background:var(--surface-2);border-radius:7px;width:100%;min-width:0;padding:7px 9px}input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:3px solid var(--accent-soft);outline-offset:0}textarea{resize:vertical;min-height:84px;font:12.5px/1.45 var(--mono)}.app{flex-direction:column;height:100dvh;display:flex}.topbar{z-index:20;padding:8px 12px;padding-top:max(8px, env(safe-area-inset-top));border-bottom:1px solid var(--border);background:var(--surface);align-items:center;gap:8px;display:flex;position:relative}.brand{color:var(--accent);letter-spacing:.01em;align-items:center;gap:8px;margin-right:4px;font-weight:700;display:flex}.brand-name{color:var(--text)}.connection-dot{background:var(--warning);border-radius:50%;width:8px;height:8px}.connection-dot.open{background:var(--success);box-shadow:0 0 0 3px #2fbf7133}.connection-dot.closed{background:var(--danger);animation:1.2s ease-in-out infinite pulse}.panel-select{appearance:none;text-overflow:ellipsis;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b95a7' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;background-size:14px;flex:0 auto;width:auto;min-width:72px;max-width:280px;height:34px;padding:0 30px 0 10px;font-weight:600}.topbar-spacer{flex:1}.save-state{color:var(--text-muted);font-size:12px}.save-state.failed{color:var(--danger)}.mode-switch{border:1px solid var(--border);background:var(--surface-2);border-radius:9px;padding:2px;display:inline-flex}.mode-switch button{height:30px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:6px;padding:0 11px;font-weight:600;display:inline-flex}.mode-switch button[aria-pressed=true]{background:var(--surface-3);color:var(--text);box-shadow:0 1px 2px #0003}.app.editing .mode-switch button[aria-pressed=true]{background:var(--accent);color:#fff}.menu{position:relative}.menu-backdrop{z-index:25;position:fixed;inset:0}.menu-list{z-index:30;border:1px solid var(--border);background:var(--surface);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:4px;position:absolute;top:calc(100% + 6px);right:0}.menu-list button{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;width:100%;padding:8px 10px;display:block}.menu-list button:hover{background:var(--surface-3)}.menu-list button.danger{color:var(--danger)}.workspace{flex:1;min-height:0;display:flex;position:relative}.empty-state{max-width:440px;color:var(--text-muted);text-align:center;margin:auto;padding:24px}.empty-state h1{color:var(--text);margin-bottom:8px;font-size:20px}.empty-state p{margin:0 0 18px}.board-column{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.board-scroll{flex:1;min-width:0;min-height:0;padding:16px;overflow:auto}.board-scroll.columns{overflow-x:hidden}.board.preview{box-shadow:0 0 0 1px var(--border-strong), 0 0 0 9999px #0000001f;border-radius:4px;margin:0 auto}.layout-bar{border-bottom:1px solid var(--border);background:var(--surface);color:var(--text-muted);flex-wrap:wrap;align-items:center;gap:6px 14px;padding:8px 16px;font-size:12.5px;display:flex}.layout-bar strong{color:var(--text)}.layout-hidden{flex-wrap:wrap;align-items:center;gap:4px;display:inline-flex}.layout-chip{border:1px solid var(--border-strong);background:var(--surface-2);cursor:pointer;border-radius:999px;padding:1px 8px;font-size:12px}.layout-chip:hover{border-color:var(--accent);color:var(--accent)}.board{position:relative}.board.editing{outline:1px solid var(--grid-line);background-image:linear-gradient(to right, var(--grid-line) 1px, transparent 1px), linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);background-size:var(--cell) var(--cell)}.board-hint{width:min(420px,90%);color:var(--text-muted);text-align:center;pointer-events:none;position:absolute;top:40%;left:50%;transform:translate(-50%)}.drop-target{z-index:5;border:2px dashed var(--accent);border-radius:var(--radius);background:var(--accent-soft);pointer-events:none;position:absolute}.drop-target.invalid{border-color:var(--danger);background:var(--danger-soft)}.widget{display:flex;position:absolute}.widget-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden;box-shadow:0 1px 2px #0000002e}.widget-title{color:var(--text-muted);letter-spacing:.06em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;padding:7px 10px 0;font-size:11px;font-weight:650;overflow:hidden}.widget-body{flex:1;min-width:0;min-height:0;display:flex;position:relative}.widget-message{color:var(--text-muted);text-align:center;margin:auto;padding:12px;font-size:13px}.widget-message.error{color:var(--danger)}.widget.editing{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab}.widget.editing .widget-body{pointer-events:none}.widget.editing:hover .widget-card{border-color:var(--border-strong)}.widget.selected .widget-card{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent), 0 0 0 5px var(--accent-soft)}.widget.dragging{z-index:10;opacity:.88;cursor:grabbing}.widget.dragging .widget-card{box-shadow:var(--shadow)}.widget-chrome{pointer-events:none;position:absolute;inset:0}.widget-tag,.widget-buttons,.resize-handle:after{opacity:0;transition:opacity .12s}.widget.editing:hover .widget-tag,.widget.editing:hover .widget-buttons,.widget.editing:hover .resize-handle:after,.widget.selected .widget-tag,.widget.selected .widget-buttons,.widget.selected .resize-handle:after{opacity:1}@media (hover:none){.widget.editing .widget-tag,.widget.editing .widget-buttons,.widget.editing .resize-handle:after{opacity:1}}.widget-tag{background:var(--surface-3);max-width:calc(100% - 72px);color:var(--text-muted);white-space:nowrap;border-radius:6px;align-items:center;gap:5px;padding:3px 7px;font-size:11px;font-weight:600;display:inline-flex;position:absolute;top:6px;left:6px;overflow:hidden}.widget-buttons{gap:4px;display:flex;position:absolute;top:5px;right:5px}.widget-button{background:var(--surface-3);width:26px;height:26px;color:var(--text-muted);cursor:pointer;pointer-events:auto;border:0;border-radius:6px;place-items:center;display:grid}.widget-button:hover{background:var(--accent);color:#fff}.widget-button.remove:hover{background:var(--danger)}.resize-handle{touch-action:none;cursor:nwse-resize;pointer-events:auto;width:22px;height:22px;position:absolute;bottom:0;right:0}.resize-handle:after{border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);content:"";border-bottom-right-radius:3px;width:9px;height:9px;position:absolute;bottom:5px;right:5px}.properties{border-left:1px solid var(--border);background:var(--surface);flex-direction:column;flex:0 0 320px;width:320px;min-height:0;display:flex}@media (width<=720px){.properties{z-index:15;border-top:1px solid var(--border);width:auto;max-height:60%;box-shadow:var(--shadow);border-left:0;border-radius:14px 14px 0 0;position:absolute;bottom:0;left:0;right:0}}.properties-header{border-bottom:1px solid var(--border);color:var(--accent);align-items:center;gap:10px;padding:10px 10px 10px 16px;display:flex}.properties-header h2{color:var(--text);flex:1;font-size:15px}.properties-body{flex-direction:column;flex:1;gap:16px;padding:14px 16px;display:flex;overflow:auto}.properties-meta{color:var(--text-muted);margin:0;font-size:11.5px}.properties-footer{padding:12px 16px;padding-bottom:max(12px, env(safe-area-inset-bottom));border-top:1px solid var(--border);gap:8px;display:flex}.properties-footer .button{flex:1}.field{flex-direction:column;gap:5px;display:flex}.field-label{font-size:12px;font-weight:600}.field-help{color:var(--text-muted);margin:0;font-size:11.5px}.toggle{cursor:pointer;align-items:center;gap:10px;display:flex}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle-switch{border:1px solid var(--border-strong);background:var(--surface-3);border-radius:999px;flex:none;width:34px;height:20px;transition:background-color .15s;position:relative}.toggle-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #0000004d}.toggle input:checked+.toggle-switch{border-color:var(--accent);background:var(--accent)}.toggle input:checked+.toggle-switch:after{transform:translate(14px)}.toggle input:focus-visible+.toggle-switch{outline:2px solid var(--accent);outline-offset:2px}.color-field{align-items:center;gap:10px;display:flex}.color-field input{cursor:pointer;width:46px;height:32px;padding:2px}.color-field code{color:var(--text-muted);font:12px var(--mono)}.modal-backdrop{z-index:50;background:#05080c8c;justify-content:center;align-items:center;padding:16px;animation:.12s ease-out fade-in;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--border);background:var(--surface);width:min(420px,100%);max-height:calc(100dvh - 32px);box-shadow:var(--shadow);border-radius:14px;flex-direction:column;animation:.14s ease-out pop-in;display:flex}.modal.wide{width:min(560px,100%)}.modal.resizable{background:var(--surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M9 2 2 9M9 6 6 9' stroke='%238b95a7' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat right 4px bottom 4px / 11px;resize:both;width:min(720px,100%);min-width:min(340px,100%);max-width:100%;height:min(600px,100dvh - 32px);min-height:min(320px,100dvh - 32px);overflow:hidden}.modal.resizable>.modal-body{flex:1;min-height:0}.modal-header{align-items:center;padding:12px 10px 4px 18px;display:flex}.modal-header h2{flex:1;font-size:16px}.modal-body{flex-direction:column;gap:16px;padding:8px 18px 18px;display:flex;overflow:auto}.dialog-message{color:var(--text-muted)}.dialog-command{background:var(--surface-2);max-height:200px;color:var(--text);font:12px/1.45 var(--mono);white-space:pre-wrap;border-radius:6px;margin:0;padding:8px 10px;overflow:auto}.modal-actions{justify-content:flex-end;gap:8px;display:flex}.palette-scroll{min-height:0;padding-bottom:10px;overflow-y:auto}.palette{gap:8px;padding:8px 18px;display:grid}.palette-heading{color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;padding:10px 18px 0;font-size:12px;font-weight:600}.palette-item{border:1px solid var(--border);background:var(--surface-2);text-align:left;cursor:pointer;border-radius:10px;align-items:center;gap:14px;padding:12px 14px;display:flex}.palette-item:hover{border-color:var(--accent);background:var(--accent-soft)}.palette-icon{background:var(--accent-soft);width:44px;height:44px;color:var(--accent);border-radius:10px;flex:none;place-items:center;display:grid}.palette-text{flex-direction:column;gap:2px;display:flex}.palette-text span{color:var(--text-muted);font-size:13px}.notifications{bottom:max(16px, env(safe-area-inset-bottom));z-index:60;pointer-events:none;flex-direction:column;gap:8px;width:min(480px,100% - 32px);display:flex;position:fixed;left:50%;transform:translate(-50%)}.notification{border:1px solid var(--border-strong);background:var(--surface-3);box-shadow:var(--shadow);pointer-events:auto;border-radius:10px;align-items:center;gap:10px;padding:9px 8px 9px 14px;animation:.18s ease-out rise-in;display:flex}.notification.error{border-left:3px solid var(--danger)}.notification>span{overflow-wrap:anywhere;flex:1}.notification-close{width:26px;height:26px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;font-size:18px;line-height:1}.notification-close:hover{background:var(--surface-2)}.teleop{flex-direction:column;flex:1;gap:4px;min-width:0;min-height:0;padding:8px;display:flex}.teleop-pads{flex:1;justify-content:space-evenly;align-items:center;min-height:0;display:flex;container-type:size}.joystick-slot{flex-direction:column;align-items:center;gap:4px;display:flex}.joystick{aspect-ratio:1;border:1px solid var(--border-strong);background:radial-gradient(circle at 50% 42%, var(--surface-3), var(--surface-2) 72%);touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;border-radius:50%;width:min(100cqh - 22px,100cqw - 8px);position:relative;box-shadow:inset 0 2px 10px #00000040}.teleop-pads.two .joystick{width:min(100cqh - 22px,50cqw - 16px)}.joystick:before,.joystick:after{background:var(--border);content:"";position:absolute}.joystick:before{height:1px;top:50%;left:12%;right:12%}.joystick:after{width:1px;top:12%;bottom:12%;left:50%}.joystick-track{border:1px dashed var(--border-strong);border-radius:50%;position:absolute;inset:16%}.joystick.horizontal{box-shadow:none;background:0 0;border-color:#0000}.joystick.horizontal:after{display:none}.joystick.horizontal .joystick-track{border:1px solid var(--border-strong);background:radial-gradient(circle at 50% 30%, var(--surface-3), var(--surface-2));border-radius:999px;inset:37% 0;box-shadow:inset 0 2px 8px #00000038}.joystick.vertical{box-shadow:none;background:0 0;border-color:#0000}.joystick.vertical:before{display:none}.joystick.vertical .joystick-track{border:1px solid var(--border-strong);background:radial-gradient(circle at 30% 50%, var(--surface-3), var(--surface-2));border-radius:999px;inset:0 37%;box-shadow:inset 0 2px 8px #00000038}.joystick-knob{aspect-ratio:1;background:radial-gradient(circle at 35% 30%, #8db6ff, var(--accent) 58%, var(--accent-strong));pointer-events:none;border-radius:50%;width:32%;transition:left .16s ease-out,top .16s ease-out;position:absolute;transform:translate(-50%,-50%);box-shadow:0 4px 12px #00000059,inset 0 1px 1px #ffffff59}.joystick.active{cursor:grabbing}.joystick.active .joystick-knob{box-shadow:0 0 0 7px var(--accent-soft), 0 4px 14px #0006, inset 0 1px 1px #ffffff59;transition:none}.joystick.disabled{cursor:default}.joystick.disabled .joystick-knob{background:var(--border-strong)}.joystick-label{height:14px;color:var(--text-muted);font:11px/14px var(--mono)}.teleop-readout{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:center;gap:4px 12px;display:flex}.teleop-topic{opacity:.7}.teleop-readout .offline{color:var(--danger)}.command-button{flex-direction:column;flex:1;gap:6px;min-width:0;min-height:0;padding:5px;display:flex}.command-button-face{cursor:pointer;border:0;border-radius:7px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:1px;min-height:0;padding:4px 10px;font-size:15px;font-weight:650;transition:filter .15s,background-color .25s;display:flex;position:relative;overflow:hidden;box-shadow:inset 0 -2px #0000002e}.command-button-face:hover{filter:brightness(1.08)}.command-button-face:active{filter:brightness(.95)}.command-button-face.busy{background-image:repeating-linear-gradient(-45deg,#ffffff24 0 10px,#0000 10px 20px);background-size:28.28px 28.28px;animation:.9s linear infinite stripes}.command-button-label,.command-button-status{text-overflow:ellipsis;white-space:nowrap;max-width:100%;overflow:hidden}.command-button-status{opacity:.85;font-size:11px;font-weight:500}.command-button.with-output .command-button-face{flex:none;min-height:46px}.command-output{border:1px solid var(--border);background:var(--bg);min-height:0;color:var(--text-muted);font:11px/1.4 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;flex:1;margin:0;padding:6px 8px;overflow:auto}.camera{background:#000;flex:1;min-width:0;min-height:0;position:relative}.camera canvas{width:100%;height:100%;display:block;position:absolute;inset:0}.camera canvas.dimmed{opacity:.35}.camera-overlay{color:#9aa4b5;text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.camera-overlay.error{color:#ff8f8f}.camera-info{color:#e5e7eb;font:11px var(--mono);font-variant-numeric:tabular-nums;background:#0000008c;border-radius:4px;padding:2px 6px;position:absolute;bottom:8px;left:8px}.navigation{background:var(--map-unknown);flex:1;min-width:0;min-height:0;position:relative;overflow:hidden}.navigation canvas{touch-action:none;cursor:grab;width:100%;height:100%;display:block;position:absolute;inset:0}.navigation canvas:active{cursor:grabbing}.navigation canvas.placing{cursor:crosshair}.overlay-toolbar{border:1px solid var(--border);background:var(--surface);border-radius:10px;align-items:center;gap:2px;padding:3px;display:flex;position:absolute;top:8px;left:8px;box-shadow:0 2px 8px #0003}.overlay-button{width:32px;height:32px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:7px;place-items:center;display:grid}.overlay-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.overlay-button[aria-pressed=true]{background:var(--accent);color:#fff}.overlay-button:disabled{opacity:.4;cursor:default}.overlay-separator{background:var(--border);align-self:stretch;width:1px;margin:5px 3px}.nav-hint{color:#fff;text-align:center;pointer-events:none;background:#000000ad;border-radius:8px;max-width:calc(100% - 16px);padding:5px 10px;font-size:12px;position:absolute;top:54px;left:50%;transform:translate(-50%)}.nav-readout{color:#e5e7eb;max-width:calc(100% - 16px);font:11px var(--mono);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:pre;pointer-events:none;background:#00000094;border-radius:6px;padding:3px 8px;position:absolute;bottom:8px;left:8px;overflow:hidden}.nav-readout.stale{color:#f6c26b}.nav-readout.error{color:#ffbdbd}.nav-overlay{color:#f1f3f6;text-align:center;pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.nav-overlay.error{color:#ffd0d0}.robot-model{background:radial-gradient(ellipse at 50% 40%, var(--surface-3), var(--surface-2) 75%);flex:1;min-width:0;min-height:0;position:relative;overflow:hidden}.robot-canvas{position:absolute;inset:0}.robot-canvas canvas{touch-action:none;display:block}.robot-labels{pointer-events:none;position:absolute;inset:0}.robot-frame-label{color:#f1f3f6;font:10px/1.3 var(--mono);white-space:nowrap;background:#0000008c;border-radius:4px;padding:1px 5px}.robot-overlay{color:var(--text-muted);text-align:center;pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:12px;display:flex;position:absolute;inset:0}.robot-overlay.error{color:var(--danger)}.robot-loading{color:#e5e7eb;font:11px var(--mono);pointer-events:none;background:#0000008c;border-radius:6px;padding:3px 8px;position:absolute;top:10px;right:10px}.robot-notes{pointer-events:none;flex-wrap:wrap;gap:4px;display:flex;position:absolute;bottom:8px;left:8px;right:8px}.robot-motion,.robot-note{font:11px var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:6px;padding:2px 7px}.robot-motion{color:#231400;background:#f59e0b;font-weight:600}.robot-note{color:#ffd2a6;background:#0000008c}.services{flex:1;min-width:0;min-height:0;margin:0;padding:2px 4px;list-style:none;overflow:auto}.service+.service{border-top:1px solid var(--border)}.service-row{align-items:center;gap:10px;padding:7px 4px;display:flex}.service-dot{background:var(--border-strong);border-radius:50%;flex:none;width:10px;height:10px}.service-dot.on{background:var(--success);box-shadow:0 0 0 3px #2fbf712e}.service-dot.busy{background:var(--warning);animation:1s ease-in-out infinite pulse}.service-dot.failed{background:var(--danger)}.service-text{flex-direction:column;flex:1;min-width:0;display:flex}.service-name{white-space:nowrap;align-items:center;gap:6px;font-weight:600;display:flex;overflow:hidden}.service-tag{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 6px;font-size:10.5px;font-weight:600}.service-state{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.service-state.on{color:var(--success)}.service-state.busy{color:var(--warning)}.service-state.failed{color:var(--danger)}.service-actions{flex:none;gap:4px;display:flex}.service-button{border:1px solid var(--border);background:var(--surface-2);width:32px;height:32px;color:var(--text-muted);cursor:pointer;border-radius:8px;place-items:center;display:grid}.service-button:hover:not(:disabled){background:var(--surface-3);color:var(--text)}.service-button.start{color:var(--success)}.service-button.stop{color:var(--danger)}.service-button[aria-pressed=true]{border-color:var(--accent);background:var(--accent);color:#fff}.service-button:disabled{opacity:.45;cursor:default}.service-output{height:160px;margin:0 4px 8px}.image-viewer{flex:1;min-width:0;min-height:0;position:relative}.image-viewer img{width:100%;height:100%;position:absolute;inset:0}.image-viewer img.failed{visibility:hidden}.image-viewer-error{place-items:center;display:grid;position:absolute;inset:0}.file-input{flex-direction:column;gap:8px;display:flex}.file-input-actions{flex-wrap:wrap;gap:6px;display:flex}.file-input-preview{border:1px solid var(--border);background:var(--surface-2);border-radius:6px;align-self:flex-start;max-width:100%;max-height:140px}.file-browser-path{align-items:center;gap:10px;min-width:0;display:flex}.file-browser-path code{min-width:0;color:var(--text-muted);font:12px var(--mono);overflow-wrap:anywhere}.file-browser-body{grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;height:min(360px,50dvh);display:grid}.modal.resizable .file-browser-body{flex:1;height:auto;min-height:120px}.file-browser-body.single{grid-template-columns:minmax(0,1fr)}@media (width<=560px){.file-browser-body:not(.single){grid-template-rows:minmax(0,1fr) 120px;grid-template-columns:1fr}}.file-browser-list{border:1px solid var(--border);border-radius:8px;margin:0;padding:4px;list-style:none;overflow:auto}.file-browser-entry{text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;width:max-content;min-width:100%;padding:6px 8px;display:flex}.file-browser-chosen{color:var(--text-muted);font:12px var(--mono);overflow-wrap:anywhere;margin:-6px 0 0}.file-browser-entry:hover{background:var(--surface-3)}.file-browser-entry.selected{background:var(--accent-soft);color:var(--accent)}.file-browser-empty{color:var(--text-muted);padding:8px}.file-browser-preview{border:1px solid var(--border);background:var(--surface-2);min-height:0;color:var(--text-muted);text-align:center;border-radius:8px;place-items:center;padding:8px;font-size:12px;display:grid}.file-browser-preview img{object-fit:contain;max-width:100%;max-height:100%}.field-help.error{color:var(--danger)}@media (width<=560px){.hide-narrow,.brand-name,.save-state{display:none}.topbar{gap:6px;padding-left:8px;padding-right:8px}.topbar .button{padding:0 9px}.mode-switch button{padding:0 8px}.app.editing .topbar{flex-wrap:wrap;row-gap:6px}}@keyframes pulse{50%{opacity:.35}}@keyframes stripes{to{background-position:28.28px 0}}@keyframes fade-in{0%{opacity:0}}@keyframes pop-in{0%{opacity:0;transform:scale(.97)}}@keyframes rise-in{0%{opacity:0;transform:translateY(8px)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.arm-teleop{flex-direction:column;flex:1;gap:6px;min-width:0;min-height:0;padding:8px;display:flex}.arm-banner{color:var(--warning);text-align:center;background:#f0a02024;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:600}.arm-pads{min-height:90px}.arm-joints{flex-direction:column;flex:1;justify-content:space-evenly;gap:2px;min-height:0;display:flex;overflow-y:auto}.arm-joints.compact{flex:none}.arm-joint{grid-template-columns:minmax(48px,72px) 1fr 64px;align-items:center;gap:8px;min-height:30px;display:grid}.arm-joint.undriven .arm-joint-name{color:var(--text-muted);text-decoration:line-through}.arm-joint-name{font:12px var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.jog-slider{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;height:28px;position:relative}.jog-slider-track{border:1px solid var(--border-strong);background:linear-gradient(90deg, var(--accent-soft), transparent 40% 60%, var(--accent-soft));border-radius:999px;height:8px;position:absolute;top:50%;left:2%;right:2%;transform:translateY(-50%)}.jog-slider-track:after{background:var(--border-strong);content:"";width:1px;position:absolute;top:-5px;bottom:-5px;left:50%}.jog-slider-knob{background:radial-gradient(circle at 35% 30%, #8db6ff, var(--accent) 58%, var(--accent-strong));pointer-events:none;border-radius:50%;width:20px;height:20px;transition:left .16s ease-out;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 2px 6px #00000059}.jog-slider.active{cursor:grabbing}.jog-slider.active .jog-slider-knob{box-shadow:0 0 0 6px var(--accent-soft), 0 2px 8px #0006;transition:none}.jog-slider.disabled{cursor:default}.jog-slider.disabled .jog-slider-knob{background:var(--border-strong)}.arm-joint-readout{font:12px var(--mono);font-variant-numeric:tabular-nums;flex-direction:column;align-items:flex-end;gap:3px;display:flex}.arm-joint-readout .relative{color:var(--warning);font-style:italic}.arm-range{background:var(--surface-3);border-radius:2px;width:100%;height:4px;position:relative}.arm-range.empty{visibility:hidden}.arm-range-zero{background:var(--text-muted);width:1px;position:absolute;top:-2px;bottom:-2px}.arm-range-position{background:var(--accent);border-radius:2px;width:4px;height:8px;position:absolute;top:-2px;transform:translate(-50%)}.arm-status{color:var(--text-muted);text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.arm-status.error{color:var(--danger)}.arm-status.active{color:var(--accent)}.bt{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.bt-banner{text-overflow:ellipsis;white-space:nowrap;flex:none;padding:4px 10px;font-size:11.5px;font-weight:600;overflow:hidden}.bt-banner.warning{color:var(--warning);background:#f0a02024}.bt-banner.error{background:var(--danger-soft);color:var(--danger)}.bt-main{flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.bt .overlay-toolbar{flex-wrap:wrap;max-width:calc(100% - 16px)}.bt-main.list{flex-direction:column}.bt-main.list>.overlay-toolbar{order:-1;align-self:flex-start;margin:8px 8px 2px;position:static}.overlay-button.recording{background:var(--danger);color:#fff;animation:1.4s ease-out infinite bt-recording}@keyframes bt-recording{0%{box-shadow:0 0 #f052528c}to{box-shadow:0 0 0 7px #f0525200}}.bt-graph{touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;background-image:radial-gradient(circle,#8b95a738 1px,#0000 1.3px);background-size:24px 24px;position:absolute;inset:0;overflow:hidden}.bt-graph:active{cursor:grabbing}.bt-layer{transform-origin:0 0;position:absolute;top:0;left:0}.bt-links{position:absolute;inset:0;overflow:visible}.bt-links path{fill:none;stroke:var(--border-strong);stroke-width:1.5px}.bt-links path.running{stroke:var(--warning);stroke-width:2.5px}.bt-node{border:1px solid var(--border-strong);background:var(--surface-2);cursor:pointer;border-radius:8px;flex-direction:column;transition:border-color .2s,background-color .2s,box-shadow .2s;display:flex;position:absolute;box-shadow:0 1px 2px #0000002e}.bt-node-head{flex:none;align-items:center;gap:7px;height:38px;padding:0 10px;display:flex}.bt-kind{color:var(--text-muted);flex:none}.bt-node-labels{flex-direction:column;min-width:0;line-height:1.25;display:flex}.bt-node-type,.bt-node-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-node-type{font-size:12px;font-weight:650}.bt-node-name{color:var(--text-muted);font-size:11px}.bt-node-ports{border-top:1px solid var(--border);font:10.5px/15px var(--mono);margin:0;padding:4px 10px 6px}.bt-node-ports div,.bt-ports div{gap:8px;min-width:0;display:flex}.bt-node-ports dt,.bt-ports dt{color:var(--text-muted);flex:none}.bt-node-ports dd{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.bt-node-ports dd.entry,.bt-ports dd.entry{color:var(--accent)}.bt-node.running{border-color:var(--warning);background:linear-gradient(#f0a02029, #f0a02029), var(--surface-2);animation:1.6s ease-in-out infinite bt-glow;box-shadow:0 0 0 3px #f0a02038}.bt-node.success{border-color:var(--success);background:linear-gradient(#2fbf7129, #2fbf7129), var(--surface-2)}.bt-node.failure{border-color:var(--danger);background:linear-gradient(#f0525229, #f0525229), var(--surface-2)}.bt-node.skipped{opacity:.6;border-style:dashed}.bt-node.running .bt-kind{color:var(--warning)}.bt-node.success .bt-kind{color:var(--success)}.bt-node.failure .bt-kind{color:var(--danger)}.bt-node.was-success{border-color:#2fbf7180;box-shadow:inset 3px 0 #2fbf71bf,0 1px 2px #0000002e}.bt-node.was-failure{border-color:#f052528c;box-shadow:inset 3px 0 #f05252cc,0 1px 2px #0000002e}.bt-node.selected{outline:2px solid var(--accent);outline-offset:2px}.bt-fold{z-index:1;border:1px solid var(--border-strong);background:var(--surface);min-width:18px;height:18px;color:var(--text-muted);text-align:center;cursor:pointer;border-radius:9px;padding:0 5px;font-size:11px;font-weight:650;line-height:16px;position:absolute;bottom:-9px;left:50%;transform:translate(-50%)}.bt-fold.side{inset:50% 0 auto auto;transform:translate(50%,-50%)}.bt-fold:hover{border-color:var(--accent);color:var(--accent)}.bt-fold.running{border-color:var(--warning);color:var(--warning)}@keyframes bt-glow{50%{box-shadow:0 0 0 6px #f0a02014}}.bt-list{flex:1;min-height:0;padding:0 4px 6px;position:relative;overflow:auto;container-type:inline-size}.bt-list ul{margin:0;padding:0;list-style:none}.bt-list-heading{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:10px 8px 4px;font-size:11px;font-weight:650}.bt-row{border-radius:6px;align-items:center;display:flex}.bt-row.running{background:#f0a0201a}.bt-row.selected{background:var(--accent-soft)}.bt-row-indent{flex:none}.bt-row-fold{width:20px;height:26px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;flex:none;place-items:center;padding:0;display:grid}.bt-row-fold svg{transition:transform .12s}.bt-row-fold[aria-expanded=true] svg{transform:rotate(90deg)}.bt-row-main{text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:7px;min-width:0;height:30px;padding:0 8px 0 2px;display:flex}.bt-row-labels{white-space:nowrap;flex:1;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:hidden}.bt-row-type{text-overflow:ellipsis;flex:0 auto;min-width:2.5em;font-size:13px;font-weight:600;overflow:hidden}.bt-row-name{min-width:0;color:var(--text-muted);text-overflow:ellipsis;flex:0 100 auto;font-size:12px;overflow:hidden}.bt-row-status{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none;gap:8px;font-size:11.5px;display:flex}.bt-row.running .bt-row-status{color:var(--warning)}.bt-row.success .bt-row-status{color:var(--success)}.bt-row.failure .bt-row-status{color:var(--danger)}.bt-row-counts{font:11px var(--mono)}@container (width<=380px){.bt-row-counts{display:none}}.bt-row-counts .success,.bt-facts .success{color:var(--success)}.bt-row-counts .failure,.bt-facts .failure{color:var(--danger)}.bt-dot{background:var(--border-strong);border-radius:50%;flex:none;width:9px;height:9px}.bt-row.running .bt-dot,.bt-status.running .bt-dot{background:var(--warning);animation:1s ease-in-out infinite pulse}.bt-row.success .bt-dot,.bt-status.success .bt-dot{background:var(--success)}.bt-row.failure .bt-dot,.bt-status.failure .bt-dot,.bt-status.error .bt-dot{background:var(--danger)}.bt-row.was-success .bt-dot{box-shadow:inset 0 0 0 2px var(--success);background:0 0}.bt-row.was-failure .bt-dot{box-shadow:inset 0 0 0 2px var(--danger);background:0 0}.bt-pill{background:var(--surface-3);color:var(--text-muted);white-space:nowrap;border-radius:4px;padding:0 6px;font-size:10.5px;font-weight:650;line-height:17px;display:inline-block}.bt-pill.running{color:var(--warning);background:#f0a0202e}.bt-pill.success{color:var(--success);background:#2fbf7129}.bt-pill.failure{background:var(--danger-soft);color:var(--danger)}.bt-muted{color:var(--text-muted)}.bt-details{z-index:2;border:1px solid var(--border);background:var(--surface);width:min(300px,100% - 16px);box-shadow:var(--shadow);border-radius:10px;flex-direction:column;animation:.12s ease-out pop-in;display:flex;position:absolute;top:8px;bottom:8px;right:8px}.bt-details-header{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:6px 6px 6px 12px;display:flex}.bt-details-header .bt-kind{color:var(--accent)}.bt-details-title{flex-direction:column;flex:1;min-width:0;display:flex}.bt-details-title strong,.bt-details-title span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-details-title span{color:var(--text-muted);font-size:12px}.bt-details-body{flex-direction:column;gap:14px;padding:10px 12px 12px;font-size:12.5px;display:flex;overflow:auto}.bt-details-body h3{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:0 0 6px;font-size:11px;font-weight:650}.bt-path{flex-wrap:wrap;font-size:11.5px;display:flex}.bt-path button{color:var(--text-muted);cursor:pointer;background:0 0;border:0;padding:0}.bt-path button:hover{color:var(--accent)}.bt-path button+button:before{color:var(--border-strong);content:"›";margin:0 5px}.bt-facts{grid-template-columns:auto 1fr;align-items:baseline;gap:6px 12px;margin:0;display:grid}.bt-facts dt{color:var(--text-muted)}.bt-facts dd{margin:0}.bt-ports{font:11.5px/1.55 var(--mono);margin:0}.bt-ports dd{overflow-wrap:anywhere;margin:0}.bt-node-log{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.bt-node-log li{color:var(--text-muted);align-items:center;gap:5px;display:flex}.bt-node-log time,.bt-log time{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex:none}.bt-log{border-top:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 0 38%;min-height:90px;display:flex}.bt-log ol{flex:1;margin:0;padding:4px;list-style:none;overflow:auto}.bt-log button{width:100%;color:var(--text-muted);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;padding:2px 6px;font-size:11.5px;display:flex}.bt-log button:hover{background:var(--surface-3)}.bt-log-node{min-width:0;color:var(--text);text-overflow:ellipsis;overflow:hidden}.bt-log-empty{margin:auto;font-size:12px}.bt-status{border-top:1px solid var(--border);min-width:0;color:var(--text-muted);flex:none;align-items:center;gap:7px;padding:5px 10px;font-size:12px;display:flex}.bt-status-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bt-status.running{color:var(--text)}.bt-status.error{color:var(--danger)}.bt-rec{background:var(--danger-soft);color:var(--danger);letter-spacing:.04em;font-variant-numeric:tabular-nums;border-radius:4px;flex:none;margin-left:auto;padding:0 6px;font-size:10.5px;font-weight:650;line-height:17px}.bt-playback{border-top:1px solid var(--border);background:var(--surface-2);flex:none;align-items:center;gap:6px;padding:3px 4px 3px 2px;display:flex;container-type:inline-size}.bt-playback .icon-button{width:30px;height:30px}.bt-playback input[type=range]{min-width:48px;accent-color:var(--accent);cursor:pointer;background:0 0;border:0;flex:1;padding:0}.bt-playback input[type=range]:focus{outline:none}.bt-playback-time{color:var(--text-muted);font:11px var(--mono);font-variant-numeric:tabular-nums;flex:none}.bt-playback select{flex:none;width:auto;padding:3px 6px;font-size:12px}.bt-playback-error{min-width:0;color:var(--danger);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}@container (width<=300px){.bt-playback-time{display:none}}.bt-record-path{gap:8px;display:flex}.bt-record-path input,.dialog-message code{font:12.5px var(--mono)}.bte:focus,.bte:focus-visible{outline:none}.bte-banner{align-items:center;gap:10px;display:flex}.bte-banner>span{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.bte-banner .link-button{color:inherit;flex:none;padding:0;font-size:11.5px;text-decoration:underline}.bte-banner .link-button:disabled{opacity:.5;cursor:default}.bte-toolbar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none;align-items:center;gap:2px;padding:4px 6px;display:flex}.bte-tree-select{width:auto;min-width:90px;max-width:220px;height:32px;padding:0 8px;font-size:13px;font-weight:600}.bte-toolbar-end{flex:1}.bte-save{height:32px;padding:0 10px}.menu-list button.bte-narrow{display:none}.menu-list button:disabled{opacity:.45;cursor:default}@container (width<=520px){.bte-save-label,.bte-toolbar .bte-wide{display:none}.menu-list button.bte-narrow{display:block}.bte-tree-select{flex:80px}}.bte{container-type:inline-size}.bte-body{flex:1;min-height:0;display:flex;position:relative}.bte-palette{border-right:1px solid var(--border);background:var(--surface);flex-direction:column;flex:none;width:240px;min-height:0;display:flex}.bte-body.narrow .bte-palette{z-index:3;width:min(260px,100%);box-shadow:var(--shadow);animation:.12s ease-out pop-in;position:absolute;top:0;bottom:0;left:0}.bte-palette-header{gap:4px;padding:8px 6px 6px 8px;display:flex}.bte-palette-header input{height:32px;font-size:13px}.bte-palette-body{flex:1;min-height:0;padding:0 4px 6px;overflow:auto}.bte-palette-body ul,.bte-picker ul{margin:0;padding:0;list-style:none}.bte-palette-group{width:100%;color:var(--text-muted);letter-spacing:.06em;text-align:left;text-transform:uppercase;cursor:pointer;background:0 0;border:0;justify-content:space-between;margin-top:6px;padding:5px 6px;font-size:11px;font-weight:650;display:flex}.bte-palette-item{text-align:left;cursor:grab;touch-action:pan-y;background:0 0;border:0;border-radius:6px;align-items:center;gap:7px;width:100%;min-width:0;height:30px;padding:0 8px;display:flex}.bte-palette-item:hover{background:var(--surface-3)}.bte-palette-name{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.bte-palette-library{min-width:0;color:var(--text-muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:1 100 auto;font-size:11px;overflow:hidden}.bte-palette-empty{margin:12px 8px;font-size:12.5px}.bte-palette-footer{border-top:1px solid var(--border);flex-direction:column;gap:6px;padding:8px;display:flex}.bte-palette-footer .field-help{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bte-library{font:12px var(--mono);align-items:center;gap:4px;display:flex}.bte-library span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;line-height:26px;overflow:hidden}.bte-library .icon-button{width:26px;height:26px}.bte-canvas{flex:1;min-width:0}.bte-graph.dragging{cursor:grabbing}.bte-node.tree{border-style:dashed}.bte-node.unknown .bt-node-type{font-style:italic}.bte-node.problem{border-color:var(--danger)}.bte-problem{background:var(--danger);color:#fff;border-radius:50%;flex:none;place-items:center;width:16px;height:16px;margin-left:auto;font-size:11px;font-weight:800;display:grid}.bte-node.drop-into,.bte-slot.drop-into{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.bte-node.dragged{opacity:.35}.bte-slot{border:1.5px dashed var(--border-strong);color:var(--text-muted);text-align:center;border-radius:8px;place-items:center;padding:0 8px;font-size:11.5px;display:grid;position:absolute}.bte-drop-bar{background:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);pointer-events:none;border-radius:2px;position:absolute}.bte-ghost,.bte-palette-ghost{opacity:.85;box-shadow:var(--shadow);pointer-events:none}.bte-ghost.nowhere{opacity:.45}.bte-palette-ghost{z-index:40;min-width:120px;position:fixed}.bte-palette-ghost .bt-node-type{white-space:nowrap}.bte-properties .bt-details-header .bt-kind{color:var(--accent)}.bte-actions{border-bottom:1px solid var(--border);align-items:center;gap:1px;padding:4px 6px;display:flex}.bte-actions .icon-button{width:28px;height:28px}.bte-actions .icon-button.danger:hover:not(:disabled){background:var(--danger-soft);color:var(--danger)}.bte-actions-text{flex:1;justify-content:center;min-width:0;display:flex}.bte-actions-text .link-button{border-radius:6px;height:28px;padding:0 5px;font-size:12px}.bte-actions-text .link-button:hover:not(:disabled){background:var(--accent-soft)}.bte-actions-text .link-button:disabled{color:var(--text-muted);opacity:.45;cursor:default}.bte-problems{background:var(--danger-soft);color:var(--danger);border-radius:7px;margin:0;padding:6px 10px 6px 24px;font-size:12px}.bte-description{margin:0}.bte-properties input,.bte-properties textarea,.bte-properties select{font:12.5px var(--mono);padding:5px 8px}.bte-properties textarea{resize:vertical;min-height:0}.bte-properties input[aria-invalid=true]{border-color:var(--danger)}.bte-row,.bte-attribute{align-items:center;gap:6px;display:flex}.bte-attribute{margin-bottom:6px}.bte-attribute>input:first-child{flex:0 0 38%}.bte-attribute .icon-button{width:28px;height:28px}.bte-check{cursor:pointer;align-items:flex-start;gap:8px;font-size:12px;display:flex}.bte-check input{width:auto;margin-top:2px}.bte-port{margin-bottom:10px}.bte-port .field-label{align-items:baseline;gap:6px;min-width:0;display:flex}.bte-port-name{font:600 12px var(--mono)}.bte-direction{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 5px;font-size:10px;font-weight:650;line-height:16px}.bte-direction.output,.bte-direction.inout{background:var(--accent-soft);color:var(--accent)}.bte-port-type{min-width:0;font:11px var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bte-picker{flex-direction:column;gap:8px;display:flex}.bte-picker ul{max-height:min(50vh,420px);overflow:auto}.bte-xml{flex-direction:column;display:flex;position:absolute;inset:0}.bte-xml textarea{background:var(--surface);min-height:0;font:12.5px/1.5 var(--mono);white-space:pre;resize:none;tab-size:2;border:0;border-radius:0;flex:1;padding:10px 12px}.bte-xml textarea:focus{outline:0}.bte-xml-error{background:var(--danger-soft);color:var(--danger);font:12px var(--mono);flex:none;margin:0;padding:5px 10px}.bte-empty{flex-direction:column;align-items:center;gap:4px;display:flex}.bte-empty p{margin:0 0 8px}.bt-status.changed{color:var(--text)}.bt-status.changed .bt-dot{background:var(--warning)}.bte-problems-chip{background:var(--danger-soft);color:var(--danger);cursor:pointer;border:0;border-radius:4px;flex:none;margin-left:auto;padding:0 7px;font-size:11px;font-weight:650;line-height:18px}.logs{--log-debug:#5fb3a1;--log-info:var(--accent);--log-warn:var(--warning);--log-error:var(--danger);--log-fatal:#d56cff;--log-warn-soft:#f0a02017;--log-error-soft:#f052521c;--log-fatal-soft:#d56cff29;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;container-type:inline-size}.logs.cramped .logs-main{display:none}.logs.cramped .logs-details{border-top:0;flex:auto;max-height:none}@media (prefers-color-scheme:light){.logs{--log-debug:#2c8270;--log-warn:#a86400;--log-error:#cf2f2f;--log-fatal:#9327c4;--log-warn-soft:#f0a0201c;--log-error-soft:#f052521a;--log-fatal-soft:#9327c41f}}.logs .debug{--level:var(--log-debug)}.logs .info{--level:var(--log-info)}.logs .warn{--level:var(--log-warn);--level-soft:var(--log-warn-soft)}.logs .error{--level:var(--log-error);--level-soft:var(--log-error-soft)}.logs .fatal{--level:var(--log-fatal);--level-soft:var(--log-fatal-soft)}.logs-toolbar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none;align-items:center;gap:4px;padding:4px 6px;display:flex}.logs-toolbar-end{flex:1}.logs-levels{gap:3px;display:flex}.logs-level{border:1px solid var(--border);height:28px;color:var(--text-muted);white-space:nowrap;cursor:pointer;background:0 0;border-radius:7px;align-items:center;gap:5px;padding:0 7px;font-size:12px;font-weight:600;display:inline-flex}.logs-level:hover{background:var(--surface-3)}.logs-level[aria-pressed=true]{border-color:var(--level);color:var(--text)}.logs-level-dot{width:8px;height:8px;box-shadow:inset 0 0 0 1.5px var(--level);border-radius:50%;flex:none}.logs-level[aria-pressed=true] .logs-level-dot{background:var(--level)}.logs-level-count{color:var(--text-muted);font-variant-numeric:tabular-nums;font-weight:500}.logs-level-letter{display:none}.logs-tools{flex:300px;align-items:center;gap:4px;min-width:0;display:flex}.logs-tools .overlay-separator{margin-left:auto}.logs-search{flex:1 1 0;align-items:center;min-width:60px;max-width:240px;display:flex;position:relative}.logs-search svg{color:var(--text-muted);pointer-events:none;position:absolute;left:8px}.logs-search input{height:28px;padding:0 6px 0 27px;font-size:12.5px}.logs-search.invalid input{border-color:var(--danger);outline-color:var(--danger-soft)}.logs-regex{width:28px;height:28px;font:700 12px var(--mono);flex:none}.logs-main{flex:1 1 0;min-height:66px;display:flex;position:relative}.logs-nodes{border-right:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 0 210px;min-height:0;display:flex}.logs-nodes.overlay{z-index:2;width:min(260px,88%);box-shadow:var(--shadow);animation:.12s ease-out fade-in;position:absolute;inset:0 auto 0 0}.logs-nodes-header{min-height:30px;color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;flex:none;align-items:center;gap:6px;padding:2px 4px 0 10px;font-size:11px;font-weight:650;display:flex}.logs-nodes-header>span{flex:1}.logs-nodes-header .link-button{letter-spacing:0;text-transform:none;padding:0 4px;font-size:11.5px}.logs-nodes-header .link-button:disabled{color:var(--text-muted);opacity:.6;cursor:default}.logs-nodes-header .overlay-button{width:26px;height:26px}.logs-nodes ul{flex:1;margin:0;padding:0 4px 6px;list-style:none;overflow:auto}.logs-nodes-empty{color:var(--text-muted);margin:auto;font-size:12px}.logs-node{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;height:26px;padding:0 6px;font-size:12.5px;display:flex}.logs-node:hover{background:var(--surface-3)}.logs-node[aria-pressed=true]{background:var(--accent-soft);box-shadow:inset 2px 0 var(--accent)}.logs-node-dot{background:var(--success);border-radius:50%;flex:none;width:7px;height:7px}.logs-node.gone .logs-node-dot{box-shadow:inset 0 0 0 1.5px var(--border-strong);background:0 0}.logs-node-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.logs-node.gone .logs-node-name{color:var(--text-muted)}.logs-node-badge{background:var(--level-soft);color:var(--level);font-variant-numeric:tabular-nums;border-radius:4px;flex:none;padding:0 5px;font-size:10.5px;font-weight:650;line-height:16px}.logs-node-count{min-width:3ch;color:var(--text-muted);text-align:right;font-variant-numeric:tabular-nums;flex:none;font-size:11px}.logs-list{min-width:0;font:12px var(--mono);overscroll-behavior:contain;flex:1;position:relative;overflow:auto}.logs-list:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.logs-rows{position:relative}.logs-empty{color:var(--text-muted);font:13px var(--font);text-align:center;place-items:center;margin:0;padding:12px;display:grid;position:absolute;inset:0}.log-row{height:var(--log-row);background:var(--level-soft,none);line-height:var(--log-row);white-space:nowrap;cursor:default;border-left:3px solid #0000;align-items:center;gap:8px;padding:0 8px 0 7px;display:flex;position:absolute;left:0;right:0}.log-row:hover{background:var(--surface-2)}.log-row.selected{background:var(--accent-soft)}.log-row.warn,.log-row.error,.log-row.fatal{border-left-color:var(--level)}.log-time{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none}.log-level{width:5ch;color:var(--level);flex:none;font-weight:700}.log-node{width:var(--log-node);color:var(--text-muted);text-overflow:ellipsis;flex:none;overflow:hidden}.log-msg{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.log-row.debug .log-msg{color:var(--text-muted)}.log-row.warn .log-msg,.log-row.error .log-msg,.log-row.fatal .log-msg{color:var(--level)}.log-row.fatal .log-msg{font-weight:700}.log-more{background:var(--surface-3);color:var(--text-muted);border-radius:4px;flex:none;padding:0 4px;font-size:10.5px;line-height:16px}.logs-list.compact .log-row{border-bottom:1px solid var(--border);grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-areas:"level node more time""msg msg msg msg";align-content:center;gap:1px 8px;line-height:16px;display:grid}.logs-list.compact .log-level{grid-area:level;width:auto;font-size:10.5px}.logs-list.compact .log-node{grid-area:node;width:auto;font-size:11px}.logs-list.compact .log-more{grid-area:more}.logs-list.compact .log-time{grid-area:time;font-size:10.5px}.logs-list.compact .log-msg{grid-area:msg}.logs-details{border-top:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 auto;min-height:0;max-height:45%;display:flex;overflow:hidden}.logs-details-header{flex:none;align-items:center;gap:8px;min-width:0;padding:3px 4px 3px 10px;display:flex}.logs-pill{background:var(--level-soft,var(--surface-3));color:var(--level);font:700 10.5px/18px var(--mono);border-radius:4px;flex:none;padding:0 6px}.logs-details-node{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12.5px;overflow:hidden}.logs-details-msg{border:1px solid var(--border);border-left:3px solid var(--level);background:var(--bg);min-height:24px;font:12px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;flex:0 auto;margin:0 10px;padding:6px 8px;overflow:auto}.logs-details-facts{flex-wrap:wrap;flex:none;gap:2px 16px;margin:6px 10px 8px;font-size:11.5px;display:flex}.logs-details-facts div{gap:6px;min-width:0;display:flex}.logs-details-facts dt{color:var(--text-muted)}.logs-details-facts dd{min-width:0;font-family:var(--mono);overflow-wrap:anywhere;margin:0}.logs-status{border-top:1px solid var(--border);min-width:0;color:var(--text-muted);flex:none;align-items:center;gap:7px;padding:5px 10px;font-size:12px;display:flex}.logs-status-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.logs-dot{background:var(--border-strong);border-radius:50%;flex:none;width:9px;height:9px}.logs-status.streaming .logs-dot{background:var(--success)}.logs-status.paused{color:var(--text)}.logs-status.paused .logs-dot{background:var(--warning);animation:1s ease-in-out infinite pulse}.logs-status.error{color:var(--danger)}.logs-status.error .logs-dot{background:var(--danger)}@container (width<=560px){.logs-level-name{display:none}.logs-level-letter{color:var(--level);display:inline}.logs-level-dot{display:none}.logs-level{gap:4px;padding:0 6px}.logs-level[aria-pressed=false] .logs-level-letter{color:var(--text-muted)}.logs-tools .overlay-button{width:28px;height:28px}.logs-tools .overlay-separator{display:none}}.diag{--diag-ok:var(--success);--diag-warn:var(--warning);--diag-error:var(--danger);--diag-stale:#a395f0;--diag-warn-soft:#f0a0201a;--diag-error-soft:#f052521f;--diag-stale-soft:#a395f021;--diag-mark:var(--surface);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;container-type:inline-size}@media (prefers-color-scheme:light){.diag{--diag-ok:#1f9a5a;--diag-warn:#b06a00;--diag-error:#cf2f2f;--diag-stale:#6a58c9;--diag-warn-soft:#f0a0201f;--diag-error-soft:#f052521a;--diag-stale-soft:#6a58c91a}}.diag .ok{--level:var(--diag-ok)}.diag .warn{--level:var(--diag-warn);--level-soft:var(--diag-warn-soft)}.diag .error{--level:var(--diag-error);--level-soft:var(--diag-error-soft)}.diag .stale{--level:var(--diag-stale);--level-soft:var(--diag-stale-soft)}.diag-icon{color:var(--level);flex:none}.diag-toolbar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none;align-items:center;gap:4px;padding:4px 6px;display:flex}.diag-levels{gap:3px;display:flex}.diag-level{border:1px solid var(--border);height:28px;color:var(--text-muted);white-space:nowrap;cursor:pointer;background:0 0;border-radius:7px;align-items:center;gap:5px;padding:0 7px;font-size:12px;font-weight:600;display:inline-flex}.diag-level:hover{background:var(--surface-3)}.diag-level[aria-pressed=true]{border-color:var(--level);color:var(--text)}.diag-level[aria-pressed=false] .diag-icon{color:var(--border-strong)}.diag-level-count{color:var(--text-muted);font-variant-numeric:tabular-nums;font-weight:500}.diag-filter{flex:140px;align-items:center;gap:4px;min-width:0;max-width:300px;display:flex}.diag-tools{flex:none;align-items:center;gap:4px;margin-left:auto;display:flex}.diag-search{flex:1 1 0;align-items:center;min-width:60px;display:flex;position:relative}.diag-search svg{color:var(--text-muted);pointer-events:none;position:absolute;left:8px}.diag-search input{height:28px;padding:0 6px 0 27px;font-size:12.5px}.diag-search.invalid input{border-color:var(--danger);outline-color:var(--danger-soft)}.diag-regex{width:28px;height:28px;font:700 12px var(--mono);flex:none}.diag-body{flex-direction:column;flex:1 1 0;min-height:0;display:flex}.diag-body.beside{flex-direction:row}.diag-main{flex-direction:column;flex:1 1 0;min-width:0;min-height:78px;display:flex;position:relative}.diag.cramped .diag-main{display:none}.diag.cramped .diag-details{border-top:0;flex:auto;max-height:none}.diag-rows{overscroll-behavior:contain;flex:1;min-height:0;padding:2px 0;overflow:auto}.diag-rows:focus-visible,.diag-changes:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.diag-empty{color:var(--text-muted);text-align:center;place-items:center;margin:0;padding:12px;font-size:13px;display:grid;position:absolute;inset:0}.diag-row{white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;height:26px;padding-right:8px;font-size:12.5px;display:flex}.diag-row:hover{background:var(--surface-2)}.diag-row.selected{background:var(--accent-soft);box-shadow:inset 2px 0 var(--accent)}.diag-fold{width:18px;height:100%;color:var(--text-muted);flex:none;place-items:center;display:grid}.diag-fold svg{transition:transform .12s ease-out}.diag-row[aria-expanded=true] .diag-fold svg{transform:rotate(90deg)}.diag-label{text-overflow:ellipsis;flex:0 auto;min-width:4ch;max-width:65%;font-weight:550;overflow:hidden}.diag-msg{min-width:0;color:var(--text-muted);text-overflow:ellipsis;flex:1 1 0;overflow:hidden}.diag-row:is(.warn,.error) .diag-msg{color:var(--level)}.diag-row.dim .diag-label,.diag-row.dim .diag-msg{opacity:.55}.diag-rows.list .diag-row{padding-left:8px}.diag-rows.list .diag-label{max-width:55%}.diag-badge{background:var(--level-soft);color:var(--level);font-variant-numeric:tabular-nums;border-radius:4px;flex:none;padding:0 5px;font-size:10.5px;font-weight:650;line-height:16px}.diag-changes{overscroll-behavior:contain;flex:1;min-height:0;margin:0;padding:2px 0;list-style:none;overflow:auto}.diag-change{text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:7px;width:100%;height:26px;padding:0 8px;font-size:12.5px;display:flex}.diag-change:hover{background:var(--surface-2)}.diag-change.selected{background:var(--accent-soft);box-shadow:inset 2px 0 var(--accent)}.diag-change time{color:var(--text-muted);font:11.5px var(--mono);font-variant-numeric:tabular-nums;flex:none}.diag-change-name{text-overflow:ellipsis;flex:0 auto;min-width:4ch;max-width:50%;font-weight:550;overflow:hidden}.diag-change:is(.warn,.error) .diag-msg{color:var(--level)}.diag-details{border-top:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:0 auto;min-height:0;max-height:55%;display:flex;overflow:hidden}.diag-body.beside .diag-details{border-top:0;border-left:1px solid var(--border);flex:0 0 clamp(260px,42%,440px);max-height:none}.diag-details-header{flex:none;align-items:center;gap:7px;min-width:0;padding:3px 4px 3px 10px;display:flex}.diag-details-header .overlay-button{width:28px;height:28px}.diag-spacer{flex:1}.diag-pill{background:var(--level-soft,var(--surface-3));color:var(--level);font:700 10.5px/18px var(--mono);border-radius:4px;flex:none;padding:0 6px}.diag-details-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.diag-details-body{overscroll-behavior:contain;flex:auto;min-height:0;padding:0 10px 10px;overflow:auto}.diag-details-body h3{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:12px 0 4px;font-size:11px;font-weight:650}.diag-details-msg{border:1px solid var(--border);border-left:3px solid var(--level);background:var(--bg);font:12px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;margin:0 0 8px;padding:6px 8px}.diag-facts,.diag-values{grid-template-columns:fit-content(45%) minmax(0,1fr);gap:3px 12px;margin:0;font-size:12px;display:grid}.diag-facts div,.diag-values div{display:contents}.diag-facts dt,.diag-values dt{color:var(--text-muted);overflow-wrap:anywhere}.diag-facts dd,.diag-values dd{min-width:0;font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.diag-values{gap:0 12px}.diag-values dt,.diag-values dd{border-bottom:1px solid var(--border);padding:3px 0}.diag-muted{color:var(--text-muted);margin:0;font-size:12px}.diag-status-changes{flex-direction:column;gap:3px;margin:0;padding:0;font-size:12px;list-style:none;display:flex}.diag-status-changes li{align-items:center;gap:7px;min-width:0;display:flex}.diag-status-changes time{color:var(--text-muted);font-family:var(--mono);font-variant-numeric:tabular-nums;flex:none}.diag-status-changes .diag-msg{white-space:nowrap}.diag-status{border-top:1px solid var(--border);min-width:0;color:var(--text-muted);flex:none;align-items:center;gap:7px;padding:5px 10px;font-size:12px;display:flex}.diag-status-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.diag-status:is(.warn,.error,.stale) .diag-status-text{color:var(--level)}.diag-dot{background:var(--border-strong);border-radius:50%;flex:none;width:9px;height:9px}.diag-status.paused{color:var(--text)}.diag-status.paused .diag-dot{background:var(--warning);animation:1s ease-in-out infinite pulse}.diag-status.failed{color:var(--danger)}.diag-status.failed .diag-dot{background:var(--danger)}@container (width<=560px){.diag-level-name{display:none}.diag-level{gap:4px;padding:0 6px}.diag-tools .overlay-button{width:28px;height:28px}.diag-tools .overlay-separator{display:none}}.fm{--fm-comment:#7f8a9c;--fm-string:#98c379;--fm-number:#d19a66;--fm-keyword:#c678dd;--fm-type:#e5c07b;--fm-function:#61afef;--fm-variable:#e06c75;--fm-tag:#e06c75;--fm-attribute:#d19a66;--fm-key:#61afef;--fm-meta:#56b6c2;--fm-punctuation:#8b95a7;--fm-match:#f0a02047;--fm-match-current:#f0a0209e;--fm-caret-line:#ffffff0a;--fm-selection:#4f8cff52}@media (prefers-color-scheme:light){.fm{--fm-comment:#7a7f8a;--fm-string:#3f8f3e;--fm-number:#986801;--fm-keyword:#a626a4;--fm-type:#a86f00;--fm-function:#3366d6;--fm-variable:#d03f32;--fm-tag:#d03f32;--fm-attribute:#986801;--fm-key:#3366d6;--fm-meta:#0177a8;--fm-punctuation:#6b7280;--fm-match:#f0a0204d;--fm-match-current:#f0a020a6;--fm-caret-line:#0f172a0a;--fm-selection:#2f6fed3d}}.fm .drop-into{background:var(--accent-soft);box-shadow:inset 0 0 0 2px var(--accent)}.fm-toolbar{flex-wrap:nowrap}.fm-crumbs{border:1px solid var(--border);background:var(--surface-2);cursor:text;border-radius:7px;flex-wrap:nowrap;flex:120px;align-items:center;min-width:48px;height:30px;margin:0 4px;padding:0 8px;font-size:12.5px;display:flex;overflow:hidden}.fm-crumbs button{text-overflow:ellipsis;white-space:nowrap;border-radius:4px;flex:0 auto;min-width:1.6em;overflow:hidden}.fm-crumbs button.current{max-width:60%;color:var(--text);flex-shrink:0;font-weight:600}.fm-address{flex:120px;min-width:48px;margin:0 4px;display:flex}.fm-address input{height:30px;font:12.5px var(--mono)}.fm-search{align-items:center;min-width:60px;display:flex;position:relative}.fm-search svg{color:var(--text-muted);pointer-events:none;position:absolute;left:8px}.fm-search input{height:28px;padding:0 6px 0 27px;font-size:12.5px}.fm-search.invalid input{border-color:var(--danger);outline-color:var(--danger-soft)}.fm-filter{flex:0 150px;margin-right:2px}@container (width<=520px){.fm-filter{flex-basis:90px}}.fm-tabs{border-bottom:1px solid var(--border);background:var(--surface-2);scrollbar-width:thin;flex:none;display:flex;overflow-x:auto}.fm-tab{border:0;border-right:1px solid var(--border);max-width:200px;height:30px;color:var(--text-muted);white-space:nowrap;cursor:pointer;background:0 0;flex:none;align-items:center;gap:6px;padding:0 6px 0 10px;font-size:12.5px;display:flex}.fm-tab:hover{color:var(--text)}.fm-tab.active{background:var(--surface);color:var(--text);box-shadow:inset 0 2px 0 var(--accent)}.fm-tab-name{text-overflow:ellipsis;min-width:0;overflow:hidden}.fm-dirty{background:var(--warning);border-radius:50%;flex:none;width:7px;height:7px}.fm-tab-close{width:20px;height:20px;color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;place-items:center;padding:0;display:grid}.fm-tab-close:hover{background:var(--surface-3);color:var(--text)}.fm-sidebar-header{align-items:center}.fm-sidebar-title{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;flex:1;padding-left:6px;font-size:11px;font-weight:650}.fm-place-item{align-items:center;display:flex}.fm-place{cursor:pointer;flex:1}.fm-place .bte-palette-name{font-weight:500}.fm-place.active{background:var(--accent-soft)}.fm-place-remove{width:26px;height:26px}.fm-disk{cursor:pointer;flex-direction:column;align-items:stretch;gap:4px;height:auto;padding:6px 8px}.fm-disk-name{align-items:center;gap:7px;min-width:0;display:flex}.fm-usage{background:var(--surface-3);border-radius:3px;flex:none;height:5px;display:block;overflow:hidden}.fm-usage>span{background:var(--accent);border-radius:3px;height:100%;display:block}.fm-usage.warn>span{background:var(--warning)}.fm-usage.full>span{background:var(--danger)}.fm-icon{color:var(--text-muted);flex:none}.fm-icon.folder{color:var(--accent)}.fm-icon.bag{color:var(--warning)}.fm-icon.image{color:var(--success)}.fm-icon.archive{color:#a78bfa}.fm-main.beside>.fm-details{box-shadow:none;flex:none;margin:8px 8px 8px 0;animation:none;position:static}.fm-files,.fm-list-box{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.fm-head{border-bottom:1px solid var(--border);flex:none;align-items:center;height:26px;padding:0 4px 0 32px;display:flex}.fm-head button{height:100%;color:var(--text-muted);letter-spacing:.05em;text-transform:uppercase;cursor:pointer;background:0 0;border:0;padding:0 8px;font-size:11px;font-weight:650}.fm-head button:hover,.fm-head button[aria-sort]{color:var(--text)}.fm-head .fm-head-name{text-align:left;flex:1;padding-left:23px}.fm-list{overscroll-behavior:contain;flex:1;min-height:0;padding:2px 4px;position:relative;overflow:auto}.fm-list:focus{outline:none}.fm-list.drop-into{box-shadow:inset 0 0 0 2px var(--accent)}.fm-rows{position:relative}.fm-row{cursor:default;-webkit-user-select:none;user-select:none;height:28px;position:absolute;left:0;right:0}.fm-row:hover:not(.selected){background:var(--surface-2)}.fm-list:focus-visible .fm-row.focused{box-shadow:inset 0 0 0 1px var(--accent)}.fm-row.cut{opacity:.5}.fm-row.special .fm-name{color:var(--text-muted);font-style:italic}.fm-row-name{flex:1;align-items:center;gap:7px;min-width:0;padding-left:2px;display:flex}.fm-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.fm-link{color:var(--text-muted);flex:none}.fm-rename{height:24px;padding:0 6px;font-size:13px}.fm-size,.fm-date{color:var(--text-muted);font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;flex:none;font-size:12px;overflow:hidden}.fm-size{width:76px}.fm-date{width:96px}.fm-head .fm-size,.fm-head .fm-date{text-align:right}.fm-row-more{width:28px;height:24px;color:var(--text-muted);opacity:0;cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;place-items:center;padding:0;display:grid}.fm-head .fm-row-more{height:0}.fm-row:hover .fm-row-more,.fm-row.selected .fm-row-more{opacity:1}.fm-row-more:hover{background:var(--surface-3);color:var(--text)}@media (hover:none){.fm-row-more{opacity:1}}@container (width<=520px){.fm .fm-date{display:none}}@container (width<=360px){.fm .fm-size{display:none}}.fm-note{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-style:italic;line-height:28px;position:absolute;left:0;right:0;overflow:hidden}.fm-note.error{color:var(--danger)}.fm-empty p{margin:0 0 10px}.fm-error{color:var(--danger);margin:0;font-size:12px}.fm-inline-button{font-size:inherit;text-align:left;overflow-wrap:anywhere;padding:0;font-weight:500}.fm-details .bt-facts{align-items:start}.fm-details .bt-facts dd{overflow-wrap:anywhere;min-width:0}.fm-inline-button:disabled{opacity:.6;cursor:default}.fm-preview{border:1px solid var(--border);background:repeating-conic-gradient(var(--surface-2) 0 25%, var(--surface-3) 0 50%) 0 0 / 16px 16px;cursor:zoom-in;border-radius:8px;place-items:center;max-height:200px;padding:6px;display:grid;overflow:hidden}.fm-preview img{object-fit:contain;max-width:100%;max-height:186px}.fm-perms{border-collapse:collapse;font-size:12px}.fm-perms th{color:var(--text-muted);text-align:left;padding:2px 10px 2px 0;font-weight:600}.fm-perms thead th{text-align:center;font-size:11px}.fm-perms td{text-align:center;padding:2px 10px}.fm-perms input{width:auto;accent-color:var(--accent)}.fm-details-actions{flex-wrap:wrap;gap:6px;display:flex}.fm-details-actions .button{height:30px;padding:0 10px}.fm-menu{min-width:200px;max-height:calc(100vh - 8px);position:fixed;right:auto;overflow-y:auto}.fm-menu button{justify-content:space-between;gap:18px;display:flex}.fm-menu button.separated{margin-top:7px;position:relative}.fm-menu button.separated:before{background:var(--border);content:"";height:1px;position:absolute;top:-4px;left:6px;right:6px}.fm-menu kbd{color:var(--text-muted);font:11px var(--mono)}.fm-choices{margin:10px 0 0;padding-left:18px;font-size:13px}.fm-overview{flex:1;min-width:0;padding:10px 14px 16px;font-size:12.5px;overflow:auto}.fm-overview h3{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;align-items:center;gap:4px;margin:6px 0 8px;font-size:11px;font-weight:650;display:flex}.fm-overview h4{margin:14px 0 6px;font-size:12px;font-weight:650}.fm-overview section+section{margin-top:16px}.fm-heading-button{width:24px;height:24px}.fm-disks,.fm-bars,.fm-file-list{margin:0;padding:0;list-style:none}.fm-disks{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px;display:grid}.fm-disk-card{border:1px solid var(--border);background:var(--surface-2);text-align:left;cursor:pointer;border-radius:10px;flex-direction:column;gap:7px;width:100%;padding:10px 12px;display:flex}.fm-disk-card:hover{border-color:var(--border-strong)}.fm-disk-card.warn{border-color:#f0a02080}.fm-disk-card.full{border-color:var(--danger)}.fm-disk-head{align-items:baseline;gap:8px;min-width:0;display:flex}.fm-disk-head svg{color:var(--text-muted);flex:none;align-self:center}.fm-disk-head .bt-muted{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:11.5px;overflow:hidden}.fm-disk-card .fm-usage{height:7px}.fm-disk-numbers{color:var(--text-muted);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:space-between;gap:2px 10px;font-size:12px;display:flex}.fm-disk-numbers strong{color:var(--text)}.fm-analyze{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:8px;display:flex}.fm-overview-hint{margin:0 0 10px}.fm-overview-path{font:600 12.5px var(--mono);overflow-wrap:anywhere;margin:-4px 0 8px}.fm-summary{font-variant-numeric:tabular-nums;margin:4px 0 6px}.fm-bar-row,.fm-file-row{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;grid-template-columns:minmax(0,1fr) auto auto;align-items:baseline;gap:2px 10px;width:100%;padding:4px 6px;display:grid}.fm-bar-row:disabled{cursor:default}.fm-bar-row:hover:not(:disabled),.fm-file-row:hover{background:var(--surface-2)}.fm-bar-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}.fm-bar-size{font-variant-numeric:tabular-nums;text-align:right}.fm-bar-note{min-width:7em;color:var(--text-muted);font-variant-numeric:tabular-nums;text-align:right;font-size:11.5px}.fm-bar{background:var(--surface-3);border-radius:2px;grid-column:1/-1;height:4px;display:block;overflow:hidden}.fm-bar>span{background:var(--accent);border-radius:2px;height:100%;display:block}.fm-file-where{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;max-width:24ch;font-size:11.5px;overflow:hidden}.fm-image{background:repeating-conic-gradient(var(--surface-2) 0 25%, var(--surface-3) 0 50%) 0 0 / 16px 16px;cursor:zoom-out;flex:1;min-width:0;display:flex;overflow:auto}.fm-image img{image-rendering:pixelated;margin:auto}.fm-image.fit{cursor:zoom-in}.fm-image.fit img{object-fit:contain;image-rendering:auto;width:100%;height:100%}.fm-image.map img{image-rendering:pixelated}.fm-editor{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.fm-find{border-bottom:1px solid var(--border);background:var(--surface-2);flex-direction:column;flex:none;gap:4px;padding:4px 6px;display:flex}.fm-find-row{align-items:center;gap:2px;display:flex}.fm-find-input{flex:1;margin-right:4px}.fm-find-input input{padding-left:9px;padding-right:70px}.fm-find-count{color:var(--text-muted);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;position:absolute;right:8px}.fm-find .overlay-button{width:28px;height:28px}.fm-find-option{font:700 12px var(--mono)}.fm-find-button{height:28px;padding:0 10px}.fm-text{background:var(--surface);min-height:0;font:13px/20px var(--mono);font-variant-ligatures:none;tab-size:var(--fm-tab);flex:1;display:flex;position:relative}.fm-gutter{width:calc(var(--fm-gutter) + 8px);border-right:1px solid var(--border);background:var(--surface-2);color:var(--text-muted);-webkit-user-select:none;user-select:none;flex:none;position:relative;overflow:hidden}.fm-gutter-lines,.fm-overlay-lines{will-change:transform;position:absolute;top:0;left:0}.fm-gutter-lines{right:0}.fm-number{text-align:right;cursor:pointer;height:20px;padding-right:8px;font-size:11.5px;position:absolute;left:0;right:0}.fm-number.current{color:var(--text)}.fm-code{flex:1;min-width:0;position:relative;overflow:hidden}.fm-overlay{pointer-events:none;position:absolute;inset:0;overflow:hidden}.fm-line{white-space:pre;height:20px;position:absolute;left:10px}.fm-caret-line{background:var(--fm-caret-line);width:1000000px;height:20px;position:absolute;left:0}.fm-area,.fm-area:focus{color:#0000;width:100%;height:100%;min-height:0;caret-color:var(--text);font:inherit;font-variant-ligatures:none;letter-spacing:normal;white-space:pre;overflow-wrap:normal;tab-size:inherit;resize:none;background:0 0;border:0;border-radius:0;outline:none;margin:0;padding:6px 10px;position:absolute;inset:0}.fm-area::selection{background:var(--fm-selection);color:#0000}.fm-text.wrap .fm-area{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere}.fm-text.wrap .fm-area::selection{color:inherit}.fm-match{background:var(--fm-match);border-radius:2px}.fm-match.current{background:var(--fm-match-current);box-shadow:0 0 0 1px var(--warning)}.fm-t-comment{color:var(--fm-comment);font-style:italic}.fm-t-string{color:var(--fm-string)}.fm-t-number,.fm-t-atom{color:var(--fm-number)}.fm-t-keyword{color:var(--fm-keyword)}.fm-t-type{color:var(--fm-type)}.fm-t-function,.fm-t-heading{color:var(--fm-function)}.fm-t-heading,.fm-t-emphasis{font-weight:700}.fm-t-variable{color:var(--fm-variable)}.fm-t-tag{color:var(--fm-tag)}.fm-t-attribute{color:var(--fm-attribute)}.fm-t-key{color:var(--fm-key)}.fm-t-meta,.fm-t-link{color:var(--fm-meta)}.fm-t-link{text-decoration:underline}.fm-t-punctuation{color:var(--fm-punctuation)}.fm-status-space{font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.fm-status-space.warn{color:var(--warning)}.fm-status-space.full{color:var(--danger);font-weight:600}.fm-status-action{flex:none;margin-left:auto;padding:0;font-size:12px}.fm-status-tools{flex:none;align-items:center;gap:2px;margin-left:auto;display:flex}.fm-status-caret{font-variant-numeric:tabular-nums;white-space:nowrap;margin-right:6px}.fm-status-select{width:auto;height:22px;color:inherit;cursor:pointer;background:0 0;border-color:#0000;padding:0 4px;font-size:11.5px}.fm-status-select:hover{border-color:var(--border)}@container (width<=520px){.fm-status-select{display:none}}.terminal-widget{background:var(--terminal-bg);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;container-type:inline-size}.terminal-widget.filled{z-index:40;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);box-shadow:var(--shadow);border:0;position:fixed}.terminal-toolbar{border-bottom:1px solid var(--border);background:var(--surface);flex:none;align-items:center;gap:2px;min-width:0;padding:3px 4px 3px 10px;display:flex}.terminal-toolbar .overlay-button{flex:none;width:30px;height:30px}.terminal-dot{background:var(--border-strong);border-radius:50%;flex:none;width:8px;height:8px;margin-right:6px}.terminal-dot.streaming{background:var(--success)}.terminal-dot.error{background:var(--danger)}.terminal-title{min-width:0;color:var(--text-muted);font:12px/1.3 var(--mono);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}@container (width<=360px){.terminal-font{display:none}}.terminal-screen{background:var(--terminal-bg);touch-action:none;flex:1;min-height:0;padding:6px 4px 2px 10px;overflow:hidden}.terminal-banner{border-top:1px solid var(--border);background:var(--surface-2);color:var(--text);flex:none;align-items:center;gap:10px;padding:6px 6px 6px 12px;font-size:12.5px;display:flex}.terminal-banner>span{flex:1;min-width:0}.terminal-banner.error{color:var(--danger)}.terminal-banner .button{height:28px;padding:0 10px;font-size:12.5px}.terminal-keys{border-top:1px solid var(--border);background:var(--surface);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;flex:none;gap:4px;padding:5px;display:grid}.terminal-keys-row{grid-auto-columns:minmax(0,1fr);grid-auto-flow:column;gap:4px;display:grid}.terminal-key{background:var(--surface-3);min-width:0;height:38px;color:var(--text);font:600 15px/1 var(--mono);cursor:pointer;-webkit-tap-highlight-color:transparent;border:0;border-radius:7px;padding:0 2px;position:relative}.terminal-key.word{font:600 12px/1 var(--font)}.terminal-key.pressed{background:var(--border-strong)}.terminal-key[data-state=once]{background:var(--accent-soft);box-shadow:inset 0 0 0 1.5px var(--accent);color:var(--accent)}.terminal-key[data-state=locked]{background:var(--accent);color:#fff}.terminal-key-lock{background:currentColor;border-radius:1px;height:2px;position:absolute;bottom:5px;left:30%;right:30%}.terminal-key-popup{color:var(--text-muted);font:500 10px/1 var(--mono);position:absolute;top:3px;right:5px}.terminal-key-bubble{background:var(--accent);min-width:44px;height:44px;box-shadow:var(--shadow);color:#fff;font:600 20px/1 var(--mono);pointer-events:none;border-radius:9px;place-items:center;padding:0 8px;display:grid;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}@media (hover:hover){.terminal-key:is(:not([data-state]),[data-state=off]):hover{background:var(--border)}}