livedesk 0.1.151 → 0.1.152

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/README.md CHANGED
@@ -29,7 +29,7 @@ automatically after reboot.
29
29
  - Mode 2: independent 320x180 RGB565+LZO tiles for large, stable walls.
30
30
  - Mode 3: direct hardware H.264 for focused remote control up to 4K.
31
31
  - Mode 4: client Mode 2 inputs composited by an isolated Hub worker into one
32
- 1920x1080 H.264 Atlas stream for the browser wall.
32
+ bounded H.264 Atlas stream, then split by UV into the normal browser slots.
33
33
 
34
34
  ## Plans
35
35
 
@@ -9,7 +9,18 @@ const DEFAULT_WIDTH = 1920;
9
9
  const DEFAULT_HEIGHT = 1080;
10
10
  const DEFAULT_FPS = 20;
11
11
  const MAX_DEVICES = 100;
12
- const FRAME_POOL_SIZE = 3;
12
+ const FRAME_POOL_SIZE = 8;
13
+ const MAX_TILE_WIDTH = 320;
14
+ const MAX_TILE_HEIGHT = 180;
15
+
16
+ const rgb565Red = new Uint8Array(65_536);
17
+ const rgb565Green = new Uint8Array(65_536);
18
+ const rgb565Blue = new Uint8Array(65_536);
19
+ for (let pixel = 0; pixel < 65_536; pixel += 1) {
20
+ rgb565Red[pixel] = (((pixel >> 11) & 0x1f) * 255 / 31) | 0;
21
+ rgb565Green[pixel] = (((pixel >> 5) & 0x3f) * 255 / 63) | 0;
22
+ rgb565Blue[pixel] = ((pixel & 0x1f) * 255 / 31) | 0;
23
+ }
13
24
 
14
25
  let config = normalizeConfig({});
15
26
  let layoutVersion = 0;
@@ -25,7 +36,10 @@ let encoderStartupTimer = null;
25
36
  let outputBuffer = Buffer.alloc(0);
26
37
  let frameSeq = 0;
27
38
  let tickTimer = null;
39
+ let nextTickAt = 0;
28
40
  let closed = false;
41
+ let lastComposeMs = 0;
42
+ let poolStarved = 0;
29
43
 
30
44
  function clamp(value, min, max, fallback) {
31
45
  const number = Number(value);
@@ -35,10 +49,23 @@ function clamp(value, min, max, fallback) {
35
49
  function normalizeConfig(value) {
36
50
  const deviceIds = [...new Set((Array.isArray(value?.deviceIds) ? value.deviceIds : [])
37
51
  .map(item => String(item || '').trim()).filter(Boolean))].slice(0, MAX_DEVICES);
52
+ const maxWidth = clamp(value?.width, 640, 3840, DEFAULT_WIDTH);
53
+ const maxHeight = clamp(value?.height, 360, 2160, DEFAULT_HEIGHT);
54
+ const count = Math.max(1, deviceIds.length);
55
+ const columns = Math.max(1, Math.ceil(Math.sqrt(count)));
56
+ const rows = Math.max(1, Math.ceil(count / columns));
57
+ const tileWidth = Math.max(2, Math.min(MAX_TILE_WIDTH, Math.floor(maxWidth / columns))) & ~1;
58
+ const tileHeight = Math.max(2, Math.min(MAX_TILE_HEIGHT, Math.floor(maxHeight / rows))) & ~1;
38
59
  return {
39
60
  deviceIds,
40
- width: clamp(value?.width, 640, 3840, DEFAULT_WIDTH),
41
- height: clamp(value?.height, 360, 2160, DEFAULT_HEIGHT),
61
+ maxWidth,
62
+ maxHeight,
63
+ width: tileWidth * columns,
64
+ height: tileHeight * rows,
65
+ columns,
66
+ rows,
67
+ tileWidth,
68
+ tileHeight,
42
69
  fps: clamp(value?.fps, 1, 30, DEFAULT_FPS)
43
70
  };
44
71
  }
@@ -193,27 +220,25 @@ function emitEncodedUnit(payload) {
193
220
  isKeyFrame,
194
221
  chunkType: isKeyFrame ? 'key' : 'delta',
195
222
  hardwareEncoder: encoder?.candidate?.name || '',
196
- layoutVersion
223
+ layoutVersion,
224
+ composeMs: lastComposeMs,
225
+ poolStarved
197
226
  }
198
227
  });
199
228
  }
200
229
 
201
230
  function rebuildLayout() {
202
- const count = Math.max(1, config.deviceIds.length);
203
- const columns = Math.max(1, Math.ceil(Math.sqrt(count)));
204
- const rows = Math.max(1, Math.ceil(count / columns));
205
- const cellWidth = Math.floor(config.width / columns);
206
- const cellHeight = Math.floor(config.height / rows);
231
+ const { columns, rows, tileWidth, tileHeight } = config;
207
232
  layoutVersion += 1;
208
233
  layout = config.deviceIds.map((deviceId, index) => ({
209
234
  deviceId,
210
235
  index,
211
236
  column: index % columns,
212
237
  row: Math.floor(index / columns),
213
- x: (index % columns) * cellWidth,
214
- y: Math.floor(index / columns) * cellHeight,
215
- width: index % columns === columns - 1 ? config.width - (index % columns) * cellWidth : cellWidth,
216
- height: Math.floor(index / columns) === rows - 1 ? config.height - Math.floor(index / columns) * cellHeight : cellHeight
238
+ x: (index % columns) * tileWidth,
239
+ y: Math.floor(index / columns) * tileHeight,
240
+ width: tileWidth,
241
+ height: tileHeight
217
242
  }));
218
243
  for (const tile of latestTiles.values()) tile.rendered = null;
219
244
  framePool = Array.from({ length: FRAME_POOL_SIZE }, () => Buffer.alloc(config.width * config.height * 3));
@@ -228,17 +253,26 @@ function renderTile(tileState, tileLayout) {
228
253
  const height = Math.max(1, Math.floor(sourceHeight * scale));
229
254
  const pixels = Buffer.allocUnsafe(width * height * 3);
230
255
  let target = 0;
256
+ if (width === sourceWidth && height === sourceHeight) {
257
+ for (let source = 0; source < tileState.rgb565.length; source += 2) {
258
+ const pixel = tileState.rgb565[source] | (tileState.rgb565[source + 1] << 8);
259
+ pixels[target++] = rgb565Red[pixel];
260
+ pixels[target++] = rgb565Green[pixel];
261
+ pixels[target++] = rgb565Blue[pixel];
262
+ }
263
+ } else {
231
264
  for (let y = 0; y < height; y += 1) {
232
265
  const sourceY = Math.min(sourceHeight - 1, Math.floor((y + 0.5) * sourceHeight / height));
233
266
  for (let x = 0; x < width; x += 1) {
234
267
  const sourceX = Math.min(sourceWidth - 1, Math.floor((x + 0.5) * sourceWidth / width));
235
268
  const source = (sourceY * sourceWidth + sourceX) * 2;
236
269
  const pixel = tileState.rgb565[source] | (tileState.rgb565[source + 1] << 8);
237
- pixels[target++] = ((pixel >> 11) & 0x1f) * 255 / 31;
238
- pixels[target++] = ((pixel >> 5) & 0x3f) * 255 / 63;
239
- pixels[target++] = (pixel & 0x1f) * 255 / 31;
270
+ pixels[target++] = rgb565Red[pixel];
271
+ pixels[target++] = rgb565Green[pixel];
272
+ pixels[target++] = rgb565Blue[pixel];
240
273
  }
241
274
  }
275
+ }
242
276
  tileState.rendered = {
243
277
  pixels,
244
278
  width,
@@ -269,9 +303,13 @@ function ingestFrame(message) {
269
303
  }
270
304
 
271
305
  function writeAtlasFrame() {
306
+ const composeStartedAt = performance.now();
272
307
  const target = framePool.pop();
273
308
  const stdin = encoder?.child?.stdin;
274
- if (!target || !stdin || stdin.destroyed || !stdin.writable) return;
309
+ if (!target || !stdin || stdin.destroyed || !stdin.writable) {
310
+ if (!target) poolStarved += 1;
311
+ return;
312
+ }
275
313
  target.fill(0);
276
314
  for (const tileLayout of layout) {
277
315
  const tileState = latestTiles.get(tileLayout.deviceId);
@@ -284,6 +322,7 @@ function writeAtlasFrame() {
284
322
  rendered.pixels.copy(target, targetStart, sourceStart, sourceStart + rendered.width * 3);
285
323
  }
286
324
  }
325
+ lastComposeMs = Math.max(0, performance.now() - composeStartedAt);
287
326
  try {
288
327
  stdin.write(target, error => {
289
328
  framePool.push(target);
@@ -295,6 +334,21 @@ function writeAtlasFrame() {
295
334
  }
296
335
  }
297
336
 
337
+ function startComposeClock() {
338
+ clearTimeout(tickTimer);
339
+ const intervalMs = 1000 / config.fps;
340
+ nextTickAt = performance.now() + intervalMs;
341
+ const tick = () => {
342
+ if (closed) return;
343
+ writeAtlasFrame();
344
+ const now = performance.now();
345
+ nextTickAt += intervalMs;
346
+ if (nextTickAt < now - intervalMs) nextTickAt = now + intervalMs;
347
+ tickTimer = setTimeout(tick, Math.max(0, nextTickAt - performance.now()));
348
+ };
349
+ tickTimer = setTimeout(tick, intervalMs);
350
+ }
351
+
298
352
  function configure(value) {
299
353
  const next = normalizeConfig(value);
300
354
  const encoderChanged = next.width !== config.width || next.height !== config.height || next.fps !== config.fps;
@@ -307,8 +361,7 @@ function configure(value) {
307
361
  encoderCandidateIndex = 0;
308
362
  startEncoder();
309
363
  }
310
- clearInterval(tickTimer);
311
- tickTimer = setInterval(writeAtlasFrame, Math.max(1, Math.round(1000 / config.fps)));
364
+ startComposeClock();
312
365
  }
313
366
 
314
367
  process.on('message', message => {
@@ -320,7 +373,7 @@ process.on('message', message => {
320
373
  function shutdown() {
321
374
  if (closed) return;
322
375
  closed = true;
323
- clearInterval(tickTimer);
376
+ clearTimeout(tickTimer);
324
377
  stopEncoder();
325
378
  setTimeout(() => process.exit(0), 50).unref?.();
326
379
  }
@@ -14,6 +14,8 @@ export class Mode4AtlasSession {
14
14
  this.closed = false;
15
15
  this.worker = null;
16
16
  this.restartTimer = null;
17
+ this.pendingFrames = new Map();
18
+ this.frameSendsInFlight = new Set();
17
19
  this.startWorker();
18
20
  }
19
21
 
@@ -37,6 +39,7 @@ export class Mode4AtlasSession {
37
39
  });
38
40
  worker.on('exit', code => {
39
41
  if (this.worker === worker) this.worker = null;
42
+ this.frameSendsInFlight.clear();
40
43
  if (this.closed) return;
41
44
  this.onStatus({ type: 'status', state: 'worker-restart', code });
42
45
  clearTimeout(this.restartTimer);
@@ -46,13 +49,18 @@ export class Mode4AtlasSession {
46
49
  }, 750);
47
50
  });
48
51
  worker.on('error', error => this.onStatus({ type: 'status', state: 'worker-error', error: error.message }));
49
- if (this.config) worker.send({ type: 'configure', ...this.config });
52
+ if (this.config) {
53
+ worker.send({ type: 'configure', ...this.config }, () => {
54
+ for (const deviceId of this.pendingFrames.keys()) this.pumpDeviceFrame(deviceId);
55
+ });
56
+ }
50
57
  }
51
58
 
52
59
  configure(options = {}) {
53
60
  this.deviceIds = [...new Set((Array.isArray(options.deviceIds) ? options.deviceIds : [])
54
61
  .map(value => String(value || '').trim()).filter(Boolean))].slice(0, 100);
55
62
  this.deviceSet = new Set(this.deviceIds);
63
+ this.pendingFrames = new Map([...this.pendingFrames].filter(([deviceId]) => this.deviceSet.has(deviceId)));
56
64
  this.config = {
57
65
  deviceIds: this.deviceIds,
58
66
  width: Number(options.width || 1920),
@@ -62,13 +70,33 @@ export class Mode4AtlasSession {
62
70
  this.worker?.send({ type: 'configure', ...this.config });
63
71
  }
64
72
 
73
+ pumpDeviceFrame(deviceId) {
74
+ if (this.closed || !this.worker || this.frameSendsInFlight.has(deviceId)) return;
75
+ const message = this.pendingFrames.get(deviceId);
76
+ if (!message) return;
77
+ this.pendingFrames.delete(deviceId);
78
+ this.frameSendsInFlight.add(deviceId);
79
+ try {
80
+ this.worker.send(message, error => {
81
+ this.frameSendsInFlight.delete(deviceId);
82
+ if (error && !this.closed) {
83
+ this.onStatus({ type: 'log', level: 'warn', message: `Mode 4 input ${deviceId}: ${error.message}` });
84
+ }
85
+ this.pumpDeviceFrame(deviceId);
86
+ });
87
+ } catch (error) {
88
+ this.frameSendsInFlight.delete(deviceId);
89
+ this.onStatus({ type: 'log', level: 'warn', message: `Mode 4 input ${deviceId}: ${error.message}` });
90
+ }
91
+ }
92
+
65
93
  ingest(frameEvent) {
66
94
  if (this.closed || !this.worker) return;
67
95
  const frame = frameEvent?.frame || {};
68
96
  const deviceId = String(frameEvent?.deviceId || frame.deviceId || '').trim();
69
97
  const mode = String(frame.frameMode || frame.mode || '').toLowerCase();
70
98
  if (!this.deviceSet.has(deviceId) || mode !== 'mode2-lzo' || !Buffer.isBuffer(frameEvent?.payload)) return;
71
- this.worker.send({
99
+ this.pendingFrames.set(deviceId, {
72
100
  type: 'frame',
73
101
  deviceId,
74
102
  frameSeq: Number(frame.frameSeq || 0),
@@ -77,12 +105,15 @@ export class Mode4AtlasSession {
77
105
  uncompressedByteLength: Number(frame.uncompressedByteLength || 0),
78
106
  payload: frameEvent.payload
79
107
  });
108
+ this.pumpDeviceFrame(deviceId);
80
109
  }
81
110
 
82
111
  close() {
83
112
  if (this.closed) return;
84
113
  this.closed = true;
85
114
  clearTimeout(this.restartTimer);
115
+ this.pendingFrames.clear();
116
+ this.frameSendsInFlight.clear();
86
117
  const worker = this.worker;
87
118
  this.worker = null;
88
119
  try { worker?.send({ type: 'close' }); } catch {}
package/hub/src/server.js CHANGED
@@ -773,7 +773,9 @@ function buildRemoteFrameBinaryPacket(frameEvent, diagnostics = {}) {
773
773
  convertMs: Number(frame.convertMs || 0) || 0,
774
774
  compressMs: Number(frame.compressMs || 0) || 0,
775
775
  sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
776
- layoutVersion: Number(frame.layoutVersion || 0) || 0
776
+ layoutVersion: Number(frame.layoutVersion || 0) || 0,
777
+ atlasComposeMs: Number(frame.atlasComposeMs || 0) || 0,
778
+ atlasPoolStarved: Number(frame.atlasPoolStarved || 0) || 0
777
779
  };
778
780
  const metaBuffer = Buffer.from(JSON.stringify(metadata), 'utf8');
779
781
  const header = Buffer.allocUnsafe(4);
@@ -913,7 +915,9 @@ function sendMode4AtlasFrame(ws, output) {
913
915
  receivedAt: new Date().toISOString(),
914
916
  hardwareEncoder: String(metadata.hardwareEncoder || ''),
915
917
  platformProfile: 'mode4-hub-atlas-worker',
916
- layoutVersion: Number(metadata.layoutVersion || 0)
918
+ layoutVersion: Number(metadata.layoutVersion || 0),
919
+ atlasComposeMs: Number(metadata.composeMs || 0),
920
+ atlasPoolStarved: Number(metadata.poolStarved || 0)
917
921
  }
918
922
  };
919
923
  const lane = ensureFrameClientSendLane(ws);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livedesk",
3
- "version": "0.1.151",
3
+ "version": "0.1.152",
4
4
  "description": "LiveDesk Hub and client launcher",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1 @@
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}*{box-sizing:border-box}html,body,#root{width:100%;min-width:320px;min-height:100%;margin:0}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-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-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-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)}.brand,.top-actions,.status-item,.deck-actions,.panel-title{display:flex;align-items:center}.brand{gap:10px;min-width:0}.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{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}.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) ;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%}.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}.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(400px,1fr));gap:12px}.screen-wall.size-medium{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}.screen-wall.size-small{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}.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:#2dd4bfc7;box-shadow:inset 0 1px #ffffff1a,0 0 0 2px #2dd4bf2e,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}.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.is-empty{opacity:0}.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}.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(3,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}.screen-wall.size-small .tile-meta{min-height:40px;padding:7px 8px}.screen-wall.size-small .tile-meta strong{font-size:11px}.screen-wall.size-small .tile-meta span{font-size:10px}.screen-wall.size-small .empty-screen strong{font-size:11px}.screen-wall.size-small .tile-workload{display:none}.screen-wall.size-small .tile-health-pill{top:6px;left:6px;min-height:19px;padding:0 6px;font-size:9px}.screen-wall.size-small .tile-metrics{left:6px;right:6px;bottom:6px;gap:4px}.screen-wall.size-small .tile-metric{min-height:20px;padding:3px 4px;grid-template-columns:1fr;gap:1px}.screen-wall.size-small .tile-metric b,.screen-wall.size-small .tile-metric em{text-align:center;font-size:8px}.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}.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)}.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;background:#f3f6fb;color:#172033}body{background:radial-gradient(circle at 18% 0%,#cbd5e138,#cbd5e100 28%),linear-gradient(180deg,#f8fafc,#eef3f9 46%,#e9eef6)}.app-shell{color:#172033}.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(148,163,184,.28);border-radius:8px;background:#ffffffeb;color:#111827;box-shadow: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:#14b8a6b8;box-shadow:0 0 0 3px #14b8a624,0 24px 48px #0f172a2e,0 3px 9px #0f172a14}.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}.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:#ffffffd1;border-color:#94a3b857;box-shadow:0 8px 18px #0f172a1f}.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}.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}}@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}.desk-stage.control-stage .control-monitor-tabs{position:absolute;top:8px;left:50%;z-index:24;max-width:min(72vw,760px);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-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 .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}@media(max-width:1180px){.share-files-page{width:min(820px,calc(100vw - 116px))}}@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-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-folder-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.share-auto-sync{grid-column:2}}