livedesk 0.1.685 → 0.1.686
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/livedesk.js +1 -0
- package/bootstrap/hub-self-agent.js +1 -0
- package/client/bin/livedesk-client.js +1 -1
- package/client/package.json +5 -5
- package/electron/main.mjs +3 -1
- package/hub/package.json +32 -32
- package/hub/src/console-direct.js +4 -1
- package/hub/src/console-direct.test.mjs +70 -4
- package/package.json +6 -6
- package/runtime-core/package.json +18 -18
- package/web/dist/app.html +1 -1
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/{AgentSettingsTab-C2yWMYVI.js → AgentSettingsTab-BpaAvVmS.js} +1 -1
- package/web/dist/assets/{AgentsPage-BlV_riNE.js → AgentsPage-CviietlX.js} +1 -1
- package/web/dist/assets/{CaptureGallery-Dbn6VhEu.js → CaptureGallery-v-uzDN4q.js} +1 -1
- package/web/dist/assets/HubApp-CEZWMXxq.js +182 -0
- package/web/dist/assets/{HubApp-DFLBNvIi.css → HubApp-DdHHVOM0.css} +1 -1
- package/web/dist/assets/MonitorStackIcon-JfWhLRS2.js +8 -0
- package/web/dist/assets/{SettingsPage-49Z3Hv0p.js → SettingsPage-XqN0yfRR.js} +1 -1
- package/web/dist/assets/{ShareFilesPage-BEOcL51r.js → ShareFilesPage-BcxBsXoN.js} +1 -1
- package/web/dist/assets/{SupportPage-CB0Hrnri.js → SupportPage-D_60jn3l.js} +1 -1
- package/web/dist/assets/{VuvoDeskApp-CFZWGgYH.js → VuvoDeskApp-DsIm_aTa.js} +1 -1
- package/web/dist/assets/{app-CoHWIYYA.js → app-DA8I23kG.js} +2 -2
- package/web/dist/assets/{main-D83bJX4i.js → main-B1P8Damh.js} +2 -2
- package/web/dist/assets/styles-CQz52HHV.css +1 -0
- package/web/dist/index.html +3 -3
- package/web/dist/sw.js +2 -2
- package/web/dist/vuvodesk-build-evidence.json +47 -47
- package/web/dist/assets/HubApp-CjBsQESw.js +0 -182
- package/web/dist/assets/MonitorStackIcon-BTi3OZ_m.js +0 -8
- package/web/dist/assets/styles-BjyLRq6m.css +0 -1
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{j as M}from"./pwa-startup-DvbrYEQi.js";const W=15e3;function Pe(n,e=W){const t=Number(n),i=Number.isFinite(Number(e))?Number(e):W;return Math.max(250,Math.min(12e4,Math.trunc(Number.isFinite(t)?t:i)))}class fe extends Error{constructor(e){super(`VuvoDesk Hub request timed out after ${e} ms.`),this.name="HubRequestTimeoutError",this.code="livedesk-hub-request-timeout",this.timeoutMs=e}}async function Ne(n,e,t){const i=Pe(e),s=new AbortController;let r=!1;const o=()=>{s.signal.aborted||s.abort(n?.reason)};n?.aborted?o():n?.addEventListener("abort",o,{once:!0});const a=setTimeout(()=>{r=!0,s.signal.aborted||s.abort(new fe(i))},i);try{return await t(s.signal)}catch(c){throw r?new fe(i):c}finally{clearTimeout(a),n?.removeEventListener("abort",o)}}function cn(n,e){if(n.current)return n.current;const t=Promise.resolve().then(e);return n.current=t,t.finally(()=>{n.current===t&&(n.current=null)}).catch(()=>{}),t}const oe=16*1024,k=6*1024*1024,xe=12*1024*1024,T=24,D=oe-T,Ie=1,We=2,pe=32,Z=4294967295,ee=Symbol("direct-console-wire-budget-reserve"),te=Object.freeze([76,68,67,87]),ve=Object.freeze({control:1,text:2,binary:3}),Be=Object.freeze({1:"control",2:"text",3:"binary"});class B extends Error{constructor(e,t=void 0){super(String(e||"direct-console-wire-error")),this.name="DirectConsoleWireError",this.code=String(e||"direct-console-wire-error"),t!==void 0&&(this.details=t)}}function f(n,e=void 0){throw new B(n,e)}function ae(n,e){return n===void 0?{}:((!n||typeof n!="object"||Array.isArray(n))&&f(`${e}-options-invalid`),n)}function F(n,e,t,i){const s=Number(n);return(!Number.isInteger(s)||s<t||s>i)&&f(e),s}function ye(n){return n===void 0?k:F(n,"max-message-bytes-invalid",1,Z)}function Ue(n,e){const t=n===void 0?e?"text":"binary":String(n);return Object.hasOwn(ve,t)||f("message-kind-invalid"),e&&t==="binary"&&f("binary-message-requires-bytes"),!e&&t!=="binary"&&f(`${t}-message-requires-text`),t}function He(n){if(typeof n=="string")return{bytes:new TextEncoder().encode(n),isText:!0};if(n instanceof Uint8Array)return{bytes:n,isText:!1};if(n instanceof ArrayBuffer)return{bytes:new Uint8Array(n),isText:!1};f("message-payload-invalid")}function Fe(n){if(n instanceof Uint8Array)return n;if(n instanceof ArrayBuffer)return new Uint8Array(n);f("wire-chunk-type-invalid")}function qe(n,{kind:e,messageId:t,chunkIndex:i,chunkCount:s,totalLength:r}){n.set(te,0);const o=new DataView(n.buffer,n.byteOffset,T);o.setUint8(4,Ie),o.setUint8(5,ve[e]),o.setUint16(6,0,!1),o.setUint32(8,t,!1),o.setUint32(12,i,!1),o.setUint32(16,s,!1),o.setUint32(20,r,!1)}function Ge(n,e){const t=Fe(n);(t.byteLength<T||t.byteLength>oe)&&f("wire-chunk-length-invalid");for(let p=0;p<te.length;p+=1)t[p]!==te[p]&&f("wire-magic-invalid");const i=new DataView(t.buffer,t.byteOffset,T);i.getUint8(4)!==Ie&&f("wire-version-invalid");const s=Be[i.getUint8(5)];s||f("wire-kind-invalid"),i.getUint16(6,!1)!==0&&f("wire-reserved-invalid");const r=i.getUint32(8,!1),o=i.getUint32(12,!1),a=i.getUint32(16,!1),c=i.getUint32(20,!1);c>e&&f("message-too-large");const u=Math.max(1,Math.ceil(c/D));(a!==u||o>=a)&&f("wire-chunk-layout-invalid");const d=t.byteLength-T,h=o<a-1?D:c-o*D;return d!==h&&f("wire-chunk-layout-invalid"),{bytes:t,kind:s,messageId:r,chunkIndex:o,chunkCount:a,totalLength:c,payloadLength:d}}function Le(n=void 0){const e=ae(n,"budget"),t=e.maxBytes===void 0?xe:F(e.maxBytes,"budget-max-bytes-invalid",1,Number.MAX_SAFE_INTEGER);let i=0,s=0;const r=()=>Object.freeze({maxBytes:t,retainedBytes:i,reservationCount:s}),o=a=>{const c=F(a,"budget-reservation-invalid",0,Number.MAX_SAFE_INTEGER);c>t-i&&f("shared-budget-overflow"),i+=c,s+=1;let u=!0;return Object.freeze({byteLength:c,release(){return u?(u=!1,i-=c,s-=1,(i<0||s<0)&&(i=0,s=0,f("shared-budget-underflow")),!0):!1}})};return Object.freeze({inspect:r,[ee]:o})}function je(n,e=void 0){const t=ae(e,"encode"),i=F(t.messageId,"message-id-invalid",0,Z),s=ye(t.maxMessageBytes),r=He(n),o=Ue(t.kind,r.isText),a=r.bytes.byteLength;(a>s||a>Z)&&f("message-too-large");const c=Math.max(1,Math.ceil(a/D)),u=new Array(c);for(let d=0;d<c;d+=1){const h=d*D,p=Math.min(D,a-h),w=new Uint8Array(T+p);qe(w,{kind:o,messageId:i,chunkIndex:d,chunkCount:c,totalLength:a}),p>0&&w.set(r.bytes.subarray(h,h+p),T),u[d]=w}return u}function ge(n=void 0){const e=ae(n,"assembler"),t=ye(e.maxMessageBytes),i=e.maxPendingMessages===void 0?We:Number(e.maxPendingMessages);(!Number.isSafeInteger(i)||i<1||i>pe)&&f("max-pending-messages-invalid");const s=e.budget===void 0?Le():e.budget;(!s||typeof s[ee]!="function"||typeof s.inspect!="function")&&f("shared-budget-invalid");const r=new Map,o=new Map;let a=!1;const c=()=>{for(const b of r.values())b.reservation.release();r.clear()},u=()=>{o.clear()},d=()=>{let b=0;for(const E of r.values())b+=E.totalLength;let l=0;for(const E of o.values())l+=E.remainingChunks;return Object.freeze({disposed:a,maxMessageBytes:t,maxPendingMessages:i,pendingMessages:r.size,pendingBytes:b,abandonedMessages:o.size,abandonedChunksRemaining:l,budget:s.inspect()})},h=()=>(a||(a=!0,c(),u()),d()),p=b=>{throw a=!0,c(),u(),b instanceof B?b:new B("wire-chunk-malformed")};return Object.freeze({abandonPending:()=>{a&&f("assembler-disposed");for(const[b,l]of r.entries()){if(o.size>=pe){const E=o.keys().next().value;o.delete(E)}o.set(b,{kind:l.kind,chunkCount:l.chunkCount,totalLength:l.totalLength,receivedChunks:new Uint8Array(l.receivedChunks),remainingChunks:Math.max(0,l.chunkCount-l.receivedChunkCount)}),l.reservation.release()}return r.clear(),d()},dispose:h,inspect:d,push:b=>{a&&f("assembler-disposed");try{const l=Ge(b,t),E=o.get(l.messageId);if(E)return(E.kind!==l.kind||E.chunkCount!==l.chunkCount||E.totalLength!==l.totalLength)&&f("wire-message-metadata-mismatch"),E.receivedChunks[l.chunkIndex]===0&&(E.receivedChunks[l.chunkIndex]=1,E.remainingChunks-=1),E.remainingChunks<=0&&o.delete(l.messageId),null;let m=r.get(l.messageId);if(m)(m.kind!==l.kind||m.chunkCount!==l.chunkCount||m.totalLength!==l.totalLength)&&f("wire-message-metadata-mismatch");else{r.size>=i&&f("pending-message-limit");const de=s[ee](l.totalLength);let he;try{he=new Uint8Array(l.totalLength)}catch{de.release(),f("message-allocation-failed")}m={kind:l.kind,chunkCount:l.chunkCount,totalLength:l.totalLength,receivedChunks:new Uint8Array(l.chunkCount),receivedChunkCount:0,receivedBytes:0,buffer:he,reservation:de},r.set(l.messageId,m)}m.receivedChunks[l.chunkIndex]!==0&&f("duplicate-wire-chunk");const L=l.chunkIndex*D,_e=L+l.payloadLength;if((L<0||_e>m.totalLength)&&f("wire-chunk-overlap"),l.payloadLength>0&&m.buffer.set(l.bytes.subarray(T),L),m.receivedChunks[l.chunkIndex]=1,m.receivedChunkCount+=1,m.receivedBytes+=l.payloadLength,m.receivedChunkCount<m.chunkCount)return null;m.receivedBytes!==m.totalLength&&f("wire-message-length-mismatch");let ue;try{ue=m.kind==="binary"?m.buffer:new TextDecoder("utf-8",{fatal:!0}).decode(m.buffer)}catch{f("wire-text-invalid")}finally{r.delete(l.messageId),m.reservation.release()}return Object.freeze({messageId:l.messageId,kind:m.kind,byteLength:m.totalLength,data:ue})}catch(l){return p(l)}}})}const $e="Direct connection signaling is unavailable. Try again.",ze="Desktop Hub is offline.",Ve="A direct connection could not be established on this network.",ke=750,Xe=2e3,Ye=1500,Ke=3e3,Je=512*1024,Qe=64*1024;function we(n){const e=Math.max(0,Number(n)||0),t=Math.ceil(e/Je*1e3);return Math.min(Xe,ke+t)}function Ze(n){const e=Math.max(0,Number(n)||0),t=Math.ceil(e/Qe*1e3);return Math.max(Ye,Math.min(Ke,ke+t))}const ne=Object.freeze({"signal-service-unavailable":$e,"hub-unavailable":ze,"p2p-unavailable":Ve});function ce(n){const e=new Error(ne[n]);return e.name="ConsoleDirectError",e.code=n,e.directFailureKind=n,e}function S(){return ce("signal-service-unavailable")}function V(){return ce("hub-unavailable")}function g(){return ce("p2p-unavailable")}function X(n){const e=String(n?.directFailureKind||n?.code||""),t=`${e}
|
|
2
|
-
${String(n?.message||n||"")}`.toLowerCase(),i=Object.hasOwn(ne,e)?e:/hub[- ]?(offline|unavailable)|desktop hub is offline/.test(t)?"hub-unavailable":/signal|websocket|wake-service/.test(t)?"signal-service-unavailable":"p2p-unavailable";return Object.freeze({kind:i,message:ne[i],retryAt:0})}function et({userId:n,connectionId:e,hubEpoch:t,generation:i}){const s={userId:String(n||""),connectionId:String(e||""),hubEpoch:String(t||""),generation:Number(i)};if(!s.userId||!s.connectionId||!s.hubEpoch||!Number.isSafeInteger(s.generation)||s.generation<1)throw new Error("console-direct-owner-invalid");return Object.freeze(s)}function tt(n,e){return!!n&&!!e&&n.userId===e.userId&&n.connectionId===e.connectionId&&n.hubEpoch===e.hubEpoch&&n.generation===e.generation}const Te="https://livedesk-wake.lovecrdm.workers.dev",nt="stun:stun.cloudflare.com:3478",it="livedesk-console-signal-v2",st="livedesk-auth.",rt="livedesk-control-v1",ot="livedesk-ws-v1:",at=1e4,Y=12e3,me=1e4,ct=5e3,lt=5e3,ut=15e3,dt=15e3,be=24,ht=16,Ee=32,ft=64,pt=1024*1024,gt=new Set(["/api/remote/status","/api/remote/devices"]),Ce=4*1024*1024,wt=12*1024*1024,Se=8*1024*1024+oe,mt=8,bt=1,Et=2,Ct=2,St=new Set(["rtc-offer","rtc-ice","rtc-close"]),It=new Set(["frame","atlas","input","audio"]),N=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function vt(n){const e=String(Te).trim(),t=new URL(e);return t.protocol=t.protocol==="http:"?"ws:":t.protocol==="https:"?"wss:":t.protocol,t.pathname="/v2/rtc/console",t.search="",t.searchParams.set("workspaceId",n),t.hash="",t.toString()}function yt(n){const e=String(Te).trim(),t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("console-direct-signal-http-url-invalid");return t.pathname=n,t.search="",t.hash="",t.toString()}function Lt(n){const e=String(n?.accessToken||"").trim(),t=String(n?.user?.id||"").trim(),i=String(n?.workspaceId||"").trim(),s=String(n?.workspaceKind||"").trim().toLowerCase(),r=String(n?.workspaceRole||"").trim().toLowerCase(),o=Number(n?.membershipRevision||0);return e&&t&&N.test(i)&&["personal","team"].includes(s)&&["owner","operator"].includes(r)&&Number.isSafeInteger(o)&&o>=1&&(s!=="personal"||i===t)?{accessToken:e,user:{id:t},workspaceId:i,workspaceKind:s,workspaceRole:r,membershipRevision:o}:null}function kt(){const n="".split(/[\s,]+/).map(t=>t.trim()).filter(t=>/^stun:[^\s@]+$/i.test(t)&&t.length<=512),e=[...new Set(n)].slice(0,4);return e.length>0?e:[nt]}function Tt(n){let e="";for(let i=0;i<n.byteLength;i+=32768)e+=String.fromCharCode(...n.subarray(i,Math.min(n.byteLength,i+32768)));return btoa(e)}function At(n){const e=atob(n),t=new Uint8Array(e.length);for(let i=0;i<e.length;i+=1)t[i]=e.charCodeAt(i);return t}async function Mt(n){if(n==null)return new Uint8Array;if(typeof n=="string")return new TextEncoder().encode(n);if(n instanceof URLSearchParams)return new TextEncoder().encode(n.toString());if(n instanceof Blob)return new Uint8Array(await n.arrayBuffer());if(n instanceof ArrayBuffer)return new Uint8Array(n);if(ArrayBuffer.isView(n))return new Uint8Array(n.buffer,n.byteOffset,n.byteLength);throw new Error("This request body cannot be sent through the direct mobile Console connection.")}function Dt(n){const e=new Headers(n?.headers||{}),t={};for(const i of["accept","content-type","if-match","range","x-livedesk-csrf"]){const s=e.get(i);s&&(t[i]=s)}return t}function P(n){return/(?:^|\r?\n)(?:a=)?candidate:[^\r\n]*\btyp\s+relay(?:\s|$)/i.test(String(n||""))}function ie(n,e=1e3){const t=Number(n);return Number.isInteger(t)&&t>=0&&t<=65535?t:e}function K(n,e="console-direct-failed"){return n instanceof Error?n:new Error(String(n||e))}function se(n){if(n instanceof ArrayBuffer||n instanceof Uint8Array)return n;throw new B("wire-chunk-type-invalid")}function Rt(n){const e=se(n),t=e instanceof Uint8Array?e:new Uint8Array(e),i={chunkBytes:t.byteLength,headerReadable:!1,messageId:0,chunkIndex:0,chunkCount:0,totalLength:0};if(t.byteLength<be)return i;const s=new DataView(t.buffer,t.byteOffset,be);return{...i,headerReadable:t[0]===76&&t[1]===68&&t[2]===67&&t[3]===87,messageId:s.getUint32(8,!1),chunkIndex:s.getUint32(12,!1),chunkCount:s.getUint32(16,!1),totalLength:s.getUint32(20,!1)}}function Ot(n,e){return e?e.aborted?Promise.reject(e.reason||new Error("Mobile Console request cancelled.")):new Promise((t,i)=>{let s=!1;const r=a=>{s||(s=!0,e.removeEventListener("abort",o),a())},o=()=>r(()=>i(e.reason||new Error("Mobile Console request cancelled.")));e.addEventListener("abort",o,{once:!0}),n.then(a=>r(()=>t(a)),a=>r(()=>i(a)))}):n}class _t extends EventTarget{constructor(e,t,i,s){super(),this.manager=e,this.channelId=t,this.purpose=i,this.url=s}manager;channelId;purpose;url;protocol="livedesk-ws-v1";extensions="";binaryType="blob";readyState=WebSocket.CONNECTING;onopen=null;onmessage=null;onerror=null;onclose=null;get bufferedAmount(){return this.manager.logicalBufferedAmount(this.channelId)}send(e){if(this.readyState!==WebSocket.OPEN)throw new DOMException("WebSocket is not open.","InvalidStateError");this.manager.sendLogicalMessage(this.channelId,e)}close(e=1e3,t=""){this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING||(this.readyState=WebSocket.CLOSING,this.manager.closeLogicalChannel(this.channelId,ie(e),String(t||"").slice(0,120),!0))}managerOpened(){if(this.readyState!==WebSocket.CONNECTING)return;this.readyState=WebSocket.OPEN;const e=new Event("open");this.onopen?.call(this,e),this.dispatchEvent(e)}managerMessage(e){if(this.readyState!==WebSocket.OPEN)return;const t=new MessageEvent("message",{data:e});this.onmessage?.call(this,t),this.dispatchEvent(t)}managerError(){if(this.readyState===WebSocket.CLOSED)return;const e=new Event("error");this.onerror?.call(this,e),this.dispatchEvent(e)}managerClosed(e,t,i=!1){if(this.readyState===WebSocket.CLOSED)return;i&&this.managerError(),this.readyState=WebSocket.CLOSED;const s=new CloseEvent("close",{code:ie(e,1006),reason:String(t||"").slice(0,120),wasClean:e===1e3});this.onclose?.call(this,s),this.dispatchEvent(s)}}class Pt{session=null;preferred=!1;generation=0;stage="idle";signalSocket=null;signalReady=!1;consoleId="";hubEpoch="";peerOwner=null;peer=null;controlChannel=null;controlAssembler=null;controlWireDeadline=null;wireBudget=null;remoteDescriptionApplied=!1;pendingRemoteCandidates=[];directReady=!1;connectPromise=null;resolveConnect=null;rejectConnect=null;connectTimer=null;peerDisconnectTimer=null;wireMessageId=0;pendingHttp=new Map;channels=new Map;livenessEvidenceEpoch=0;consecutiveLivenessRequestTimeouts=0;livenessRequestTimeoutCount=0;consecutiveMediaLogicalOpenFailures=0;logicalChannelFailureCount=0;lastLogicalChannelFailure=null;partialMediaWireTimeoutCount=0;lastPartialMediaWireTimeout=null;preOpenMediaCoalesceCount=0;lastPreOpenMediaCoalesce=null;logicalWireFailureCount=0;lastLogicalWireFailure=null;controlMediaRecoveryCount=0;lastControlMediaRecovery=null;livenessMediaRecoveryGeneration=0;mediaAttachmentHoldGeneration=0;lastFailure=null;lastTerminalWireBytes=0;lastTerminalWireReservations=0;workspaceReauthAttempt=null;configure(e){const t=Lt(e),i=this.session?`${this.session.user.id}
|
|
3
|
-
${this.session.workspaceId}
|
|
4
|
-
${this.session.workspaceRole}`:"",s=t?`${t.user.id}
|
|
5
|
-
${t.workspaceId}
|
|
6
|
-
${t.workspaceRole}`:"";this.session=t,i!==s&&(this.teardown("console-session-replaced",null,!0),this.lastFailure=null)}preferDirect(){this.preferred=!0}markLocalHubReachable(){this.preferred=!1,this.teardown("local-hub-reachable",null,!0),this.lastFailure=null}resume(){if(this.invalidateLivenessEvidence(),this.hasReadyPayloadPeer()){this.lastFailure=null;return}this.teardown("console-resume",null,!0),this.lastFailure=null}suspendLivenessEvidence(){this.invalidateLivenessEvidence()}retry(){this.preferred=!0,this.teardown("console-manual-retry",null,!0),this.lastFailure=null}shouldUseDirect(){return this.preferred&&!!this.session?.accessToken}inspect(){const e=this.wireBudget?.inspect()||{retainedBytes:0,reservationCount:0},t=[...this.channels.values()].filter(c=>c.wireDeadline!==null).length,i=[...this.channels.values()].filter(c=>c.openDeadline!==null).length,s=this.connectTimer===null?0:1,r=this.peerDisconnectTimer===null?0:1,o=this.controlWireDeadline===null?0:1,a=this.workspaceReauthAttempt?.deadline==null?0:1;return Object.freeze({preferred:this.preferred,stage:this.stage,directReady:this.directReady,generation:this.generation,signalSockets:this.signalSocket?1:0,peerCount:this.peer?1:0,controlChannels:this.controlChannel?1:0,logicalChannels:this.channels.size,openLogicalChannels:[...this.channels.values()].filter(c=>c.opened).length,pendingHttpRequests:this.pendingHttp.size,livenessEvidenceEpoch:this.livenessEvidenceEpoch,workspaceReauthRequests:this.workspaceReauthAttempt?1:0,consecutiveLivenessRequestTimeouts:this.consecutiveLivenessRequestTimeouts,livenessRequestTimeoutCount:this.livenessRequestTimeoutCount,consecutiveMediaLogicalOpenFailures:this.consecutiveMediaLogicalOpenFailures,logicalChannelFailureCount:this.logicalChannelFailureCount,lastLogicalChannelFailure:this.lastLogicalChannelFailure,partialMediaWireTimeoutCount:this.partialMediaWireTimeoutCount,lastPartialMediaWireTimeout:this.lastPartialMediaWireTimeout,preOpenMediaCoalesceCount:this.preOpenMediaCoalesceCount,lastPreOpenMediaCoalesce:this.lastPreOpenMediaCoalesce,logicalWireFailureCount:this.logicalWireFailureCount,lastLogicalWireFailure:this.lastLogicalWireFailure,controlMediaRecoveryCount:this.controlMediaRecoveryCount,lastControlMediaRecovery:this.lastControlMediaRecovery,mediaAttachmentHoldGeneration:this.mediaAttachmentHoldGeneration,heldMediaLogicalChannels:[...this.channels.values()].filter(c=>(c.purpose==="frame"||c.purpose==="atlas")&&c.owner===null&&c.dataChannel===null).length,pendingRemoteCandidates:this.pendingRemoteCandidates.length,connectTimers:s,peerDisconnectTimers:r,controlWireTimers:o,workspaceReauthTimers:a,logicalOpenTimers:i,logicalWireTimers:t,resourceTimers:s+r+o+a+i+t+this.pendingHttp.size,wireRetainedBytes:e.retainedBytes,wireReservations:e.reservationCount,sendBufferedBytes:this.peerBufferedAmount(),lastTerminalWireBytes:this.lastTerminalWireBytes,lastTerminalWireReservations:this.lastTerminalWireReservations,failure:this.lastFailure})}nextMessageId(){return this.wireMessageId=this.wireMessageId>=4294967295?1:this.wireMessageId+1,this.wireMessageId}isSignalOwner(e,t){return e===this.generation&&this.signalSocket===t}isPeerOwner(e){return tt(this.peerOwner,e)}hasReadyPayloadPeer(){return this.directReady&&!!this.peerOwner&&!!this.peer&&this.peer?.connectionState!=="failed"&&this.peer?.connectionState!=="closed"&&this.controlChannel?.readyState==="open"}detachSignalFromReadyPeer(e,t,i){if(!this.isSignalOwner(e,t)||!this.hasReadyPayloadPeer())return!1;this.cancelWorkspaceReauthAttempt(e,t),this.signalSocket=null,this.signalReady=!1,this.consoleId="";try{t.close(1e3,i)}catch{}return!0}clearConnectTimer(){this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null)}clearPeerDisconnectTimer(){this.peerDisconnectTimer!==null&&(window.clearTimeout(this.peerDisconnectTimer),this.peerDisconnectTimer=null)}cancelWorkspaceReauthAttempt(e,t){const i=this.workspaceReauthAttempt;if(!i||e!==void 0&&i.generation!==e||t!==void 0&&i.socket!==t)return!1;this.workspaceReauthAttempt=null,i.deadline!==null&&(window.clearTimeout(i.deadline),i.deadline=null);try{i.controller.abort()}catch{}return!0}refreshPeerDisconnectDeadline(e,t){if(!this.isPeerOwner(e)||this.peer!==t)return;if(!(t.connectionState==="disconnected"||t.iceConnectionState==="disconnected")){this.clearPeerDisconnectTimer();return}if(this.peerDisconnectTimer!==null)return;const s=window.setTimeout(()=>{this.peerDisconnectTimer===s&&(this.peerDisconnectTimer=null,!(!this.isPeerOwner(e)||this.peer!==t)&&(t.connectionState==="disconnected"||t.iceConnectionState==="disconnected")&&this.fail(g(),"peer-disconnected-timeout",!0))},ct);this.peerDisconnectTimer=s}clearControlWireDeadline(){this.controlWireDeadline!==null&&(window.clearTimeout(this.controlWireDeadline),this.controlWireDeadline=null)}refreshControlWireDeadline(e,t){if((t.inspect().pendingMessages||0)===0){this.clearControlWireDeadline();return}if(this.controlWireDeadline!==null)return;const s=window.setTimeout(()=>{this.controlWireDeadline===s&&(this.controlWireDeadline=null,!(!this.isPeerOwner(e)||this.controlAssembler!==t)&&(t.inspect().pendingMessages||0)>0&&this.fail(g(),"control-wire-assembly-timeout",!0))},ut);this.controlWireDeadline=s}resolveCurrentConnect(){const e=this.resolveConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),e?.()}rejectCurrentConnect(e){const t=this.rejectConnect;this.resolveConnect=null,this.rejectConnect=null,this.connectPromise=null,this.clearConnectTimer(),t?.(e)}signal(e){if(!St.has(String(e.type||"")))throw new Error("console-direct-signal-type-forbidden");const t=this.signalSocket;if(!t||t.readyState!==WebSocket.OPEN||!this.signalReady)throw S();t.send(JSON.stringify(e))}peerBufferedAmount(){let e=Number(this.controlChannel?.bufferedAmount||0);for(const t of this.channels.values())e+=Number(t.dataChannel?.bufferedAmount||0);return e}sendWire(e,t,i,s){if(e.readyState!=="open")throw new Error("console-direct-data-channel-not-open");const r=je(t,{messageId:this.nextMessageId(),kind:i,maxMessageBytes:s}),o=r.reduce((a,c)=>a+c.byteLength,0);if(o>Ce||this.peerBufferedAmount()>Ce-o)throw new Error("console-direct-send-buffer-full");for(const a of r)e.send(a)}sendControl(e){const t=this.controlChannel;if(!t||!this.directReady||!this.peerOwner)throw g();this.sendWire(t,JSON.stringify(e),"control",k)}fail(e,t,i=!0){this.lastFailure=X(e),this.teardown(t,e,i)}teardown(e,t,i,s=!1){const r=this.signalSocket,o=this.peerOwner;if(i&&r?.readyState===WebSocket.OPEN&&this.signalReady&&o)try{this.signal({type:"rtc-close",connectionId:o.connectionId,hubEpoch:o.hubEpoch,reason:String(e||"console-direct-closed").slice(0,120)})}catch{}s?this.stage="hub-offline":(this.generation+=1,this.stage="idle",this.signalSocket=null,this.signalReady=!1,this.consoleId="",this.cancelWorkspaceReauthAttempt()),this.hubEpoch="",this.peerOwner=null,this.directReady=!1,this.remoteDescriptionApplied=!1,this.pendingRemoteCandidates=[],this.invalidateLivenessEvidence(),this.clearConnectTimer(),this.clearPeerDisconnectTimer();const a=t||new Error(e||"console-direct-closed");this.rejectCurrentConnect(a);for(const[h,p]of this.pendingHttp)window.clearTimeout(p.timeout),p.detachAbort(),p.reject(a),this.pendingHttp.delete(h);for(const h of[...this.channels.values()])this.retireLogicalEntry(h,t?1011:1001,e,!!t,!1);this.clearControlWireDeadline(),this.controlAssembler?.dispose(),this.controlAssembler=null;const c=this.controlChannel;if(this.controlChannel=null,c){c.onopen=null,c.onmessage=null,c.onerror=null,c.onclose=null;try{c.close()}catch{}}const u=this.peer;if(this.peer=null,u){u.onicecandidate=null,u.onconnectionstatechange=null,u.oniceconnectionstatechange=null;try{u.close()}catch{}}if(!s)try{r?.close(1e3,String(e||"console-direct-closed").slice(0,120))}catch{}const d=this.wireBudget?.inspect();this.lastTerminalWireBytes=Number(d?.retainedBytes||0),this.lastTerminalWireReservations=Number(d?.reservationCount||0),this.wireBudget=null}async connect(){if(this.directReady&&this.peerOwner&&this.controlChannel?.readyState==="open")return;if(this.connectPromise)return this.connectPromise;const e=this.session;if(!e)throw S();const t=this.signalSocket?.readyState===WebSocket.OPEN&&this.signalReady;if(t&&this.stage==="hub-offline"){const r=V();throw this.lastFailure=X(r),r}if(t&&this.stage==="p2p"&&this.peerOwner&&this.peer){const r=this.generation,o=new Promise((a,c)=>{this.resolveConnect=a,this.rejectConnect=c});return this.connectPromise=o,this.connectTimer===null&&(this.connectTimer=window.setTimeout(()=>{r===this.generation&&!this.directReady&&this.fail(g(),"direct-ready-timeout",!0)},Y)),o}const i=this.generation+1;this.generation=i,this.stage="signal",this.lastFailure=null;const s=new Promise((r,o)=>{this.resolveConnect=r,this.rejectConnect=o});this.connectPromise=s,this.connectTimer=window.setTimeout(()=>{if(i!==this.generation)return;const r=this.stage==="signal"?S():g();this.fail(r,this.stage==="signal"?"signal-timeout":"direct-ready-timeout",!1)},this.stage==="signal"?at:Y);try{const r=new WebSocket(vt(e.workspaceId),[it,`${st}${e.accessToken}`]);this.signalSocket=r,r.addEventListener("message",o=>{if(!this.isSignalOwner(i,r)||typeof o.data!="string")return;let a;try{a=JSON.parse(o.data)}catch{this.fail(S(),"invalid-signal-json",!1);return}this.handleSignal(a,i,r)}),r.addEventListener("error",()=>{this.isSignalOwner(i,r)&&(this.detachSignalFromReadyPeer(i,r,"signal-detached-after-ready")||this.fail(S(),"signal-service-unavailable",!1))}),r.addEventListener("close",()=>{this.isSignalOwner(i,r)&&(this.detachSignalFromReadyPeer(i,r,"signal-closed-after-ready")||this.fail(S(),"signal-service-closed",!1))})}catch{this.fail(S(),"signal-constructor-failed",!1)}return s}handleSignal(e,t,i){if(!this.isSignalOwner(t,i))return;if(e.type==="workspace-reauth-required"){const r=this.session,o=String(e.workspaceId||r?.workspaceId||"").trim(),a=String(e.challengeNonce||"").trim();if(!r||o!==r.workspaceId||!N.test(a)){this.fail(S(),"workspace-reauth-owner-mismatch",!1);return}if(this.workspaceReauthAttempt?.challengeNonce===a&&this.workspaceReauthAttempt.generation===t&&this.workspaceReauthAttempt.socket===i)return;this.cancelWorkspaceReauthAttempt();const c=new AbortController,u={challengeNonce:a,generation:t,socket:i,controller:c,deadline:null},d=Number(e.deadlineAt||0),h=Number.isFinite(d)&&d>0?Math.max(1,d-Date.now()):me;u.deadline=window.setTimeout(()=>{this.workspaceReauthAttempt===u&&this.cancelWorkspaceReauthAttempt(t,i)},Math.max(1,Math.min(me,h))),this.workspaceReauthAttempt=u,(async()=>{try{await fetch(yt("/v2/rtc/reauth"),{method:"POST",headers:{Authorization:`Bearer ${r.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({workspaceId:r.workspaceId,challengeNonce:a}),signal:c.signal,cache:"no-store"})}catch{}})().finally(()=>{this.workspaceReauthAttempt===u&&(this.workspaceReauthAttempt=null,u.deadline!==null&&(window.clearTimeout(u.deadline),u.deadline=null))});return}if(e.type==="workspace-access-refreshed"||e.type==="workspace-reauth-ok"){e.type==="workspace-reauth-ok"&&this.cancelWorkspaceReauthAttempt(t,i);return}if(e.type==="workspace-access-expired"){this.fail(S(),"workspace-access-expired",!1);return}if(e.type==="signal-ready"){const r=String(e.consoleId||""),o=String(e.hubEpoch||"");if(e.role!=="console"||!N.test(r)){this.fail(S(),"invalid-signal-ready",!1);return}if(this.signalReady=!0,this.consoleId=r,e.hubOnline!==!0){const a=V();this.lastFailure=X(a),this.teardown("hub-offline",a,!1,!0);return}if(!N.test(o)){this.fail(S(),"invalid-hub-epoch",!1);return}if(this.peerOwner){this.peerOwner.hubEpoch!==o&&this.fail(g(),"hub-epoch-replaced",!1);return}this.hubEpoch=o,this.stage="p2p",this.lastFailure=null,this.clearConnectTimer(),this.connectTimer=window.setTimeout(()=>{t===this.generation&&!this.directReady&&this.fail(g(),"direct-ready-timeout",!0)},Y),this.beginPeer(t,o);return}const s=this.peerOwner;if(!(!s||String(e.connectionId||"")!==s.connectionId||String(e.hubEpoch||"")!==s.hubEpoch)){if(e.type==="rtc-answer")this.acceptAnswer(s,e.description);else if(e.type==="rtc-ice")this.acceptRemoteCandidate(s,e.candidate,e.sdpMid);else if(e.type==="rtc-close"){const r=String(e.reason||"rtc-closed"),o=/hub-offline/i.test(r)?V():g();this.fail(o,r,!1)}}}beginPeer(e,t){if(e!==this.generation||this.peer)return;const i=this.session;if(!i){this.fail(S(),"session-missing",!1);return}const s=et({userId:i.user.id,connectionId:crypto.randomUUID(),hubEpoch:t,generation:e});this.consecutiveMediaLogicalOpenFailures=0,this.peerOwner=s,this.wireBudget=Le({maxBytes:wt}),this.controlAssembler=ge({budget:this.wireBudget,maxMessageBytes:k});let r;try{r=new RTCPeerConnection({iceServers:[{urls:kt()}],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"})}catch{this.fail(g(),"peer-constructor-failed",!0);return}this.peer=r;const o=r.createDataChannel(rt,{ordered:!0});o.binaryType="arraybuffer",this.controlChannel=o,r.onicecandidate=a=>{if(!this.isPeerOwner(s)||this.peer!==r||!a.candidate)return;const c=String(a.candidate.candidate||"");if(P(c)){this.fail(g(),"relay-ice-candidate-forbidden",!0);return}try{this.signal({type:"rtc-ice",connectionId:s.connectionId,hubEpoch:s.hubEpoch,candidate:c,sdpMid:a.candidate.sdpMid})}catch{this.fail(S(),"signal-ice-failed",!1)}},r.onconnectionstatechange=()=>{if(!(!this.isPeerOwner(s)||this.peer!==r)){if(r.connectionState==="failed"||r.connectionState==="closed"){this.fail(g(),`peer-${r.connectionState}`,!0);return}this.refreshPeerDisconnectDeadline(s,r)}},r.oniceconnectionstatechange=()=>{if(!(!this.isPeerOwner(s)||this.peer!==r)){if(r.iceConnectionState==="failed"||r.iceConnectionState==="closed"){this.fail(g(),`ice-${r.iceConnectionState}`,!0);return}this.refreshPeerDisconnectDeadline(s,r)}},o.onmessage=a=>{!this.isPeerOwner(s)||this.controlChannel!==o||this.handleControlWire(s,a.data)},o.onerror=()=>{!this.isPeerOwner(s)||this.controlChannel!==o||this.fail(g(),"control-channel-error",!0)},o.onclose=()=>{!this.isPeerOwner(s)||this.controlChannel!==o||this.fail(g(),"control-channel-closed",!0)},(async()=>{try{const a=await r.createOffer();if(!this.isPeerOwner(s)||this.peer!==r)return;if(a.type!=="offer"||P(a.sdp))throw new Error("relay-sdp-forbidden");if(await r.setLocalDescription(a),!this.isPeerOwner(s)||this.peer!==r)return;const c=r.localDescription||a;if(c.type!=="offer"||P(c.sdp))throw new Error("relay-sdp-forbidden");this.signal({type:"rtc-offer",connectionId:s.connectionId,hubEpoch:s.hubEpoch,description:{type:"offer",sdp:c.sdp||""}})}catch(a){if(!this.isPeerOwner(s))return;const c=/signal/i.test(String(a?.message||""))?S():g();this.fail(c,"rtc-offer-failed",!0)}})()}async acceptAnswer(e,t){const i=this.peer;if(!(!this.isPeerOwner(e)||!i||this.remoteDescriptionApplied)){if(t?.type!=="answer"||typeof t.sdp!="string"||P(t.sdp)){this.fail(g(),"rtc-answer-invalid",!0);return}try{if(await i.setRemoteDescription({type:"answer",sdp:t.sdp}),!this.isPeerOwner(e)||this.peer!==i)return;this.remoteDescriptionApplied=!0;const s=this.pendingRemoteCandidates;this.pendingRemoteCandidates=[];for(const r of s){if(!this.isPeerOwner(e)||this.peer!==i)return;await i.addIceCandidate(r.candidate?r:null)}}catch{this.isPeerOwner(e)&&this.fail(g(),"rtc-answer-apply-failed",!0)}}}async acceptRemoteCandidate(e,t,i){if(!this.isPeerOwner(e))return;const s=String(t??""),r=i==null?null:String(i);if(s.length>4*1024||r!==null&&r.length>256||P(s)){this.fail(g(),"rtc-candidate-invalid",!0);return}const o=this.peer;if(o){if(!this.remoteDescriptionApplied){if(this.pendingRemoteCandidates.length>=ft){this.fail(g(),"rtc-candidate-capacity",!0);return}this.pendingRemoteCandidates.push({candidate:s,sdpMid:r});return}try{await o.addIceCandidate(s?{candidate:s,sdpMid:r}:null)}catch{this.isPeerOwner(e)&&this.fail(g(),"rtc-candidate-apply-failed",!0)}}}handleControlWire(e,t){const i=this.controlAssembler;if(!(!this.isPeerOwner(e)||!i))try{const s=i.push(se(t));if(this.refreshControlWireDeadline(e,i),!s)return;if(s.kind!=="control"||typeof s.data!="string")throw new Error("control-wire-kind-invalid");const r=JSON.parse(s.data);if(r.type==="direct-ready"){if(r.connectionId!==e.connectionId||r.hubEpoch!==e.hubEpoch||this.controlChannel?.readyState!=="open")throw new Error("direct-ready-owner-invalid");this.directReady||(this.consecutiveLivenessRequestTimeouts=0,this.directReady=!0,this.stage="ready",this.resolveCurrentConnect());return}if(r.type==="http-response"){this.handleHttpResponse(e,r);return}if(r.type==="ws-opened"||r.type==="ws-closed"||r.type==="ws-error"){this.handleLogicalLifecycle(e,r);return}throw new Error("control-message-type-invalid")}catch{this.isPeerOwner(e)&&this.fail(g(),"control-wire-invalid",!0)}}handleLogicalLifecycle(e,t){if(t.connectionId!==e.connectionId||t.hubEpoch!==e.hubEpoch)throw new Error("logical-lifecycle-owner-invalid");const i=String(t.channelId||"");if(!N.test(i))throw new Error("logical-lifecycle-channel-invalid");const s=this.channels.get(i);if(!s)return;const r=s.dataChannel;if(!r||!s.openRequested||!this.logicalEntryIsCurrent(s,e,r))throw new Error("logical-lifecycle-owner-invalid");if(t.type==="ws-opened"){if(s.opened)return;s.opened=!0,(s.purpose==="frame"||s.purpose==="atlas")&&(this.consecutiveMediaLogicalOpenFailures=0),this.clearLogicalOpenDeadline(s);const o=s.pendingInbound.splice(0);if(s.pendingInboundBytes=0,s.socket.managerOpened(),!this.logicalEntryIsCurrent(s,e,r)||!s.opened)return;for(const a of o)this.deliverLogicalMessage(s,a);return}if(t.type==="ws-closed"){this.retireLogicalEntry(s,ie(t.code,1e3),String(t.reason||""),!1,!1);return}this.retireLogicalEntry(s,1011,String(t.error||"console-direct-websocket-error"),!0,!1)}handleHttpResponse(e,t){const i=String(t.requestId||""),s=this.pendingHttp.get(i);if(!s||s.generation!==e.generation||!this.isPeerOwner(e))return;this.consecutiveLivenessRequestTimeouts=0,this.livenessMediaRecoveryGeneration=0;const r=this.mediaAttachmentHoldGeneration===e.generation;this.pendingHttp.delete(i),window.clearTimeout(s.timeout),s.detachAbort();try{const o=Number(t.status||502),a=t.bodyBase64?At(t.bodyBase64):new TextEncoder().encode(JSON.stringify({ok:!1,error:t.error||"console-direct-request-failed"})),c=new Response(a,{status:Number.isInteger(o)&&o>=200&&o<=599?o:502,statusText:String(t.statusText||""),headers:t.headers||{"content-type":"application/json"}});s.resolve(c),r&&(this.mediaAttachmentHoldGeneration=0,this.attachHeldMediaChannels(e))}catch(o){s.reject(K(o))}}async fetch(e,t,i){await Ot(this.connect(),t?.signal);const s=this.peerOwner;if(!s||!this.directReady||this.controlChannel?.readyState!=="open")throw g();if(this.pendingHttp.size>=Ee)throw new Error("console-direct-http-capacity-reached");const r=await Mt(t?.body);if(r.byteLength>pt)throw new Error("console-direct-http-body-too-large");if(!this.isPeerOwner(s)||!this.directReady)throw g();if(this.pendingHttp.size>=Ee)throw new Error("console-direct-http-capacity-reached");if(t?.signal?.aborted)throw t.signal.reason||new Error("Mobile Console request cancelled.");const o=crypto.randomUUID(),a=Number.isFinite(i)&&i>0?Math.floor(i):4e3,c=String(t?.method||"GET").toUpperCase(),u=c==="GET"&>.has(e),d=u?this.livenessEvidenceEpoch:null,h=new Promise((p,w)=>{const C=(E,m=!1)=>{const L=this.pendingHttp.get(o);if(L){this.pendingHttp.delete(o),window.clearTimeout(L.timeout),L.detachAbort();try{this.sendControl({type:"http-cancel",requestId:o})}catch{}w(E),m&&u&&this.recordLivenessRequestTimeout(s,L.livenessEvidenceEpoch)}},b=()=>C(t?.signal?.reason instanceof Error?t.signal.reason:new Error("Mobile Console request cancelled."));t?.signal?.addEventListener("abort",b,{once:!0});const l=window.setTimeout(()=>{C(new Error("Mobile Console direct request timed out."),!0)},a);this.pendingHttp.set(o,{generation:s.generation,livenessEvidenceEpoch:d,resolve:p,reject:w,timeout:l,detachAbort:()=>t?.signal?.removeEventListener("abort",b)})});try{this.sendControl({type:"http-request",requestId:o,method:c,path:e,headers:Dt(t),bodyBase64:r.byteLength>0?Tt(r):""})}catch(p){const w=this.pendingHttp.get(o);w&&(this.pendingHttp.delete(o),window.clearTimeout(w.timeout),w.detachAbort(),w.reject(K(p))),this.fail(g(),"control-send-failed",!0)}return h}openWebSocket(e,t){if(!It.has(t))throw new Error("console-direct-purpose-invalid");if(this.channels.size>=ht)throw new Error("console-direct-channel-capacity-reached");const i=crypto.randomUUID(),s=new _t(this,i,t,e),r={channelId:i,path:e,purpose:t,socket:s,owner:null,dataChannel:null,assembler:null,openDeadline:null,wireDeadline:null,wireStartedAtEpochMs:0,wireLastProgressAtEpochMs:0,wireAbsoluteDeadlineAtEpochMs:0,openRequested:!1,opened:!1,pendingInbound:[],pendingInboundBytes:0};return this.channels.set(i,r),this.connect().then(()=>{this.channels.get(i)===r&&this.attachLogicalChannel(r)}).catch(o=>{this.channels.get(i)===r&&this.retireLogicalEntry(r,1011,K(o).message,!0,!1)}),s}attachLogicalChannel(e){const t=this.peerOwner,i=this.peer,s=this.wireBudget;if(!t||!i||!s||!this.directReady||this.channels.get(e.channelId)!==e){this.retireLogicalEntry(e,1011,"console-direct-not-ready",!0,!1);return}const r=e.purpose==="frame"||e.purpose==="atlas";if(r&&this.mediaAttachmentHoldGeneration===t.generation)return;e.owner=t;let o;try{o=i.createDataChannel(`${ot}${e.channelId}:${e.purpose}`,{ordered:!0})}catch{this.retireLogicalOpenFailure(e,t,1011,"console-direct-channel-create-failed",!0,!0);return}o.binaryType="arraybuffer",e.dataChannel=o,e.assembler=ge({budget:s,maxMessageBytes:r?Se:k,maxPendingMessages:r?mt:2}),this.refreshLogicalOpenDeadline(e,t,o),o.onopen=()=>{if(this.logicalEntryIsCurrent(e,t,o))try{this.sendControl({type:"ws-open",connectionId:t.connectionId,hubEpoch:t.hubEpoch,channelId:e.channelId,purpose:e.purpose,path:e.path}),e.openRequested=!0}catch{this.retireLogicalEntry(e,1011,"console-direct-ws-open-failed",!0,!1)}},o.onmessage=a=>{this.logicalEntryIsCurrent(e,t,o)&&this.handleLogicalWire(e,t,a.data)},o.onerror=()=>{this.logicalEntryIsCurrent(e,t,o)&&this.retireLogicalOpenFailure(e,t,1011,"console-direct-channel-error",!0,!1)},o.onclose=()=>{this.logicalEntryIsCurrent(e,t,o)&&this.retireLogicalOpenFailure(e,t,1006,"console-direct-channel-closed",!1,!1)}}retireLogicalOpenFailure(e,t,i,s,r,o){if(this.channels.get(e.channelId)!==e||!this.isPeerOwner(t))return;const a=!e.openRequested&&(e.purpose==="frame"||e.purpose==="atlas");this.logicalChannelFailureCount+=1,this.lastLogicalChannelFailure=Object.freeze({reason:String(s||"console-direct-logical-channel-failed").slice(0,120),purpose:e.purpose,generation:t.generation,occurredAt:Date.now()}),a&&(this.consecutiveMediaLogicalOpenFailures+=1);const c=[...this.channels.values()].some(d=>d!==e&&d.opened&&(d.purpose==="frame"||d.purpose==="atlas")&&d.dataChannel?.readyState==="open"),u=a&&!c&&(o||this.consecutiveMediaLogicalOpenFailures>=Ct);this.retireLogicalEntry(e,i,s,r,!1),u&&this.isPeerOwner(t)&&this.fail(g(),"console-direct-media-channel-unusable",!0)}logicalEntryIsCurrent(e,t,i){return this.channels.get(e.channelId)===e&&e.owner===t&&e.dataChannel===i&&this.isPeerOwner(t)}clearLogicalOpenDeadline(e){e.openDeadline!==null&&(window.clearTimeout(e.openDeadline),e.openDeadline=null)}refreshLogicalOpenDeadline(e,t,i){this.clearLogicalOpenDeadline(e);const s=window.setTimeout(()=>{e.openDeadline===s&&(e.openDeadline=null,!(!this.logicalEntryIsCurrent(e,t,i)||e.opened)&&this.retireLogicalOpenFailure(e,t,1011,"console-direct-logical-open-timeout",!0,!1))},lt);e.openDeadline=s}invalidateLivenessEvidence(){this.livenessEvidenceEpoch+=1,this.consecutiveLivenessRequestTimeouts=0,this.livenessMediaRecoveryGeneration=0,this.peerOwner||(this.mediaAttachmentHoldGeneration=0)}attachHeldMediaChannels(e){if(!this.isPeerOwner(e)||!this.directReady)return 0;let t=0;for(const i of[...this.channels.values()])i.owner!==null||i.dataChannel!==null||i.purpose!=="frame"&&i.purpose!=="atlas"||(this.attachLogicalChannel(i),t+=1);return t}recoverControlFromMediaPressure(e){if(!this.isPeerOwner(e)||this.livenessMediaRecoveryGeneration===e.generation)return!1;const t=[...this.channels.values()].filter(i=>(i.purpose==="frame"||i.purpose==="atlas")&&i.owner===e&&i.dataChannel?.readyState==="open");if(t.length===0)return!1;this.livenessMediaRecoveryGeneration=e.generation,this.mediaAttachmentHoldGeneration=e.generation,this.livenessEvidenceEpoch+=1,this.consecutiveLivenessRequestTimeouts=0,this.controlMediaRecoveryCount+=1,this.lastControlMediaRecovery=Object.freeze({generation:e.generation,retiredMediaLanes:t.length,occurredAt:Date.now()});for(const i of t)this.retireLogicalEntry(i,1013,"console-direct-control-media-recovery",!1,!0);return!0}recordLivenessRequestTimeout(e,t){t===null||t!==this.livenessEvidenceEpoch||!this.isPeerOwner(e)||!this.directReady||(this.livenessRequestTimeoutCount+=1,this.consecutiveLivenessRequestTimeouts+=1,!(this.consecutiveLivenessRequestTimeouts<2)&&(this.recoverControlFromMediaPressure(e)||this.fail(g(),"control-http-timeout",!0)))}handleLogicalWire(e,t,i){const s=e.assembler;if(!s||!this.logicalEntryIsCurrent(e,t,e.dataChannel))return;const r=s.inspect();let o={chunkBytes:0,headerReadable:!1,messageId:0,chunkIndex:0,chunkCount:0,totalLength:0};try{o=Rt(i);const a=s.push(se(i));if(this.refreshLogicalWireDeadline(e,t),!a)return;if(a.kind==="control")throw new Error("logical-control-forbidden");let c;if(a.kind==="text"&&typeof a.data=="string")c={kind:"text",data:a.data,byteLength:a.byteLength};else if(a.kind==="binary"&&a.data instanceof Uint8Array)c={kind:"binary",data:a.data,byteLength:a.byteLength};else throw new Error("logical-wire-kind-invalid");if(!e.opened){this.queuePreOpenLogicalMessage(e,c);return}this.deliverLogicalMessage(e,c)}catch(a){this.logicalWireFailureCount+=1,this.lastLogicalWireFailure=Object.freeze({errorCode:a instanceof B?a.code:a instanceof Error?a.message.slice(0,120):"logical-wire-invalid",purpose:e.purpose,generation:t.generation,pendingMessagesBefore:Math.max(0,Number(r.pendingMessages||0)),pendingBytesBefore:Math.max(0,Number(r.pendingBytes||0)),...o,occurredAt:Date.now()}),this.retireLogicalEntry(e,1011,"console-direct-wire-invalid",!0,!1)}}queuePreOpenLogicalMessage(e,t){const i=e.purpose==="frame"||e.purpose==="atlas",s=i?Se:k;if(i){if(e.pendingInbound.length===0){e.pendingInbound.push(t),e.pendingInboundBytes=t.byteLength;return}if(e.pendingInbound.length<Et&&e.pendingInboundBytes+t.byteLength<=s){e.pendingInbound.push(t),e.pendingInboundBytes+=t.byteLength;return}const r=e.pendingInbound[0],o=r.byteLength+t.byteLength,a=o<=s?"replace-latest":"drop-over-budget";a==="replace-latest"&&(e.pendingInbound=[r,t],e.pendingInboundBytes=o),this.preOpenMediaCoalesceCount+=1,this.lastPreOpenMediaCoalesce=Object.freeze({action:a,purpose:e.purpose==="atlas"?"atlas":"frame",generation:e.owner?.generation||0,retainedMessages:e.pendingInbound.length,retainedBytes:e.pendingInboundBytes,incomingBytes:t.byteLength,occurredAt:Date.now()});return}if(e.pendingInbound.length>=bt||e.pendingInboundBytes+t.byteLength>s)throw new Error("logical-preopen-buffer-full");e.pendingInbound.push(t),e.pendingInboundBytes+=t.byteLength}deliverLogicalMessage(e,t){if(t.kind==="text"){e.socket.managerMessage(t.data);return}const i=t.data,s=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);e.socket.managerMessage(e.socket.binaryType==="arraybuffer"?s:new Blob([s]))}logicalBufferedAmount(e){return Number(this.channels.get(e)?.dataChannel?.bufferedAmount||0)}clearLogicalWireDeadline(e){e.wireDeadline!==null&&(window.clearTimeout(e.wireDeadline),e.wireDeadline=null),e.wireStartedAtEpochMs=0,e.wireLastProgressAtEpochMs=0,e.wireAbsoluteDeadlineAtEpochMs=0}scheduleLogicalWireDeadline(e,t){e.wireDeadline!==null&&window.clearTimeout(e.wireDeadline);const i=e.purpose==="frame"||e.purpose==="atlas",s=Date.now(),r=e.assembler?.inspect(),o=i?we(Number(r?.pendingBytes||0)):Number.POSITIVE_INFINITY,a=i?Math.max(1,o-(s-e.wireLastProgressAtEpochMs)):Number.POSITIVE_INFINITY,c=Math.max(1,e.wireAbsoluteDeadlineAtEpochMs-s),u=window.setTimeout(()=>{if(e.wireDeadline!==u)return;e.wireDeadline=null;const d=e.dataChannel;if(!d||!this.logicalEntryIsCurrent(e,t,d))return;const h=e.assembler?.inspect(),p=Number(h?.pendingMessages||0);if(p===0){this.clearLogicalWireDeadline(e);return}const w=Date.now(),C=Math.max(0,w-e.wireLastProgressAtEpochMs),b=Math.max(0,w-e.wireStartedAtEpochMs),l=i?we(Number(h?.pendingBytes||0)):Number.POSITIVE_INFINITY;if(!(!i||C>=l||w>=e.wireAbsoluteDeadlineAtEpochMs)){this.scheduleLogicalWireDeadline(e,t);return}if(i){this.partialMediaWireTimeoutCount+=1,this.lastPartialMediaWireTimeout=Object.freeze({recovery:"abandon-message",purpose:e.purpose,generation:t.generation,pendingMessages:p,pendingBytes:Math.max(0,Number(h?.pendingBytes||0)),stalledForMs:C,lifetimeMs:b,idleDeadlineMs:l,absoluteDeadlineMs:Math.max(0,e.wireAbsoluteDeadlineAtEpochMs-e.wireStartedAtEpochMs),occurredAt:w}),e.assembler?.abandonPending(),this.clearLogicalWireDeadline(e);return}this.retireLogicalEntry(e,1011,"console-direct-partial-message-timeout",!0,!1)},Math.min(a,c));e.wireDeadline=u}refreshLogicalWireDeadline(e,t){const i=e.assembler?.inspect();if(Number(i?.pendingMessages||0)===0){this.clearLogicalWireDeadline(e);return}const r=Date.now(),o=e.purpose==="frame"||e.purpose==="atlas";e.wireStartedAtEpochMs<=0&&(e.wireStartedAtEpochMs=r,e.wireAbsoluteDeadlineAtEpochMs=r+(o?Ze(Number(i?.pendingBytes||0)):dt)),e.wireLastProgressAtEpochMs=r,this.scheduleLogicalWireDeadline(e,t)}sendLogicalMessage(e,t){const i=this.channels.get(e),s=i?.dataChannel;if(!i||!s||!i.opened||s.readyState!=="open")throw new DOMException("WebSocket is not open.","InvalidStateError");try{if(typeof t=="string")this.sendWire(s,t,"text",k);else if(t instanceof ArrayBuffer)this.sendWire(s,t,"binary",k);else if(ArrayBuffer.isView(t)){const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);this.sendWire(s,r,"binary",k)}else throw new DOMException("Blob sends are not supported by the direct Console channel.","NotSupportedError")}catch(r){throw this.retireLogicalEntry(i,1011,"console-direct-send-failed",!0,!1),r}}closeLogicalChannel(e,t,i,s){const r=this.channels.get(e);r&&this.retireLogicalEntry(r,t,i,!1,s)}retireLogicalEntry(e,t,i,s,r){if(this.channels.get(e.channelId)!==e)return;this.channels.delete(e.channelId);const o=e.dataChannel,a=e.owner;if(r&&a&&e.openRequested&&this.isPeerOwner(a)&&this.controlChannel?.readyState==="open")try{this.sendControl({type:"ws-close",connectionId:a.connectionId,hubEpoch:a.hubEpoch,channelId:e.channelId,code:t,reason:i})}catch{s=!0}if(this.clearLogicalWireDeadline(e),this.clearLogicalOpenDeadline(e),e.assembler?.dispose(),e.assembler=null,e.pendingInbound=[],e.pendingInboundBytes=0,e.dataChannel=null,e.owner=null,e.openRequested=!1,e.opened=!1,o){o.onopen=null,o.onmessage=null,o.onerror=null,o.onclose=null;try{o.close()}catch{}}e.socket.managerClosed(t,i,s)}}const I=new Pt;function Ae(n){I.configure(n)}function Nt(){I.preferDirect()}function xt(){I.markLocalHubReachable()}function ln(){I.resume()}function un(){I.suspendLivenessEvidence()}function dn(){I.retry()}function J(n,e,t){return I.preferDirect(),I.fetch(n,e,t)}function hn(n,e,t){return I.shouldUseDirect()?I.openWebSocket(e,t):new WebSocket(n)}function fn(){return I.inspect()}function Wt(n){let e=null;return{run(){if(e)return e;const t=Promise.resolve().then(n);e=t.finally(()=>{(e===t||e===i)&&(e=null)});const i=e;return i}}}async function Bt(n,e){return n&&await n.catch(()=>{}),e()}function Ut(n,e={}){if(e.publicConsole===!0)throw new Error("Public Console does not create a Hub cookie session.");return n?.workspaceKind==="team"&&n?.workspaceRole==="operator"?{accessToken:n.accessToken,workspaceId:n.workspaceId}:{accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt,user:n.user,workspaceId:n.workspaceId}}function le(n){return!n?.user?.id||!n?.workspaceId?"":[n.user.id,n.workspaceId,n.workspaceKind,n.workspaceRole,Number(n.membershipRevision||0)].join(`
|
|
7
|
-
`)}function Ht(n){const e=le(n);return!e||!n?.accessToken||!n?.refreshToken?"":[e,n.accessToken,n.refreshToken,Number(n.expiresAt||0)].join(`
|
|
8
|
-
`)}function Ft({publicConsole:n,path:e,requiresUiSession:t}){return n?String(e||"").split("?")[0]==="/api/auth/session"?"reject-auth-session":t?"direct":"local":"local"}const x=5179,_=H(`http://127.0.0.1:${x}`);function qt(n){const e=n.split(".").map(t=>Number(t));return e.length===4&&e.every(t=>Number.isInteger(t)&&t>=0&&t<=255)?e:[]}function Me(n){const e=n.trim().toLowerCase();return e==="localhost"||e==="127.0.0.1"||e==="::1"||e==="[::1]"}function Gt(n){const e=n.trim().toLowerCase();return!e||e==="0.0.0.0"||e==="::"||e==="[::]"}function De(n){const e=qt(n);return e.length===0?!1:e[0]===10||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&e[1]===168}function jt(n){return n.includes(":")&&!n.startsWith("[")?`[${n}]`:n}function $t(n){const e=String(n||"").trim();if(!e)return null;const t=/^[a-z][a-z\d+.-]*:\/\//i.test(e)?e:`tcp://${e}`;try{const i=new URL(t),s=i.hostname.replace(/^\[|\]$/g,""),r=Number(i.port);return!s||!Number.isInteger(r)||r<1||r>65535||Gt(s)?null:{host:s,port:r}}catch{return null}}function H(n){const e=String(n||"").trim()||`http://127.0.0.1:${x}`,t=/^[a-z][a-z\d+.-]*:\/\//i.test(e)?e:`http://${e}`;try{const i=new URL(t);return i.port||(i.port=String(x)),i.hash="",i.search="",i.toString().replace(/\/+$/,"")}catch{return`http://127.0.0.1:${x}`}}function zt(n){const e=$t(n);return e?H(`http://${jt(e.host)}:${x}`):""}function pn(n){const t=[n?.endpoint,...Array.isArray(n?.endpoint_candidates)?n.endpoint_candidates:[]].map(i=>zt(String(i||""))).filter(Boolean);return[...new Set(t)]}function Vt(n=_){if(!(typeof window>"u"||window.location.protocol!=="https:"))try{const e=new URL(n);if(e.protocol!=="http:")return;if(Me(e.hostname))return"loopback";if(De(e.hostname))return"local"}catch{return}}function gn(n,e=_){const t=new URL(n,H(e));return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString()}let v=null,O="",A="";const y=new Map,R=new Map,U=new Map,q=new Set;function $(n){const e=U.get(n);e!==void 0&&typeof window<"u"&&window.clearTimeout(e),U.delete(n)}function Re(){for(const n of U.keys())$(n)}function re(n){const e=Number(n||0);if(Number.isFinite(e)&&e>0)return e<1e10?e*1e3:e;const t=Date.parse(String(n||""));return Number.isFinite(t)?t:0}function Oe(n,e,t){if($(n),typeof window>"u"||e<=Date.now())return;const i=Math.max(1e3,Math.min(45e3,e-Date.now()-15e3)),s=window.setTimeout(()=>{U.delete(n),!(t!==O||v?.workspaceKind!=="team")&&j(n,!0).catch(()=>{})},i);U.set(n,s)}function Xt(n,e,t){const i=v?.workspaceKind==="team",s=i?re(e.accessExpiresAt)||Date.now()+6e4:0;y.set(n,{csrfToken:e.csrfToken,expiresAt:e.expiresAt,accessExpiresAt:s,ownerSignature:A}),q.add(n),i?Oe(n,s,t):$(n)}function wn(n){const e=n?.accessToken&&n?.refreshToken&&n?.user?.id?n:null,t=le(e),i=Ht(e);if(t!==A&&(e&&y.clear(),A=t),i!==O&&(Re(),O=i,e?.workspaceKind==="team"))for(const[s,r]of y)r.ownerSignature===t&&Oe(s,r.accessExpiresAt,i);v=e,Ae(e?{accessToken:e.accessToken,user:{id:e.user.id},workspaceId:e.workspaceId,workspaceKind:e.workspaceKind,workspaceRole:e.workspaceRole,membershipRevision:e.membershipRevision}:null),e&&z()&&Nt()}function z(){if(typeof window>"u"||window.location.protocol!=="https:")return!1;const n=window.location.hostname.replace(/^\[|\]$/g,"");return!Me(n)&&!De(n)}function Q(n){const e=n.split("?")[0];return e==="/api/health"||e==="/api/runtime/status"||e==="/api/auth/status"||e==="/api/auth/session"}async function G(n,e,t,i,s){const r=Vt(t);return r&&(e.targetAddressSpace=r),Ne(s,i,async o=>{e.signal=o;try{return await fetch(`${t}${n}`,e)}catch(a){throw!o.aborted&&r?new Error("VuvoDesk Hub is not reachable at this local network address. If Chrome shows a local network prompt, allow it; otherwise restart the Hub so port 5179 is open on the network."):a}})}async function j(n,e=!1){if(z())throw new Error("Public Console uses verified P2P authorization instead of a Hub cookie session.");const t=y.get(n);if(!e&&t&&t.ownerSignature===A&&t.expiresAt>Date.now()+3e4&&(t.accessExpiresAt===0||t.accessExpiresAt>Date.now()+15e3))return;e&&y.delete(n);const i=v,s=O;if(!i)return;const r=R.get(n);if(r)return r.authSignature===s?r.promise:r.promise.catch(()=>{}).then(()=>j(n,e));let o;const a=(async()=>{const c=await G("/api/auth/session",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Ut(i,{publicConsole:!1})),credentials:"include",cache:"no-store"},n,W),u=await c.json().catch(()=>null);if(!c.ok)throw new Error(`${c.status} ${u?.error||c.statusText}`);const d=String(u?.uiSession?.csrfToken||"").trim(),h=Number(u?.uiSession?.expiresAt||0);if(!d||!Number.isFinite(h)||h<=Date.now())throw new Error("VuvoDesk Hub did not issue a valid UI session.");if(s!==O)throw y.set(n,{csrfToken:d,expiresAt:h,accessExpiresAt:re(u?.uiSession?.accessExpiresAt),ownerSignature:le(i)}),q.add(n),new Error("VuvoDesk workspace changed while the Hub session was opening.");Xt(n,{csrfToken:d,expiresAt:h,accessExpiresAt:re(u?.uiSession?.accessExpiresAt)},s)})().finally(()=>{R.get(n)===o&&R.delete(n)});return o={authSignature:s,promise:a},R.set(n,o),a}async function Yt(){const n=new Set(q);for(const t of R.keys())n.add(t);z()||n.add(H(_));const e=[...n].map(t=>Bt(R.get(t)?.promise,async()=>{const i=y.get(t),s=await G("/api/auth/session",{method:"DELETE",headers:i?.csrfToken?{"X-LiveDesk-CSRF":i.csrfToken}:{},credentials:"include",cache:"no-store"},t,W);if(!s.ok&&s.status!==401){const r=await s.json().catch(()=>null);throw new Error(`${s.status} ${r?.error||s.statusText}`)}q.delete(t),y.delete(t),$(t)}));await Promise.all(e)}const Kt=Wt(Yt);function mn(){return v=null,O="",A="",Re(),Ae(null),Kt.run()}async function Jt(n,e,t=_){const i=H(t),{timeoutMs:s=W,signal:r,transport:o="auto",...a}=e||{},c=!Q(n),u=c?A:"",d=()=>!c||!!u&&u===A,h=()=>{if(!d())throw new Error("VuvoDesk workspace changed while the Hub request was running.")},p=Ft({publicConsole:z(),path:n,requiresUiSession:c});if(c&&!v)throw new Error("VuvoDesk account authority is not available for this Hub request.");const w=()=>{const C=String(a.method||"GET").toUpperCase(),b=y.get(i),l=b?.ownerSignature===A?b.csrfToken:"";return{...a,...r?{signal:r}:{},headers:{...a.headers||{},...!["GET","HEAD","OPTIONS"].includes(C)&&l?{"X-LiveDesk-CSRF":l}:{}},credentials:"include",cache:"no-store"}};if(p==="reject-auth-session")throw new Error("Public Console does not create a Hub cookie session.");if(p==="direct"){if(h(),r?.aborted)throw r.reason||new Error("VuvoDesk Hub request cancelled.");return J(n,w(),s)}if(o==="p2p"){if(h(),r?.aborted)throw r.reason||new Error("VuvoDesk Hub request cancelled.");if(!v||Q(n))throw new Error("Mobile Console direct connection requires an authenticated management request.");return J(n,w(),s)}try{c&&await j(i),h();let C=await G(n,w(),i,s,r);if(h(),xt(),c&&C.status===401&&v){const b=await C.clone().json().catch(()=>null);/^hub-ui-session-(required|expired)$/.test(String(b?.error||""))&&(await j(i,!0),h(),C=await G(n,w(),i,s,r),h())}return C}catch(C){if(!d()||r?.aborted||!v||Q(n))throw C;return J(n,w(),s)}}async function Qt(n,e,t=_){const i=await Jt(n,{...e||{},headers:{"Content-Type":"application/json",...e?.headers||{}}},t);let s=null;try{s=await i.json()}catch(r){if(e?.signal?.aborted)throw r;s=null}if(!i.ok){const r=s&&typeof s=="object"&&"error"in s?String(s.error||""):"";throw new Error(`${i.status} ${r||i.statusText}`)}return s}async function bn({baseUrl:n=_,targetRole:e,previousRuntimePid:t=0,allowedStates:i=["running","waiting-auth"],timeoutMs:s=3e4}){const r=Date.now()+s;let o=null;for(;Date.now()<r;){try{const c=await Qt("/api/runtime/status",void 0,n),u=String(c.role||"").toLowerCase(),d=String(c.state||"").toLowerCase(),h=Number(c.runtimePid||0),p=t>1?h>1&&h!==t:h>1;if(u===e&&i.map(w=>w.toLowerCase()).includes(d)&&p)return c}catch(c){o=c}await new Promise(c=>setTimeout(c,300))}const a=o instanceof Error?` ${o.message}`:"";throw new Error(`VuvoDesk runtime did not become ${e} with a new process.${a}`)}function En(n,e=120){if(typeof window>"u")return;const t=new URL(window.location.href);t.port=String(n),t.pathname="/",t.search="",t.hash="";const i=t.toString();let s=0;const r=()=>{fetch(i,{cache:"no-store",mode:"no-cors"}).then(()=>window.location.replace(i)).catch(()=>{if(s+=1,s>=e){window.location.replace(i);return}window.setTimeout(r,250)})};r()}function Cn(n){if(!n)return"-";const e=Date.now()-Date.parse(n);return Number.isFinite(e)?e<1e3?"now":e<6e4?`${Math.round(e/1e3)}s`:e<36e5?`${Math.round(e/6e4)}m`:`${Math.round(e/36e5)}h`:"-"}async function Sn(n){await navigator.clipboard.writeText(n)}const Zt=5,en=15,tn=50,nn=Number.POSITIVE_INFINITY,sn=5,In={free:{name:"Free",price:"$0",limit:Zt,people:1,audience:"Personal, ad-supported",note:"Up to 5 personal devices supported by a standard banner."},ltd:{name:"Plus",price:"$5",ltd:"$79 LTD",limit:en,people:1,audience:"Creators and homelabs",note:"15 devices, no ads, personal use."},pro:{name:"Pro / Business",price:"$15",ltd:"$199 LTD",limit:tn,people:1,audience:"Schools, academies, studios, and businesses",note:"Up to 50 devices for school, academy, and commercial use."},team:{name:"Team",price:"$49",limit:nn,people:sn,audience:"Shared business operations",note:"Commercial use, a shared Team Space, and up to 5 people using their own accounts."}},rn="0.1.685",on={version:rn},vn=String(on.version).trim();function yn({size:n=22}){return M.jsxs("svg",{width:n,height:n,viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[M.jsx("rect",{x:"2.5",y:"4",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.42"}),M.jsx("path",{d:"M7 16v1.5h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.42"}),M.jsx("rect",{x:"10.5",y:"2.5",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.62"}),M.jsx("path",{d:"M15 14.5V16h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.62"}),M.jsx("rect",{x:"6.5",y:"8.5",width:"15",height:"10",rx:"1.7",fill:"currentColor",fillOpacity:"0.12",stroke:"currentColor",strokeWidth:"1.9"}),M.jsx("path",{d:"M12 21v1.5H9.5M16 21v1.5h2.5M9.5 22.5h9",stroke:"currentColor",strokeWidth:"1.9",strokeLinecap:"round"})]})}export{_ as D,Zt as F,vn as L,yn as M,en as P,sn as T,tn as a,mn as b,Sn as c,X as d,dn as e,Cn as f,Vt as g,Qt as h,z as i,hn as j,gn as k,H as l,ln as m,En as n,Jt as o,In as p,wn as q,cn as r,un as s,pn as t,fn as u,bn as w};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#0b0c0e;color:#f7f7f4;letter-spacing:0;font-synthesis:none;text-rendering:geometricPrecision;-webkit-font-smoothing:antialiased}.settings-page{width:min(1120px,calc(100vw - 150px));min-height:calc(100vh - 118px);margin:0 auto;display:grid;align-content:start;gap:18px;color:#0f172a}.settings-page-tabs{display:grid;grid-template-columns:repeat(4,minmax(110px,1fr));width:100%;padding:4px;border:1px solid #cbd5e1;border-radius:8px;background:#f1f5f9}.settings-page-tabs button{display:inline-flex;justify-content:center;align-items:center;gap:7px;min-height:38px;border:0;border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:800;white-space:nowrap}.settings-page-tabs button.active{background:#0f172a;color:#fff;box-shadow:0 6px 14px #0f172a26}.settings-page-tabs button:focus-visible,.settings-page-panel:focus-visible{outline:3px solid rgba(14,165,233,.28);outline-offset:2px}.settings-page-panel{width:100%;min-width:0}.settings-tab-content{width:100%;display:grid;gap:16px}.product-settings-hero,.security-status-card{display:none}.settings-section-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}.settings-section-card{width:100%;min-width:0;display:grid;gap:14px;padding:20px;border:1px solid #d7e0ea;border-radius:8px;background:#fff;box-shadow:0 12px 28px #0f172a0f}.settings-section-heading{display:flex;justify-content:space-between;gap:14px;align-items:start}.settings-section-heading>svg{flex:0 0 auto;color:#0d9488}.settings-section-heading span{display:block;margin-bottom:5px;color:#64748b;font-size:10px;font-weight:850;letter-spacing:.06em;text-transform:uppercase}.settings-section-heading h3{margin:0;color:#0f172a;font-size:18px;line-height:1.15;font-weight:850}.product-setting-row{display:grid;grid-template-columns:auto auto minmax(0,1fr);align-items:center;gap:10px;min-width:0;padding:4px 0}.product-setting-control{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.product-switch{display:inline-flex;align-items:center;justify-content:center;margin:0;line-height:1}.product-switch input{width:14px;height:14px;margin:0;accent-color:#0f172a}.product-switch>span{display:none}.product-setting-icon{display:inline-flex;align-items:center;justify-content:center;width:17px;height:20px;flex:0 0 17px;color:#334155}.product-setting-copy{display:flex;align-items:baseline;min-width:0;overflow:hidden;color:#0f172a;line-height:1.35;white-space:nowrap}.product-setting-copy strong{flex:0 0 auto;font-size:14px;font-weight:800}.product-setting-copy em{flex:0 0 auto;margin-left:6px;color:#0369a1;font-size:12px;font-style:normal;font-weight:700}.product-setting-copy small{min-width:0;margin-left:14px;overflow:hidden;color:#475569;font-size:12px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.product-setting-row.disabled .product-setting-copy,.product-setting-row.disabled .product-setting-icon{opacity:.48}.desktop-update-card,.desktop-auto-start-card{max-width:none}.desktop-update-meta{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 12px;color:#475569;font-size:12px}.desktop-update-meta strong{color:#0f172a}.desktop-update-action{width:fit-content;display:inline-flex;align-items:center;gap:7px}.desktop-auto-start-setting{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px 16px;align-items:center;padding:12px;border:1px solid #dbeafe;border-radius:7px;background:#f8fbff}.desktop-auto-start-copy{display:flex;gap:10px;align-items:center;min-width:0;color:#2563eb}.desktop-auto-start-copy span{display:grid;gap:3px;min-width:0}.desktop-auto-start-copy strong{color:#0f172a;font-size:12px}.desktop-auto-start-copy small{color:#64748b;font-size:11px}.desktop-auto-start-toggle{min-height:34px;padding:7px 9px}.desktop-auto-start-error{grid-column:1 / -1;margin:0;color:#b91c1c;font-size:11px;font-weight:700}.desktop-update-spin{animation:desktop-update-spin .9s linear infinite}@keyframes desktop-update-spin{to{transform:rotate(360deg)}}.settings-pin-display{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px 12px;align-items:center;padding:14px;border:1px solid #bae6fd;border-radius:7px;background:#f0f9ff}.settings-pin-display span{color:#0369a1;font-size:10px;font-weight:850;text-transform:uppercase}.settings-pin-display strong{grid-column:1;color:#0f172a;font-size:30px;line-height:1;letter-spacing:.18em}.settings-pin-display button{grid-column:2;grid-row:1 / span 2}.settings-command-list{display:grid;gap:8px}.settings-command-row{display:grid;grid-template-columns:76px minmax(0,1fr) auto;gap:8px;align-items:center}.settings-command-row>span{color:#64748b;font-size:11px;font-weight:800}.settings-command-row code{min-width:0;overflow:hidden;padding:9px 10px;border:1px solid #dbe3ec;border-radius:6px;background:#f8fafc;color:#334155;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.settings-status-dot{width:10px;height:10px;border-radius:50%;background:#94a3b8;box-shadow:0 0 0 5px #94a3b821}.settings-status-dot.state-ready,.settings-status-dot.state-online{background:#14b8a6;box-shadow:0 0 0 5px #14b8a621}.settings-facts{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);gap:10px 14px;margin:0;font-size:12px}.settings-facts dt{color:#64748b;font-weight:750}.settings-facts dd{min-width:0;margin:0;overflow-wrap:anywhere;color:#0f172a;font-weight:800;text-align:right}.settings-action-row{display:flex;flex-wrap:wrap;gap:8px}.settings-field,.settings-toggle{display:grid;gap:7px}.settings-field>span{color:#475569;font-size:11px;font-weight:800}.settings-field select,.settings-field input{width:100%;min-height:40px;padding:0 11px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#0f172a;font:inherit;font-size:12px;font-weight:700}.settings-field-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.settings-toggle{grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center;min-height:40px;padding:10px 11px;border:1px solid #e2e8f0;border-radius:6px;color:#334155;font-size:12px;font-weight:750}.settings-toggle input{width:17px;height:17px;accent-color:#0d9488}.settings-summary{display:flex;justify-content:space-between;gap:12px;padding:12px;border:1px solid #99f6e4;border-radius:6px;background:#f0fdfa;color:#0f766e;font-size:11px;font-weight:800}.settings-summary strong{color:#0f172a}.settings-reset{display:inline-flex;justify-content:center;align-items:center;gap:7px;min-height:38px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#475569;font-size:12px;font-weight:800}.settings-reset:hover{background:#f8fafc;color:#0f172a}.settings-help{margin:-6px 0 0;color:#64748b;font-size:11px;line-height:1.4;font-weight:600}.agent-settings-content{gap:18px}.agent-enable-card{padding-block:14px}.agent-enable-toggle{justify-self:start}.agent-settings-alert{display:flex;align-items:center;min-height:40px;padding:10px 12px;border:1px solid;border-radius:6px;font-size:12px;font-weight:750}.agent-settings-alert.error{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.agent-settings-alert.success{border-color:#a7f3d0;background:#ecfdf5;color:#047857}.agent-connection-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;color:#475569;font-size:11px;font-weight:750}.agent-connection-dot{width:9px;height:9px;border-radius:50%;background:#94a3b8;box-shadow:0 0 0 4px #94a3b824}.agent-connection-dot.connected{background:#10b981;box-shadow:0 0 0 4px #10b98124}.agent-connection-dot.unavailable{background:#ef4444;box-shadow:0 0 0 4px #ef444424}.agent-safety-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;min-height:36px;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;font-size:11px;font-weight:700}.agent-safety-row svg{color:#dc2626}.agent-safety-row strong{color:#b91c1c;font-size:10px;text-transform:uppercase}.agent-safety-row strong.agent-safety-configured{color:#b45309}.agent-safety-row strong.agent-safety-verified{color:#15803d}.agent-settings-actions{justify-content:flex-end}@media(max-width:760px){.settings-page-tabs{width:100%;grid-template-columns:repeat(4,minmax(0,1fr));overflow-x:auto}.agent-enable-toggle{width:100%}.agent-connection-row{grid-template-columns:auto minmax(0,1fr)}.agent-connection-row button{grid-column:1 / -1}}.app-shell .pricing-page{width:min(1180px,calc(100vw - 150px));min-height:calc(100vh - 118px);margin:0 auto;display:grid;align-content:start;gap:18px;color:#0f172a}.pricing-header{position:relative;display:flex;justify-content:space-between;gap:24px;align-items:start;padding:12px 0 4px}.pricing-header h2{margin:12px 0 8px;color:#0f172a;font-size:clamp(28px,4vw,44px);line-height:1.02;font-weight:850}.pricing-header p{max-width:650px;margin:0;color:#64748b;font-size:15px;line-height:1.5;font-weight:650}.pricing-page .pricing-eyebrow{color:#0f766e;letter-spacing:.07em}.pricing-page .pricing-close{position:static;flex:0 0 auto;border-color:#cbd5e1;background:#fff;color:#475569;box-shadow:0 8px 20px #0f172a14}.pricing-page .pricing-close:hover{background:#f8fafc;color:#0f172a}.pricing-status{display:flex;align-items:center;gap:9px;width:fit-content;padding:8px 12px;border:1px solid #cbd5e1;border-radius:8px;background:#fff;color:#64748b;font-size:12px;font-weight:750;box-shadow:0 8px 18px #0f172a0d}.pricing-status strong{color:#0f172a;font-weight:850}.pricing-status small{padding-left:9px;border-left:1px solid #e2e8f0;color:#64748b;font-size:11px}.pricing-cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;align-items:stretch}.pricing-plan-card{min-width:0;display:flex;flex-direction:column;gap:11px;padding:22px;border:1px solid #d7e0ea;border-radius:8px;background:#fff;box-shadow:0 14px 30px #0f172a12}.pricing-plan-card.featured{border-color:#27b9a9;box-shadow:0 18px 34px #0d948821}.pricing-plan-card.pro{border-color:#b8c4f2}.pricing-plan-card.team{border-color:#d8c9f3}.pricing-plan-card.current{box-shadow:0 0 0 2px #14b8a629,0 16px 32px #0f172a14}.pricing-plan-topline{display:flex;justify-content:space-between;gap:12px;align-items:center}.pricing-plan-topline>strong{color:#0f172a;font-size:38px;line-height:.95;font-weight:850}.pricing-plan-price{display:inline-flex;align-items:baseline;justify-content:flex-end;gap:5px;color:#0f172a;white-space:nowrap}.pricing-plan-price>strong{font-size:38px;line-height:.95;font-weight:850}.pricing-plan-price>small{color:#64748b;font-size:11px;font-weight:750}.pricing-plan-badge{display:inline-flex;align-items:center;gap:6px;width:fit-content;padding:5px 9px;border:1px solid #bae6fd;border-radius:999px;color:#0369a1;font-size:11px;font-weight:850;text-transform:uppercase;letter-spacing:.05em}.pricing-plan-badge.free{border-color:#bbf7d0;color:#15803d}.pricing-plan-badge.plus{border-color:#99f6e4;color:#0f766e}.pricing-plan-badge.pro{border-color:#c7d2fe;color:#4338ca}.pricing-plan-badge.team{border-color:#ddd0f7;color:#6d28d9}.pricing-plan-audience{margin:2px 0 0;color:#64748b;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.05em}.pricing-plan-card h3{margin:0;color:#0f172a;font-size:20px;line-height:1.15;font-weight:850}.pricing-plan-card>p:not(.pricing-plan-audience){min-height:42px;margin:0;color:#64748b;font-size:13px;line-height:1.45;font-weight:600}.pricing-plan-card ul{display:grid;gap:9px;margin:3px 0 8px;padding:0;list-style:none}.pricing-plan-card li{display:flex;gap:8px;align-items:start;color:#334155;font-size:13px;line-height:1.35;font-weight:700}.pricing-plan-card li svg{flex:0 0 auto;margin-top:1px;color:#0d9488}.pricing-plan-card.pro li svg{color:#4f46e5}.pricing-plan-card.team li svg{color:#7c3aed}.pricing-team-readiness{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px 12px;margin-top:auto;padding:11px 12px;border:1px solid #ddd0f7;border-radius:8px;background:#faf7ff}.pricing-team-readiness span,.pricing-team-readiness small{color:#6b5a7f;font-size:10px;font-weight:700}.pricing-team-readiness strong{color:#5b21b6;font-size:12px}.pricing-team-readiness small{grid-column:1 / -1}.pricing-ltd-offer{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:3px 12px;margin-top:auto;padding:11px 12px;border:1px solid #99f6e4;border-radius:7px;background:#f0fdfa}.pricing-ltd-offer>span{color:#0f766e;font-size:12px;font-weight:850;letter-spacing:.03em;text-transform:uppercase}.pricing-ltd-offer>strong{grid-row:span 2;color:#0f172a;font-size:18px;font-weight:900}.pricing-ltd-offer>small{color:#64748b;font-size:10px;font-weight:700}.pricing-ltd-offer.pro{border-color:#c7d2fe;background:#eef2ff}.pricing-ltd-offer.pro>span{color:#4338ca}.pricing-current-label{display:grid;place-items:center;min-height:42px;margin-top:auto;border:1px solid #dbe3ec;border-radius:7px;color:#64748b;font-size:12px;font-weight:800}.pricing-plan-button,.pricing-primary-cta{display:inline-flex;justify-content:center;align-items:center;gap:8px;border:0;border-radius:7px;font-weight:850}.pricing-plan-actions{display:grid;gap:8px}.pricing-plan-button{min-height:42px;margin-top:0;background:#0f766e;color:#fff;font-size:13px}.pricing-plan-button.secondary{color:#0f172a;border:1px solid #cbd5e1;background:#f8fafc}.pricing-plan-card.pro .pricing-plan-button{background:#1e293b}.pricing-plan-card.pro .pricing-plan-button.secondary{color:#1e293b;border-color:#c7d2fe;background:#eef2ff}.pricing-plan-button:hover:not(:disabled){filter:brightness(1.08)}.pricing-plan-button:disabled,.pricing-primary-cta:disabled{cursor:not-allowed;opacity:.52}.pricing-includes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid #dbe3ec;border-radius:8px;background:#dbe3ec}.pricing-includes>div{display:grid;grid-template-columns:auto minmax(0,1fr);gap:5px 8px;align-items:center;padding:14px;background:#fff}.pricing-includes svg{grid-row:span 2;color:#0d9488}.pricing-includes span{color:#64748b;font-size:11px;font-weight:750}.pricing-includes strong{color:#0f172a;font-size:12px;font-weight:850}.pricing-note{display:inline-flex;justify-content:center;gap:7px;align-items:center;margin:0;color:#64748b;font-size:12px;line-height:1.4;font-weight:650;text-align:center}.pricing-note svg{flex:0 0 auto;color:#0d9488}.pricing-primary-cta{justify-self:center;min-width:240px;min-height:46px;padding:0 18px;background:#0f172a;color:#fff;font-size:14px;box-shadow:0 12px 24px #0f172a24}.pricing-primary-cta:hover:not(:disabled){background:#1e293b}@media(max-width:980px){.app-shell .pricing-page{width:min(100%,calc(100vw - 110px))}.pricing-cards{grid-template-columns:1fr}.pricing-plan-card>p:not(.pricing-plan-audience){min-height:0}}@media(max-width:620px){.app-shell .pricing-page{width:min(100%,calc(100vw - 84px))}.pricing-header{display:grid}.pricing-header .pricing-close{position:absolute;top:0;right:0}.pricing-status{flex-wrap:wrap}.pricing-includes{grid-template-columns:repeat(2,minmax(0,1fr))}}*{box-sizing:border-box}html,body,#root{width:100%;min-width:320px;min-height:100%;margin:0}html{overflow-y:scroll;scrollbar-gutter:stable}body{background:linear-gradient(135deg,#2a303a8a,#0b0c0e00 34%),linear-gradient(180deg,#17191d,#0b0c0e 46%,#08090a)}button,textarea,code{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.48}h1,h2,p{margin:0}.app-shell{min-height:100vh;display:grid;grid-template-columns:72px minmax(0,1fr);color:#f7f7f4}.tool-rail{position:sticky;top:0;height:100vh;min-height:100vh;max-height:100vh;display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:18px;padding:10px 8px;border-right:1px solid rgba(255,255,255,.08);background:#121417e6;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);z-index:1300}.rail-brand{width:40px;height:40px;margin:0 auto;display:grid;place-items:center;border-radius:8px;background:#f7f7f4;color:#111214;box-shadow:0 14px 32px #0000006b}.rail-tools,.rail-footer{display:flex;flex-direction:column;align-items:center;gap:8px}.rail-footer{position:relative}.rail-tools{scrollbar-width:none}.rail-tools::-webkit-scrollbar{display:none}.rail-tool{width:56px;min-height:56px;display:grid;place-items:center;gap:4px;border:1px solid transparent;border-radius:8px;background:transparent;color:#a9adb5;padding:7px 4px;transition:background .16s ease,color .16s ease,border-color .16s ease,transform .16s ease}.rail-tool:hover{color:#fff;background:#ffffff14}.rail-tool.active{color:#fff;background:#ffffff1f;border-color:#ffffff24;transform:translateY(-1px)}.rail-tool span{max-width:52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1;font-weight:700}.rail-tool.accent-mint.active svg{color:#5eead4}.rail-tool.accent-blue.active svg{color:#60a5fa}.rail-tool.accent-red.active svg{color:#fb7185}.rail-tool.accent-violet.active svg{color:#a78bfa}.rail-tool.accent-amber.active svg{color:#fbbf24}.rail-tool.accent-green.active svg{color:#34d399}.rail-tool.compact{min-height:48px}.rail-tool.sync-server span{white-space:normal;line-height:1.05}.rail-tool[data-tooltip]{position:relative}@media(min-width:761px){.rail-tool[data-tooltip]:before,.rail-tool[data-tooltip]:after{position:absolute;left:calc(100% + 12px);pointer-events:none;opacity:0;visibility:hidden;transition:opacity .14s ease,transform .14s ease,visibility .14s ease;z-index:1500}.rail-tool[data-tooltip]:before{content:"";top:50%;width:9px;height:9px;margin-left:-4px;background:#111827;border-left:1px solid rgba(255,255,255,.12);border-bottom:1px solid rgba(255,255,255,.12);transform:translate(4px,-50%) rotate(45deg)}.rail-tool[data-tooltip]:after{content:attr(data-tooltip);top:50%;width:min(320px,calc(100vw - 116px));padding:12px 14px;border:1px solid rgba(255,255,255,.12);border-radius:10px;background:#111827;color:#f8fafc;box-shadow:0 18px 42px #0f172a4d;font-size:12px;font-weight:500;line-height:1.5;letter-spacing:0;text-align:start;white-space:pre-line;unicode-bidi:plaintext;transform:translate(4px,-50%)}.rail-tool[data-tooltip]:hover:before,.rail-tool[data-tooltip]:hover:after,.rail-tool[data-tooltip]:focus-visible:before,.rail-tool[data-tooltip]:focus-visible:after{opacity:1;visibility:visible}.rail-tool[data-tooltip]:hover:before,.rail-tool[data-tooltip]:focus-visible:before{transform:translateY(-50%) rotate(45deg)}.rail-tool[data-tooltip]:hover:after,.rail-tool[data-tooltip]:focus-visible:after{transform:translateY(-50%)}}.rail-account{width:56px;min-height:60px;display:grid;place-items:center;gap:5px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:#ffffff14;color:#f7f7f4;padding:6px 4px;transition:background .16s ease,border-color .16s ease,transform .16s ease}.rail-account:hover{background:#ffffff21;border-color:#fff3;transform:translateY(-1px)}.rail-account img,.avatar-fallback{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;overflow:hidden}.rail-account img{object-fit:cover;background:#0b0c0e;box-shadow:0 0 0 2px #2dd4bf7a}.avatar-fallback{background:linear-gradient(145deg,#2dd4bf,#60a5fa);color:#061012;font-size:14px;font-weight:900}.rail-account span:last-child{max-width:52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1;font-weight:800}.rail-account.signed-in{background:#2dd4bf17;border-color:#2dd4bf33}.account-popover{position:fixed;left:78px;bottom:14px;z-index:1400;width:min(304px,calc(100vw - 92px));padding:14px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#121417f5;color:#f7f7f4;box-shadow:0 22px 50px #0000006b}.account-popover-head{display:grid;grid-template-columns:42px minmax(0,1fr);gap:10px;align-items:center;margin-bottom:12px}.account-popover-avatar{width:42px;height:42px;display:grid;place-items:center;overflow:hidden;border-radius:50%;background:linear-gradient(145deg,#2dd4bf,#60a5fa);color:#061012;font-weight:900}.account-popover-avatar img{width:100%;height:100%;object-fit:cover}.account-popover-head strong{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:900}.account-popover-head p{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#a9adb5;font-size:12px;font-weight:700}.account-popover-facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:7px 12px;margin:0 0 13px;padding:11px 0 12px;border-top:1px solid rgba(255,255,255,.1);border-bottom:1px solid rgba(255,255,255,.1);font-size:12px}.account-popover-facts dt{color:#a9adb5;font-weight:800}.account-popover-facts dd{margin:0;min-width:0;overflow-wrap:anywhere;color:#fff;font-weight:900;text-align:right}.account-popover-action{width:100%;min-height:40px;display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid rgba(255,255,255,.16);border-radius:8px;background:#fff;color:#111827;font-size:12px;font-weight:900;box-shadow:0 12px 26px #00000038}.local-settings-popover{position:fixed;left:78px;bottom:86px;z-index:1400;width:min(328px,calc(100vw - 92px));max-height:min(640px,calc(100vh - 28px));overflow:auto;display:grid;gap:12px;padding:14px;border:1px solid rgba(148,163,184,.28);border-radius:8px;background:linear-gradient(180deg,#fffffff7,#f9fafbf0),#fff;color:#111827;box-shadow:0 24px 58px #0f172a29,0 3px 9px #0f172a14,0 1px #fffffffa inset}.local-settings-head{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:12px}.local-settings-head strong{display:block;font-size:14px;font-weight:900}.local-settings-head p{color:#667085;font-size:12px;font-weight:700}.local-settings-tabs{display:grid;grid-template-columns:1fr 1fr;padding:3px;border:1px solid #d8dee8;border-radius:8px;background:#f2f4f7}.local-settings-tabs button{min-height:31px;border:0;border-radius:6px;background:transparent;color:#667085;font-size:12px;font-weight:800;cursor:pointer}.local-settings-tabs button.active{background:#111827;color:#fff;box-shadow:0 2px 5px #0f172a29}.local-settings-mode-lock{display:grid;gap:5px;padding:10px;border:1px solid #d8dee8;border-radius:8px;background:#f8fafc}.local-settings-mode-lock span{color:#667085;font-size:10px;font-weight:800;text-transform:uppercase}.local-settings-mode-lock strong{color:#111827;font-size:12px;font-weight:850}.local-setting-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.local-setting-row{display:grid;gap:6px;min-width:0}.local-setting-row span,.local-setting-toggle span{color:#667085;font-size:11px;line-height:1.15;font-weight:900;text-transform:uppercase}.local-setting-row select{width:100%;min-width:0;height:38px;border:1px solid rgba(148,163,184,.32);border-radius:8px;background:#f8fafc;color:#111827;padding:0 10px;font-size:12px;font-weight:800}.local-setting-row select:focus{outline:none;border-color:#60a5fab8;box-shadow:0 0 0 3px #60a5fa24}.local-setting-toggle{min-height:38px;display:grid;grid-template-columns:18px minmax(0,1fr);align-items:center;gap:8px;padding:8px 10px;border:1px solid rgba(148,163,184,.24);border-radius:8px;background:#f8fafc}.local-setting-toggle input{width:16px;height:16px;margin:0;accent-color:#60a5fa}.local-settings-summary{display:grid;gap:4px;padding:10px;border:1px solid rgba(96,165,250,.22);border-radius:8px;background:#eff6ffeb}.local-settings-summary span{color:#2563eb;font-size:11px;line-height:1.1;font-weight:900;text-transform:uppercase}.local-settings-summary strong{min-width:0;overflow-wrap:anywhere;color:#111827;font-size:13px;font-weight:900}.local-settings-summary.control{border-color:#0f172a33;background:#f8fafc}.local-settings-summary.control span{color:#475467}.local-settings-reset{min-height:36px;border:1px solid rgba(148,163,184,.28);border-radius:8px;background:#fff;color:#111827;font-size:12px;font-weight:900}.local-settings-reset:hover{background:#f8fafc;border-color:#60a5fa5c}.desk-stage{min-width:0;display:flex;flex-direction:column;gap:14px;padding:18px 22px 24px}.topbar{min-height:50px;display:grid;grid-template-columns:minmax(180px,1fr) auto;align-items:center;gap:16px;transition:padding-right .18s ease}.desk-stage.dock-open .topbar{padding-right:calc(var(--dock-width) + 18px)}.desk-stage.file-share-stage{height:100vh;min-height:0;overflow:hidden}.desk-stage.file-share-stage .livedesk-file-explorer{min-height:0;flex:1 1 auto}.topbar-tray{min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:10px}.topbar-leading{min-width:0;display:flex;align-items:center}.topbar-update-button{position:relative;width:42px;height:42px;min-width:42px;flex:0 0 42px;display:grid;place-items:center;padding:0;border:1px solid rgba(96,165,250,.78);border-radius:50%;background:linear-gradient(145deg,#3b82f6,#1d4ed8);color:#fff;box-shadow:0 10px 22px #2563eb47,inset 0 1px #ffffff38;cursor:pointer;transition:transform .16s ease,filter .16s ease,box-shadow .16s ease,opacity .16s ease}.topbar-update-button:hover:not(:disabled){filter:brightness(1.1);transform:translateY(-1px) scale(1.03);box-shadow:0 13px 26px #2563eb57,inset 0 1px #ffffff40}.topbar-update-button:focus-visible{outline:3px solid rgba(59,130,246,.28);outline-offset:3px}.topbar-update-button:disabled{cursor:wait;opacity:.74}.topbar-update-spinner{width:18px;height:18px;box-sizing:border-box;border:2px solid rgba(255,255,255,.38);border-top-color:#fff;border-radius:50%;animation:topbar-update-spin .72s linear infinite}@keyframes topbar-update-spin{to{transform:rotate(360deg)}}.topbar-update-count{position:absolute;top:-6px;right:-8px;min-width:22px;height:18px;display:grid;place-items:center;padding:0 5px;border:2px solid #f8fafc;border-radius:999px;background:#111827;color:#fff;font-size:8px;line-height:1;font-weight:850;white-space:nowrap}.brand,.top-actions,.status-item,.deck-actions,.panel-title{display:flex;align-items:center}.brand{gap:10px;min-width:0}.brand-copy{min-width:0;flex:0 1 auto}.brand-mark{width:36px;height:36px;display:grid;place-items:center;border-radius:8px;background:linear-gradient(145deg,#2dd4bf,#60a5fa);color:#061012;box-shadow:0 16px 34px #2dd4bf2e;flex:0 0 auto}h1{color:#fff;font-size:18px;line-height:1.08;font-weight:800}.brand p{color:#8d939d;font-size:12px;font-weight:700}.top-actions{min-width:0;gap:8px;justify-content:flex-end;justify-self:end}.top-actions .segmented-control,.top-actions .wall-view-control{flex:0 0 auto}.icon-button,.text-button{height:36px;border:1px solid rgba(255,255,255,.13);background:#ffffff14;color:#f7f7f4;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;gap:8px;box-shadow:none;transition:background .16s ease,border-color .16s ease,transform .16s ease}.icon-button:hover,.text-button:hover{background:#ffffff21;border-color:#fff3;transform:translateY(-1px)}.icon-button{width:36px;padding:0}.text-button{padding:0 12px;white-space:nowrap;font-size:12px;font-weight:800}.text-button.full{width:100%}.text-button.primary{background:#f7f7f4;border-color:#f7f7f4;color:#0c0d0f}.text-button.primary:hover{background:#fff;border-color:#fff}.text-button.ghost{background:#ffffff0a;border-color:#ffffff1a}.text-button.compact{height:32px;padding:0 10px;font-size:11px}.text-button.active{background:#60a5fa2e;border-color:#60a5fa8c;color:#bfdbfe}.text-button.buy{background:#14b8a6;border-color:#14b8a6;color:#02120f}.notice-band{border:1px solid rgba(251,191,36,.35);background:#fbbf241f;color:#fde68a;border-radius:8px;padding:10px 12px;font-size:13px;font-weight:700}.notice-band.compact{display:grid;gap:8px;padding:9px 10px;font-size:12px}.livedesk-toast{position:fixed;right:20px;bottom:20px;z-index:1600;display:flex;align-items:flex-start;gap:12px;width:min(420px,calc(100vw - 40px));padding:13px 14px;border:1px solid rgba(245,158,11,.55);border-radius:10px;background:#1f2937;color:#fff7ed;box-shadow:0 18px 42px #0f172a47,0 2px #ffffff14 inset;font-size:13px;font-weight:700;line-height:1.45}.livedesk-toast.tone-progress{border-color:#3b82f6b8;background:#172554;color:#dbeafe}.livedesk-toast.tone-success{border-color:#22c55ead;background:#052e24;color:#dcfce7}.livedesk-toast.tone-error{border-color:#f87171bf;background:#450a0a;color:#fee2e2}.livedesk-toast-spinner,.sync-server-spinner{flex:0 0 auto;width:16px;height:16px;box-sizing:border-box;border:2px solid rgba(255,255,255,.35);border-top-color:currentColor;border-radius:50%;animation:rail-update-spin .72s linear infinite}.livedesk-toast-spinner{margin-top:2px}.livedesk-toast>span{min-width:0;overflow-wrap:anywhere}.livedesk-toast-close{display:inline-grid;flex:0 0 auto;place-items:center;width:25px;height:25px;margin:-3px -3px 0 auto;padding:0;border:0;border-radius:6px;background:transparent;color:#fed7aa;cursor:pointer}.livedesk-toast-close:hover{background:#ffffff1a;color:#fff}.transfer-bar{position:fixed;left:50%;right:auto;bottom:12px;transform:translate(-50%);z-index:1200;display:grid;grid-template-columns:minmax(120px,1fr) auto;align-items:center;gap:8px;width:min(420px,calc(100vw - 32px));padding:0;border:0;background:transparent;color:#475569;box-shadow:none;pointer-events:none}.transfer-bar-track{position:relative;height:2px;overflow:hidden;border-radius:999px;background:#94a3b847}.transfer-bar-track span{position:absolute;inset:0 auto 0 0;width:0;border-radius:inherit;background:linear-gradient(90deg,#2563eb,#14b8a6);transition:width .18s ease}.transfer-bar p{margin:0;max-width:min(180px,38vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:inherit;font-size:11px;font-weight:650}.transfer-bar.state-failed{color:#b91c1c}.transfer-bar.state-failed .transfer-bar-track span{background:#ef4444}.pricing-page{min-width:0;width:60%;margin:0 auto;display:grid;gap:14px}.pricing-hero{min-width:0;display:grid;grid-template-columns:1fr;gap:14px;align-items:stretch}.pricing-hero-copy,.license-card,.ltd-card,.pricing-panel{min-width:0;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:linear-gradient(180deg,#ffffff0f,#ffffff05),#080a0dbd;box-shadow:inset 0 1px #ffffff12,0 18px 38px #0000003d}.pricing-hero-copy{display:grid;gap:10px;padding:24px;align-content:center;background:linear-gradient(135deg,#14b8a62e,#60a5fa14 52%,#ffffff05),#080a0dc7}.pricing-eyebrow,.plan-badge{width:fit-content;display:inline-flex;align-items:center;gap:7px;color:#5eead4;font-size:11px;font-weight:900;text-transform:uppercase}.pricing-hero-copy h2{color:#fff;font-size:clamp(28px,4vw,52px);line-height:.98;font-weight:950}.pricing-hero-copy p{max-width:680px;color:#aeb5c0;font-size:15px;line-height:1.5;font-weight:700}.license-card{display:grid;gap:8px;padding:18px;align-content:center}.license-card.active{border-color:#2dd4bf70;background:linear-gradient(135deg,#14b8a62e,#ffffff09),#080a0dcc}.license-card span{color:#8d939d;font-size:11px;font-weight:900;text-transform:uppercase}.license-card strong{color:#fff;font-size:24px;font-weight:950}.license-card p{color:#8d939d;font-size:12px;line-height:1.45;font-weight:700}.pricing-grid{min-width:0;display:grid;grid-template-columns:1fr;gap:14px;align-items:stretch}.ltd-card,.pricing-panel{padding:16px}.ltd-card{display:grid;gap:16px;align-content:start;border-color:#14b8a642}.ltd-card.active{border-color:#2dd4bf94}.ltd-card-head{display:grid;gap:7px}.ltd-card-head strong{color:#fff;font-size:58px;line-height:.94;font-weight:950}.ltd-card-head p,.ltd-title span{color:#8d939d;font-size:12px;font-weight:800}.ltd-title{display:grid;gap:5px}.ltd-title h3{margin:0;color:#fff;font-size:19px;line-height:1.1;font-weight:950}.pricing-cta{width:100%;height:44px}.pricing-panel{display:grid;gap:12px;align-content:start}.feature-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}.feature-list li{min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:start;padding:10px;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#ffffff0b}.feature-list svg{color:#5eead4;margin-top:2px}.feature-list span,.feature-list strong,.feature-list small{min-width:0;display:block}.feature-list strong{color:#fff;font-size:13px;font-weight:900}.feature-list small{margin-top:2px;color:#8d939d;font-size:12px;line-height:1.38;font-weight:700}.pricing-facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px 14px;margin:0;font-size:12px}.pricing-facts.compact{padding-top:2px}.pricing-facts dt{color:#8d939d;font-weight:900}.pricing-facts dd{margin:0;min-width:0;overflow-wrap:anywhere;color:#f7f7f4;font-weight:850}.doc-page{min-width:0;width:60%;margin:0 auto;display:grid;gap:14px}.doc-hero{min-width:0;display:grid;grid-template-columns:1fr;gap:14px;align-items:stretch}.doc-hero-copy,.doc-language-picker,.doc-card,.doc-sync,.doc-firewall,.doc-command-panel{min-width:0;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:linear-gradient(180deg,#ffffff0f,#ffffff05),#080a0dbd;box-shadow:inset 0 1px #ffffff12,0 18px 38px #0000003d}.doc-hero-copy{display:grid;gap:10px;padding:24px;align-content:center;background:linear-gradient(135deg,#14b8a62e,#60a5fa14 52%,#ffffff05),#080a0dc7}.doc-hero-copy h2{color:#fff;font-size:clamp(28px,4vw,52px);line-height:.98;font-weight:950}.doc-hero-copy p,.doc-card p,.doc-sync p,.doc-firewall p,.doc-command-head p{color:#aeb5c0;line-height:1.5;font-weight:700}.doc-hero-copy p{max-width:720px;font-size:15px}.doc-language-picker{display:grid;gap:10px;padding:18px;align-content:center}.doc-language-picker span{display:inline-flex;align-items:center;gap:8px;color:#8d939d;font-size:12px;font-weight:900;text-transform:uppercase}.doc-language-picker select{width:100%;min-width:0;height:42px;border:1px solid rgba(255,255,255,.13);border-radius:8px;background:#00000038;color:#f7f7f4;padding:0 12px;font-size:14px;font-weight:850;outline:0}.doc-grid{min-width:0;display:grid;grid-template-columns:1fr;gap:14px}.doc-card{display:grid;grid-template-columns:auto minmax(0,1fr);gap:13px;padding:16px}.doc-card-icon{width:38px;height:38px;display:grid;place-items:center;border-radius:8px;background:#14b8a61f;color:#5eead4}.doc-card h3,.doc-sync h3,.doc-firewall h3,.doc-command-panel h3{color:#fff;font-size:16px;line-height:1.2;font-weight:950}.doc-card p,.doc-sync p,.doc-firewall p,.doc-command-head p{margin-top:6px;font-size:13px}.doc-card ul,.doc-sync ul,.doc-firewall ul{display:grid;gap:7px;margin:12px 0 0;padding-left:18px;color:#8d939d;font-size:12px;line-height:1.45;font-weight:750}.doc-page[dir=rtl] .doc-card ul,.doc-page[dir=rtl] .doc-sync ul,.doc-page[dir=rtl] .doc-firewall ul{padding-left:0;padding-right:18px}.doc-firewall,.doc-sync,.doc-command-panel{display:grid;gap:14px;padding:16px}.doc-firewall{border-color:#f59e0b4d}.doc-sync{border-color:#60a5fa4d}.doc-firewall-head,.doc-sync-head,.doc-command-head{display:grid;grid-template-columns:auto minmax(0,1fr);gap:11px;align-items:start}.doc-firewall-head svg{color:#f59e0b;margin-top:1px}.doc-sync-head svg{color:#93c5fd;margin-top:1px}.doc-command-head svg{color:#5eead4;margin-top:1px}.doc-command-list{display:grid;gap:9px}.doc-command-row{min-width:0;display:grid;grid-template-columns:1fr;gap:10px;align-items:stretch;padding:10px;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#ffffff0b}.doc-command-row span{color:#8d939d;font-size:12px;font-weight:900}.doc-command-row code{min-width:0;overflow-x:auto;color:#5eead4;font-size:12px;font-weight:800;white-space:nowrap}.monitor-layout{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:14px;align-items:start;min-width:0;transition:grid-template-columns .18s ease}.monitor-layout.dock-collapsed{grid-template-columns:minmax(0,1fr) 44px}.right-dock{position:sticky;top:18px;min-width:0;display:flex;flex-direction:column;gap:12px;transition:transform .18s ease,opacity .18s ease}.right-dock.collapsed{width:44px}.dock-toggle{width:36px;height:36px;margin-left:auto;display:grid;place-items:center;border:1px solid rgba(255,255,255,.13);border-radius:8px;background:#ffffff14;color:#c8d0db;transition:background .16s ease,border-color .16s ease,color .16s ease,transform .16s ease}.dock-toggle:hover{color:#fff;background:#ffffff21;border-color:#fff3;transform:translateY(-1px)}.right-dock.collapsed .dock-toggle{width:44px;height:76px;margin-left:0}.action-dock{min-width:0;display:grid;gap:12px}.action-context{min-width:0;display:grid;gap:4px;padding:13px 14px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:linear-gradient(135deg,#2dd4bf1f,#ffffff09 48%),#ffffff0e;box-shadow:inset 0 1px #ffffff12}.action-context span{color:#8d939d;font-size:11px;font-weight:900;text-transform:uppercase}.action-context strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff;font-size:16px;font-weight:900}.action-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.action-tile{min-width:0;min-height:76px;display:grid;place-items:center;align-content:center;gap:8px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#ffffff0f;color:#c8d0db;box-shadow:inset 0 1px #fff1;transition:background .16s ease,border-color .16s ease,color .16s ease,transform .16s ease}.action-tile:hover:not(:disabled){transform:translateY(-1px);color:#fff;background:#ffffff1a;border-color:#ffffff2e}.action-tile.primary{background:#2dd4bf24;border-color:#2dd4bf47;color:#a7f3d0}.action-tile.active{background:#60a5fa2e;border-color:#60a5fa7a;color:#bfdbfe}.action-tile span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:900}.command-deck{display:grid;grid-template-columns:minmax(320px,1fr) auto;gap:12px;align-items:center}.setup-card{min-width:0;display:grid;gap:10px;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:12px;background:#fff1;box-shadow:inset 0 1px #ffffff12}.settings-card{min-width:0;display:grid;gap:9px;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:12px;background:#fff1;box-shadow:inset 0 1px #ffffff12}.field-row{min-width:0;display:grid;gap:7px}.field-row span{color:#8d939d;font-size:12px;font-weight:900}.field-row input{width:100%;height:38px;border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:0 10px;background:#00000038;color:#f7f7f4;outline:0;font-size:12px;font-weight:800}.field-row input:focus{border-color:#2dd4bfb3;box-shadow:0 0 0 2px #2dd4bf24}.hidden-file-input{display:none}.setup-head{min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center}.setup-icon{width:36px;height:36px;display:grid;place-items:center;border-radius:8px;background:#2dd4bf24;color:#5eead4}.setup-head strong,.setup-head span{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setup-head strong{color:#fff;font-size:14px;font-weight:900}.setup-head span{margin-top:2px;color:#8d939d;font-size:12px;font-weight:700}.setup-pin-row{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:9px 10px;background:#00000029}.setup-pin-row div{min-width:0}.setup-pin-row span,.setup-pin-row strong{display:block}.setup-pin-row span{color:#8d939d;font-size:10px;font-weight:950;letter-spacing:.04em;text-transform:uppercase}.setup-pin-row strong{margin-top:2px;color:#fff;font-family:Cascadia Code,SFMono-Regular,Consolas,monospace;font-size:18px;letter-spacing:.08em;line-height:1}.setup-disclosure{height:30px;display:inline-flex;align-items:center;justify-content:center;gap:7px;border:0;border-radius:8px;background:transparent;color:#8d939d;font-size:12px;font-weight:800}.setup-disclosure:hover{background:#ffffff14;color:#fff}.setup-code-row{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px;background:#0003}.setup-code-row code{min-width:0;overflow-wrap:anywhere;color:#9fe6d7;font-family:Cascadia Code,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.45}.deck-actions{gap:8px;justify-content:flex-end}.right-dock .command-deck{grid-template-columns:1fr;gap:10px}.right-dock .deck-actions{display:grid;grid-template-columns:1fr;gap:8px}.right-dock .deck-actions .text-button{width:100%}.status-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}.status-item{min-width:0;gap:9px;min-height:58px;padding:11px 12px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#fff1;box-shadow:inset 0 1px #ffffff12}.status-item svg{color:#9ca3af}.status-item span{min-width:0;color:#8d939d;font-size:12px;font-weight:800}.status-item strong{margin-left:auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff;font-size:13px;font-weight:900}.status-item.state-online svg,.dot.green{color:#34d399}.right-dock .status-strip{grid-template-columns:1fr;gap:8px}.right-dock .status-item{min-height:50px}.screen-wall-panel{position:relative;min-width:0;display:flex;flex-direction:column;gap:12px}.screen-wall-panel.drop-active:after{content:"";position:absolute;inset:-6px 12px 6px -6px;border:2px solid rgba(45,212,191,.58);border-radius:12px;pointer-events:none;box-shadow:0 0 0 4px #2dd4bf14}.control-focus{min-width:0;display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;min-height:calc(100vh - 82px)}.control-focus-head{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:12px}.control-focus-title{min-width:0;display:grid;gap:3px}.control-focus-title>span{color:#8d939d;font-size:11px;font-weight:900;text-transform:uppercase}.control-focus-title small{min-width:0;overflow:hidden;color:#64748b;font-size:12px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.control-focus-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff;font-size:18px;font-weight:900}.control-monitor-tabs{min-width:0;max-width:min(58vw,760px);display:flex;justify-content:flex-end;gap:6px;overflow-x:auto;padding:4px}.control-monitor-tabs button{min-width:116px;height:42px;display:grid;align-content:center;gap:2px;border:1px solid rgba(148,163,184,.28);border-radius:8px;background:#ffffffb8;color:#1f2937;box-shadow:0 10px 22px #0f172a14,0 1px #ffffffe6 inset;cursor:pointer}.control-monitor-tabs button.active{border-color:#0f172ae0;background:#111827;color:#fff}.control-monitor-tabs span,.control-monitor-tabs small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.control-monitor-tabs span{font-size:12px;font-weight:850}.control-monitor-tabs small{color:currentColor;font-size:10px;font-weight:650;opacity:.68}.control-wall{--control-screen-height: calc(100vh - 128px) ;position:relative;display:flex;align-items:center;justify-content:center;min-width:0;min-height:0;height:100%;padding:0}.control-wall .device-tile{width:min(100%,calc(var(--control-screen-height) * var(--screen-aspect, 1.77778)));max-width:100%}.control-empty{display:grid;place-items:center;align-content:center;gap:8px;min-width:min(420px,80%);min-height:220px;color:#98a2b3;text-align:center}.control-empty strong{color:#344054;font-size:16px;font-weight:850}.control-connection-overlay{position:absolute;inset:0;z-index:30;display:grid;place-content:center;justify-items:center;gap:8px;color:#344054;background:#f4f7fb;pointer-events:none}.control-connection-overlay strong{font-size:14px;font-weight:750}.control-connection-overlay small{color:#667085;font-size:12px}.control-connection-spinner{width:22px;height:22px;box-sizing:border-box;border:2px solid rgba(100,116,139,.24);border-top-color:#111827;border-radius:50%;animation:control-connection-spin .7s linear infinite}@keyframes control-connection-spin{to{transform:rotate(360deg)}}.control-empty span{font-size:12px;font-weight:650}.segmented-control{min-width:0;display:inline-flex;gap:4px;padding:4px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#ffffff0e}.segmented-control button{height:30px;min-width:62px;border:0;border-radius:6px;background:transparent;color:#8d939d;padding:0 10px;font-size:12px;font-weight:900}.segmented-control button:hover{color:#fff;background:#ffffff14}.segmented-control button.active{background:#f7f7f4;color:#0c0d0f}.wall-view-control{position:relative;display:inline-block}.wall-view-slider{position:absolute;top:calc(100% - 2px);right:5px;left:5px;display:block;height:8px}.wall-view-slider input[type=range]{appearance:none;-webkit-appearance:none;display:block;width:100%;height:8px;margin:0;padding:0;border:0;background:transparent;cursor:ew-resize}.wall-view-slider input[type=range]::-webkit-slider-runnable-track{height:2px;border-radius:999px;background:#9ca3af}.wall-view-slider input[type=range]::-webkit-slider-thumb{width:8px;height:8px;margin-top:-3px;border:0;border-radius:50%;background:#60a5fa;-webkit-appearance:none}.wall-view-slider input[type=range]::-moz-range-track{height:2px;border:0;border-radius:999px;background:#9ca3af}.wall-view-slider input[type=range]::-moz-range-thumb{width:8px;height:8px;border:0;border-radius:50%;background:#60a5fa}.screen-wall{display:grid;grid-template-columns:repeat(auto-fill,minmax(440px,1fr));gap:14px;align-items:start;min-width:0}.atlas-source-canvas{position:fixed;left:-10000px;top:0;width:1px;height:1px;opacity:0;pointer-events:none}.atlas-slot-wall .remote-canvas.has-frame{image-rendering:auto}.atlas-wall{position:relative;width:100%;max-height:calc(100vh - 96px);overflow:hidden;border:1px solid rgba(15,23,42,.14);border-radius:8px;background:#05070a;box-shadow:0 16px 36px #0f172a2e}.atlas-canvas,.atlas-hit-grid{position:absolute;inset:0;width:100%;height:100%}.atlas-canvas{display:block;object-fit:contain;background:#000}.atlas-hit-grid{display:grid}.atlas-hit-tile{position:relative;min-width:0;min-height:0;overflow:hidden;border:1px solid rgba(255,255,255,.1);border-radius:0;background:transparent;color:#fff;cursor:pointer;outline:none;box-shadow:none}.atlas-hit-tile:hover{border-color:#ffffff9e;background:#ffffff06}.atlas-hit-tile.selected{z-index:2;border-color:#14b8a6;box-shadow:inset 0 0 0 2px #14b8a6db}.atlas-tile-label{position:absolute;left:8px;bottom:8px;display:grid;justify-items:start;gap:1px;max-width:calc(100% - 16px);padding:4px 7px;border-radius:5px;background:#030712bd;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.atlas-tile-label strong,.atlas-tile-label small{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0}.atlas-tile-label strong{font-size:11px;font-weight:750}.atlas-tile-label small{color:#5eead4;font-size:9px;font-weight:650}.atlas-monitor-cycle{position:absolute;top:7px;left:50%;display:flex;align-items:center;gap:3px;min-height:24px;padding:2px 4px;border-radius:12px;background:#ffffffe6;color:#111827;opacity:0;transform:translate(-50%);transition:opacity .12s ease}.atlas-hit-tile:hover .atlas-monitor-cycle,.atlas-hit-tile:focus-visible .atlas-monitor-cycle{opacity:1}.atlas-monitor-cycle>button{width:20px;height:20px;display:grid;place-items:center;padding:0;border:0;border-radius:50%;background:transparent;color:inherit}.atlas-monitor-cycle>button:hover{background:#0f172a1a}.atlas-monitor-cycle b{min-width:22px;font-size:9px;font-weight:800}.screen-wall .device-tile{align-self:start}.screen-wall.size-large{grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--wall-tile-min-width, 500px)),1fr));gap:12px}.screen-wall.size-medium{grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--wall-tile-min-width, 300px)),1fr));gap:12px}.device-tile{position:relative;min-width:0;overflow:hidden;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#ffffff0f;box-shadow:inset 0 1px #ffffff12,0 18px 38px #0000003d}.device-tile.selected{border-color:#3b82f6d1;box-shadow:inset 0 1px #ffffff1a,0 0 0 2px #3b82f633,0 18px 44px #00000061}.device-tile.selected:before{display:none}.device-tile.selected:after{content:none;display:none}.tile-screen{position:relative;width:100%;aspect-ratio:16 / 9;display:block;border:0;padding:1px;overflow:hidden;background:linear-gradient(135deg,#ffffff14,#fff0 44%),#111317;line-height:0}.tile-screen.has-frame{background:#000}.screen-content{position:absolute;inset:1px;z-index:1;display:block;overflow:hidden;border-radius:6px;background:#000}.screen-wall .screen-content{inset:50% auto auto 50%;width:var(--screen-content-width, 100%);height:var(--screen-content-height, 100%);transform:translate(-50%,-50%)}.screen-content.is-empty{opacity:0;pointer-events:none}.control-wall .tile-screen{aspect-ratio:var(--screen-aspect, 16 / 9)}.control-wall .screen-content{inset:1px;width:auto;height:auto;transform:none}.tile-screen:after{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;border:1px solid rgba(255,255,255,.08);box-shadow:inset 0 0 40px #00000080}.device-tile.selected .tile-screen:before{content:none;display:none}.tile-health-pill{position:absolute;top:10px;left:10px;z-index:3;display:inline-flex;align-items:center;min-height:24px;padding:0 9px;border:1px solid rgba(255,255,255,.12);border-radius:999px;background:#080a0da8;color:#f7f7f4;font-size:11px;line-height:1;font-weight:950;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);pointer-events:none}.wall-device-title{position:absolute;top:10px;right:10px;left:auto;z-index:5;max-width:min(52%,320px);min-height:24px;display:inline-flex;align-items:center;justify-content:center;padding:0 10px;overflow:hidden;border:1px solid rgba(255,255,255,.16);border-radius:999px;background:#080a0dad;color:#fff;box-shadow:0 10px 22px #00000038;font-size:11px;line-height:1;font-weight:900;text-overflow:ellipsis;white-space:nowrap;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);pointer-events:none;transform:none}.tile-health-pill.state-online,.machine-health.state-online{color:#6ee7b7}.tile-health-pill.state-busy,.machine-health.state-busy{color:#93c5fd}.tile-health-pill.state-warn,.machine-health.state-warn{color:#fbbf24}.tile-health-pill.state-critical,.machine-health.state-critical{color:#fb7185}.tile-health-pill.state-stale,.machine-health.state-stale,.tile-health-pill.state-offline,.machine-health.state-offline{color:#cbd5e1}.tile-workload{position:absolute;left:10px;right:10px;bottom:10px;z-index:3;min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;padding:8px 9px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#080a0d9e;color:#f7f7f4;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);pointer-events:none}.tile-workload span,.tile-workload strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tile-workload span{color:#cbd5e1;font-size:11px;font-weight:800}.tile-workload strong{justify-self:end;max-width:45%;color:#fff;font-size:11px;font-weight:950}.remote-canvas{position:relative;z-index:1;width:100%;height:100%;display:block;object-fit:contain;object-position:center;background:#000;border-radius:6px;outline:0}.remote-canvas.control-input-enabled{touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.remote-pointer-feedback{position:absolute;z-index:3;width:22px;height:22px;display:grid;place-items:start;color:#fff;pointer-events:none;transform:translate(-2px,-2px);filter:drop-shadow(0 0 1px #000000) drop-shadow(0 1px 2px rgb(0 0 0 / 75%))}.remote-pointer-feedback svg{display:block;fill:#fff;stroke:#111827}.remote-canvas.is-empty{opacity:0}.control-wall .remote-canvas{contain:paint}.monitor-cycle{position:absolute;inset:0;z-index:6;opacity:0;pointer-events:none;transition:opacity .14s ease}.tile-screen:hover .monitor-cycle,.tile-screen:focus-within .monitor-cycle{opacity:1}.monitor-cycle-button{position:absolute;top:50%;width:32px;height:32px;display:grid;place-items:center;border:1px solid rgba(255,255,255,.2);border-radius:50%;background:#080a0db8;color:#fff;box-shadow:0 8px 18px #00000042;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);cursor:pointer;pointer-events:auto;transform:translateY(-50%)}.monitor-cycle-button svg{width:16px;height:16px;stroke-width:2.5}.monitor-cycle-button:hover{background:#080a0de0}.monitor-cycle-button.previous{left:10px}.monitor-cycle-button.next{right:10px}.monitor-cycle-count{position:absolute;top:10px;left:50%;min-height:24px;display:inline-flex;align-items:center;padding:0 10px;border:1px solid rgba(255,255,255,.16);border-radius:999px;background:#080a0dad;color:#fff;font-size:11px;line-height:1;font-weight:900;white-space:nowrap;box-shadow:0 10px 22px #00000038;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);pointer-events:none;transform:translate(-50%)}.slot-grid{position:absolute;inset:1px;border-radius:6px;background-image:linear-gradient(rgba(255,255,255,.055) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.055) 1px,transparent 1px);background-size:34px 34px;-webkit-mask-image:linear-gradient(180deg,#000000d9,#00000040);mask-image:linear-gradient(180deg,#000000d9,#00000040)}.empty-screen{position:absolute;inset:1px;display:grid;place-items:center;align-content:center;gap:6px;color:#7c828d;text-align:center;z-index:1}.wall-presentation-loading{position:absolute;inset:1px;z-index:4;display:grid;place-content:center;justify-items:center;gap:9px;border-radius:6px;background:radial-gradient(circle at center,#1e293bb8,#030712f0),#0b1020;color:#e2e8f0;text-align:center;pointer-events:none}.wall-presentation-loading strong{color:#cbd5e1;font-size:11px;line-height:1;font-weight:800;letter-spacing:.01em}.wall-presentation-spinner{width:24px;height:24px;box-sizing:border-box;border:2px solid rgba(148,163,184,.28);border-top-color:#5eead4;border-right-color:#38bdf8;border-radius:50%;animation:wall-presentation-spin .72s linear infinite}@keyframes wall-presentation-spin{to{transform:rotate(360deg)}}.wall-update-status{position:absolute;inset:1px;z-index:5;display:grid;place-content:center;justify-items:center;gap:8px;border-radius:6px;background:#030712c7;color:#e2e8f0;text-align:center;pointer-events:none}.wall-update-status.state-updated{background:#064e3bd1;color:#d1fae5}.wall-update-status.state-failed{background:#7f1d1de0;color:#fee2e2}.wall-update-status.state-offline,.wall-update-status.state-queued{background:#1e293bdb;color:#e2e8f0}.wall-update-status strong{font-size:12px;line-height:1;font-weight:850;letter-spacing:.01em}.wall-update-spinner{width:24px;height:24px;box-sizing:border-box;border:2px solid rgba(148,163,184,.3);border-top-color:#60a5fa;border-right-color:#a78bfa;border-radius:50%;animation:wall-update-spin .72s linear infinite}@keyframes wall-update-spin{to{transform:rotate(360deg)}}.empty-screen strong{color:#f7f7f4;font-size:13px;font-weight:900}.tile-meta{min-height:54px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:10px 11px}.tile-metrics{position:absolute;left:10px;right:10px;bottom:10px;z-index:3;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;line-height:1;pointer-events:none}.tile-metric{position:relative;min-width:0;overflow:hidden;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px;align-items:center;min-height:25px;padding:4px 7px;border:1px solid rgba(255,255,255,.08);border-radius:7px;background:#080a0d9e;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.tile-metric b,.tile-metric em{position:relative;z-index:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal}.tile-metric b{color:#8d939d;font-size:10px;line-height:1;font-weight:950}.tile-metric em{color:#f7f7f4;font-size:11px;line-height:1;font-weight:950}.tile-metric i{position:absolute;left:0;bottom:0;height:2px;max-width:100%;border-radius:999px;background:#34d399}.tile-metric.state-warn i{background:#f59e0b}.tile-metric.state-critical i{background:#f43f5e}.tile-metric.state-unknown i{display:none}.side-panel{min-width:0;padding:12px 14px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:linear-gradient(180deg,#ffffff0b,#ffffff04),#060709b8;box-shadow:inset 0 1px #fff1}.side-panel.selected-panel,.side-panel.account-panel{display:flex;flex-direction:column}.side-panel.selected-panel .text-button{width:100%;align-self:stretch}.machine-detail-head{display:flex;justify-content:space-between;gap:10px;align-items:center}.machine-detail-head .panel-title{margin-bottom:0}.machine-health{display:inline-flex;align-items:center;min-height:26px;padding:0 10px;border:1px solid rgba(255,255,255,.1);border-radius:999px;background:#ffffff0f;color:#f7f7f4;font-size:11px;font-weight:950}.machine-title{display:grid;gap:3px;margin:7px 0 11px}.machine-title strong,.machine-title span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.machine-title strong{color:#fff;font-size:18px;font-weight:950}.machine-title span{color:#8d939d;font-size:12px;font-weight:850}.machine-metric-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:12px}.machine-metric{min-width:0;display:grid;gap:5px;padding:10px;border:1px solid rgba(255,255,255,.09);border-radius:8px;background:#ffffff0b}.machine-metric span,.machine-metric strong,.machine-metric small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.machine-metric span{color:#8d939d;font-size:10px;font-weight:950}.machine-metric strong{color:#fff;font-size:19px;font-weight:950}.machine-metric small{color:#8d939d;font-size:11px;font-weight:750}.machine-metric i{position:relative;height:3px;overflow:hidden;border-radius:999px;background:#94a3b82e}.machine-metric i b{position:absolute;inset:0 auto 0 0;display:block;max-width:100%;border-radius:inherit;background:#34d399}.machine-metric.state-warn i b{background:#f59e0b}.machine-metric.state-critical i b{background:#f43f5e}.machine-section{display:grid;gap:8px;padding-top:10px;margin-top:10px;border-top:1px solid rgba(255,255,255,.08)}.machine-section-title{display:flex;gap:7px;align-items:center;color:#8d939d;font-size:11px;font-weight:950;text-transform:uppercase}.tool-probe-list{display:grid;gap:7px}.tool-probe{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;padding:7px 9px;border:1px solid rgba(255,255,255,.08);border-radius:7px;background:#ffffff0a}.tool-probe b,.tool-probe em{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-probe b{color:#f7f7f4;font-size:12px;font-weight:900}.tool-probe em{color:#8d939d;font-size:11px;font-style:normal;font-weight:800}.tool-probe.state-online em,.tool-probe.state-busy em{color:#6ee7b7}.tool-probe.state-offline em{color:#cbd5e1}.workload-card{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 8px;padding:9px;border:1px solid rgba(255,255,255,.08);border-radius:7px;background:#ffffff0a}.workload-card strong,.workload-card span,.workload-card p{min-width:0;overflow:hidden;text-overflow:ellipsis}.workload-card strong{white-space:nowrap;color:#f7f7f4;font-size:12px;font-weight:950}.workload-card span{justify-self:end;color:#8d939d;font-size:11px;font-weight:950}.workload-card p{grid-column:1 / -1;color:#8d939d;font-size:11px;line-height:1.35;font-weight:750}.facts.compact{margin-bottom:0;gap:5px 10px}.panel-warning{margin-top:10px;color:#fb7185;font-size:12px;font-weight:800}.tile-meta strong,.tile-meta span{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tile-meta strong{color:#fff;font-size:13px;font-weight:900}.tile-meta span{color:#8d939d;font-size:12px;font-weight:700}.placeholder-tile{border-style:dashed;background:#ffffff0a}.placeholder-tile .tile-screen{cursor:default}.dot{width:9px;height:9px;border-radius:50%;background:#69707b;box-shadow:0 0 0 4px #69707b1f}.dot.green{background:#34d399;box-shadow:0 0 0 4px #34d39924}.dot.gray{background:#69707b}.operator-console{display:grid;grid-template-columns:minmax(220px,.82fr) minmax(360px,1.35fr) minmax(280px,.92fr);gap:0;align-items:stretch;overflow:hidden;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:linear-gradient(180deg,#ffffff0b,#ffffff04),#060709b8;box-shadow:inset 0 1px #fff1,0 16px 34px #0003}.console-panel{min-width:0;min-height:118px;padding:12px 14px;border-right:1px solid rgba(255,255,255,.09);background:transparent}.console-panel:last-child{border-right:0}.panel-title{gap:7px;margin-bottom:9px;color:#8d939d}.panel-title h2{color:#c6cad2;font-size:11px;font-weight:900;text-transform:uppercase}.selected-panel,.account-panel{display:flex;flex-direction:column}.selected-panel .text-button{margin-top:auto;width:auto;min-width:142px;align-self:flex-start}.facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 12px;margin:0 0 10px;font-size:12px}.facts dt{color:#8d939d;font-weight:800}.facts dd{margin:0;min-width:0;overflow-wrap:anywhere;color:#f7f7f4;font-weight:800}.task-panel{display:grid;grid-template-columns:minmax(0,1fr) 160px;grid-template-rows:auto minmax(58px,1fr);gap:9px 10px;align-items:stretch}.task-panel .panel-title{grid-column:1 / -1;margin-bottom:0}.task-panel .text-button{height:auto;min-height:58px;align-self:stretch}.side-panel.task-panel{grid-template-columns:1fr;grid-template-rows:auto minmax(74px,1fr) auto}.side-panel.task-panel .text-button{grid-column:1;min-height:42px}.plan-summary{display:grid;gap:4px;margin-bottom:0}.plan-summary strong{color:#fff;font-size:14px;font-weight:900}.plan-summary span{color:#5eead4;font-weight:900;font-size:13px}.plan-summary p{color:#8d939d;font-size:12px;line-height:1.45;font-weight:700}textarea{width:100%;resize:none;min-height:58px;border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:9px 10px;background:#00000038;color:#f7f7f4;margin-bottom:0;outline:0}textarea:focus{border-color:#2dd4bfb3;box-shadow:0 0 0 2px #2dd4bf24}textarea::placeholder{color:#6f7681}.muted{color:#8d939d;font-size:12px;font-weight:700}@media(max-width:1180px){.topbar{grid-template-columns:1fr auto}.pricing-hero,.pricing-grid,.doc-hero,.doc-grid{grid-template-columns:1fr}.pricing-page,.doc-page{width:100%}.monitor-layout,.operator-console{grid-template-columns:1fr}.operator-console{grid-template-columns:repeat(2,minmax(0,1fr))}.console-panel{border-right:1px solid rgba(255,255,255,.09);border-bottom:1px solid rgba(255,255,255,.09)}.console-panel:nth-child(2n){border-right:0}.console-panel:nth-child(n+3){border-bottom:0}.right-dock{position:static;display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,300px);align-items:start}.right-dock.actions-mode{grid-template-columns:1fr}.right-dock .action-dock{grid-column:1 / -1}.right-dock .notice-band,.right-dock .command-deck{grid-column:1}.right-dock .status-strip{grid-column:2;grid-row:1 / span 2}.deck-actions{justify-content:flex-start;flex-wrap:wrap}}@media(max-width:760px){.app-shell{grid-template-columns:1fr}.tool-rail{position:sticky;top:0;height:auto;min-height:auto;max-height:none;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto;align-items:center;gap:10px;padding:8px;border-right:0;border-bottom:1px solid rgba(255,255,255,.08)}.desk-stage.file-share-stage{height:auto;overflow:visible}.rail-tools,.rail-footer{flex-direction:row;overflow-x:auto;justify-content:flex-start}.rail-tool,.rail-account{width:54px;min-height:48px;flex:0 0 auto}.rail-account img,.avatar-fallback{width:26px;height:26px}.account-popover{inset:74px 8px auto auto;width:min(320px,calc(100vw - 16px))}.desk-stage{padding:14px 12px 18px}.pricing-hero-copy,.license-card,.ltd-card,.pricing-panel,.doc-hero-copy,.doc-language-picker,.doc-card,.doc-firewall,.doc-command-panel{padding:14px}.ltd-card-head strong{font-size:46px}.topbar{grid-template-columns:minmax(0,1fr) auto}.status-strip{grid-template-columns:repeat(2,minmax(0,1fr))}.right-dock{display:flex}.action-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.operator-console{grid-template-columns:1fr}.console-panel,.console-panel:nth-child(2n),.console-panel:nth-child(n+3){border-right:0;border-bottom:1px solid rgba(255,255,255,.09)}.console-panel:last-child{border-bottom:0}.task-panel{grid-template-columns:1fr}.task-panel .text-button{grid-column:1;grid-row:auto;min-width:0}.right-dock .status-strip{grid-template-columns:1fr}.free-ad-banner{grid-template-columns:1fr;gap:6px;min-height:64px;padding:10px 12px}.free-ad-banner .ad-label{writing-mode:horizontal-tb;transform:none}.command-deck{gap:10px}}@media(max-width:480px){.topbar{gap:10px}.topbar .segmented-control button{min-width:54px;padding:0 8px}.status-strip{grid-template-columns:1fr}.deck-actions .text-button,.top-actions .text-button{flex:1 1 auto}.action-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.action-tile{min-height:68px}.facts,.doc-card,.doc-sync-head,.doc-firewall-head,.doc-command-head,.doc-command-row{grid-template-columns:1fr}.doc-command-row .icon-button{width:100%}}:root{color-scheme:light;--livedesk-workspace-base: #cad6e0;--livedesk-workspace-floor: linear-gradient(215deg, #d4dee7 0%, #c2cfda 52%, #d0dbe4 100%);--livedesk-workspace-mesh-top: radial-gradient(ellipse 18% 24% at 7% 9%, rgba(255, 255, 255, .36) 0%, rgba(255, 255, 255, 0) 100%), radial-gradient(ellipse 16% 22% at 36% 22%, rgba(154, 194, 191, .25) 0%, rgba(154, 194, 191, 0) 100%), radial-gradient(ellipse 17% 23% at 66% 18%, rgba(143, 171, 195, .25) 0%, rgba(143, 171, 195, 0) 100%), radial-gradient(ellipse 19% 25% at 93% 9%, rgba(245, 249, 252, .34) 0%, rgba(245, 249, 252, 0) 100%);--livedesk-workspace-mesh-bottom: radial-gradient(ellipse 17% 23% at 8% 84%, rgba(151, 174, 198, .24) 0%, rgba(151, 174, 198, 0) 100%), radial-gradient(ellipse 19% 25% at 37% 96%, rgba(130, 153, 172, .22) 0%, rgba(130, 153, 172, 0) 100%), radial-gradient(ellipse 16% 22% at 67% 82%, rgba(151, 191, 187, .23) 0%, rgba(151, 191, 187, 0) 100%), radial-gradient(ellipse 18% 24% at 94% 95%, rgba(244, 248, 251, .32) 0%, rgba(244, 248, 251, 0) 100%);background:var(--livedesk-workspace-base);color:#172033}body{background:var(--livedesk-workspace-floor);background-attachment:fixed}.app-shell{position:relative;isolation:isolate;color:#172033;background:var(--livedesk-workspace-mesh-bottom),var(--livedesk-workspace-floor)}.app-shell:before{content:"";position:fixed;inset:-9%;z-index:0;pointer-events:none;will-change:transform,opacity}.app-shell:before{background:var(--livedesk-workspace-mesh-top);opacity:.72;animation:livedesk-workspace-mesh-top 12s steps(12,end) infinite alternate}.app-shell.stream-surface-active:before{content:none;animation:none;transform:none;will-change:auto}.app-shell.stream-surface-active{background:var(--livedesk-workspace-mesh-top),var(--livedesk-workspace-mesh-bottom),var(--livedesk-workspace-floor)}.app-shell>.desk-stage{position:relative;z-index:1}@keyframes livedesk-workspace-mesh-top{0%{transform:translate3d(-8.5%,-4%,0) scale(1.03);opacity:.62}50%{transform:translate3d(7.5%,2%,0) scale(1.08);opacity:.82}to{transform:translate3d(-1.5%,8%,0) scale(1.05);opacity:.68}}@media(prefers-reduced-motion:reduce){.app-shell:before{animation:none;transform:none}}html.livedesk-electron-desktop .desk-stage:not(.control-stage){padding-top:14px}.tool-rail{background:#ffffffdb;border-right-color:#94a3b847;box-shadow:10px 0 28px #0f172a14}.rail-brand{background:#111827;color:#fff;box-shadow:0 14px 28px #0f172a2e}.rail-tool{color:#667085}.rail-tool:hover,.rail-tool.active{color:#111827;background:#fff;border-color:#94a3b852;box-shadow:0 10px 22px #0f172a1a}.rail-account{background:#fff;color:#111827;border-color:#94a3b857;box-shadow:0 12px 24px #0f172a1a}.rail-account.signed-in{background:#ecfdf5;border-color:#14b8a652}.account-popover{background:#fffffffa;color:#111827;border-color:#94a3b847;box-shadow:0 22px 46px #0f172a2e}.account-popover-head p,.account-popover-facts dt{color:#667085}.account-popover-facts{border-top-color:#94a3b833;border-bottom-color:#94a3b833}.account-popover-facts dd{color:#111827}.account-popover-action{background:#111827;color:#fff;border-color:#0f172a29;box-shadow:0 14px 28px #0f172a29}.account-popover-action.primary{background:#111827;color:#fff}.desk-stage{--dock-width: 360px;--dock-gutter: 0px;--dock-tab-size: 54px;--dock-tab-half: 27px}h1,.action-context strong,.control-focus-head strong,.setup-head strong,.tile-meta strong,.empty-screen strong,.panel-title h2,.facts dd,.pricing-hero-copy h2,.doc-hero-copy h2,.doc-card h3,.doc-sync h3,.doc-firewall h3,.doc-command-panel h3,.license-card strong,.ltd-card-head strong,.ltd-title h3,.feature-list strong,.pricing-facts dd,.plan-summary strong,.status-item strong{color:#111827}.brand p,.action-context span,.control-focus-title>span,.setup-head span,.field-row span,.setup-disclosure,.tile-meta span,.panel-title,.facts dt,.muted,.license-card span,.license-card p,.ltd-card-head p,.ltd-title span,.feature-list small,.pricing-facts dt,.doc-hero-copy p,.doc-card p,.doc-sync p,.doc-firewall p,.doc-command-head p,.doc-language-picker span,.doc-card ul,.doc-sync ul,.doc-firewall ul,.doc-command-row span,.plan-summary p,.status-item span{color:#667085}.brand-mark,.avatar-fallback{background:linear-gradient(145deg,#10b981,#3b82f6);color:#fff;box-shadow:0 14px 30px #2563eb33}.icon-button,.text-button,.dock-toggle{background:#fff;border-color:#94a3b857;color:#1f2937;box-shadow:0 9px 22px #0f172a1a,0 1px #ffffffe6 inset}.icon-button:hover,.text-button:hover,.dock-toggle:hover{background:#fff;border-color:#47556952;box-shadow:0 14px 30px #0f172a24,0 1px #ffffffeb inset}.text-button.primary,.segmented-control button.active{background:#111827;border-color:#111827;color:#fff}.text-button.buy{background:#10b981;border-color:#10b981;color:#fff;box-shadow:0 14px 28px #10b9813d}.notice-band{background:#fff7ed;border-color:#f59e0b61;color:#9a3412;box-shadow:0 12px 24px #f59e0b1c}.monitor-layout{position:relative;grid-template-columns:minmax(0,1fr) var(--dock-width);gap:0}.screen-wall-panel{position:relative;padding-right:18px}.free-ad-banner{position:sticky;bottom:14px;z-index:40;width:min(760px,calc(100% - 32px));min-height:74px;margin:18px auto 0;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:14px;padding:10px 14px;border:1px solid rgba(100,116,139,.38);border-radius:8px;background:#ffffffeb;color:#111827;box-shadow:0 0 0 1px #ffffffad inset,0 2px 5px #0f172a29,0 18px 40px #0f172a24,0 1px #ffffffe6 inset;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.free-ad-banner .ad-label{align-self:start;color:#98a2b3;font-size:10px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;writing-mode:vertical-rl;transform:rotate(180deg)}.livedesk-ad-unit{min-width:0;width:100%;min-height:54px}.house-ad-copy{min-width:0;display:grid;gap:4px}.house-ad-copy strong{color:#111827;font-size:13px;font-weight:900}.house-ad-copy span{color:#475467;font-size:12px;line-height:1.35;font-weight:760}.free-ad-banner.adsense-ready{min-height:90px}.monitor-layout.dock-collapsed{grid-template-columns:minmax(0,1fr) 0;gap:0}.monitor-layout.dock-collapsed .screen-wall-panel{padding-right:0}.right-dock{position:fixed;top:0;right:0;bottom:0;width:var(--dock-width);min-width:0;overflow:visible;overflow-y:auto;z-index:900;height:100vh;min-height:100vh;padding:18px 12px 18px 24px;border-left:1px solid rgba(203,213,225,.72);border-radius:0;background:linear-gradient(180deg,#fffffffa,#f9fafbf2),#fff;box-shadow:-12px 0 22px #0f172a21,-3px 0 8px #0f172a14,1px 0 #fffffff2 inset;isolation:isolate}.right-dock.collapsed{width:0;min-width:0;height:0;min-height:0;bottom:auto;padding:0;border-left-width:0;border-left-color:transparent;border-radius:0;background:transparent;box-shadow:none;pointer-events:none}.dock-toggle{position:fixed;top:50vh;right:var(--dock-width);z-index:1000;pointer-events:auto;width:var(--dock-tab-half);height:var(--dock-tab-size);margin:0;border-radius:999px 0 0 999px;color:#475467;transform:translateY(-50%);overflow:hidden;background:#fff;border-color:#cbd5e1eb;border-right-color:#fff0;box-shadow:-8px 0 16px #0f172a29,-2px 0 5px #0f172a1a,0 1px #fffffffa inset}.dock-toggle:after{display:none}.dock-toggle svg{position:relative;z-index:2;transform:translate(1px)}.dock-toggle:hover{color:#475467;background:#fff;border-color:#cbd5e1eb;box-shadow:-8px 0 16px #0f172a29,-2px 0 5px #0f172a1a,0 1px #fffffffa inset;transform:translateY(-50%) scale(1.03)}.dock-toggle:focus-visible{outline:0;color:#475467;box-shadow:-8px 0 16px #0f172a29,-2px 0 5px #0f172a1a,0 0 0 3px #4755692e}.right-dock.collapsed .dock-toggle{right:0;width:var(--dock-tab-half);height:var(--dock-tab-size);pointer-events:auto;border-radius:999px 0 0 999px;box-shadow:-8px 0 18px #0f172a2e,-2px 0 6px #0f172a1a,0 1px #fffffff5 inset}.right-dock.collapsed .dock-toggle:hover{box-shadow:-8px 0 18px #0f172a2e,-2px 0 6px #0f172a1a,0 1px #fffffff5 inset}.right-dock.collapsed .dock-toggle:focus-visible{box-shadow:-8px 0 18px #0f172a2e,-2px 0 6px #0f172a1a,0 0 0 3px #4755692e}.action-context,.setup-card,.settings-card,.status-item,.side-panel,.pricing-hero-copy,.license-card,.ltd-card,.pricing-panel,.doc-hero-copy,.doc-language-picker,.doc-card,.doc-sync,.doc-firewall,.doc-command-panel{background:linear-gradient(180deg,#fffffff5,#f9fafbeb),#fff;border-color:#94a3b847;box-shadow:0 18px 38px #0f172a1c,0 2px 6px #0f172a0f,0 1px #fffffffa inset}.segmented-control{background:#ffffffdb;border-color:#94a3b852;box-shadow:0 12px 26px #0f172a1a,0 1px #ffffffe6 inset}.segmented-control button{color:#667085}.segmented-control button:hover{color:#111827;background:#0f172a0d}.doc-language-picker select{background:#f8fafc;border-color:#94a3b852;color:#111827}.doc-card-icon{background:#ecfdf5;color:#10b981}.doc-firewall{border-color:#f59e0b57}.doc-firewall-head svg{color:#d97706}.doc-command-head svg,.doc-command-row code{color:#047857}.doc-command-row{background:#f8fafc;border-color:#94a3b83d}.device-tile{background:#fff;border-color:#94a3b83d;box-shadow:0 20px 42px #0f172a24,0 3px 9px #0f172a0f,0 1px #fffffff5 inset}.device-tile.selected{border-color:#2563ebdb;box-shadow:0 0 0 3px #2563eb47,0 3px 9px #0f172a14}.wall-device-list{position:relative;min-width:0;max-height:calc(100vh - 82px);overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;border:1px solid rgba(148,163,184,.3);border-radius:8px;background:#ffffffe6;box-shadow:0 18px 42px #0f172a1a,0 1px #fffffff5 inset}.wall-device-list-head,.wall-device-list-row{display:grid;grid-template-columns:minmax(160px,1.5fr) 84px repeat(4,minmax(52px,.48fr)) minmax(82px,.7fr) minmax(76px,.65fr) minmax(118px,.9fr);min-width:750px}.wall-device-list-head{position:sticky;top:0;z-index:4;min-height:36px;align-items:center;border-bottom:1px solid rgba(148,163,184,.34);background:#f1f5f9f7;color:#64748b;box-shadow:0 2px 6px #0f172a0f;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.wall-device-list-head>span{min-width:0;padding:0 8px;overflow:hidden;font-size:10px;font-weight:900;letter-spacing:.045em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.wall-device-list-head>span+span{border-left:1px solid rgba(148,163,184,.18)}.wall-device-list-row{position:relative;min-height:58px;align-items:stretch;border-bottom:1px solid rgba(148,163,184,.2);background:#ffffffd6;color:#1f2937;cursor:default;outline:none}.wall-device-list-row:last-child{border-bottom:0}.wall-device-list-row:hover{z-index:1;background:#f8fafc}.wall-device-list-row:focus-visible{z-index:2;box-shadow:inset 0 0 0 2px #2563eb94}.wall-device-list-row.selected{z-index:1;background:#eff6ff;box-shadow:inset 3px 0 #2563eb,inset 0 0 0 1px #2563eb3d}.wall-device-list-row.state-warn{box-shadow:inset 3px 0 #f59e0b}.wall-device-list-row.state-critical,.wall-device-list-row.state-offline{box-shadow:inset 3px 0 #ef4444}.wall-device-list-row.selected.state-warn,.wall-device-list-row.selected.state-critical,.wall-device-list-row.selected.state-offline{box-shadow:inset 3px 0 #2563eb,inset 0 0 0 1px #2563eb3d}.wall-device-list-row>[role=gridcell]{min-width:0;padding:8px}.wall-device-list-row>[role=gridcell]+[role=gridcell]{border-left:1px solid rgba(148,163,184,.15)}.wall-device-name{display:grid;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:8px}.wall-device-name>span:not(.wall-device-icon){min-width:0;display:grid;gap:3px}.wall-device-icon{width:28px;height:28px;display:grid;place-items:center;border:1px solid rgba(59,130,246,.2);border-radius:6px;background:#eff6ff;color:#2563eb}.wall-device-name strong,.wall-device-name small,.wall-device-list-status strong,.wall-device-list-metric strong,.wall-device-list-metric small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wall-device-name strong{color:#172033;font-size:12px;font-weight:850}.wall-device-name small{color:#7c8799;font-size:9px;font-weight:700}.wall-device-name>svg{color:#2563eb}.wall-device-list-status{display:grid;grid-template-columns:8px minmax(0,1fr);align-items:center;gap:7px}.wall-device-list-status>i{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 0 3px #22c55e1f}.wall-device-list-status strong{color:#475569;font-size:10px;font-weight:850}.wall-device-list-status.state-busy>i,.wall-device-list-status.update-updating>i,.wall-device-list-status.update-queued>i{background:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.wall-device-list-status.state-warn>i{background:#f59e0b;box-shadow:0 0 0 3px #f59e0b21}.wall-device-list-status.state-critical>i,.wall-device-list-status.state-offline>i,.wall-device-list-status.update-failed>i{background:#ef4444;box-shadow:0 0 0 3px #ef44441f}.wall-device-list-status.state-stale>i{background:#94a3b8;box-shadow:0 0 0 3px #94a3b824}.wall-device-list-metric{position:relative;display:grid;align-content:center;gap:3px}.wall-device-list-metric strong{color:#334155;font-size:11px;font-weight:900}.wall-device-list-metric small{color:#94a3b8;font-size:8px;font-weight:700}.wall-device-list-metric>i{position:absolute;left:8px;bottom:5px;max-width:calc(100% - 16px);height:2px;border-radius:999px;background:#22c55e;opacity:.72}.wall-device-list-metric.state-warn strong{color:#b45309}.wall-device-list-metric.state-warn>i{background:#f59e0b}.wall-device-list-metric.state-critical strong{color:#dc2626}.wall-device-list-metric.state-critical>i{background:#ef4444}.wall-device-list-metric.state-unknown{opacity:.58}.wall-device-list-diagnostics{grid-column:1 / -1;padding:6px 8px 8px!important;border-top:1px solid rgba(148,163,184,.18);border-left:0!important;background:#f1f5f99e}.wall-device-list-diagnostics .remote-status-lines{position:static;max-height:none;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));overflow:visible}.wall-device-list-empty{min-height:240px;display:grid;place-content:center;justify-items:center;gap:9px;color:#94a3b8}.wall-device-list-empty strong{color:#64748b;font-size:12px;font-weight:800}.device-tile.selected:before{border-color:#0d9488eb;box-shadow:0 0 0 2px #ffffffdb,0 0 18px #0d948833}.tile-screen{background:linear-gradient(rgba(17,24,39,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(17,24,39,.045) 1px,transparent 1px),linear-gradient(180deg,#fff,#f8fafc);background-size:34px 34px,34px 34px,auto}.tile-screen.has-frame{background:#000;background-size:auto}.tile-screen:after{border-color:#94a3b847;box-shadow:inset 0 0 0 1px #ffffffa3,inset 0 -24px 40px #0f172a09}.monitor-cycle-button{border-color:#94a3b85c;background:#ffffffe6;color:#111827;box-shadow:0 8px 18px #0f172a29,0 1px #ffffffe6 inset}.monitor-cycle-button:hover{background:#fff}.monitor-cycle-count{border-color:#94a3b847;background:#ffffffe0;color:#111827;box-shadow:0 10px 24px #0f172a1f,0 1px #ffffffe6 inset}.tile-health-pill,.wall-device-title{border:1px solid rgba(148,163,184,.36);background:#fffffff5;color:#64748b;box-shadow:0 1px 2px #0f172a1f,0 1px #fffffff5 inset}.tile-health-pill.state-online{color:#047857}.tile-health-pill.state-busy{color:#1d4ed8}.tile-health-pill.state-warn{color:#b45309}.tile-health-pill.state-critical{color:#be123c}.tile-health-pill.state-stale,.tile-health-pill.state-offline{color:#64748b}.device-tile.selected .wall-device-title{border-color:#60a5fac7;background:#fffffffa;color:#1d4ed8;box-shadow:0 0 0 1px #93c5fdb8,0 0 0 4px #2563eb3d,0 1px #fffffff5 inset}.slot-grid{background-image:linear-gradient(rgba(17,24,39,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(17,24,39,.045) 1px,transparent 1px)}.placeholder-tile{border-style:solid;background:#fff}.empty-screen{color:#98a2b3}.dot.gray{background:#cbd5e1}.dot.green{background:#10b981;box-shadow:0 0 0 4px #10b98124}.machine-metric,.tool-probe,.workload-card{background:#f8fafc;border-color:#94a3b83d}.tile-metric{background:#fffffff5;border-color:#94a3b857;box-shadow:0 1px 2px #0f172a1a}.tile-metric b,.machine-metric span,.machine-metric small,.machine-section-title,.tool-probe em,.workload-card span,.workload-card p,.machine-title span{color:#667085}.tile-metric em,.machine-metric strong,.machine-title strong,.tool-probe b,.workload-card strong{color:#111827}.machine-health{background:#fff;border-color:#94a3b847;color:#111827}.machine-section{border-top-color:#94a3b838}.machine-metric i{background:#94a3b838}.setup-icon{background:#ecfdf5;color:#10b981}.field-row input,.setup-code-row,textarea{background:#f8fafc;border-color:#94a3b852;color:#111827}.setup-code-row code{color:#047857}.field-row input:focus,textarea:focus{border-color:#10b981b8;box-shadow:0 0 0 3px #10b98121}textarea::placeholder{color:#98a2b3}.feature-list li{background:#f8fafc;border-color:#94a3b83d}.feature-list svg,.pricing-eyebrow,.plan-badge,.plan-summary span{color:#10b981}.action-tile{background:#fff;border-color:#94a3b847;color:#475467;box-shadow:0 14px 28px #0f172a1a,0 1px #fffffff5 inset}.action-tile:hover:not(:disabled){color:#111827;background:#fff;border-color:#4755694d;box-shadow:0 18px 34px #0f172a24,0 1px #fffffff5 inset}.action-tile.primary{background:#ecfdf5;border-color:#10b98147;color:#047857}.action-tile.active{background:#eff6ff;border-color:#3b82f65c;color:#1d4ed8}.manual-action-bar{min-height:34px;display:flex;align-items:center;gap:4px;padding:0 2px}.manual-action-tooltip{position:relative;flex:0 0 34px;display:inline-flex}.manual-action-tooltip.disabled{cursor:default}.manual-action-tooltip.disabled .manual-action{pointer-events:none}.manual-action-tooltip:after{position:absolute;top:calc(100% + 7px);left:50%;z-index:100;width:max-content;max-width:min(280px,calc(100vw - 32px));padding:5px 7px;border-radius:4px;background:#1f2937;color:#f8fafc;box-shadow:0 4px 12px #0f172a38;content:attr(data-tooltip);font-size:11px;font-weight:650;line-height:1.3;opacity:0;pointer-events:none;text-align:left;transform:translate(-50%,-2px);transition:opacity .1s ease,transform .1s ease;visibility:hidden;white-space:normal}.manual-action-tooltip:first-child:after{left:0;transform:translateY(-2px)}.manual-action-tooltip:nth-last-child(-n+3):after{right:0;left:auto;transform:translateY(-2px)}.manual-action-tooltip:hover:after,.manual-action-tooltip:focus-within:after{opacity:1;transform:translate(-50%);visibility:visible}.manual-action-tooltip:first-child:hover:after,.manual-action-tooltip:first-child:focus-within:after,.manual-action-tooltip:nth-last-child(-n+3):hover:after,.manual-action-tooltip:nth-last-child(-n+3):focus-within:after{transform:translateY(0)}.manual-action{flex:0 0 34px;width:34px;height:34px;display:inline-flex;min-width:34px;min-height:34px;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;background:transparent;color:#526174;cursor:pointer;box-shadow:none;padding:0;transition:background-color .12s ease,color .12s ease,border-color .12s ease}.manual-action:hover:not(:disabled){border-color:transparent;background:#e9eef5;color:#111827}.manual-action:focus-visible{outline:1px solid #5b86c5;outline-offset:-1px}.manual-action.active{border-color:transparent;background:#e7f0ff;color:#1d4ed8}.manual-action.danger{color:#b42318}.manual-action.danger:hover:not(:disabled){background:#feeceb;color:#b42318}.manual-action:disabled{cursor:default;opacity:.35}.manual-action svg{pointer-events:none}.wall-update-status small{max-width:min(90%,320px);overflow:hidden;color:currentColor;font-size:10px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.transfer-bar{color:#475569}.transfer-bar-track{background:#94a3b83d}.transfer-bar.state-failed{color:#991b1b}.pricing-page{width:min(620px,calc(100vw - 130px));min-height:calc(100vh - 112px);place-items:center}.pricing-offer{position:relative;width:100%;min-width:0;display:grid;gap:16px;padding:26px;overflow:hidden;border:1px solid rgba(148,163,184,.28);border-radius:10px;background:radial-gradient(circle at 58% 9%,#ffffff1a,#fff0 16%),linear-gradient(180deg,#1f2937fa,#111827fa 45%,#030712fc);color:#f8fafc;box-shadow:0 30px 70px #0f172a38,0 0 0 1px #ffffff0a inset,0 22px 48px #0f172a38}.pricing-close{position:absolute;top:18px;right:18px;z-index:2;display:grid;place-items:center;width:34px;height:34px;border:1px solid rgba(255,255,255,.18);border-radius:8px;background:#ffffff14;color:#ffffffdb;box-shadow:none}.pricing-close:hover{background:#ffffff24;color:#fff}.pricing-offer-head{display:grid;gap:10px;padding-right:42px}.pricing-offer .pricing-eyebrow{color:#d1d5db;letter-spacing:.08em}.deal-price-line{min-width:0;display:flex;flex-wrap:wrap;gap:8px 10px;align-items:center}.deal-price-line strong,.deal-original{color:#fff;font-size:clamp(42px,8vw,64px);line-height:.9;font-weight:950}.deal-original{opacity:.9;text-decoration:line-through;text-decoration-thickness:3px;text-decoration-color:#d1d5dbb8}.deal-arrow{color:#ffffffdb;font-size:clamp(30px,5vw,44px);line-height:1;font-weight:900}.deal-badge{display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border-radius:8px;background:#e5e7eb;color:#111827;font-size:12px;font-weight:950;box-shadow:0 14px 28px #0f172a38}.pricing-offer-head p{max-width:520px;margin:0;color:#e5e7ebb8;font-size:15px;line-height:1.5;font-weight:750}.deal-table,.deal-module,.deal-open-price{border:1px solid rgba(255,255,255,.14);border-radius:10px;background:#02061747;box-shadow:0 1px #ffffff14 inset}.deal-table{overflow:hidden}.deal-row{display:grid;grid-template-columns:minmax(130px,1fr) minmax(160px,1.3fr) minmax(76px,auto);gap:12px;align-items:center;padding:12px 16px;border-top:1px solid rgba(255,255,255,.09);color:#f3f4f6e0;font-size:13px;font-weight:800}.deal-row:first-child{border-top:0}.deal-row-head{padding-block:10px;background:#ffffff14;color:#d1d5db94;font-size:11px;text-transform:uppercase;letter-spacing:.04em}.deal-row-highlight{background:linear-gradient(90deg,#4b55638f,#11182729)}.deal-row strong{color:#fff;font-size:14px;font-weight:950}.deal-row s{color:#ffffff7a;font-weight:950}.deal-row>:last-child{justify-self:end;color:#f9fafb}.deal-card-grid{display:grid;grid-template-columns:1fr;gap:10px}.deal-plan-card{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 14px;align-items:center;padding:14px;border:1px solid rgba(255,255,255,.12);border-radius:10px;background:#02061738;box-shadow:0 1px #ffffff14 inset}.deal-plan-card.featured{border-color:#d1d5db57;background:linear-gradient(90deg,#4b556375,#11182738),#02061742}.deal-plan-card span{grid-column:1 / -1;color:#d1d5db9e;font-size:11px;font-weight:950;text-transform:uppercase;letter-spacing:.04em}.deal-plan-card h3{margin:0;color:#fff;font-size:22px;line-height:1;font-weight:950}.deal-plan-card strong{justify-self:end;color:#fff;font-size:18px;line-height:1;font-weight:950}.deal-plan-card p{grid-column:1 / -1;margin:0;color:#e5e7ebb8;font-size:12px;line-height:1.45;font-weight:800}.deal-plan-card ul{grid-column:1 / -1;display:grid;gap:4px;margin:2px 0 0;padding:0;list-style:none;color:#f3f4f6d6;font-size:12px;font-weight:850}.deal-plan-card li:before{content:"";display:inline-block;width:5px;height:5px;margin-right:8px;border-radius:999px;background:#d1d5db;vertical-align:2px}.deal-card-button{grid-column:1 / -1;display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;border:0;border-radius:8px;background:#f9fafb;color:#111827;font-size:13px;font-weight:950;box-shadow:0 14px 28px #0f172a38,0 1px #ffffffbf inset}.deal-card-button:disabled{cursor:not-allowed;opacity:.58}.deal-module{display:grid;gap:12px;padding:14px}.deal-module-title{display:flex;justify-content:space-between;gap:12px;align-items:center}.deal-module-title strong{color:#fff;font-size:13px;font-weight:950;text-transform:uppercase;letter-spacing:.04em}.deal-module-title span{color:#d1d5db;font-size:12px;font-weight:900}.deal-feature-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.deal-feature-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:9px;align-items:center;color:#f3f4f6e0;font-size:13px;font-weight:850}.deal-feature-list svg{color:#d1d5db}.deal-feature-list b{padding:4px 8px;border:1px solid rgba(209,213,219,.28);border-radius:999px;color:#e5e7eb;font-size:11px}.deal-open-price{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px 16px;align-items:center;padding:16px;border-color:#94a3b83d;background:#1118277a}.deal-open-price>span{color:#d1d5dba8;font-size:12px;font-weight:950;text-transform:uppercase}.deal-open-price strong{justify-self:end;color:#fff;font-size:24px;line-height:1;font-weight:950}.deal-open-price small{grid-column:1 / -1;color:#d1d5db9e;font-size:12px;line-height:1.45;font-weight:800}.deal-note{display:inline-flex;justify-content:center;gap:8px;align-items:center;margin:2px 0 0;color:#d1d5dbb8;font-size:12px;line-height:1.4;font-weight:850;text-align:center}.deal-note svg{color:#d1d5db;flex:0 0 auto}.deal-cta{display:inline-flex;justify-content:center;align-items:center;gap:9px;width:100%;min-height:58px;border:0;border-radius:10px;background:linear-gradient(90deg,#111827,#374151);color:#fff;font-size:16px;font-weight:950;box-shadow:0 18px 40px #0f172a52,0 1px #ffffff57 inset}.deal-cta:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 24px 48px #0f172a61,0 1px #fff6 inset}.deal-cta:disabled{cursor:not-allowed;opacity:.68}.deal-later{justify-self:center;border:0;background:transparent;color:#d1d5db8f;font-size:13px;font-weight:900}.deal-later:hover{color:#fff}@media(max-width:1180px){.dock-toggle{right:var(--dock-width);top:50vh;bottom:auto}.right-dock.collapsed .dock-toggle{right:0;top:50vh;bottom:auto}.monitor-layout.dock-collapsed{grid-template-columns:1fr}.livedesk-toast{right:12px;bottom:12px;width:calc(100vw - 24px)}}@media(max-width:760px){.pricing-page{width:min(100%,calc(100vw - 84px));min-height:auto;align-items:start}.pricing-offer{padding:20px;gap:13px}.deal-price-line strong,.deal-original{font-size:42px}.deal-badge{width:fit-content}.deal-row{grid-template-columns:1fr auto;gap:7px 10px}.deal-row span:nth-child(2){grid-column:1 / -1;order:3}.deal-open-price{grid-template-columns:1fr}.deal-open-price strong{justify-self:start}.transfer-bar{left:50%;right:auto;width:min(320px,calc(100vw - 32px));grid-template-columns:minmax(100px,1fr) auto;gap:6px}.transfer-bar p{max-width:120px}.desk-stage{--dock-width: min(360px, calc(100vw - 24px) )}.desk-stage.dock-open .topbar{padding-right:0}.monitor-layout:not(.dock-collapsed){grid-template-columns:1fr}}.desk-stage.control-stage{height:100vh;min-height:100vh;overflow:hidden;gap:0;padding:0}.desk-stage.control-stage .topbar{display:none}.desk-stage.control-stage .monitor-layout{height:100vh;min-height:0;align-items:stretch;overflow:hidden}.desk-stage.control-stage .screen-wall-panel{height:100vh;min-height:0;overflow:hidden;padding:0}.desk-stage.control-stage .control-focus{min-height:0;height:100vh;display:block}.desk-stage.control-stage .control-wall{--control-screen-height: calc(100vh - 8px) ;position:relative;width:100%;height:100vh;min-height:0;box-sizing:border-box;display:flex;align-items:center;justify-content:center;overflow:hidden;padding:4px 8px}.desk-stage.control-stage .control-wall .device-tile{flex:0 1 auto;align-self:center;width:min(100%,calc(var(--control-screen-height) * var(--screen-aspect, 1.77778)));max-width:100%;height:auto;line-height:0;border:0;border-radius:0;background:transparent;box-shadow:none}.desk-stage.control-stage .control-wall .tile-screen{padding:0}.desk-stage.control-stage .control-wall .screen-content{inset:0;border-radius:0}.desk-stage.control-stage .control-wall .remote-canvas{border-radius:0}.desk-stage.control-stage .control-wall .tile-screen:after{border:0;box-shadow:none}.desk-stage.control-stage .control-monitor-tabs{position:absolute;top:8px;left:50%;z-index:24;max-width:min(82vw,920px);min-height:30px;display:flex;align-items:center;justify-content:center;gap:4px;overflow-x:auto;padding:3px;border:1px solid rgba(148,163,184,.24);border-radius:999px;background:#ffffffc7;box-shadow:0 10px 24px #0f172a1f,0 1px #ffffffe0 inset;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);transform:translate(-50%)}.desk-stage.control-stage .control-computer-name{flex:0 1 auto;min-width:0;max-width:180px;padding:0 10px 0 8px;overflow:hidden;border-right:1px solid rgba(100,116,139,.28);color:#1d4ed8;font-size:10px;font-weight:900;line-height:24px;text-overflow:ellipsis;white-space:nowrap}.desk-stage.control-stage .control-monitor-tabs button{min-width:0;width:auto;height:24px;display:inline-flex;align-items:center;gap:5px;padding:0 10px;border:0;border-radius:999px;background:transparent;color:#475569;box-shadow:none;font-size:10px;line-height:1}.desk-stage.control-stage .control-monitor-tabs button.active{background:#111827;color:#fff}.desk-stage.control-stage .control-monitor-tabs span{max-width:120px;font-size:10px;font-weight:850}.desk-stage.control-stage .control-monitor-tabs small{font-size:8px;font-weight:700;opacity:.72}.desk-stage.control-stage .control-modifier-bar{position:absolute;left:50%;bottom:12px;z-index:25;display:flex;align-items:center;gap:4px;padding:4px;transform:translate(-50%);border:1px solid rgba(148,163,184,.28);border-radius:999px;background:#ffffffd1;box-shadow:0 10px 24px #0f172a24;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.desk-stage.control-stage .control-modifier-bar button{min-width:46px;height:28px;padding:0 10px;border:1px solid transparent;border-radius:999px;background:transparent;color:#475569;font:inherit;font-size:11px;font-weight:900;cursor:pointer}.desk-stage.control-stage .control-modifier-bar button:hover{border-color:#2563eb3d;color:#1d4ed8}.desk-stage.control-stage .control-modifier-bar button.active{border-color:#2563eb;background:#0f172a;color:#fff}.desk-stage.control-stage .remote-keyboard-input{position:fixed;left:50%;bottom:1px;z-index:-1;width:1px;height:1px;min-width:1px;min-height:1px;padding:0;border:0;opacity:0;color:transparent;background:transparent;caret-color:transparent;pointer-events:none;resize:none;transform:translate(-50%);font-size:16px}.desk-stage.control-stage .monitor-cycle{display:none}.share-files-page{width:min(1100px,64vw);min-width:0;margin:0 auto;padding:8px 0 48px;display:grid;gap:18px;color:#172033}.share-files-header,.share-section-heading,.share-files-header-actions,.share-destination-row,.share-folder-row,.share-auto-sync,.share-direct-actions button{display:flex;align-items:center}.share-files-header{justify-content:space-between;gap:22px;padding-bottom:18px;border-bottom:1px solid rgba(148,163,184,.28)}.share-files-header>div:first-child{display:grid;gap:5px}.share-files-eyebrow{display:inline-flex;align-items:center;gap:7px;color:#64748b;font-size:11px;font-weight:800;letter-spacing:0;text-transform:uppercase}.share-files-header h2{color:#111827;font-size:25px;line-height:1.15;font-weight:760}.share-files-header p{color:#667085;font-size:13px;font-weight:550}.share-files-header-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px}.share-target-panel,.share-sync-section,.share-direct-section{min-width:0;display:grid;gap:14px;padding:18px;border:1px solid rgba(148,163,184,.28);border-radius:8px;background:#ffffffe0;box-shadow:0 16px 36px #0f172a17,0 1px #fffffff5 inset}.share-section-heading{justify-content:space-between;gap:16px}.share-section-heading>div:first-child{display:grid;gap:2px}.share-section-heading span{color:#667085;font-size:10px;font-weight:800;letter-spacing:0;text-transform:uppercase}.share-section-heading strong{color:#111827;font-size:16px;font-weight:760}.share-section-heading .segmented-control{width:auto;flex:0 0 auto}.share-section-heading .segmented-control button{display:inline-flex;align-items:center;gap:6px;min-width:118px}.share-destination-row{gap:12px;padding:12px 0;border-top:1px solid rgba(148,163,184,.18);border-bottom:1px solid rgba(148,163,184,.18)}.share-directory-field{min-width:0;flex:1 1 auto;display:grid;grid-template-columns:auto minmax(160px,1fr);align-items:center;gap:10px}.share-directory-field>span,.share-directory-hint{color:#667085;font-size:11px;font-weight:700}.share-directory-field input{width:100%;height:38px;box-sizing:border-box;border:1px solid rgba(148,163,184,.34);border-radius:7px;background:#f8fafc;color:#111827;padding:0 11px;outline:none}.share-directory-field input:focus{border-color:#3b82f68f;box-shadow:0 0 0 3px #3b82f61c}.share-device-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.share-device-option{min-width:0;min-height:52px;display:grid;grid-template-columns:auto auto minmax(0,1fr);align-items:center;gap:9px;padding:8px 10px;border:1px solid rgba(148,163,184,.24);border-radius:7px;background:#f8fafc;color:#64748b;cursor:pointer}.share-device-option.selected{border-color:#3b82f652;background:#eff6ff;color:#2563eb}.share-device-option input{width:16px;height:16px;margin:0;accent-color:#2563eb}.share-device-option span{min-width:0;display:grid;gap:2px}.share-device-option strong,.share-device-option small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.share-device-option strong{color:#111827;font-size:12px}.share-device-option small{color:#7c8799;font-size:10px}.share-folder-list{display:grid;gap:8px}.share-folder-row{min-width:0;gap:12px;padding:11px 12px;border:1px solid rgba(148,163,184,.24);border-radius:7px;background:#f8fafc}.share-folder-row.state-syncing,.share-folder-row.state-scanning{border-color:#3b82f661;background:#eff6ff}.share-folder-row.state-blocked,.share-folder-row.state-error{border-color:#f59e0b5c;background:#fff7ed}.share-folder-icon{width:36px;height:36px;flex:0 0 auto;display:grid;place-items:center;border-radius:7px;background:#fff;color:#475569;box-shadow:0 7px 16px #0f172a14}.share-folder-info{min-width:0;flex:1 1 auto;display:grid;gap:2px}.share-folder-info strong,.share-folder-info span,.share-folder-info small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.share-folder-info strong{color:#111827;font-size:13px}.share-folder-info span,.share-folder-info small{color:#667085;font-size:10px}.share-auto-sync{gap:6px;color:#64748b;font-size:11px;font-weight:750}.share-auto-sync input{width:16px;height:16px;accent-color:#2563eb}.share-remove{flex:0 0 auto;color:#64748b;box-shadow:none}.share-remove:hover{color:#b91c1c}.share-empty-state,.share-empty-inline{color:#7c8799;font-size:12px;text-align:center}.share-empty-state{min-height:112px;display:grid;place-items:center;align-content:center;gap:5px;border:1px dashed rgba(148,163,184,.4);border-radius:7px;background:#f8fafc}.share-empty-state.interactive{width:100%;color:#64748b;cursor:pointer}.share-empty-state.interactive:hover{border-color:#3b82f66b;background:#eff6ff;color:#2563eb}.share-empty-state strong{color:#111827;font-size:13px}.share-empty-state span{max-width:420px;font-size:11px}.share-empty-inline{grid-column:1 / -1;padding:18px}.share-direct-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.share-direct-actions button{min-width:0;min-height:62px;gap:12px;padding:10px 14px;border:1px solid rgba(148,163,184,.26);border-radius:7px;background:#f8fafc;color:#475569;text-align:left}.share-direct-actions button:hover:not(:disabled){border-color:#3b82f657;background:#eff6ff;color:#2563eb}.share-direct-actions button span{min-width:0;display:grid;gap:2px}.share-direct-actions button strong{color:#111827;font-size:12px}.share-direct-actions button small{color:#7c8799;font-size:10px}.share-files-page{width:min(1280px,calc(100vw - 170px));gap:16px;padding-top:4px}.share-files-header{min-height:76px;padding:0 0 14px}.share-files-header h2{font-size:27px}.share-files-header-actions .text-button{min-height:42px;padding-inline:14px}.share-route-map{min-width:0;min-height:118px;display:grid;grid-template-columns:minmax(220px,1fr) minmax(150px,.7fr) minmax(240px,1fr);align-items:center;gap:18px;padding:18px 22px;border:1px solid rgba(148,163,184,.28);border-radius:8px;background:#fff;box-shadow:0 18px 38px #0f172a14}.share-route-node{min-width:0;display:flex;align-items:center;gap:13px}.share-route-node>span:last-child{min-width:0;display:grid;gap:2px}.share-route-node small,.share-route-node strong,.share-route-node em{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.share-route-node small{color:#7c8799;font-size:10px;font-style:normal;font-weight:800;text-transform:uppercase}.share-route-node strong{color:#111827;font-size:15px;font-weight:780}.share-route-node em{color:#667085;font-size:11px;font-style:normal;font-weight:600}.share-route-node-icon,.share-route-device-stack{position:relative;width:58px;height:58px;flex:0 0 auto;display:grid;place-items:center;border-radius:8px}.share-route-node-icon{border:1px solid rgba(20,184,166,.28);background:#ecfdf5;color:#0f9f8f;box-shadow:inset 0 0 0 5px #ffffffb3}.share-route-device-stack{border:1px solid rgba(59,130,246,.24);background:#eff6ff;color:#2563eb}.share-route-device-stack svg{position:absolute;padding:3px;border:1px solid rgba(59,130,246,.22);border-radius:5px;background:#fff}.share-route-device-stack svg:nth-child(1){transform:translate(-11px,8px)}.share-route-device-stack svg:nth-child(2){z-index:2;transform:translate(0)}.share-route-device-stack svg:nth-child(3){transform:translate(11px,-8px)}.share-route-connection{min-width:0;display:grid;grid-template-columns:auto minmax(50px,1fr) auto;align-items:center;gap:8px;color:#94a3b8}.share-route-connection>span{position:relative;height:20px;display:flex;align-items:center;justify-content:space-around}.share-route-connection>span:before{content:"";position:absolute;left:0;right:0;top:50%;height:1px;background:#94a3b880}.share-route-connection i{position:relative;z-index:1;width:6px;height:6px;border:2px solid #ffffff;border-radius:50%;background:#94a3b8}.share-route-connection.active{color:#0f9f8f}.share-route-connection.active i{background:#14b8a6;animation:share-route-pulse .9s ease-in-out infinite alternate}.share-route-connection.active i:nth-child(2){animation-delay:.18s}.share-route-connection.active i:nth-child(3){animation-delay:.36s}@keyframes share-route-pulse{to{transform:scale(1.55)}}.share-target-panel,.share-sync-section,.share-direct-section{gap:16px;padding:18px 20px;box-shadow:0 12px 28px #0f172a11}.share-destination-row{padding:10px 12px;border:1px solid rgba(148,163,184,.24);border-radius:8px;background:#f8fafc}.share-directory-field{grid-template-columns:auto auto minmax(160px,1fr)}.share-directory-field:before{content:"";width:8px;height:8px;border-radius:50%;background:#14b8a6;box-shadow:0 0 0 4px #14b8a61f}.share-directory-field input{height:40px;border-color:transparent;background:#fff;box-shadow:0 1px #0f172a0d}.share-device-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.share-device-option{position:relative;min-height:76px;grid-template-columns:auto minmax(0,1fr) auto;gap:11px;padding:11px 12px;border-radius:8px;background:#f8fafc;transition:border-color .14s ease,background-color .14s ease,transform .14s ease}.share-device-option:hover{border-color:#3b82f65c;transform:translateY(-1px)}.share-device-option.selected{border-color:#2563eb6b;background:#eff6ff;box-shadow:inset 3px 0 #3b82f6}.share-device-option input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.share-device-screen{position:relative;width:44px;height:44px;display:grid;place-items:center;border:1px solid rgba(148,163,184,.24);border-radius:7px;background:#fff;color:#64748b}.share-device-screen i{position:absolute;right:5px;bottom:5px;width:7px;height:7px;border:2px solid #ffffff;border-radius:50%;background:#22c55e}.share-device-option.selected .share-device-screen{border-color:#3b82f647;color:#2563eb}.share-device-check{width:24px;height:24px;display:grid;place-items:center;color:#cbd5e1}.share-device-option.selected .share-device-check{color:#2563eb}.share-empty-state{min-height:154px;gap:7px;border-radius:8px;background:#f8fafc}.share-empty-graphic{position:relative;width:68px;height:56px;display:grid;place-items:center;color:#64748b}.share-empty-graphic svg:last-child{position:absolute;right:4px;bottom:2px;box-sizing:content-box;padding:5px;border:2px solid #f8fafc;border-radius:50%;background:#dbeafe;color:#2563eb}.share-folder-row{min-height:66px;border-radius:8px}.share-folder-icon{position:relative;width:44px;height:44px;color:#2563eb}.share-folder-state{position:absolute;right:3px;bottom:3px;width:8px;height:8px;border:2px solid #ffffff;border-radius:50%;background:#22c55e}.share-folder-state.state-syncing,.share-folder-state.state-scanning{background:#3b82f6;animation:share-route-pulse .7s ease-in-out infinite alternate}.share-folder-state.state-blocked,.share-folder-state.state-error{background:#f59e0b}.share-direct-actions{gap:12px}.share-direct-actions button{min-height:92px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:13px;padding:14px;border-radius:8px;background:#f8fafc}.share-direct-actions button>svg:last-child{color:#94a3b8}.share-direct-actions button:hover:not(:disabled)>svg:last-child{color:#2563eb;transform:translate(2px)}.share-direct-icon{width:54px;height:54px;display:grid;place-items:center;border-radius:8px;background:#e0f2fe;color:#0284c7}.share-direct-icon.folder{background:#fef3c7;color:#d97706}.share-direct-actions button strong{font-size:13px}.share-direct-actions button small{margin-top:2px;font-size:11px}.transfer-bar{width:min(520px,calc(100vw - 32px));min-height:62px;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;padding:10px 12px;border:1px solid rgba(148,163,184,.32);border-radius:8px;background:#fff;box-shadow:0 22px 52px #0f172a33;pointer-events:auto}.transfer-bar-icon{width:36px;height:36px;display:grid;place-items:center;border-radius:7px;background:#eff6ff;color:#2563eb}.transfer-bar-copy{min-width:0;display:grid;align-content:center;gap:7px}.transfer-bar p{max-width:none;color:#334155;font-size:11px}.transfer-bar>strong{color:#111827;font-size:12px;font-weight:800}.transfer-bar-track{height:5px}.transfer-bar.state-queued .transfer-bar-icon{background:#ecfdf5;color:#059669}.transfer-bar.state-failed .transfer-bar-icon{background:#fef2f2;color:#dc2626}@media(max-width:1180px){.share-files-page{width:min(820px,calc(100vw - 116px))}.share-device-list{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:760px){.share-files-page{width:calc(100vw - 92px);gap:12px}.share-files-header,.share-section-heading,.share-destination-row{align-items:stretch;flex-direction:column}.share-files-header-actions{justify-content:flex-start}.share-route-map{grid-template-columns:1fr;gap:10px}.share-route-connection{width:min(260px,80%);justify-self:center}.share-section-heading .segmented-control{width:100%}.share-section-heading .segmented-control button{min-width:0}.share-directory-field,.share-device-list,.share-direct-actions{grid-template-columns:1fr}.share-directory-field:before{display:none}.share-folder-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.share-auto-sync{grid-column:2}.transfer-bar{width:min(420px,calc(100vw - 24px));grid-template-columns:auto minmax(0,1fr) auto}}.runtime-role-settings .settings-reset{margin-top:10px}.runtime-role-success{color:#166534;font-weight:700}.runtime-role-error{color:#b42318;font-weight:700}.runtime-role-boot{min-height:100vh;display:grid;place-content:center;justify-items:center;gap:10px;background:var(--livedesk-workspace-floor);color:#111827;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.wall-presentation-loading small{max-width:240px;color:#94a3b8;font-size:10px;line-height:1.4}.wall-presentation-loading.permission-required svg{color:#fbbf24}.runtime-role-boot-mark{width:30px;height:30px;border:3px solid rgba(15,118,110,.18);border-top-color:#0f766e;border-radius:999px;animation:runtime-role-boot-spin .8s linear infinite}.runtime-role-boot strong{font-size:15px}.runtime-role-boot p{margin:0;color:#667085;font-size:12px}.runtime-role-boot-retry{min-width:108px;min-height:40px;margin-top:4px;border:0;border-radius:10px;background:#0f766e;color:#fff;font:inherit;font-size:13px;font-weight:700;cursor:pointer}.runtime-role-boot-retry:focus-visible{outline:3px solid rgba(15,118,110,.28);outline-offset:3px}@keyframes runtime-role-boot-spin{to{transform:rotate(360deg)}}.mobile-console-header,.mobile-console-nav{display:none}html.livedesk-mobile-console-active,html.livedesk-mobile-console-active body,html.livedesk-mobile-console-active #root{height:100%;min-height:0;overflow:hidden;overscroll-behavior:none;background:var(--livedesk-workspace-base)}html.livedesk-mobile-console-active{scrollbar-gutter:auto}html.livedesk-mobile-console-active #root{position:relative}.mobile-console-shell{--livedesk-mobile-nav-bottom-gap: max(4px, calc(env(safe-area-inset-bottom) - 12px) );--livedesk-mobile-header-height: 58px;position:fixed;top:var(--livedesk-mobile-viewport-top, 0px);right:auto;left:var(--livedesk-mobile-viewport-left, 0px);width:var(--livedesk-mobile-viewport-width, 100vw);height:var(--livedesk-mobile-viewport-height, 100dvh);min-height:0;max-height:var(--livedesk-mobile-viewport-height, 100dvh);grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto;overflow:hidden;background:var(--livedesk-workspace-floor);color:#111827}.mobile-console-shell[data-mobile-standalone=true],.mobile-console-shell[data-mobile-ios=true]{--livedesk-mobile-nav-bottom-gap: 0px;position:fixed;inset:0;width:auto;height:auto;max-height:none}.mobile-console-shell[data-mobile-ios=true]{padding-top:var(--livedesk-mobile-ios-top-guard, 0px)}.mobile-console-shell[data-mobile-android=true]:not([data-mobile-standalone=true]){right:0;width:auto}@supports (-webkit-touch-callout: none){.mobile-console-shell{--livedesk-mobile-nav-bottom-gap: 0px;position:fixed;inset:0;width:auto;height:auto;max-height:none;padding-top:var(--livedesk-mobile-ios-top-guard, 0px)}}.mobile-console-shell>.tool-rail{display:none}.mobile-console-shell>.desk-stage>.mobile-console-header{flex:0 0 auto;min-width:0;min-height:58px;max-height:112px;display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:10px;margin:0 calc(0px - max(10px,env(safe-area-inset-right))) 0 calc(0px - max(10px,env(safe-area-inset-left)));padding:max(8px,env(safe-area-inset-top)) max(12px,env(safe-area-inset-right)) 8px max(12px,env(safe-area-inset-left));border-bottom:1px solid #dbe3ec;background:#fffffff5;box-shadow:0 6px 18px #0f172a0f;box-sizing:border-box;overflow:hidden;z-index:80}.mobile-console-brand,.mobile-console-hub,.mobile-console-header-actions,.mobile-console-install,.mobile-console-brand-mark,.mobile-console-update{display:inline-flex;align-items:center}.mobile-console-header-actions{grid-column:3;gap:6px}.mobile-wall-preferences{position:relative;z-index:85;flex:0 0 auto;width:100%;min-width:0;display:flex;align-items:flex-start;justify-content:center;gap:10px;padding:2px 0 8px;box-sizing:border-box;pointer-events:auto}.mobile-wall-preferences .segmented-control{gap:2px;padding:3px;border-color:#94a3b85c;background:#fffffff0}.mobile-wall-preferences .segmented-control button{min-width:48px;height:30px;padding:0 6px;font-size:12px;pointer-events:auto;touch-action:manipulation}.mobile-wall-preferences .segmented-control button.active{background:#111827;color:#fff}.mobile-wall-preferences .wall-cadence-control button{min-width:50px}.mobile-wall-preferences[data-list-status-only=true] .wall-view-control>.segmented-control{border-color:#2563eb6b}@media(max-width:359px){.mobile-wall-preferences{gap:6px}.mobile-wall-preferences .segmented-control button,.mobile-wall-preferences .wall-cadence-control button{min-width:44px;padding:0 4px}}.mobile-console-brand{min-width:0;gap:9px}.mobile-console-brand-mark{width:34px;height:34px;flex:0 0 34px;justify-content:center;border-radius:8px;background:#111827;color:#fff;box-shadow:0 8px 18px #0f172a2e}.mobile-console-brand>span:last-child,.mobile-console-hub>span{min-width:0;display:grid}.mobile-console-brand strong{font-size:15px;line-height:1.1}.mobile-console-brand small,.mobile-console-hub small{overflow:hidden;color:#7c8799;font-size:9px;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.mobile-console-hub{min-width:0;max-width:142px;justify-self:end;column-gap:9px;padding:0 3px;border:0;background:transparent;color:inherit;text-align:left;touch-action:manipulation}.mobile-console-hub:disabled{cursor:default;opacity:1}.mobile-console-hub:not(:disabled){cursor:pointer}.mobile-console-hub-live{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.mobile-console-hub>i{width:8px;height:8px;flex:0 0 8px;border-radius:50%;background:#f59e0b;box-shadow:0 0 0 4px #f59e0b1f}.mobile-console-hub.state-online>i{background:#10b981;box-shadow:0 0 0 4px #10b9811f}.mobile-console-hub.state-offline>i,.mobile-console-hub.state-unavailable>i{background:#ef4444;box-shadow:0 0 0 4px #ef44441a}.mobile-console-hub.state-reconnecting>i{background:#f59e0b;box-shadow:0 0 0 4px #f59e0b1f}.mobile-console-hub.state-checking>i,.mobile-console-hub.state-connecting>i{width:12px;height:12px;flex-basis:12px;border:2px solid rgba(37,99,235,.22);border-top-color:#2563eb;background:transparent;box-shadow:none;box-sizing:border-box;animation:mobile-hub-connecting-spin .75s linear infinite}@keyframes mobile-hub-connecting-spin{to{transform:rotate(360deg)}}.mobile-hub-recovery-overlay{position:fixed;inset:calc(var(--livedesk-mobile-header-height, 58px) + 52px) 0 calc(56px + var(--livedesk-mobile-nav-bottom-gap, env(safe-area-inset-bottom))) 0;z-index:70;display:grid;place-items:center;padding:24px;pointer-events:none;background:#e2e8f0a8;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.mobile-hub-recovery-message{width:min(320px,calc(100vw - 40px));display:grid;justify-items:center;gap:8px;padding:22px 20px;border:1px solid rgba(148,163,184,.42);border-radius:14px;background:#fffffff0;color:#334155;text-align:center;box-shadow:0 18px 42px #0f172a29}.mobile-hub-recovery-message strong{color:#1e293b;font-size:15px;line-height:1.25}.mobile-workspace-recovery-failure{position:fixed;inset:calc(var(--livedesk-mobile-header-height, 58px) + 52px) 0 calc(56px + var(--livedesk-mobile-nav-bottom-gap, env(safe-area-inset-bottom))) 0;z-index:71;display:grid;place-items:center;padding:24px;background:#e2e8f0b8}.mobile-workspace-recovery-failure-message{width:min(340px,calc(100vw - 40px));display:grid;justify-items:center;gap:10px;padding:22px 20px;border:1px solid rgba(239,68,68,.35);border-radius:14px;background:#fff;color:#334155;text-align:center;box-shadow:0 18px 42px #0f172a29}.mobile-workspace-recovery-failure-message small{color:#64748b;line-height:1.4}.mobile-workspace-recovery-failure-message button{min-width:112px;min-height:40px;border:0;border-radius:10px;background:#2563eb;color:#fff;font:inherit;font-weight:700}.mobile-hub-recovery-spinner{width:30px;height:30px;margin-bottom:2px;border:3px solid rgba(37,99,235,.2);border-top-color:#2563eb;border-radius:50%;box-sizing:border-box;animation:mobile-hub-recovery-spin .8s linear infinite}@keyframes mobile-hub-recovery-spin{to{transform:rotate(360deg)}}.desktop-hub-recovery-overlay{position:absolute;inset:0 18px 0 0;z-index:70;display:grid;place-items:center;min-height:360px;padding:24px;pointer-events:none;background:#e2e8f0b8;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.desktop-hub-recovery-message{width:min(360px,calc(100% - 40px));display:grid;justify-items:center;gap:8px;padding:24px 22px;border:1px solid rgba(148,163,184,.42);border-radius:14px;background:#fffffff5;color:#334155;text-align:center;box-shadow:0 18px 42px #0f172a29}.desktop-hub-recovery-message strong{color:#1e293b;font-size:16px}.desktop-hub-recovery-message small{color:#64748b;font-size:13px}.desktop-hub-recovery-spinner{width:32px;height:32px;margin-bottom:2px;border:3px solid rgba(37,99,235,.2);border-top-color:#2563eb;border-radius:50%;box-sizing:border-box;animation:mobile-hub-recovery-spin .8s linear infinite}@media(prefers-reduced-motion:reduce){.mobile-hub-recovery-spinner,.desktop-hub-recovery-spinner{animation:none;border-color:#2563eb33;border-top-color:#2563eb}}.mobile-console-hub strong{overflow:hidden;color:#334155;font-size:10px;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.mobile-console-install,.mobile-console-update{width:34px;height:34px;justify-content:center;padding:0;border-radius:8px}.mobile-console-install{border:1px solid #99f6e4;background:#f0fdfa;color:#0f766e}.mobile-console-update{border:1px solid #bfdbfe;background:#eff6ff;color:#2563eb}.mobile-console-account{width:38px;height:34px;min-width:38px;display:grid;place-items:center;align-content:center;gap:1px;padding:2px;border:1px solid #cbd5e1;border-radius:8px;background:#fff;color:#475569;box-shadow:none}.mobile-console-account.signed-in{border-color:#14b8a661;background:#ecfdf5;color:#0f766e}.mobile-console-account img,.mobile-console-account .avatar-fallback{width:18px;height:18px;border-radius:50%}.mobile-console-account img{object-fit:cover;box-shadow:0 0 0 1px #14b8a670}.mobile-console-account .avatar-fallback{font-size:9px}.mobile-console-account>span:last-child{max-width:34px;overflow:hidden;font-size:7px;font-weight:800;line-height:1;text-overflow:ellipsis;white-space:nowrap}.mobile-console-account:disabled{opacity:.6}.mobile-pwa-guide-backdrop{position:fixed;inset:0;z-index:160;display:flex;align-items:flex-end;justify-content:center;padding:16px 12px max(16px,env(safe-area-inset-bottom));background:#0f172a7a}.mobile-pwa-guide{width:min(100%,430px);padding:18px;border:1px solid #dbe3ec;border-radius:18px;background:#fff;box-shadow:0 24px 64px #0f172a3d;color:#1e293b}.mobile-pwa-guide>header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px}.mobile-pwa-guide>header>span:nth-child(2){min-width:0;display:grid;gap:2px}.mobile-pwa-guide>header strong{font-size:16px}.mobile-pwa-guide>header small{color:#64748b;font-size:12px}.mobile-pwa-guide-mark{width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:#eff6ff;color:#2563eb}.mobile-pwa-guide>header>button{width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:9px;background:#f1f5f9;color:#475569}.mobile-pwa-guide ol{margin:16px 0;padding-left:24px;color:#475569;font-size:14px;line-height:1.55}.mobile-pwa-guide li+li{margin-top:8px}.mobile-pwa-guide-done{width:100%;min-height:44px;border:0;border-radius:11px;background:#2563eb;color:#fff;font-size:14px;font-weight:800}.mobile-console-shell>.desk-stage{grid-row:1;grid-column:1 / -1;width:100%;height:100%;min-height:0;gap:10px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;padding:0 max(10px,env(safe-area-inset-right)) 10px max(10px,env(safe-area-inset-left))}.mobile-console-shell .topbar{display:none!important}.mobile-console-shell .monitor-layout,.mobile-console-shell .monitor-layout:not(.dock-collapsed),.mobile-console-shell .monitor-layout.dock-collapsed{width:100%;min-width:0;grid-template-columns:minmax(0,1fr)!important;gap:10px}.mobile-console-shell .right-dock{display:none!important}.mobile-console-shell .screen-wall-panel{width:100%;min-width:0;gap:10px;padding-right:0}.mobile-console-shell .screen-wall,.mobile-console-shell .screen-wall.size-large,.mobile-console-shell .screen-wall.size-medium{width:100%;grid-template-columns:minmax(0,1fr);gap:10px}.mobile-console-shell .placeholder-tile{display:none}.mobile-console-shell .device-tile{width:100%;border-radius:9px}.mobile-console-shell>.mobile-console-nav{grid-row:2;grid-column:1 / -1;min-height:calc(56px + var(--livedesk-mobile-nav-bottom-gap));display:grid;grid-template-columns:repeat(6,minmax(0,1fr));padding:4px max(4px,env(safe-area-inset-right)) var(--livedesk-mobile-nav-bottom-gap) max(4px,env(safe-area-inset-left));border-top:1px solid #dbe3ec;background:#fffffffa;box-shadow:0 -8px 24px #0f172a14;z-index:90}@media(orientation:portrait){.mobile-console-shell[data-mobile-ios=true]{--livedesk-mobile-header-height: 44px}.mobile-console-shell[data-mobile-ios=true]>.desk-stage{padding:0 10px 10px}.mobile-console-shell[data-mobile-ios=true]>.desk-stage>.mobile-console-header{margin:0 -10px;min-height:44px;max-height:44px;padding:2px 12px}.mobile-console-shell[data-mobile-ios=true]>.mobile-console-nav{height:44px;min-height:44px;padding:0 4px}.mobile-console-shell[data-mobile-ios=true]>.mobile-console-nav>button{height:100%;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;padding:0 1px}}@supports (-webkit-touch-callout: none){@media(orientation:portrait){.mobile-console-shell{--livedesk-mobile-header-height: 44px}.mobile-console-shell>.desk-stage{padding:0 10px 10px}.mobile-console-shell>.desk-stage>.mobile-console-header{margin:0 -10px;min-height:44px;max-height:44px;padding:2px 12px}.mobile-console-shell>.mobile-console-nav{height:44px;min-height:44px;padding:0 4px}.mobile-console-shell>.mobile-console-nav>button{height:100%;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;padding:0 1px}}}.mobile-console-nav button{min-width:0;min-height:44px;display:grid;place-items:center;align-content:center;gap:3px;padding:4px 1px;border:0;border-radius:8px;background:transparent;color:#7c8799;box-shadow:none}.mobile-console-nav button.active{background:#eff6ff;color:#1d4ed8}.mobile-console-nav button span{font-size:9px;font-weight:800}.mobile-console-shell .settings-page,.mobile-console-shell .share-files-page,.mobile-console-shell .pricing-page{width:100%!important;min-height:0;margin:0}.mobile-console-shell .settings-section-grid,.mobile-console-shell .share-route-map,.mobile-console-shell .share-device-list,.mobile-console-shell .share-direct-actions{grid-template-columns:minmax(0,1fr)}.mobile-console-shell .settings-page-tabs{width:100%;grid-template-columns:repeat(3,minmax(0,1fr));overflow-x:hidden}.mobile-console-shell .settings-section-card,.mobile-console-shell .share-target-panel,.mobile-console-shell .share-sync-section,.mobile-console-shell .share-direct-section{padding:14px}.mobile-console-shell .product-setting-row{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px 10px;padding:7px 0}.mobile-console-shell .product-setting-control{grid-column:2;grid-row:1;min-height:22px}.mobile-console-shell .product-setting-icon{display:none}.mobile-console-shell .product-setting-copy{grid-column:1;grid-row:1;flex-wrap:wrap;overflow:visible;white-space:normal}.mobile-console-shell .product-setting-copy em{font-size:10px}.mobile-console-shell .product-setting-copy small{flex:0 0 100%;margin:3px 0 0;overflow:visible;line-height:1.35;text-overflow:clip;white-space:normal}.mobile-console-shell .desk-stage.file-share-stage,.mobile-console-shell .desk-stage.agents-stage{height:100%;min-height:0;overflow:hidden}.mobile-console-shell .agents-page{height:100%;padding:10px 0}.mobile-console-shell .desk-stage.control-stage{height:100%;min-height:0;overflow:hidden;padding:0}.mobile-console-shell .desk-stage.control-stage .monitor-layout,.mobile-console-shell .desk-stage.control-stage .screen-wall-panel,.mobile-console-shell .desk-stage.control-stage .control-focus,.mobile-console-shell .desk-stage.control-stage .control-wall{width:100%;height:100%;min-height:0}.mobile-console-shell .desk-stage.control-stage .control-wall{--control-screen-height: calc(var(--livedesk-mobile-viewport-height, 100dvh) - 132px);padding:4px}.mobile-console-shell .desk-stage.control-stage .control-monitor-tabs{top:6px;max-width:calc(100vw - 12px)}.mobile-console-shell .desk-stage.control-stage .control-computer-name{max-width:108px}.mobile-console-shell .desk-stage.control-stage .control-modifier-bar{bottom:8px;max-width:calc(var(--livedesk-mobile-viewport-width, 100vw) - 16px);overflow-x:auto}.mobile-console-shell .desk-stage.control-stage .control-modifier-bar button{min-width:40px;padding:0 8px}.mobile-console-shell .desk-stage.control-stage .control-modifier-bar .remote-keyboard-button{display:inline-flex;align-items:center;justify-content:center;min-width:36px;padding:0}.mobile-console-shell .livedesk-toast{right:10px;bottom:calc(62px + var(--livedesk-mobile-nav-bottom-gap, env(safe-area-inset-bottom)));width:calc(var(--livedesk-mobile-viewport-width, 100vw) - 20px)}@media(orientation:landscape)and (max-height:500px){.mobile-console-shell{grid-template-columns:minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);padding-top:0}.mobile-console-shell>.desk-stage>.mobile-console-header{display:none}.mobile-hub-recovery-overlay,.mobile-workspace-recovery-failure{inset:0 calc(62px + env(safe-area-inset-right)) 0 0}.mobile-console-brand-mark{width:30px;height:30px;flex-basis:30px}.mobile-console-shell>.desk-stage{grid-row:1;grid-column:1;gap:7px;padding:max(8px,env(safe-area-inset-top)) max(7px,env(safe-area-inset-right)) 7px max(7px,env(safe-area-inset-left))}.mobile-console-shell .screen-wall,.mobile-console-shell .screen-wall.size-large,.mobile-console-shell .screen-wall.size-medium{grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}.mobile-console-shell>.mobile-console-nav{grid-row:1 / -1;grid-column:2;width:auto;min-width:62px;min-height:0;grid-template-columns:minmax(48px,1fr);grid-template-rows:repeat(6,minmax(0,1fr));padding:max(4px,env(safe-area-inset-top)) max(4px,env(safe-area-inset-right)) max(4px,env(safe-area-inset-bottom)) 4px;border-top:0;border-left:1px solid #dbe3ec;box-shadow:-8px 0 24px #0f172a14}.mobile-console-nav button{min-height:0;gap:1px;padding:2px 1px}.mobile-console-nav button span{font-size:8px}.mobile-console-shell .desk-stage.control-stage .control-wall{--control-screen-height: var(--livedesk-mobile-viewport-height, 100dvh);padding:0}.mobile-console-shell .livedesk-toast{right:calc(72px + env(safe-area-inset-right));bottom:max(8px,env(safe-area-inset-bottom));width:calc(var(--livedesk-mobile-viewport-width, 100vw) - 92px - env(safe-area-inset-left) - env(safe-area-inset-right))}}@media(max-width:480px){.mobile-console-hub{max-width:118px}.mobile-console-brand small,.mobile-console-hub small{display:none}}
|