castle-web-cli 0.4.119 → 0.4.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/api.js +13 -2
  2. package/dist/castle-host/host.d.ts +16 -0
  3. package/dist/castle-host/host.js +249 -11
  4. package/dist/castle-host/leaderboardPanel.d.ts +73 -0
  5. package/dist/castle-host/leaderboardPanel.js +714 -0
  6. package/dist/ide.d.ts +3 -0
  7. package/dist/ide.js +79 -0
  8. package/dist/index.js +1 -6
  9. package/dist/init.js +1 -1
  10. package/dist/preview.d.ts +0 -1
  11. package/dist/preview.js +18 -23
  12. package/dist/save-deck.js +33 -2
  13. package/dist/serve.js +9 -4
  14. package/dist/shell/assets/index-BkJ87APM.css +1 -0
  15. package/dist/shell/assets/index-UEwjXWKI.js +434 -0
  16. package/dist/shell/index.html +2 -2
  17. package/kits/physics-2d/CLAUDE.md +64 -9
  18. package/kits/physics-2d/behaviors/AnalogStick.jsx +40 -9
  19. package/kits/physics-2d/behaviors/Collider.jsx +12 -0
  20. package/kits/physics-2d/behaviors/Draggable.jsx +67 -23
  21. package/kits/physics-2d/behaviors/Goal.jsx +2 -0
  22. package/kits/physics-2d/behaviors/Joints.jsx +5 -0
  23. package/kits/physics-2d/behaviors/RigidBody.jsx +16 -0
  24. package/kits/physics-2d/behaviors/Slingshot.jsx +48 -16
  25. package/kits/physics-2d/behaviors/Sound.jsx +11 -0
  26. package/kits/physics-2d/behaviors/Sprite.jsx +7 -0
  27. package/kits/physics-2d/behaviors/Tone.jsx +12 -0
  28. package/kits/physics-2d/behaviors/Video.jsx +6 -0
  29. package/kits/physics-2d/castle.json +1 -1
  30. package/kits/physics-2d/editors/SceneEditor.jsx +53 -8
  31. package/kits/physics-2d/editors/pixelInspector.jsx +30 -9
  32. package/kits/physics-2d/editors/pxArtTimeline.jsx +147 -18
  33. package/kits/physics-2d/engine/ScenePlayer.jsx +9 -3
  34. package/kits/physics-2d/engine/autoInspector.jsx +28 -3
  35. package/kits/physics-2d/engine/physics/PhysicsSystem.js +117 -0
  36. package/kits/physics-2d/engine/physics/controls.js +43 -19
  37. package/kits/physics-2d/engine/propertyRanges.js +27 -0
  38. package/kits/physics-2d/engine/scene.js +86 -4
  39. package/kits/physics-2d/engine/ui.jsx +14 -1
  40. package/kits/physics-2d/engine/ui.module.css +1 -0
  41. package/kits/physics-2d/package-lock.json +1 -1
  42. package/package.json +2 -1
  43. package/dist/shell/assets/index-WtgFx1s8.js +0 -144
  44. package/dist/shell/assets/index-Y6cJRRCX.css +0 -1
package/dist/ide.d.ts CHANGED
@@ -3,9 +3,12 @@ import { Duplex } from 'stream';
3
3
  import { type RawData } from 'ws';
4
4
  export declare const IDE_ASSET_PREFIX = "/__castle/ide/";
5
5
  export declare const PTY_WS_PATH = "/__castle/pty";
6
+ export declare const VENDOR_PREFIX = "/__castle/vendor/";
6
7
  export declare const FAVICON_FILES: string[];
7
8
  export declare const FAVICON_LINK_TAGS: string;
8
9
  export declare const FILES_API_PREFIX = "/__castle/files/";
10
+ export declare const COVER_API_PATH = "/__castle/cover";
11
+ export declare const COVER_FILE = "preview.png";
9
12
  export declare function rawDataToString(data: RawData): string;
10
13
  export interface IdeServer {
11
14
  /** Serve the IDE page + its static assets. Returns true if it handled the request. */
package/dist/ide.js CHANGED
@@ -10,6 +10,7 @@ import * as fs from 'fs';
10
10
  import * as path from 'path';
11
11
  import picomatch from 'picomatch';
12
12
  import { fileURLToPath } from 'url';
13
+ import { createRequire } from 'module';
13
14
  import { spawn as spawnPty } from '@lydell/node-pty';
14
15
  import headlessPkg from '@xterm/headless';
15
16
  import { SerializeAddon } from '@xterm/addon-serialize';
@@ -49,6 +50,32 @@ const SHELL_MIME = {
49
50
  function deckHasFile(deckDir, name) {
50
51
  return (fs.existsSync(path.join(deckDir, name)) || fs.existsSync(path.join(deckDir, 'public', name)));
51
52
  }
53
+ // Serve a vendored library from the CLI's own dependencies. Resolved through
54
+ // require rather than a path relative to dist/, so it works the same whether the
55
+ // CLI runs from a checkout or from a global npm install.
56
+ function serveVendorFile(res, asset) {
57
+ const spec = VENDOR_FILES[asset];
58
+ if (!spec) {
59
+ res.writeHead(404).end();
60
+ return true;
61
+ }
62
+ let filePath;
63
+ try {
64
+ filePath = createRequire(import.meta.url).resolve(spec);
65
+ }
66
+ catch {
67
+ res.writeHead(404).end();
68
+ return true;
69
+ }
70
+ res.writeHead(200, {
71
+ 'content-type': 'text/javascript; charset=utf-8',
72
+ // Immutable for the session: the file only changes when the CLI does, and
73
+ // a capture shouldn't pay for re-fetching 194KB every time.
74
+ 'cache-control': 'public, max-age=3600',
75
+ });
76
+ fs.createReadStream(filePath).pipe(res);
77
+ return true;
78
+ }
52
79
  // Serve a file from the bundled shell dir, guarding against path traversal.
53
80
  function serveShellFile(res, asset) {
54
81
  const rel = path.normalize(asset).replace(/^(\.\.[/\\])+/, '');
@@ -75,6 +102,20 @@ function serveShellFile(res, asset) {
75
102
  // upgrade handler on Vite's HTTP server).
76
103
  export const IDE_ASSET_PREFIX = '/__castle/ide/';
77
104
  export const PTY_WS_PATH = '/__castle/pty';
105
+ // Libraries the PLATFORM lends a deck at runtime, served from this serve's own
106
+ // origin rather than fetched from a CDN.
107
+ //
108
+ // html2canvas is the only one so far: the SDK composites a card (canvas + the
109
+ // deck's own DOM) with it to capture a cover. Serving it here instead of
110
+ // bundling it into the SDK keeps it out of every published deck -- it is ~194KB
111
+ // that only an editor ever runs, and a deck is bundled into a single file, so
112
+ // bundling it could not be made lazy. And it removes a live failure: a CDN
113
+ // import fails closed, silently downgrading a cover to canvas-only whenever the
114
+ // network is slow, blocked, or absent.
115
+ export const VENDOR_PREFIX = '/__castle/vendor/';
116
+ const VENDOR_FILES = {
117
+ 'html2canvas.js': 'html2canvas/dist/html2canvas.esm.js',
118
+ };
78
119
  // Castle's favicon (the same files castle.xyz serves), shipped in the shell
79
120
  // bundle and also served from the origin root so every page under the serve
80
121
  // gets it -- the shell at `/`, the deck page at `/index.html`, and the
@@ -94,6 +135,12 @@ export const FAVICON_LINK_TAGS = [
94
135
  // hands those files to the kit iframe and keeps the builtin editor as the
95
136
  // default for everything else).
96
137
  export const FILES_API_PREFIX = '/__castle/files/';
138
+ // The deck's local cover image. Its own endpoint rather than a files/upload,
139
+ // because this file is written over and over (once per automatic capture) and
140
+ // upload deliberately refuses to clobber. A cover is platform vocabulary, not a
141
+ // kit's -- `save-deck` is what publishes preview.png -- so it belongs here.
142
+ export const COVER_API_PATH = '/__castle/cover';
143
+ export const COVER_FILE = 'preview.png';
97
144
  // Directories never surfaced in the file list / never read or written through
98
145
  // the builtin editor: VCS, deck-private state, and dependency trees.
99
146
  const FILES_IGNORE_DIRS = new Set(['.git', '.castle', 'node_modules', 'dist']);
@@ -372,6 +419,32 @@ function handleFilesMkdir(deckDir, req, res) {
372
419
  // A curated deck (non-empty visiblePaths) also gets the destination registered,
373
420
  // the same way mkdir does -- otherwise an upload lands on disk and is invisible
374
421
  // in the very panel that put it there.
422
+ // Store the deck's local cover (`preview.png`), overwriting whatever was there.
423
+ //
424
+ // The cover is captured continuously while someone plays their deck, but it is
425
+ // only PUBLISHED when they push -- `save-deck` uploads this file and hands its
426
+ // id to updateCardAndDeckV2 as the card's background image. Keeping it on disk
427
+ // until then is what stops a deck's public cover running ahead of the version
428
+ // people can actually play.
429
+ function handleCoverApi(deckDir, req, res) {
430
+ if (req.method !== "POST") {
431
+ sendJson(res, 405, { error: "Use POST to store a cover." });
432
+ return true;
433
+ }
434
+ void readRequestBuffer(req, MAX_UPLOAD_BYTES).then((bytes) => {
435
+ try {
436
+ fs.writeFileSync(path.join(deckDir, COVER_FILE), bytes);
437
+ }
438
+ catch (err) {
439
+ return sendFailure(res, "write", COVER_FILE, err);
440
+ }
441
+ return sendJson(res, 200, { ok: true, bytes: bytes.length });
442
+ }, () => {
443
+ const mb = Math.round(MAX_UPLOAD_BYTES / (1024 * 1024));
444
+ sendJson(res, 413, { error: `A cover must be under ${mb} MB.` });
445
+ });
446
+ return true;
447
+ }
375
448
  function handleFilesUpload(deckDir, req, res) {
376
449
  const url = new URL(req.url ?? '/', 'http://localhost');
377
450
  const target = resolveDeckPath(deckDir, url.searchParams.get('path'), {
@@ -909,9 +982,15 @@ export function createIdeServer(opts) {
909
982
  if (favicon && !deckHasFile(deckDir, favicon)) {
910
983
  return serveShellFile(res, favicon);
911
984
  }
985
+ if (reqPath.startsWith(VENDOR_PREFIX)) {
986
+ return serveVendorFile(res, reqPath.slice(VENDOR_PREFIX.length));
987
+ }
912
988
  if (reqPath.startsWith(IDE_ASSET_PREFIX)) {
913
989
  return serveShellFile(res, reqPath.slice(IDE_ASSET_PREFIX.length) || 'index.html');
914
990
  }
991
+ if (reqPath === COVER_API_PATH) {
992
+ return handleCoverApi(deckDir, req, res);
993
+ }
915
994
  if (reqPath.startsWith(FILES_API_PREFIX)) {
916
995
  return handleFilesApi(deckDir, req, res, reqPath);
917
996
  }
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import { addImport, updateImport } from './imports.js';
9
9
  import { listDecks } from './list-decks.js';
10
10
  import { getCliVersion, init } from './init.js';
11
11
  import { install } from './install.js';
12
- import { connectWS, savePreviewImage, savePreviewIfNeeded, takeScreenshot } from './preview.js';
12
+ import { connectWS, savePreviewImage, takeScreenshot } from './preview.js';
13
13
  const args = process.argv.slice(2);
14
14
  const command = args[0];
15
15
  const FLAGS_WITH_VALUES = new Set([
@@ -133,11 +133,6 @@ async function main() {
133
133
  const caption = getFlagValue('--caption');
134
134
  const visibility = getFlagValue('--visibility');
135
135
  await saveDeck(dir, { title, caption, visibility });
136
- // --no-preview: skip the WS canvas capture (no browser tab in headless/cloud saves).
137
- if (!args.includes('--no-preview')) {
138
- const wsPort = getWsPort(dir);
139
- await savePreviewIfNeeded(dir, wsPort);
140
- }
141
136
  break;
142
137
  }
143
138
  case 'get-deck': {
package/dist/init.js CHANGED
@@ -37,7 +37,7 @@ const DEFAULT_KIT = 'physics-2d';
37
37
  // Registry version of castle-web-sdk to inject when scaffolding from a
38
38
  // globally-installed castle-web (not from inside the workspace). Bumped
39
39
  // alongside cli/sdk version bumps.
40
- const PUBLISHED_SDK_VERSION = '0.4.12';
40
+ const PUBLISHED_SDK_VERSION = '0.4.13';
41
41
  // The account the first-party kits are (to be) published under, so a kit
42
42
  // imported from the CLI's copy is named the same as one fetched from the server.
43
43
  const KIT_AUTHOR = 'castle';
package/dist/preview.d.ts CHANGED
@@ -2,4 +2,3 @@ import type { WebSocket as WSClient } from 'ws';
2
2
  export declare function connectWS(wsPort: number): Promise<WSClient>;
3
3
  export declare function takeScreenshot(ws: WSClient): Promise<string>;
4
4
  export declare function savePreviewImage(dir: string, wsPort: number, noRestart?: boolean): Promise<void>;
5
- export declare function savePreviewIfNeeded(dir: string, wsPort: number): Promise<void>;
package/dist/preview.js CHANGED
@@ -51,6 +51,9 @@ function waitForRestart(ws) {
51
51
  setTimeout(resolve, 2000);
52
52
  });
53
53
  }
54
+ // The shared declaration (castleJson.ts) rather than a local copy of the two
55
+ // fields this file reads, so it can't drift from what the rest of the CLI
56
+ // believes castle.json contains.
54
57
  function readCastleJson(projectDir) {
55
58
  const castleJsonPath = path.join(projectDir, 'castle.json');
56
59
  if (!fs.existsSync(castleJsonPath))
@@ -58,13 +61,24 @@ function readCastleJson(projectDir) {
58
61
  return JSON.parse(fs.readFileSync(castleJsonPath, 'utf-8'));
59
62
  }
60
63
  async function captureAndUpload(projectDir, ws, castleJson) {
64
+ // A deck has no cardId until its first save, and the cover IS that card's
65
+ // background -- so there is nothing to set it on yet. Both callers reach here
66
+ // right after a save, so this is the never-saved edge, not the normal path.
67
+ // Reported back so a caller doesn't record a cover that was never set.
68
+ const { cardId } = castleJson;
69
+ if (!cardId) {
70
+ ws.close();
71
+ console.log('Preview skipped: save the deck first.');
72
+ return false;
73
+ }
61
74
  const base64 = await takeScreenshot(ws);
62
75
  ws.close();
63
76
  fs.writeFileSync(path.join(projectDir, 'preview.png'), Buffer.from(base64, 'base64'));
64
77
  console.log('Saved preview.png');
65
78
  const file = await api.uploadBase64(base64, 'preview.png');
66
- await api.updateCardCustomBackgroundImage(castleJson.cardId, file.fileId);
79
+ await api.updateCardCustomBackgroundImage(cardId, file.fileId);
67
80
  console.log('Set deck preview image.');
81
+ return true;
68
82
  }
69
83
  export async function savePreviewImage(dir, wsPort, noRestart = false) {
70
84
  const projectDir = path.resolve(dir);
@@ -80,27 +94,8 @@ export async function savePreviewImage(dir, wsPort, noRestart = false) {
80
94
  const ws = await connectWS(wsPort);
81
95
  if (!noRestart)
82
96
  await waitForRestart(ws);
97
+ // Asking for this by name is choosing a cover, so it goes to the card's
98
+ // CUSTOM slot -- the one that takes precedence over the cover a save
99
+ // publishes. Clearing it is an editor action (Deck settings -> Clear cover).
83
100
  await captureAndUpload(projectDir, ws, castleJson);
84
101
  }
85
- export async function savePreviewIfNeeded(dir, wsPort) {
86
- const projectDir = path.resolve(dir);
87
- if (fs.existsSync(path.join(projectDir, 'preview.png')))
88
- return;
89
- let ws;
90
- try {
91
- ws = await connectWS(wsPort);
92
- await waitForRestart(ws);
93
- const castleJson = readCastleJson(projectDir);
94
- if (!castleJson) {
95
- ws.close();
96
- return;
97
- }
98
- await captureAndUpload(projectDir, ws, castleJson);
99
- }
100
- catch (e) {
101
- if (ws)
102
- ws.close();
103
- const msg = e instanceof Error ? e.message : String(e);
104
- console.log(`Preview skipped: ${msg}`);
105
- }
106
- }
package/dist/save-deck.js CHANGED
@@ -6,6 +6,7 @@ import { nanoid } from 'nanoid';
6
6
  import * as api from './api.js';
7
7
  import * as config from './config.js';
8
8
  import { bundleProject } from './bundle.js';
9
+ import { COVER_FILE } from './ide.js';
9
10
  // `imports/` is derived state like node_modules: a dependency's files belong to
10
11
  // the deck that published them, and castle.json's import pins are enough to fetch
11
12
  // them again -- so they neither bloat this deck's archive nor get republished as
@@ -72,6 +73,27 @@ async function uploadSource(projectDir, deckId) {
72
73
  }
73
74
  await api.saveWebDeckSource(deckId, uploadConfig.uploadId);
74
75
  }
76
+ // Publish the deck's local cover, if it has one, and return the file id for the
77
+ // card. The editor writes `preview.png` as you play (see the serve's cover
78
+ // endpoint); this is the moment it becomes public.
79
+ //
80
+ // Never fatal: a deck that saves but whose cover upload failed is a deck that
81
+ // saved. Losing the push over a thumbnail would be the wrong trade.
82
+ async function uploadLocalCover(projectDir) {
83
+ const coverPath = path.join(projectDir, COVER_FILE);
84
+ if (!fs.existsSync(coverPath))
85
+ return null;
86
+ try {
87
+ const base64 = fs.readFileSync(coverPath).toString('base64');
88
+ const file = await api.uploadBase64(base64, COVER_FILE);
89
+ return file?.fileId ?? null;
90
+ }
91
+ catch (e) {
92
+ const msg = e instanceof Error ? e.message : String(e);
93
+ console.log(`Cover skipped: ${msg}`);
94
+ return null;
95
+ }
96
+ }
75
97
  function readCastleJson(dir) {
76
98
  const p = path.join(dir, 'castle.json');
77
99
  if (!fs.existsSync(p))
@@ -150,13 +172,22 @@ export async function saveDeck(dir, opts = {}) {
150
172
  const deckInput = { deckId, title, visibility };
151
173
  if (opts.caption !== undefined)
152
174
  deckInput.caption = opts.caption;
175
+ const backgroundImageFileId = await uploadLocalCover(projectDir);
153
176
  try {
154
- const result = await api.updateCardAndDeckV2(deckInput, {
177
+ const cardInput = {
155
178
  cardId,
156
179
  blocks: [],
157
180
  uploadId: uploadConfig.uploadId,
158
181
  makeInitialCard: true,
159
- });
182
+ };
183
+ // Rides the same call as the content it depicts, which is the whole point:
184
+ // the cover a player sees is the version they can play. It lands in the
185
+ // card's AUTOMATIC background slot -- a cover the creator chose by hand
186
+ // lives in the custom slot and takes precedence over this, so publishing
187
+ // here can never overwrite their choice.
188
+ if (backgroundImageFileId)
189
+ cardInput.backgroundImageFileId = backgroundImageFileId;
190
+ const result = await api.updateCardAndDeckV2(deckInput, cardInput);
160
191
  // Preserve any deck-owned config already in castle.json (notably the
161
192
  // `editor` block); save-deck only owns the identity fields below.
162
193
  const newCastleJson = {
package/dist/serve.js CHANGED
@@ -129,12 +129,17 @@ async function devHostContext(projectDir) {
129
129
  username: await devUsername(),
130
130
  };
131
131
  }
132
- async function handleCastleCommand(ws, projectDir, requestId, command, params) {
132
+ async function handleCastleCommand(ws, projectDir, broadcast, requestId, command, params) {
133
133
  const ctx = await devHostContext(projectDir);
134
134
  // The dev server services data commands via GraphQL but supplies no
135
135
  // platformHandler, so platform/capability commands (e.g. passes.purchase)
136
- // resolve to their normalized "unavailable" outcome.
137
- const result = await executeCommand(ctx, command, params, { graphqlFetch: castleGraphql });
136
+ // resolve to their normalized "unavailable" outcome. The leaderboard UI it
137
+ // does have: this process can't draw it, so the fetched payload goes to the
138
+ // shell, which mounts the same panel the app and the website use.
139
+ const result = await executeCommand(ctx, command, params, {
140
+ graphqlFetch: castleGraphql,
141
+ showLeaderboard: (payload) => broadcast({ type: 'castle_leaderboard_show', payload }),
142
+ });
138
143
  if (ws.readyState === WebSocket.OPEN) {
139
144
  ws.send(JSON.stringify({ type: 'castle_command_response', castleSdk: 1, requestId, ...result }));
140
145
  }
@@ -568,7 +573,7 @@ function startWSServer(port, projectDir, logFile, screenshotsDir, viteHolder) {
568
573
  // token, then replies to just this socket. See castle-web-sdk's
569
574
  // transport.ts (local channel) + host.ts.
570
575
  if (msg.type === 'castle_command' && typeof msg.requestId === 'string') {
571
- void handleCastleCommand(ws, projectDir, msg.requestId, msg.command, msg.params);
576
+ void handleCastleCommand(ws, projectDir, broadcast, msg.requestId, msg.command, msg.params);
572
577
  }
573
578
  }
574
579
  catch {
@@ -0,0 +1 @@
1
+ .dv-scrollable{position:relative;overflow:hidden}.dv-scrollable .dv-scrollbar-horizontal{will-change:background-color, transform;backface-visibility:hidden;background-color:#0000;border-radius:2px;height:4px;transition:background-color 1s ease-in-out;position:absolute;bottom:0;left:0;transform:translate(0,0)}.dv-scrollable:hover .dv-scrollbar-horizontal,.dv-scrollable.dv-scrollable-resizing .dv-scrollbar-horizontal,.dv-scrollable.dv-scrollable-scrolling .dv-scrollbar-horizontal{background-color:var(--dv-scrollbar-background-color,#ffffff40)}.dv-svg{fill:currentColor;stroke:currentColor;stroke-width:0;line-height:1;display:inline-block}.dockview-theme-dark{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#1e1e1e;--dv-tabs-and-actions-container-background-color:#252526;--dv-activegroup-visiblepanel-tab-background-color:#1e1e1e;--dv-activegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-inactivegroup-visiblepanel-tab-background-color:#1e1e1e;--dv-inactivegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-tab-divider-color:#1e1e1e;--dv-activegroup-visiblepanel-tab-color:white;--dv-activegroup-hiddenpanel-tab-color:#969696;--dv-inactivegroup-visiblepanel-tab-color:#8f8f8f;--dv-inactivegroup-hiddenpanel-tab-color:#626262;--dv-separator-border:#444;--dv-paneview-header-border-color:#ccc3}.dockview-theme-dark .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-light{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:white;--dv-tabs-and-actions-container-background-color:#f3f3f3;--dv-activegroup-visiblepanel-tab-background-color:white;--dv-activegroup-hiddenpanel-tab-background-color:#ececec;--dv-inactivegroup-visiblepanel-tab-background-color:white;--dv-inactivegroup-hiddenpanel-tab-background-color:#ececec;--dv-tab-divider-color:white;--dv-activegroup-visiblepanel-tab-color:#333;--dv-activegroup-hiddenpanel-tab-color:#333333b3;--dv-inactivegroup-visiblepanel-tab-color:#333333b3;--dv-inactivegroup-hiddenpanel-tab-color:#33333359;--dv-separator-border:#80808059;--dv-paneview-header-border-color:#333;--dv-scrollbar-background-color:#00000040}.dockview-theme-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-vs{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:11px;--dv-tabs-and-actions-container-height:20px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#1e1e1e;--dv-tabs-and-actions-container-background-color:#2d2d30;--dv-activegroup-visiblepanel-tab-background-color:#007acc;--dv-activegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-inactivegroup-visiblepanel-tab-background-color:#3f3f46;--dv-inactivegroup-hiddenpanel-tab-background-color:#2d2d2d;--dv-tab-divider-color:#1e1e1e;--dv-activegroup-visiblepanel-tab-color:white;--dv-activegroup-hiddenpanel-tab-color:white;--dv-inactivegroup-visiblepanel-tab-color:white;--dv-inactivegroup-hiddenpanel-tab-color:white;--dv-separator-border:#444;--dv-paneview-header-border-color:#ccc3}.dockview-theme-vs .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container{box-sizing:content-box;border-bottom:2px solid var(--dv-activegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tab.dv-active-tab{border-top:2px solid var(--dv-activegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tab.dv-inactive-tab{border-top:2px solid var(--dv-activegroup-hiddenpanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container{box-sizing:content-box;border-bottom:2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tab.dv-active-tab{border-top:2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color)}.dockview-theme-vs .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tab.dv-inactive-tab{border-top:2px solid var(--dv-inactivegroup-hiddenpanel-tab-background-color)}.dockview-theme-abyss{--dv-paneview-active-outline-color:#596f99;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-color-abyss-dark:#000c18;--dv-color-abyss:#10192c;--dv-color-abyss-light:#1c1c2a;--dv-color-abyss-lighter:#2b2b4a;--dv-color-abyss-accent:#5b1ecf;--dv-color-abyss-primary-text:white;--dv-color-abyss-secondary-text:#9497a9;--dv-group-view-background-color:var(--dv-color-abyss-dark);--dv-tabs-and-actions-container-background-color:var(--dv-color-abyss-light);--dv-activegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-dark);--dv-activegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss);--dv-inactivegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-dark);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss);--dv-tab-divider-color:var(--dv-color-abyss-lighter);--dv-activegroup-visiblepanel-tab-color:white;--dv-activegroup-hiddenpanel-tab-color:#ffffff80;--dv-inactivegroup-visiblepanel-tab-color:#ffffff80;--dv-inactivegroup-hiddenpanel-tab-color:#ffffff40;--dv-separator-border:var(--dv-color-abyss-lighter);--dv-paneview-header-border-color:var(--dv-color-abyss-lighter)}.dockview-theme-abyss .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-dracula{--dv-paneview-active-outline-color:#6272a4;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;--dv-group-view-background-color:#282a36;--dv-tabs-and-actions-container-background-color:#191a21;--dv-activegroup-visiblepanel-tab-background-color:#282a36;--dv-activegroup-hiddenpanel-tab-background-color:#21222c;--dv-inactivegroup-visiblepanel-tab-background-color:#282a36;--dv-inactivegroup-hiddenpanel-tab-background-color:#21222c;--dv-tab-divider-color:#191a21;--dv-activegroup-visiblepanel-tab-color:#f8f8f2;--dv-activegroup-hiddenpanel-tab-color:#6272a4;--dv-inactivegroup-visiblepanel-tab-color:#f8f8f280;--dv-inactivegroup-hiddenpanel-tab-color:#6272a480;--dv-separator-border:#bd93f9;--dv-paneview-header-border-color:#bd93f9}.dockview-theme-dracula .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-dracula .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{position:relative}.dockview-theme-dracula .dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab:after{content:"";z-index:999;background-color:#94527e;width:100%;height:1px;position:absolute;top:0;left:0}.dockview-theme-dracula .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{position:relative}.dockview-theme-dracula .dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab:after{content:"";z-index:999;background-color:#5e3d5a;width:100%;height:1px;position:absolute;bottom:0;left:0}.dockview-theme-replit{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:35px;--dv-drag-over-background-color:#53595d80;--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #53595d80;--dv-overlay-z-index:999;--dv-tab-font-size:inherit;--dv-border-radius:0px;--dv-tab-margin:0;--dv-sash-color:#cfd1d3;--dv-active-sash-color:#babbbb;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;box-sizing:border-box;--dv-group-view-background-color:#ebeced;--dv-tabs-and-actions-container-background-color:#fcfcfc;--dv-activegroup-visiblepanel-tab-background-color:#f0f1f2;--dv-activegroup-hiddenpanel-tab-background-color:#fcfcfc;--dv-inactivegroup-visiblepanel-tab-background-color:#f0f1f2;--dv-inactivegroup-hiddenpanel-tab-background-color:#fcfcfc;--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:#333;--dv-activegroup-hiddenpanel-tab-color:#333;--dv-inactivegroup-visiblepanel-tab-color:#333;--dv-inactivegroup-hiddenpanel-tab-color:#333;--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;background-color:#ebeced;padding:10px}.dockview-theme-replit .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed{opacity:0;transition:none}.dockview-theme-replit .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-replit .dv-resize-container{border:none;border-radius:10px!important}.dockview-theme-replit .dv-groupview{border-radius:10px;overflow:hidden}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container{border-bottom:1px solid #80808059}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab{border-radius:8px;margin:4px}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab:hover{background-color:#e4e5e6!important}.dockview-theme-replit .dv-groupview .dv-content-container{background-color:#fcfcfc}.dockview-theme-replit .dv-groupview.dv-active-group{border:1px solid #80808059}.dockview-theme-replit .dv-groupview.dv-inactive-group{border:1px solid #0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash{background-color:#0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):after{content:"";background-color:var(--dv-sash-color);border-radius:2px;width:40px;height:4px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):hover,.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):active{background-color:#0000}.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):hover:after,.dockview-theme-replit .dv-vertical>.dv-sash-container>.dv-sash:not(.disabled):active:after{background-color:var(--dv-active-sash-color)}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash{background-color:#0000}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):after{content:"";background-color:var(--dv-sash-color);border-radius:2px;width:4px;height:40px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):hover,.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):active{background-color:#0000}.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):hover:after,.dockview-theme-replit .dv-horizontal>.dv-sash-container>.dv-sash:not(.disabled):active:after{background-color:var(--dv-active-sash-color)}.dockview-theme-abyss-spaced{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:44px;--dv-drag-over-background-color:"";--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #00000080;--dv-overlay-z-index:999;--dv-tab-font-size:12px;--dv-border-radius:20px;--dv-tab-margin:.5rem .25rem;--dv-sash-color:transparent;--dv-active-sash-color:var(--dv-color-abyss-accent);--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;box-sizing:border-box;--dv-color-abyss-dark:#0b0611;--dv-color-abyss:#16121f;--dv-color-abyss-light:#201d2b;--dv-color-abyss-lighter:#2a2837;--dv-color-abyss-accent:#5b1ecf;--dv-color-abyss-primary-text:white;--dv-color-abyss-secondary-text:#9497a9;--dv-drag-over-border:2px solid var(--dv-color-abyss-accent);--dv-group-view-background-color:var(--dv-color-abyss-dark);--dv-tabs-and-actions-container-background-color:var(--dv-color-abyss);--dv-activegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-lighter);--dv-activegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss-light);--dv-inactivegroup-visiblepanel-tab-background-color:var(--dv-color-abyss-lighter);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--dv-color-abyss-light);--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:var(--dv-color-abyss-primary-text);--dv-activegroup-hiddenpanel-tab-color:var(--dv-color-abyss-secondary-text);--dv-inactivegroup-visiblepanel-tab-color:var(--dv-color-abyss-primary-text);--dv-inactivegroup-hiddenpanel-tab-color:var(--dv-color-abyss-secondary-text);--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;background-color:var(--dv-color-abyss-dark);padding:10px}.dockview-theme-abyss-spaced .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-abyss-spaced .dv-sash{border-radius:4px}.dockview-theme-abyss-spaced .dv-drop-target-anchor{border-radius:calc(var(--dv-border-radius) / 4)}.dockview-theme-abyss-spaced .dv-drop-target-anchor.dv-drop-target-content{border-radius:var(--dv-border-radius)}.dockview-theme-abyss-spaced .dv-resize-container{border:none;border-radius:var(--dv-border-radius)!important}.dockview-theme-abyss-spaced .dv-tabs-overflow-container,.dockview-theme-abyss-spaced .dv-tabs-overflow-dropdown-default{border-radius:8px;height:unset!important}.dockview-theme-abyss-spaced .dv-tab{border-radius:8px}.dockview-theme-abyss-spaced .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-abyss-spaced .dv-groupview{border-radius:var(--dv-border-radius)}.dockview-theme-abyss-spaced .dv-groupview .dv-tabs-and-actions-container{padding:0px calc(var(--dv-border-radius) / 2)}.dockview-theme-abyss-spaced .dv-groupview .dv-content-container{background-color:var(--dv-tabs-and-actions-container-background-color)}.dockview-theme-abyss-spaced .dv-resize-container .dv-groupview{border:2px solid var(--dv-color-abyss-dark)}.dockview-theme-light-spaced{--dv-paneview-active-outline-color:dodgerblue;--dv-tabs-and-actions-container-font-size:13px;--dv-tabs-and-actions-container-height:44px;--dv-drag-over-background-color:"";--dv-drag-over-border-color:transparent;--dv-tabs-container-scrollbar-color:#888;--dv-icon-hover-background-color:#5a5d5e4f;--dv-floating-box-shadow:8px 8px 8px 0px #0000001a;--dv-overlay-z-index:999;--dv-tab-font-size:12px;--dv-border-radius:20px;--dv-tab-margin:.5rem .25rem;--dv-sash-color:transparent;--dv-active-sash-color:#5b1ecf;--dv-active-sash-transition-duration:.1s;--dv-active-sash-transition-delay:.5s;box-sizing:border-box;--dv-drag-over-border:2px solid #5b1ecf;--dv-group-view-background-color:#f6f5f9;--dv-tabs-and-actions-container-background-color:white;--dv-activegroup-visiblepanel-tab-background-color:#ededf0;--dv-activegroup-hiddenpanel-tab-background-color:#f9f9fa;--dv-inactivegroup-visiblepanel-tab-background-color:#ededf0;--dv-inactivegroup-hiddenpanel-tab-background-color:#f9f9fa;--dv-tab-divider-color:transparent;--dv-activegroup-visiblepanel-tab-color:#686b82;--dv-activegroup-hiddenpanel-tab-color:#9497a9;--dv-inactivegroup-visiblepanel-tab-color:#686b82;--dv-inactivegroup-hiddenpanel-tab-color:#9497a9;--dv-separator-border:transparent;--dv-paneview-header-border-color:#333;--dv-scrollbar-background-color:#00000040;background-color:#f6f5f9;padding:10px}.dockview-theme-light-spaced .dv-resize-container:has(>.dv-groupview){border-radius:8px}.dockview-theme-light-spaced .dv-sash{border-radius:4px}.dockview-theme-light-spaced .dv-drop-target-anchor{border-radius:calc(var(--dv-border-radius) / 4)}.dockview-theme-light-spaced .dv-drop-target-anchor.dv-drop-target-content{border-radius:var(--dv-border-radius)}.dockview-theme-light-spaced .dv-resize-container{border:none;border-radius:var(--dv-border-radius)!important}.dockview-theme-light-spaced .dv-tabs-overflow-container,.dockview-theme-light-spaced .dv-tabs-overflow-dropdown-default{border-radius:8px;height:unset!important}.dockview-theme-light-spaced .dv-tab{border-radius:8px}.dockview-theme-light-spaced .dv-tab .dv-svg{width:8px;height:8px}.dockview-theme-light-spaced .dv-groupview{border-radius:var(--dv-border-radius)}.dockview-theme-light-spaced .dv-groupview .dv-tabs-and-actions-container{padding:0px calc(var(--dv-border-radius) / 2)}.dockview-theme-light-spaced .dv-groupview .dv-content-container{background-color:var(--dv-tabs-and-actions-container-background-color)}.dockview-theme-light-spaced .dv-resize-container .dv-groupview{border:2px solid #ffffff1a}.dv-drop-target-container{z-index:9999;pointer-events:none;--dv-transition-duration:.3s;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.dv-drop-target-container .dv-drop-target-anchor{border:var(--dv-drag-over-border);background-color:var(--dv-drag-over-background-color);opacity:1;will-change:transform, opacity;backface-visibility:hidden;contain:layout paint;transition:opacity var(--dv-transition-duration) ease-in, transform var(--dv-transition-duration) ease-out;position:relative;transform:translate(0,0)}.dv-drop-target{--dv-transition-duration:70ms;position:relative}.dv-drop-target>.dv-drop-target-dropzone{z-index:1000;pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection{box-sizing:border-box;border:var(--dv-drag-over-border);background-color:var(--dv-drag-over-background-color);width:100%;height:100%;transition:top var(--dv-transition-duration) ease-out, left var(--dv-transition-duration) ease-out, width var(--dv-transition-duration) ease-out, height var(--dv-transition-duration) ease-out, opacity var(--dv-transition-duration) ease-out;will-change:transform;pointer-events:none;position:relative}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-top.dv-drop-target-small-vertical{border-top:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-bottom.dv-drop-target-small-vertical{border-bottom:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-left.dv-drop-target-small-horizontal{border-left:1px solid var(--dv-drag-over-border-color)}.dv-drop-target>.dv-drop-target-dropzone>.dv-drop-target-selection.dv-drop-target-right.dv-drop-target-small-horizontal{border-right:1px solid var(--dv-drag-over-border-color)}.dv-dockview{background-color:var(--dv-group-view-background-color);contain:layout;position:relative}.dv-dockview .dv-watermark-container{z-index:1;width:100%;height:100%;position:absolute;top:0;left:0}.dv-dockview .dv-overlay-render-container{position:relative}.dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-groupview.dv-active-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-inactive-tab{background-color:var(--dv-activegroup-hiddenpanel-tab-background-color);color:var(--dv-activegroup-hiddenpanel-tab-color)}.dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-active-tab{background-color:var(--dv-inactivegroup-visiblepanel-tab-background-color);color:var(--dv-inactivegroup-visiblepanel-tab-color)}.dv-groupview.dv-inactive-group>.dv-tabs-and-actions-container .dv-tabs-container>.dv-tab.dv-inactive-tab{background-color:var(--dv-inactivegroup-hiddenpanel-tab-background-color);color:var(--dv-inactivegroup-hiddenpanel-tab-color)}.dv-tab.dv-tab-dragging{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-groupview{background-color:var(--dv-group-view-background-color);flex-direction:column;height:100%;display:flex;overflow:hidden}.dv-groupview:focus{outline:none}.dv-groupview>.dv-content-container{outline:none;flex-grow:1;min-height:0}.dv-root-wrapper,.dv-grid-view,.dv-branch-node{width:100%;height:100%}.dv-debug .dv-resize-container .dv-resize-handle-top{background-color:red}.dv-debug .dv-resize-container .dv-resize-handle-bottom{background-color:green}.dv-debug .dv-resize-container .dv-resize-handle-left{background-color:#ff0}.dv-debug .dv-resize-container .dv-resize-handle-right{background-color:#00f}.dv-debug .dv-resize-container .dv-resize-handle-topleft,.dv-debug .dv-resize-container .dv-resize-handle-topright,.dv-debug .dv-resize-container .dv-resize-handle-bottomleft,.dv-debug .dv-resize-container .dv-resize-handle-bottomright{background-color:#0ff}.dv-resize-container{--dv-overlay-z-index:var(--dv-overlay-z-index,999);z-index:calc(var(--dv-overlay-z-index) - 2);border:1px solid var(--dv-tab-divider-color);box-shadow:var(--dv-floating-box-shadow);will-change:transform, opacity;backface-visibility:hidden;position:absolute;transform:translate(0,0)}.dv-resize-container.dv-hidden{display:none}.dv-resize-container.dv-resize-container-dragging{opacity:.5;will-change:transform, opacity}.dv-resize-container .dv-resize-handle-top{width:calc(100% - 8px);height:4px;z-index:var(--dv-overlay-z-index);cursor:ns-resize;position:absolute;top:-2px;left:4px}.dv-resize-container .dv-resize-handle-bottom{width:calc(100% - 8px);height:4px;z-index:var(--dv-overlay-z-index);cursor:ns-resize;position:absolute;bottom:-2px;left:4px}.dv-resize-container .dv-resize-handle-left{width:4px;height:calc(100% - 8px);z-index:var(--dv-overlay-z-index);cursor:ew-resize;position:absolute;top:4px;left:-2px}.dv-resize-container .dv-resize-handle-right{width:4px;height:calc(100% - 8px);z-index:var(--dv-overlay-z-index);cursor:ew-resize;position:absolute;top:4px;right:-2px}.dv-resize-container .dv-resize-handle-topleft{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:nw-resize;position:absolute;top:-2px;left:-2px}.dv-resize-container .dv-resize-handle-topright{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:ne-resize;position:absolute;top:-2px;right:-2px}.dv-resize-container .dv-resize-handle-bottomleft{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:sw-resize;position:absolute;bottom:-2px;left:-2px}.dv-resize-container .dv-resize-handle-bottomright{width:4px;height:4px;z-index:var(--dv-overlay-z-index);cursor:se-resize;position:absolute;bottom:-2px;right:-2px}.dv-render-overlay{--dv-overlay-z-index:var(--dv-overlay-z-index,999);z-index:1;contain:layout paint;isolation:isolate;will-change:transform;backface-visibility:hidden;width:100%;height:100%;position:absolute;transform:translate(0,0)}.dv-render-overlay.dv-render-overlay-float{z-index:calc(var(--dv-overlay-z-index) - 1)}.dv-debug .dv-render-overlay{outline-offset:-1;outline:1px solid red}.dv-pane-container{width:100%;height:100%}.dv-pane-container.dv-animated .dv-view{will-change:transform;backface-visibility:hidden;transition:transform .15s ease-out;transform:translate(0,0)}.dv-pane-container .dv-view{flex-direction:column;display:flex;overflow:hidden;padding:0!important}.dv-pane-container .dv-view:not(:first-child):before{background-color:#0000!important}.dv-pane-container .dv-view:not(:first-child) .dv-pane>.dv-pane-header{border-top:1px solid var(--dv-paneview-header-border-color)}.dv-pane-container .dv-view .dv-default-header{background-color:var(--dv-group-view-background-color);color:var(--dv-activegroup-visiblepanel-tab-color);cursor:pointer;padding:0 8px;display:flex}.dv-pane-container .dv-view .dv-default-header .dv-pane-header-icon{justify-content:center;align-items:center;display:flex}.dv-pane-container .dv-view .dv-default-header>span{flex-grow:1;padding-left:8px}.dv-pane-container:first-of-type>.dv-pane>.dv-pane-header{border-top:none!important}.dv-pane-container .dv-pane{flex-direction:column;height:100%;display:flex;overflow:hidden}.dv-pane-container .dv-pane .dv-pane-header{box-sizing:border-box;-webkit-user-select:none;user-select:none;outline:none;position:relative}.dv-pane-container .dv-pane .dv-pane-header.dv-pane-draggable{cursor:pointer}.dv-pane-container .dv-pane .dv-pane-header:focus:before,.dv-pane-container .dv-pane .dv-pane-header:focus-within:before{z-index:5;content:"";pointer-events:none;outline-offset:-1px;outline:-1px solid;outline-color:var(--dv-paneview-active-outline-color);width:100%;height:100%;position:absolute;top:0;left:0}.dv-pane-container .dv-pane .dv-pane-body{outline:none;flex-grow:1;position:relative;overflow:hidden auto}.dv-pane-container .dv-pane .dv-pane-body:focus:before,.dv-pane-container .dv-pane .dv-pane-body:focus-within:before{z-index:5;content:"";pointer-events:none;outline-offset:-1px;outline:-1px solid;outline-color:var(--dv-paneview-active-outline-color);width:100%;height:100%;position:absolute;top:0;left:0}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-enabled{background-color:#000}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-disabled{background-color:orange}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-maximum{background-color:green}.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-minimum{background-color:red}.dv-split-view-container{width:100%;height:100%;position:relative;overflow:hidden}.dv-split-view-container.dv-splitview-disabled>.dv-sash-container>.dv-sash{pointer-events:none}.dv-split-view-container.dv-animation .dv-view,.dv-split-view-container.dv-animation .dv-sash{will-change:transform;backface-visibility:hidden;transition:transform .15s ease-out;transform:translate(0,0)}.dv-split-view-container.dv-horizontal{height:100%}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash{width:4px;height:100%}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-enabled{cursor:ew-resize}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-disabled{cursor:default}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-maximum{cursor:w-resize}.dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash.dv-minimum{cursor:e-resize}.dv-split-view-container.dv-horizontal>.dv-view-container>.dv-view:not(:first-child):before{width:1px;height:100%}.dv-split-view-container.dv-vertical{width:100%}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash{width:100%;height:4px}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-enabled{cursor:ns-resize}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-disabled{cursor:default}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-maximum{cursor:n-resize}.dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash.dv-minimum{cursor:s-resize}.dv-split-view-container.dv-vertical>.dv-view-container>.dv-view{width:100%}.dv-split-view-container.dv-vertical>.dv-view-container>.dv-view:not(:first-child):before{width:100%;height:1px}.dv-split-view-container .dv-sash-container{width:100%;height:100%;position:absolute}.dv-split-view-container .dv-sash-container .dv-sash{z-index:99;-webkit-user-select:none;user-select:none;touch-action:none;background-color:var(--dv-sash-color,transparent);outline:none;position:absolute}.dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):active,.dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):hover{background-color:var(--dv-active-sash-color,transparent);transition-property:background-color;transition-timing-function:ease-in-out;transition-duration:var(--dv-active-sash-transition-duration,.1s);transition-delay:var(--dv-active-sash-transition-delay,.5s)}.dv-split-view-container .dv-view-container{width:100%;height:100%;position:relative}.dv-split-view-container .dv-view-container .dv-view{box-sizing:border-box;height:100%;position:absolute;overflow:auto}.dv-split-view-container.dv-separator-border .dv-view:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--dv-separator-border);position:absolute;top:0;left:0}.dv-dragged{transform:translate(0,0)}.dv-tab{flex-shrink:0}.dv-tab:focus-within,.dv-tab:focus{position:relative}.dv-tab:focus-within:after,.dv-tab:focus:after{content:"";pointer-events:none;outline-offset:-1px;z-index:5;width:100%;height:100%;position:absolute;top:0;left:0;outline:1px solid var(--dv-tab-divider-color)!important}.dv-tab.dv-tab-dragging .dv-default-tab-action{background-color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-tab.dv-active-tab .dv-default-tab .dv-default-tab-action{visibility:visible}.dv-tab.dv-inactive-tab .dv-default-tab .dv-default-tab-action{visibility:hidden}.dv-tab.dv-inactive-tab .dv-default-tab:hover .dv-default-tab-action{visibility:visible}.dv-tab .dv-default-tab{white-space:nowrap;text-overflow:ellipsis;align-items:center;height:100%;display:flex;position:relative}.dv-tab .dv-default-tab .dv-default-tab-content{flex-grow:1;margin-right:4px}.dv-tab .dv-default-tab .dv-default-tab-action{box-sizing:border-box;justify-content:center;align-items:center;padding:4px;display:flex}.dv-tab .dv-default-tab .dv-default-tab-action:hover{background-color:var(--dv-icon-hover-background-color);border-radius:2px}.dv-tabs-overflow-dropdown-default{height:100%;color:var(--dv-activegroup-hiddenpanel-tab-color);margin:var(--dv-tab-margin);cursor:pointer;flex-shrink:0;align-items:center;padding:.25rem .5rem;display:flex}.dv-tabs-overflow-dropdown-default>span{padding-left:.25rem}.dv-tabs-overflow-dropdown-default>svg{transform:rotate(90deg)}.dv-tabs-container{scrollbar-width:thin;will-change:scroll-position;height:100%;display:flex;overflow:auto;transform:translate(0,0)}.dv-tabs-container.dv-horizontal .dv-tab:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--dv-tab-divider-color);width:1px;height:100%;position:absolute;top:0;left:0}.dv-tabs-container::-webkit-scrollbar{height:3px}.dv-tabs-container::-webkit-scrollbar-track{background:0 0}.dv-tabs-container::-webkit-scrollbar-thumb{background:var(--dv-tabs-container-scrollbar-color)}.dv-scrollable>.dv-tabs-container{overflow:hidden}.dv-tab{-webkit-user-drag:element;cursor:pointer;box-sizing:border-box;font-size:var(--dv-tab-font-size);margin:var(--dv-tab-margin);outline:none;padding:.25rem .5rem;position:relative}.dv-tabs-overflow-container{height:unset;border:1px solid var(--dv-tab-divider-color);background-color:var(--dv-group-view-background-color);flex-direction:column}.dv-tabs-overflow-container .dv-tab:not(:last-child){border-bottom:1px solid var(--dv-tab-divider-color)}.dv-tabs-overflow-container .dv-active-tab{background-color:var(--dv-activegroup-visiblepanel-tab-background-color);color:var(--dv-activegroup-visiblepanel-tab-color)}.dv-tabs-overflow-container .dv-inactive-tab{background-color:var(--dv-activegroup-hiddenpanel-tab-background-color);color:var(--dv-activegroup-hiddenpanel-tab-color)}.dv-tabs-and-actions-container{background-color:var(--dv-tabs-and-actions-container-background-color);box-sizing:border-box;height:var(--dv-tabs-and-actions-container-height);font-size:var(--dv-tabs-and-actions-container-font-size);flex-shrink:0;display:flex}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-scrollable,.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container{flex-grow:1}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container .dv-tab{flex-grow:1;padding:0}.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-void-container{flex-grow:0}.dv-tabs-and-actions-container .dv-void-container{flex-grow:1;display:flex}.dv-tabs-and-actions-container .dv-void-container.dv-draggable{cursor:grab}.dv-tabs-and-actions-container .dv-right-actions-container{display:flex}.dv-watermark{height:100%;display:flex}.castle-file-panel,.castle-code-panel{--castle-font-mono:"SFMono-Regular", Consolas, "Liberation Mono", monospace;--castle-black:var(--v2-ink);--castle-panel-raised:var(--v2-raised);--castle-border:#444;--castle-text:var(--v2-white);--castle-text-dim:var(--v2-muted);--castle-inspector-bg:var(--v2-surface);--castle-inspector-text:var(--v2-fg);--castle-inspector-muted:var(--v2-muted);--castle-inspector-border:var(--v2-border);--castle-inspector-divider:var(--v2-border);--castle-inspector-input-bg:var(--v2-raised);--castle-workspace-bg:var(--v2-surface);--castle-sheet-bg:var(--v2-surface);--castle-radius:4px}.castle-file-panel{background:var(--castle-sheet-bg);flex-direction:column;height:100%;display:flex;overflow:hidden;transform:translateZ(0)}.castle-file-panel>.fileBrowserBare{flex:1 1 0;height:auto;min-height:0}.castle-file-toolbar{border-bottom:1px solid var(--castle-inspector-border);flex-wrap:wrap;flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.castle-file-new-btn{color:#e6e6e6;cursor:pointer;background:#2f2f2f;border:1px solid #4a4a4a;border-radius:4px;align-items:center;gap:6px;padding:4px 10px;font-size:13px;display:inline-flex}.castle-file-new-btn:hover{background:#3c3c3c}.castle-file-new-btn svg{width:12px;height:12px}.castle-file-icon-btn{color:#b0b0b0;cursor:pointer;background:#2f2f2f;border:1px solid #4a4a4a;border-radius:4px;justify-content:center;align-items:center;width:28px;height:26px;margin-left:auto;display:inline-flex}.castle-file-icon-btn:hover{color:#e6e6e6;background:#3c3c3c}.castle-file-icon-btn.active{color:#dbe6f5;background:#37506f;border-color:#4a6b95}.castle-file-icon-btn svg{width:14px;height:14px}.castle-file-action-error{color:#e86a73;background:#2a1414;flex:none;justify-content:space-between;align-items:center;gap:8px;padding:5px 10px;font-size:12px;display:flex}.castle-file-action-error button{color:inherit;cursor:pointer;background:0 0;border:0;font-size:15px;line-height:1}.fileEditRow{cursor:default}.fileEditInput{border:1px solid var(--castle-border);background:var(--castle-inspector-input-bg);min-width:0;color:var(--castle-inspector-text);font:inherit;border-radius:3px;flex:auto;padding:1px 4px;font-size:13px}.fileEditInput:focus{border-color:#5a8bd6;outline:none}.fileEditSuffix{color:var(--castle-text-dim);flex:none;font-size:13px}.fileEditError{padding:2px 0 0 calc(20px + var(--file-depth,0) * 20px);color:#e86a73;flex:1 0 100%;font-size:11px}.castle-file-menu{z-index:1000;background:#232323;border:1px solid #3a3a3a;border-radius:6px;min-width:168px;padding:4px;position:fixed;box-shadow:0 8px 24px #0000008c}.castle-file-menu-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:8px;width:100%;padding:6px 8px;font-size:13px;display:flex}.castle-file-menu-item:hover:not(:disabled){background:#3a3a3a}.castle-file-menu-item:disabled{opacity:.4;cursor:default}.castle-file-menu-item.danger{color:#e86a73}.castle-file-menu-item.danger:hover{background:#3a2222}.castle-file-menu-item-icon{color:#b0b0b0;flex:0 0 14px;justify-content:center;align-items:center;width:14px;display:inline-flex}.castle-file-menu-item.danger .castle-file-menu-item-icon{color:inherit}.castle-file-menu-item-icon svg{width:13px;height:13px}.castle-file-menu-confirm{min-width:180px;padding:6px 8px}.castle-file-menu-confirm-text{color:#e6e6e6;margin-bottom:8px;font-size:13px}.castle-file-menu-confirm-actions{justify-content:flex-end;gap:6px;display:flex}.castle-file-menu-confirm-actions button{color:#e6e6e6;cursor:pointer;background:#333;border:1px solid #4a4a4a;border-radius:4px;padding:4px 10px;font-size:12px}.castle-file-menu-confirm-actions button:hover{background:#404040}.castle-file-menu-confirm-actions button.danger{color:#fff;background:#a02828;border-color:#a02828}.castle-file-menu-confirm-actions button.danger:hover{background:#b83030}.castle-file-menu-item-label{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.castle-file-menu-check{color:#7fd08a;flex:none;font-size:12px}.castle-file-menu-keys{color:gray;white-space:nowrap;flex:none;margin-left:16px;font-family:SFMono-Regular,Consolas,monospace;font-size:11px}.castle-file-menu-item:disabled .castle-file-menu-keys{color:inherit}.castle-file-menu-header{color:#9a9a9a;text-transform:uppercase;letter-spacing:.04em;padding:5px 8px 6px;font-size:11px}.castle-file-menu-sep{background:#3a3a3a;height:1px;margin:4px 2px}.castle-file-menu-error{color:#e86a73;padding:4px 8px;font-size:11px}.castle-file-picker{min-width:180px;max-height:min(60vh,420px);overflow-y:auto}.castle-file-newfolder{align-items:center;gap:6px;padding:4px 6px;display:flex}.castle-file-newfolder .fileEditInput{flex:auto}.castle-file-newfolder-btn{color:#e6e6e6;cursor:pointer;background:#333;border:1px solid #4a4a4a;border-radius:4px;flex:none;padding:3px 10px;font-size:12px}.castle-file-newfolder-btn:hover{background:#404040}.castle-file-newfolder-btn:disabled{opacity:.5;cursor:default}.fileBrowserBare{flex-direction:column;min-width:0;height:100%;display:flex}.fileTree{flex:1 1 0;min-height:0;padding-top:5px;overflow-y:auto}.fileBranch{min-width:0}.fileRow,.fileDirRow{border-radius:var(--castle-radius);width:100%;color:var(--v2-secondary);padding:5px 9px 5px calc(9px + var(--file-depth,0) * 20px);text-align:left;cursor:pointer;background:0 0;border:0;justify-content:flex-start;align-items:center;gap:6px;font-size:14px;display:flex}.fileDirRow{color:var(--v2-muted)}.fileRow:hover,.fileDirRow:hover{background:var(--castle-sheet-bg);color:var(--castle-inspector-text)}.fileRow.fileRowImported{color:var(--v2-muted);font-style:italic}.fileRow.fileRowSelected,.fileRow.fileRowSelected:hover{background:var(--castle-panel-raised);color:var(--castle-inspector-text)}.fileIcon.fileDisclosure{color:var(--v2-placeholder)}.fileDirRow:hover .fileIcon.fileDisclosure{color:inherit}.fileDisclosure svg{width:10px;height:10px}.fileLabel{flex:auto;align-items:center;gap:6px;min-width:0;display:inline-flex}.fileIcon{width:14px;color:var(--castle-inspector-muted);flex:0 0 14px;justify-content:center;align-items:center;font-size:14px;display:inline-flex}.castle-code-panel{width:100%;height:100%;position:relative}.mainEditor{background:var(--castle-sheet-bg);flex-direction:column;width:100%;min-width:0;height:100%;min-height:0;display:flex}.editorBody{flex:1;min-height:0;display:flex;overflow:hidden;container:editor/inline-size}.codeEditor{background:var(--castle-workspace-bg);flex:1;grid-template-columns:1fr;min-width:0;min-height:0;display:grid}.codeMirrorHost{min-width:0;height:100%;min-height:0}.castle-code-overlay{color:var(--castle-inspector-muted);pointer-events:none;font-size:12px;position:absolute;top:10px;left:12px}.castle-code-overlay.castle-code-error{color:var(--v2-error)}.castle-code-savebar{background:var(--v2-error-bg);color:var(--v2-error);padding:4px 10px;font-size:11px;position:absolute;bottom:0;left:0;right:0}.castle-tab-import{color:var(--v2-muted);font-style:italic}.fileImportUpdate{color:var(--castle-inspector-text);align-items:center;margin-left:6px;font-size:11px;display:inline-flex}.castle-modal-scrim{z-index:1000;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.castle-modal{color:#e8e8e8;background:#232323;border:1px solid #3a3a3a;border-radius:6px;min-width:260px;max-width:380px;padding:16px;font-size:13px;box-shadow:0 8px 24px #0000008c}.castle-modal-text{margin-bottom:14px}.castle-modal-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.castle-modal-actions button,.castle-import-link-row button{color:#e8e8e8;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-modal-actions button:hover:not(:disabled),.castle-import-link-row button:hover:not(:disabled){background:#383838}.castle-modal-actions button:disabled,.castle-import-link-row button:disabled{opacity:.6;cursor:default}.castle-upload-modal{flex-direction:column;gap:10px;width:min(460px,100vw - 24px);max-width:none;max-height:calc(100vh - 32px);display:flex;overflow-y:auto}.castle-upload-modal>.castle-modal-text{margin-bottom:0}.castle-upload-input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.castle-upload-drop{color:#e8e8e8;cursor:pointer;background:#2a2a2a;border:1px dashed #4a4a4a;border-radius:6px;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:22px 12px;font-size:13px;display:flex}.castle-upload-drop:hover,.castle-upload-drop.over{border-color:var(--castle-accent,#6c8cff);background:#313131}.castle-upload-drop svg{opacity:.8;width:18px;height:18px}.castle-upload-drop-label{font-weight:500}.castle-upload-drop-hint{opacity:.6;font-size:11px}.castle-upload-picked{border:1px solid #3a3a3a;border-radius:4px;flex-direction:column;max-height:132px;display:flex;overflow-y:auto}.castle-upload-picked-row{align-items:center;gap:8px;padding:6px 8px;font-size:12px;display:flex}.castle-upload-picked-row+.castle-upload-picked-row{border-top:1px solid #333}.castle-upload-picked-name{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.castle-upload-picked-warning{color:#e8b25a;white-space:normal;margin-top:2px;font-size:11px;display:block}.castle-upload-picked-size{opacity:.6;font-variant-numeric:tabular-nums;flex:none}.castle-upload-picked-remove{width:22px;height:22px;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;font-size:15px;line-height:1}.castle-upload-picked-remove:hover:not(:disabled){background:#3a3a3a}.castle-upload-dest{flex-direction:column;gap:6px;display:flex}.castle-upload-dest-label{text-transform:uppercase;letter-spacing:.04em;opacity:.6;font-size:11px}.castle-upload-folders{border:1px solid #3a3a3a;border-radius:4px;flex-direction:column;max-height:168px;display:flex;overflow-y:auto}.castle-upload-folder{color:#e8e8e8;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:9px 10px;font-size:12px;display:flex}.castle-upload-folder+.castle-upload-folder{border-top:1px solid #333}.castle-upload-folder:hover:not(:disabled){background:#303030}.castle-upload-folder.active{background:#35405e}.castle-upload-folder svg{opacity:.7;flex:none;width:12px;height:12px}.castle-upload-folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.castle-upload-newfolder-btn{color:#e8e8e8;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;display:flex}.castle-upload-newfolder-btn:hover:not(:disabled){background:#383838}.castle-upload-newfolder-btn svg{opacity:.7;width:12px;height:12px}.castle-upload-newfolder{gap:6px;display:flex}.castle-upload-status{text-overflow:ellipsis;white-space:nowrap;opacity:.7;text-align:left;flex:auto;min-width:0;font-size:12px;overflow:hidden}@media (width<=520px){.castle-upload-modal{width:calc(100vw - 16px);min-width:0;padding:12px}.castle-upload-drop{padding:18px 10px}.castle-upload-picked{max-height:104px}.castle-upload-folders{max-height:132px}.castle-upload-folder{padding:11px 10px;font-size:13px}}.castle-import-modal{flex-direction:column;width:min(520px,100vw - 32px);max-width:none;height:min(560px,100vh - 64px);max-height:none;display:flex}.castle-import-modal>.castle-modal-text,.castle-import-modal>.castle-key-tabs,.castle-import-modal>.castle-import-select-bar,.castle-import-modal>.castle-import-filter,.castle-import-modal>.castle-import-note,.castle-import-modal>.castle-import-error,.castle-import-modal>.castle-modal-actions{flex:none}.castle-import-select-bar{align-items:center;gap:10px;margin-bottom:8px;display:flex}.castle-import-select-all{padding:4px 8px}.castle-import-update-row{align-items:center}.castle-import-tick{color:#1b1b1b;border:1px solid #5a5a5a;border-radius:3px;flex:none;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex}.castle-import-tick.checked{background:#8ab4f8;border-color:#8ab4f8}.castle-import-filter{margin-bottom:8px}.castle-import-empty{color:#9a9a9a;text-align:center;flex:auto;justify-content:center;align-items:center;min-height:0;padding:10px;font-size:11px;display:flex}.castle-import-tabs .castle-key-tab{min-height:34px}.castle-import-list{background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;flex:auto;min-height:0;overflow-y:auto}.castle-import-row{color:#e8e8e8;width:100%;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:1px solid #2e2e2e;gap:10px;padding:8px;font-size:12px;display:flex}.castle-import-row:last-child{border-bottom:0}.castle-import-row:hover{background:#262626}.castle-import-row.selected{background:#3a3a3a}.castle-import-row.disabled{opacity:.5}.castle-import-thumb{object-fit:cover;background:#2e2e2e;border-radius:3px;flex:none;width:56px;height:79px}.castle-import-row-text{flex-direction:column;gap:3px;min-width:0;display:flex}.castle-import-row-title{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.castle-import-row-meta{color:#9a9a9a;font-size:11px}.castle-import-link{flex-direction:column;flex:auto;gap:8px;min-height:0;display:flex}.castle-import-link-row{gap:8px;display:flex}.castle-import-link-row button{white-space:nowrap}.castle-import-note{color:#9a9a9a;padding:10px 2px;font-size:11px}.castle-import-error{color:#ff8f8f;margin-top:8px;font-size:11px}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.flow-root{--flow-gutter:#000;--flow-surface:#0d0d0d;--flow-raised:#161616;--flow-hover:#1d1d1d;--flow-fg:#e6e6e6;--flow-secondary:#b3b3b3;--flow-muted:#888;--flow-border:#2a2a2a;--flow-border-active:#5a5a5a;--flow-gap:12px;--flow-dock-h:36px;--flow-radius:8px;--flow-host-l:0px;--flow-host-r:0px;--flow-max-chips:6;--flow-chips-w:calc(var(--flow-max-chips) * 34px + 8px);--flow-fade:22px;background:var(--flow-gutter);color:var(--flow-fg);flex-direction:column;font:13px ui-sans-serif,system-ui,-apple-system,sans-serif;display:flex;position:fixed;inset:0;overflow:hidden}.flow-root *{box-sizing:border-box}body.flow-reordering,body.flow-reordering *{-webkit-user-select:none!important;user-select:none!important;cursor:grabbing!important}.flow-topbar{top:var(--flow-gap);left:var(--flow-gap);right:var(--flow-gap);height:var(--flow-dock-h);z-index:40;pointer-events:none;padding-left:var(--flow-host-l);padding-right:var(--flow-host-r);grid-template-columns:minmax(0,1fr) minmax(0,auto) minmax(0,1fr);align-items:center;column-gap:10px;display:grid;position:absolute}.flow-topbar-leading{pointer-events:none;justify-self:start;align-items:center;gap:8px;min-width:0;display:flex}.flow-topbar-leading>*{pointer-events:auto}.flow-castle-wrap{flex-shrink:0;position:relative}.flow-castle-btn{width:var(--flow-dock-h);height:var(--flow-dock-h);color:var(--flow-fg);border:1px solid var(--flow-border);cursor:pointer;background:#000;border-radius:10px;justify-content:center;align-items:center;display:flex;box-shadow:0 8px 24px -12px #000000d9}.flow-castle-btn:hover{background:#111}.flow-menu-backdrop{z-index:49;position:fixed;inset:0}.flow-castle-menu{top:calc(var(--flow-dock-h) + 6px);z-index:50;background:#121212;border:1px solid #2e2e2e;border-radius:8px;flex-direction:column;min-width:170px;padding:4px;display:flex;position:absolute;left:0;box-shadow:0 8px 24px #00000080}.flow-castle-menu button{color:var(--flow-fg);cursor:pointer;text-align:left;font:inherit;background:0 0;border:none;border-radius:6px;align-items:center;padding:8px 10px;font-size:13px;display:flex}.flow-castle-menu button:hover{background:var(--flow-hover)}.flow-castle-menu button:disabled{opacity:.5;cursor:default}.flow-menu-sep{background:var(--flow-border);height:1px;margin:4px 6px}.flow-menu-narrow{display:none}.flow-deck-identity{min-height:var(--flow-dock-h);max-width:260px;color:var(--flow-fg);cursor:pointer;font:inherit;background:0 0;border:1px solid #0000;border-radius:10px;align-items:center;gap:6px;padding:0 10px;font-size:13px;font-weight:600;display:flex}.flow-deck-identity:hover{background:#ffffff0f;border-color:#ffffff14}.flow-deck-vis{color:var(--flow-secondary);flex-shrink:0;display:inline-flex}.flow-deck-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.flow-deck-caret{color:var(--flow-muted);flex-shrink:0;display:inline-flex}.flow-tabs-wrap{pointer-events:auto;justify-self:center;align-items:center;gap:6px;min-width:0;max-width:min(600px,100%);display:flex}.flow-root[data-host-chrome] .flow-tabs-wrap{justify-self:start}.flow-tabs{min-width:0;max-width:var(--flow-chips-w);height:var(--flow-dock-h);background:var(--flow-raised);border:1px solid var(--flow-border);border-radius:10px;flex:0 auto;padding:3px;position:relative;overflow:hidden;box-shadow:0 8px 24px -12px #000000d9}.flow-tabs-scroll{scrollbar-width:none;align-items:center;gap:4px;height:100%;display:flex;overflow:auto hidden}.flow-tabs-scroll::-webkit-scrollbar{display:none}.flow-tabs.more-left{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));border-left-color:#0000;border-top-left-radius:0;border-bottom-left-radius:0}.flow-tabs.more-right{-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));border-right-color:#0000;border-top-right-radius:0;border-bottom-right-radius:0}.flow-tabs.more-left.more-right{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent)}.flow-chip,.flow-tabs-add{width:30px;height:28px;color:var(--flow-muted);cursor:pointer;background:0 0;border:none;border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}@media (hover:hover){.flow-chip:hover,.flow-tabs-add:hover{color:var(--flow-fg);background:#ffffff0d}}.flow-chip.active{color:var(--flow-fg);background:#ffffff1a;box-shadow:inset 0 0 0 1px #ffffff0f}.flow-chip-icon{display:inline-flex}.flow-topbar-trailing{pointer-events:none;justify-self:end;align-items:center;gap:8px;min-width:0;display:flex}.flow-preview-btn{pointer-events:auto;height:var(--flow-dock-h);color:var(--flow-fg);background:var(--flow-raised);border:1px solid var(--flow-border);cursor:pointer;font:inherit;border-radius:10px;flex-shrink:0;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:600;display:flex;box-shadow:0 8px 24px -12px #000000d9}.flow-preview-btn:hover{background:var(--flow-hover)}.flow-preview-btn:disabled{opacity:.6;cursor:default}@media (width<=768px){.flow-root[data-host-chrome] .flow-topbar{grid-template-columns:0 minmax(0,auto) minmax(0,1fr);column-gap:0}.flow-root{--flow-max-chips:4}.flow-deck-identity,.flow-topbar-trailing{display:none}.flow-menu-narrow{display:flex}.flow-menu-sep.flow-menu-narrow{display:block}}.flow-scroller{flex:auto;min-height:0;overflow:auto}.flow-field{width:max-content;min-width:100%;min-height:100%}.flow-row{align-items:flex-start;gap:var(--flow-gap);width:max-content;min-height:100%;padding:calc(var(--flow-dock-h) + var(--flow-gap) * 2) var(--flow-gap) var(--flow-gap);padding-right:calc(var(--flow-gap) + var(--flow-overscroll,0px));display:flex}.flow-group{background:var(--flow-surface);border:1px solid var(--flow-border);border-radius:var(--flow-radius);flex-direction:column;min-width:200px;transition:border-color .12s;display:flex;position:relative;overflow:hidden}.flow-group.active{border-color:var(--flow-border-active)}.flow-titlebar{background:var(--flow-raised);border-bottom:1px solid var(--flow-border);cursor:grab;touch-action:none;flex:none;align-items:center;gap:6px;height:32px;padding:0 4px;display:flex}.flow-titlebar-btn{width:24px;height:24px;color:var(--flow-muted);cursor:pointer;background:0 0;border:none;border-radius:5px;flex:none;justify-content:center;align-items:center;display:inline-flex}.flow-titlebar-btn:hover{color:var(--flow-fg);background:var(--flow-hover)}.flow-titlebar-btn.pinned,.flow-titlebar-btn.pinned:hover{color:var(--flow-gutter);background:var(--flow-fg)}.flow-group.dragging{border-color:var(--flow-border-active);box-shadow:0 0 0 1px var(--flow-border-active) inset}.flow-drop-indicator{background:var(--flow-fg);z-index:60;pointer-events:none;border-radius:2px;width:3px;position:fixed}.flow-group.pinned{left:var(--flow-gap);z-index:5;position:sticky;box-shadow:0 6px 24px #00000073}.flow-titlebar-icon{color:var(--flow-secondary);flex:none;display:inline-flex}.flow-titlebar-title{text-overflow:ellipsis;white-space:nowrap;color:var(--flow-fg);flex:auto;font-size:12px;overflow:hidden}.flow-tab-icon{flex:none;display:inline-flex}.flow-panel-body{flex:auto;min-height:0;position:relative;overflow:hidden}.flow-panel-slot{width:100%;height:100%}.flow-resize-e{cursor:col-resize;touch-action:none;z-index:20;width:16px;position:absolute;top:32px;bottom:0;right:-8px}.flow-resize-s{cursor:row-resize;touch-action:none;z-index:20;height:16px;position:absolute;bottom:-8px;left:0;right:0}.flow-resize-se{cursor:nwse-resize;touch-action:none;z-index:21;width:22px;height:22px;position:absolute;bottom:-11px;right:-11px}.flow-placeholder{height:100%;color:var(--flow-muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:16px;display:flex}.flow-placeholder-icon :is(svg){width:34px;height:34px}.flow-placeholder-label{color:var(--flow-secondary);font-size:14px}.flow-placeholder-kind{color:var(--flow-muted);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}.flow-placeholder.kind-play{background:repeating-linear-gradient(45deg,#101018,#101018 10px,#0d0d14 10px 20px)}.flow-kind-menu{z-index:50;background:#121212;border:1px solid #2e2e2e;border-radius:8px;flex-direction:column;min-width:150px;padding:4px;display:flex;position:fixed;box-shadow:0 8px 24px #00000080}.flow-kind-menu button{color:var(--flow-fg);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:7px 8px;display:flex}.flow-kind-menu button:hover{background:var(--flow-hover)}.flow-picker{z-index:50;background:#121212;border:1px solid #2e2e2e;border-radius:8px;flex-direction:column;max-height:min(60vh,420px);padding:6px;display:flex;position:fixed;box-shadow:0 8px 24px #00000080}.flow-picker-input{color:var(--flow-fg);background:var(--flow-surface);border:1px solid var(--flow-border);border-radius:6px;outline:none;flex:none;margin-bottom:6px;padding:7px 9px;font:13px ui-sans-serif,system-ui,sans-serif}.flow-picker-input:focus{border-color:var(--flow-border-active)}.flow-picker-list{flex:auto;min-height:0;overflow-y:auto}.flow-picker-item{width:100%;color:var(--flow-fg);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;display:flex}.flow-picker-item.sel,.flow-picker-item:hover{background:var(--flow-hover)}.flow-picker-label{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.flow-picker-empty{color:var(--flow-muted);padding:10px 8px;font-size:12px}.flow-operator-host{width:100%;height:100%}.flow-operator-host .operator-resize{display:none}.flow-root.is-maximized .flow-scroller{overflow:hidden}.flow-root.is-maximized .flow-field,.flow-root.is-maximized .flow-row{width:100%;height:100%}.flow-root.is-maximized .flow-row{align-items:stretch}.flow-group.maximized{width:100%;height:100%}.flow-group.hidden{display:none}.flow-root.is-mobile .flow-scroller{overflow:clip}.flow-root.is-mobile .flow-field{width:100%;height:100%;padding-top:calc(var(--flow-gap) + var(--flow-dock-h))}.flow-root.is-mobile .flow-row{width:100%;height:100%;transform:translateX(calc(var(--flow-page,0) * -100% + var(--flow-drag,0px)));will-change:transform;flex-wrap:nowrap;align-items:stretch;gap:0;padding:0;transition:transform .28s cubic-bezier(.22,.61,.36,1);display:flex}.flow-root.is-mobile.flow-dragging .flow-row{transition:none}.flow-root.is-mobile .flow-group{flex:0 0 calc(100% - 8px);min-width:0;margin:4px}.flow-root.is-mobile .flow-resize-e,.flow-root.is-mobile .flow-resize-s,.flow-root.is-mobile .flow-resize-se{display:none}@media (prefers-reduced-motion:reduce){.flow-root.is-mobile .flow-row{transition:none}}.flow-push-modal-backdrop{z-index:1000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);pointer-events:auto;background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.flow-push-modal{border:1px solid var(--flow-border);text-align:center;background:#141414;border-radius:18px;flex-direction:column;align-items:center;gap:10px;width:min(360px,100%);padding:28px 24px;display:flex;box-shadow:0 20px 60px #0009}.flow-push-spinner{border:3px solid #ffffff26;border-top-color:var(--flow-fg);border-radius:50%;width:34px;height:34px;animation:.8s linear infinite flow-push-spin}@keyframes flow-push-spin{to{transform:rotate(360deg)}}.flow-push-check{color:#fff;background:#2e7d32;border-radius:50%;justify-content:center;align-items:center;width:34px;height:34px;font-size:20px;font-weight:700;display:flex}.flow-push-title{color:var(--flow-fg);font-size:16px;font-weight:600}.flow-push-sub{color:var(--flow-secondary);font-size:12px}.flow-push-url{overflow-wrap:anywhere;color:#7aa2ff;max-width:100%;font:13px ui-monospace,SFMono-Regular,Menlo,monospace;text-decoration:none}.flow-push-url:hover{text-decoration:underline}.flow-push-done{background:var(--flow-fg);color:var(--flow-gutter);cursor:pointer;border:none;border-radius:999px;margin-top:8px;padding:9px 24px;font-size:14px;font-weight:600}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--v2-gutter:#000;--v2-surface:#0d0d0d;--v2-raised:#161616;--v2-hover:#1d1d1d;--v2-fg:#e6e6e6;--v2-head:#e8e8e8;--v2-secondary:#b3b3b3;--v2-muted:#888;--v2-dim:#525252;--v2-placeholder:#666;--v2-ink:#111;--v2-white:#fff;--v2-border:#2a2a2a;--v2-accent:#622461;--v2-accent-hover:#855484;--v2-running:#6c9ce0;--v2-running-ring:#6c9ce040;--v2-avatar-ring:#fff;--v2-avatar-ring-hover:#b3b3b3;--v2-error-bg:#5a2b2b;--v2-warn:#e2c08d;--v2-error:#e08c8c;--v2-overlay-scrim:#00000059;--v2-overlay-code:#00000038;--v2-overlay-code-block:#00000047;--v2-overlay-task:#141414eb;--v2-overlay-feed-code:#7878784d;--v2-overlay-white-subtle:#ffffff0f;--v2-overlay-white-hover:#ffffff14;--v2-overlay-white-border:#ffffff24;--v2-overlay-white-quote:#fff6;--v2-overlay-white-dim:#ffffffd9;--v2-shadow-pop:0 10px 24px -10px #000000e6;--v2-text-shadow-float:0 1px 3px #000000f2, 0 0 2px #000000d9;--v2-selection:#e6e6e62e;--v2-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--panel-gutter:10px;--panel-chrome-radius:8px}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--v2-fg);background:var(--v2-surface);font-family:baltomobile,Balto,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;overflow:hidden}.shell-dockview{box-sizing:border-box;--dv-tab-font-size:14px;--dv-tabs-and-actions-container-font-size:14px;--dv-tabs-and-actions-container-height:30px;--dv-group-view-background-color:var(--v2-surface);--dv-tabs-and-actions-container-background-color:var(--v2-gutter);--dv-activegroup-visiblepanel-tab-background-color:var(--v2-surface);--dv-activegroup-visiblepanel-tab-color:var(--v2-fg);--dv-activegroup-hiddenpanel-tab-background-color:var(--v2-gutter);--dv-activegroup-hiddenpanel-tab-color:var(--v2-dim);--dv-inactivegroup-visiblepanel-tab-background-color:var(--v2-surface);--dv-inactivegroup-visiblepanel-tab-color:var(--v2-fg);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--v2-gutter);--dv-inactivegroup-hiddenpanel-tab-color:var(--v2-dim);--dv-tab-divider-color:var(--v2-border);--dv-separator-border:transparent;--dv-sash-color:transparent;--dv-active-sash-color:var(--v2-dim);height:100%;padding:var(--panel-gutter) var(--panel-gutter) var(--panel-gutter) 0;background-color:var(--v2-gutter);font-family:baltomobile,Balto,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.shell-dockview.dv-dockview{background-color:var(--v2-gutter)}.shell-dockview .dv-sash{z-index:99}.shell-dockview .dv-sash:before{content:"";position:absolute;inset:-5px}.play-restart-btn{color:#e7e7ef;cursor:pointer;background:#2f2f48;border:1px solid #3a3a52;border-radius:6px;align-items:center;gap:6px;padding:4px 10px;font:12px system-ui,sans-serif;transition:background .12s,border-color .12s;display:inline-flex}.play-restart-btn:hover{background:#3a3a5a;border-color:#565676}.play-restart-btn:active{background:#262638}.play-restart-icon{display:inline-flex}.play-restart-icon.spinning{animation:.6s play-restart-spin}@keyframes play-restart-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.shell-dockview .dv-default-tab-content{font-family:inherit}.shell-dockview .dv-split-view-container .dv-view:has(>.dv-groupview){border-radius:var(--panel-chrome-radius);box-sizing:border-box;overflow:hidden}.shell-dockview .dv-split-view-container .dv-view:has(>.dv-groupview):after{content:"";z-index:10;pointer-events:none;border:1px solid var(--v2-border);border-radius:inherit;box-sizing:border-box;position:absolute;inset:0}.shell-dockview .dv-view>.dv-groupview{border:none;border-radius:0;width:100%;height:100%}.shell-dockview .dv-split-view-container .dv-view:has(>.dv-groupview.dv-active-group):after{border-color:#6a6a6a}.shell-dockview .dv-resize-container:has(>.dv-groupview.dv-active-group):after{border-color:#6a6a6a}.shell-dockview .dv-resize-container:has(>.dv-groupview){border-radius:var(--panel-chrome-radius);box-sizing:border-box;overflow:hidden}.shell-dockview .dv-resize-container:has(>.dv-groupview):after{content:"";z-index:10;pointer-events:none;border:1px solid var(--v2-border);border-radius:inherit;box-sizing:border-box;position:absolute;inset:0}.shell-dockview .dv-resize-container .dv-groupview{border:none;border-radius:0;width:100%;height:100%}.shell-dockview .dv-tabs-container.dv-horizontal{align-items:stretch;display:flex}.shell-dockview .dv-tab{border:none;border-right:1px solid var(--dv-tab-divider-color);border-radius:0;align-self:stretch;height:100%;padding:0 5px 0 10px}.shell-dockview .dv-tab:not(:first-child){margin-left:0}.shell-dockview .dv-tab.dv-inactive-tab{border-bottom:1px solid var(--dv-tab-divider-color)}.shell-dockview .dv-tab.dv-active-tab{border-bottom:none}.shell-dockview .dv-tabs-and-actions-container .dv-void-container{border-bottom:1px solid var(--dv-tab-divider-color)}.shell-dockview .dv-tabs-and-actions-container .dv-right-actions-container{border-left:1px solid var(--dv-tab-divider-color);border-bottom:1px solid var(--dv-tab-divider-color);align-items:stretch}.shell-dockview .dv-tab .dv-default-tab-content{margin-right:6px}.shell-dockview .dv-tab .dv-default-tab-action{padding:2px}.shell-dockview .dv-tab .dv-default-tab-action .dv-svg{width:8px;height:8px;transform:translateY(1px)}.shell-dockview .dv-tab.dv-inactive-tab .dv-default-tab-action,.shell-dockview .dv-tab.dv-active-tab .dv-default-tab-action{color:var(--v2-dim)}.shell-dockview .dv-tabs-container.dv-horizontal .dv-tab:not(:first-child):before{display:none}.shell-dockview .dv-tab:focus:after,.shell-dockview .dv-tab:focus-within:after{display:none!important}.shell-dockview .dv-tabs-overflow-container{border:1px solid var(--dv-tab-divider-color);border-radius:var(--panel-chrome-radius);background:var(--v2-surface);min-width:180px;box-shadow:var(--v2-shadow-pop);gap:2px;padding:4px;overflow:hidden}.shell-dockview .dv-tabs-overflow-container .dv-tab{border-bottom:none;border-right:none;border-radius:6px;width:100%;padding:4px 8px 4px 10px}.shell-dockview .dv-tabs-overflow-container .dv-tab:hover{background:var(--v2-hover)}.shell-dockview .dv-tabs-overflow-container .dv-tab.dv-active-tab{background:var(--v2-raised)}.shell-dockview .dv-add-panel{align-items:center;height:100%;padding:0 3px;display:flex}.shell-dockview .dv-add-panel-btn{width:22px;height:22px;color:var(--dv-activegroup-visiblepanel-tab-color);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:0;display:flex}.shell-dockview .dv-add-panel-btn:hover{background:var(--v2-overlay-white-subtle)}.shell-dockview .dv-add-panel-btn svg{display:block}.dv-add-panel-menu{z-index:2147483000;background:var(--v2-surface);border:1px solid var(--v2-border);min-width:180px;box-shadow:var(--v2-shadow-pop);border-radius:8px;padding:4px;font-family:baltomobile,Balto,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;position:fixed;transform:translate(-100%)}.dv-add-panel-item{width:100%;color:var(--v2-fg);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:10px;padding:7px 10px;font-size:13px;display:flex}.dv-add-panel-item:hover{background:var(--v2-accent);color:var(--v2-white)}.dv-add-panel-item-icon{color:var(--v2-muted);flex:0 0 16px;justify-content:center;align-items:center;display:flex}.dv-add-panel-item:hover .dv-add-panel-item-icon{color:var(--v2-white)}.dv-add-panel-item-label{white-space:nowrap;flex:1}.empty-dock-state{z-index:20;padding:var(--panel-gutter);pointer-events:auto;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.empty-dock-card{background:var(--v2-surface);border:1px solid var(--v2-border);border-radius:var(--panel-chrome-radius);width:210px;box-shadow:var(--v2-shadow-pop);padding:6px}.empty-dock-title{color:var(--v2-muted);padding:7px 10px 8px;font-size:12px}.empty-dock-actions{flex-direction:column;gap:2px;display:flex}.empty-dock-item{width:100%;color:var(--v2-fg);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:10px;padding:8px 10px;font-size:13px;display:flex}.empty-dock-item:hover{background:var(--v2-accent);color:var(--v2-white)}.empty-dock-item:hover .dv-add-panel-item-icon{color:var(--v2-white)}.panel-error{height:100%;color:var(--v2-muted);flex-direction:column;align-items:flex-start;gap:8px;padding:14px 16px;font-size:13px;display:flex;overflow:auto}.panel-error-title{color:var(--v2-fg)}.panel-error-msg{white-space:pre-wrap;word-break:break-word;max-width:100%;color:var(--v2-muted);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.panel-error-retry{font:inherit;border:1px solid var(--v2-border);background:var(--v2-raised);color:var(--v2-fg);cursor:pointer;border-radius:4px;padding:3px 10px;font-size:12px}.panel-error-retry:hover{background:var(--v2-hover)}.editor-panel-root{flex-direction:column;width:100%;height:100%;min-height:0;display:flex}.editor-shell{flex:auto;min-height:0;display:flex}.editor-panel-body{flex:auto;min-width:0;min-height:0;position:relative}.editor-contextbar{background:var(--v2-gutter,#0d0d0d);border-bottom:1px solid var(--v2-border,#2a2a2a);flex:none;align-items:center;gap:8px;padding:5px 8px;display:flex}.editor-drawer-toggle{width:26px;height:24px;color:var(--v2-muted,#888);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;display:inline-flex}.editor-drawer-toggle:hover{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b)}.editor-drawer-toggle.on{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b);border-color:var(--v2-border,#3a3a52)}.editor-drawer{background:var(--v2-gutter,#0d0d0d);border-right:1px solid var(--v2-border,#2a2a2a);flex:none;width:190px;padding:6px 4px;overflow-y:auto}.editor-drawer-folder{letter-spacing:.03em;text-transform:uppercase;color:var(--v2-muted,#888);padding:6px 8px 2px;font:10px ui-sans-serif,system-ui,sans-serif}.editor-drawer-item{width:100%;color:var(--v2-secondary,#b3b3b3);cursor:pointer;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:5px 8px;font:12px ui-sans-serif,system-ui,sans-serif;display:block;overflow:hidden}.editor-drawer-item:hover{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef)}.editor-drawer-item.current{color:var(--v2-fg,#e7e7ef);background:#ffffff1a}.editor-drawer-empty{color:var(--v2-muted,#888);padding:10px 8px;font-size:12px}.editor-view-picker{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef);border:1px solid var(--v2-border,#3a3a52);cursor:pointer;border-radius:6px;flex:none;padding:3px 6px;font:12px system-ui,sans-serif}.editor-contextbar-path{text-overflow:ellipsis;white-space:nowrap;color:var(--v2-muted,#888);flex:auto;font:11px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden}.deck-panel{background:var(--v2-surface);width:100%;height:100%}.deck-frame{border:0;width:100%;height:100%;display:block}.play-panel{background:var(--v2-surface);flex-direction:column;width:100%;height:100%;display:flex}.play-stage{flex:auto;justify-content:center;align-items:center;min-height:0;padding:20px;display:flex;container-type:size}.play-frame-shell{aspect-ratio:5/7;border-radius:4%/2.85714%;width:min(100cqw,71.4286cqh);height:min(100cqh,140cqw);position:relative;overflow:hidden}.play-frame-shell .deck-frame{width:100%;height:100%}.play-logs{border-top:1px solid var(--v2-border);background:var(--v2-surface);color:var(--v2-secondary);flex:none;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace}.play-logs-header{justify-content:space-between;align-items:center;height:28px;padding:0 8px;display:flex}.play-logs-toggle{color:var(--v2-muted);cursor:pointer;font:inherit;text-transform:uppercase;letter-spacing:.04em;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;display:inline-flex}.play-logs-caret{width:10px;color:var(--v2-muted);display:inline-block}.play-logs-count{color:var(--v2-muted)}.play-logs-actions{align-items:center;gap:6px;display:flex}.play-logs-clear{color:var(--v2-muted);cursor:pointer;font:inherit;background:0 0;border:0;padding:2px 4px;font-size:11px}.play-logs-clear:hover{color:var(--v2-secondary)}.play-logs-btn{min-width:26px;height:22px;font:inherit;white-space:nowrap;color:var(--v2-secondary);border:1px solid var(--v2-overlay-white-border);cursor:pointer;background:0 0;border-radius:6px;justify-content:center;align-items:center;gap:5px;padding:0 7px;font-size:11px;display:inline-flex}.play-logs-btn:disabled{opacity:.6;cursor:default}.play-logs-btn:hover{background:var(--v2-overlay-white-hover);color:var(--v2-white)}.play-logs-body{border-top:1px solid var(--v2-raised);max-height:200px;padding:4px 10px 8px;overflow-y:auto}.play-logs-line{white-space:pre-wrap;word-break:break-word}.play-logs-warn{color:var(--v2-warn)}.play-logs-error{color:var(--v2-error)}.play-logs-empty{color:var(--v2-dim)}.term-panel{width:100%;height:100%;position:relative}.term-host{overscroll-behavior:contain;padding:6px;position:absolute;inset:0}.shell-root{--operator-pad:10px;--operator-col-fit:min(var(--operator-col,400px), 100%);--composer-reserve:88px;background:var(--v2-gutter);height:100%;position:relative}.shell-root .shell-dockview{height:100%;transition:margin-left .18s,width .18s,opacity .12s}body.operator-resizing .shell-root .shell-dockview{transition:none}.shell-root.dock-hidden .shell-dockview{opacity:0}.shell-root:not(.anim-ready) .shell-dockview,.shell-root:not(.anim-ready) #chat-host{transition:none}.shell-root.docked .shell-dockview{margin-left:var(--operator-col-fit);padding-right:min(var(--panel-gutter), calc(100% - var(--operator-col-fit)));width:calc(100% - var(--operator-col-fit))!important}.shell-root.floating .shell-dockview{margin-left:60px;width:calc(100% - 60px)!important}#chat-host{width:var(--operator-col-fit);background:var(--v2-gutter);color:var(--v2-fg);z-index:10;flex-direction:column;font-family:Balto,system-ui,-apple-system,sans-serif;transition:background-color .18s;display:flex;position:absolute;top:0;bottom:0;left:0}body.operator-resizing #chat-host{transition:none}.shell-root.floating #chat-host{pointer-events:none;z-index:2147482500;background:0 0;width:380px;max-width:86vw}.operator-resize{cursor:col-resize;z-index:30;width:8px;position:absolute;top:0;bottom:0;right:0}body.operator-resizing,body.operator-resizing *{cursor:col-resize;-webkit-user-select:none!important;user-select:none!important}body.shell-sash-resizing,body.shell-sash-resizing *{-webkit-user-select:none!important;user-select:none!important}.shell-root.floating #chat-messages{pointer-events:none;justify-content:flex-end;padding:0 0 0 60px;position:absolute;inset:0 0 88px}.shell-root.floating #chat-messages .chat-bubbles{pointer-events:auto;flex-direction:column;gap:4px;display:flex}.shell-root.floating #chat-pending,.shell-root.floating .chat-input .ta,.shell-root.floating .chat-input .chat-queue{pointer-events:auto}.shell-root.floating .chat-input{z-index:6;pointer-events:none;margin-top:auto;padding-left:60px;padding-right:0;position:relative}.shell-root.floating #chat-host .chat-input.collapsed{pointer-events:none;padding-bottom:13px}.shell-root.floating #chat-host .chat-input.collapsed.revealed{pointer-events:auto}.shell-root.floating #chat-host .chat-input.collapsed .ta{cursor:pointer;opacity:0;pointer-events:none;border-radius:19px;justify-content:center;align-items:center;gap:0;width:38px;height:38px;min-height:0;padding:5px;transform:translateY(6px)}.shell-root.floating #chat-host .chat-input.collapsed.revealed .ta{opacity:1;pointer-events:auto;transform:none}.shell-root.floating #chat-host .chat-input.collapsed .ta-text,.shell-root.floating #chat-host .chat-input.collapsed .ta-bottom,.shell-root.floating #chat-host .chat-input.collapsed .chat-queue,.shell-root.floating #chat-host:not(.chat-expanded) #chat-pending,#chat-host .chat-input .collapse-icon{display:none}.shell-root.floating #chat-host .chat-input.collapsed .collapse-icon{width:28px;height:28px;color:var(--v2-muted);flex-shrink:0;justify-content:center;align-items:center;display:flex}#chat-host .chat-input .collapse-icon svg{width:20px;height:20px;display:block}.shell-root.floating #chat-host .chat-input.collapsed .ta:hover .collapse-icon{color:var(--v2-fg)}.shell-root.floating #chat-host .msg,.shell-root.floating #chat-host .assistant-turn{transition:opacity .55s}.shell-root.floating #chat-host .msg.fading,.shell-root.floating #chat-host .assistant-turn.fading{opacity:0;pointer-events:none}@media (prefers-reduced-motion:reduce){.shell-root.floating #chat-host .msg,.shell-root.floating #chat-host .assistant-turn{transition:none}}.shell-root.floating #chat-host.rail-engaged #chat-messages{opacity:0;pointer-events:none;transition:opacity .14s}.operator-avatar{background:var(--v2-raised);width:36px;height:36px;color:var(--v2-fg);border:2px solid var(--v2-avatar-ring);box-shadow:var(--v2-shadow-pop);cursor:pointer;pointer-events:auto;z-index:80;border-radius:50%;justify-content:center;align-items:center;padding:0;display:flex;position:absolute;bottom:14px;left:12px;overflow:hidden}.operator-avatar:hover{border-color:var(--v2-avatar-ring-hover)}.operator-avatar svg{display:block}.operator-avatar-img{object-fit:cover;border-radius:50%;width:100%;height:100%;display:block}.operator-avatar.active{border-color:var(--v2-running);box-shadow:0 0 0 3px var(--v2-running-ring), var(--v2-shadow-pop)}.operator-gutter{pointer-events:auto;z-index:5;width:60px;max-height:calc(100% - 56px);position:absolute;top:0;left:0;overflow:visible}#chat-host .operator-gutter .task-stack{scrollbar-width:none;-ms-overflow-style:none;flex-direction:column;width:100%;max-height:100%;display:flex;overflow-y:auto}.shell-root.floating #chat-host.rail-engaged .operator-gutter .task-stack{overflow:visible}#chat-host .operator-gutter .task-stack::-webkit-scrollbar{width:0;height:0}#chat-host .operator-gutter .task-row{padding:5px 14px}#chat-host .operator-gutter .task:hover,#chat-host .operator-gutter .task.open{background:var(--v2-overlay-task);width:344px;box-shadow:inset 0 0 0 1px var(--v2-border), var(--v2-shadow-pop);z-index:30;transform:translate(8px)}#chat-host .operator-gutter .task:hover .task-row,#chat-host .operator-gutter .task.open .task-row{gap:10px;padding:5px 6px}#chat-host .operator-gutter .task-meta{opacity:0;pointer-events:none;transition:opacity .14s}#chat-host .operator-gutter .task:hover .task-meta,#chat-host .operator-gutter .task.open .task-meta{opacity:1;pointer-events:auto}#chat-host .operator-gutter .task-name,#chat-host .operator-gutter .task-sub,#chat-host .operator-gutter .task-body{text-shadow:var(--v2-text-shadow-float)}#chat-host .settings-popover{z-index:2147483000;background:var(--v2-surface);width:390px;max-width:calc(100vw - 24px);color:var(--v2-fg);border:1px solid var(--v2-border);box-shadow:var(--v2-shadow-pop);border-radius:8px;padding:10px 12px;font-size:13px;position:fixed;bottom:70px;left:12px}#chat-host .settings-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}#chat-host .settings-row+.settings-row{margin-top:8px}#chat-host .settings-label{white-space:nowrap}#chat-host .settings-seg{border:1px solid var(--v2-border);border-radius:4px;display:flex;overflow:hidden}#chat-host .settings-opt{font:inherit;background:var(--v2-surface);color:var(--v2-muted);cursor:pointer;white-space:nowrap;border:0;padding:5px 10px;font-size:13px}#chat-host .settings-opt+.settings-opt{border-left:1px solid var(--v2-border)}#chat-host .settings-opt:hover{color:var(--v2-fg)}#chat-host .settings-opt.active{background:var(--v2-accent);color:var(--v2-white)}#chat-host .settings-text{min-width:0;font:inherit;background:var(--v2-surface);color:var(--v2-fg);border:1px solid var(--v2-border);border-radius:4px;flex:auto;padding:5px 8px;font-size:13px}#chat-host .settings-text::placeholder{color:var(--v2-placeholder)}#chat-host .settings-text:focus{border-color:var(--v2-accent);outline:none}#chat-host .settings-row-stack{flex-direction:column;align-items:stretch;gap:4px;display:flex}#chat-host .settings-row-main{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}#chat-host .settings-text-warn{border-color:var(--v2-warn)}#chat-host .settings-warning{color:var(--v2-warn);text-align:right;font-size:11px;line-height:1.35}#chat-host .settings-warning-suggest{appearance:none;font:inherit;color:var(--v2-warn);cursor:pointer;background:0 0;border:none;margin:0;padding:0;text-decoration:underline}#chat-host .settings-warning-suggest:hover{color:var(--v2-fg)}#chat-host .settings-select{max-width:60%;font:inherit;background:var(--v2-surface);color:var(--v2-fg);border:1px solid var(--v2-border);cursor:pointer;border-radius:4px;flex:0 auto;padding:5px 8px;font-size:13px}#chat-host .settings-select:focus{border-color:var(--v2-accent);outline:none}#chat-host .settings-select option{background:var(--v2-surface);color:var(--v2-fg)}#chat-host .settings-group+.settings-group{border-top:1px solid var(--v2-border);margin-top:12px;padding-top:12px}#chat-host .settings-usage-text{color:var(--v2-secondary);white-space:nowrap}#chat-host .settings-usage-bar{background:var(--v2-border);border-radius:2px;height:4px;margin-top:6px;overflow:hidden}#chat-host .settings-usage-fill{background:var(--v2-accent-hover);height:100%}#chat-host .settings-usage-fill.blocked{background:var(--v2-error)}#chat-host .settings-account-open{width:100%;font:inherit;background:var(--v2-surface);color:var(--v2-muted);border:1px solid var(--v2-border);cursor:pointer;border-radius:4px;margin-top:10px;padding:7px 12px;font-size:13px}#chat-host .settings-account-open:hover{color:var(--v2-fg)}.castle-key-heading{margin-bottom:4px;font-weight:600}.castle-key-subtitle{color:#9a9a9a;margin-bottom:14px;font-size:12px;line-height:1.5}.castle-key-tabs{border:1px solid #3a3a3a;border-radius:4px;margin-bottom:12px;display:flex;overflow:hidden}.castle-key-tab{color:#9a9a9a;font:inherit;cursor:pointer;background:#2e2e2e;border:0;flex:1;padding:6px 10px;font-size:12px}.castle-key-tab+.castle-key-tab{border-left:1px solid #3a3a3a}.castle-key-tab:hover{color:#e8e8e8}.castle-key-tab.active{color:#e8e8e8;background:#3a3a3a}.castle-key-input{box-sizing:border-box;color:#e8e8e8;width:100%;font:inherit;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;outline:none;padding:7px 9px;font-size:12px;display:block}.castle-key-input:focus{border-color:#4a4a4a}.castle-key-input::placeholder{color:#6a6a6a}.castle-key-stored{color:#8a8a8a;margin-top:8px;font-size:11px}.castle-key-error{color:#e8705a;margin-top:8px;font-size:11px;line-height:1.4}.castle-key-row{color:#c8c8c8;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;display:flex}.castle-key-row button{color:#e8e8e8;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-key-row button:hover{background:#383838}.castle-key-login{margin-bottom:12px}.castle-key-signin{color:#e8e8e8;width:100%;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:9px 12px;font-size:13px;display:block}.castle-key-signin:hover{background:#383838}.castle-key-or{color:#7a7a7a;letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:10px;margin:14px 0;font-size:11px;display:flex}.castle-key-or:before,.castle-key-or:after{content:"";background:#3a3a3a;flex:1;height:1px}.castle-key-field-label{color:#c8c8c8;margin-bottom:6px;font-size:12px}.castle-key-url{color:#7aa2f7;word-break:break-all;-webkit-user-select:all;user-select:all;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;padding:8px 9px;font-size:11px;line-height:1.4;display:block}#chat-messages{scrollbar-width:none;-ms-overflow-style:none;flex-direction:column;flex:1 1 0;min-height:0;padding:0;font-size:14px;line-height:1.5;display:flex;overflow-y:auto}#chat-messages .chat-thread{opacity:0;flex-direction:column;transition:opacity .12s;display:flex}#chat-messages .chat-thread.ready{opacity:1}.shell-root.docked #chat-messages{-webkit-mask-image:linear-gradient(to bottom, var(--v2-gutter) calc(100% - var(--composer-reserve,88px)), transparent 100%);-webkit-mask-image:linear-gradient(to bottom, var(--v2-gutter) calc(100% - var(--composer-reserve,88px)), transparent 100%);mask-image:linear-gradient(to bottom, var(--v2-gutter) calc(100% - var(--composer-reserve,88px)), transparent 100%);padding:0}.shell-root.docked #chat-messages .chat-thread{padding-bottom:var(--composer-reserve,88px)}.shell-root.docked #chat-messages>:first-child{margin-top:auto}#chat-messages::-webkit-scrollbar{width:0;height:0}#chat-empty{color:var(--v2-muted)}#chat-host .msg{margin:5px 0}#chat-host .msg.user{text-align:right}#chat-host .msg.user span{background:var(--v2-white);color:var(--v2-ink);text-align:left;white-space:pre-wrap;word-break:break-word;border-radius:17px;max-width:85%;padding:7px 14px;display:inline-block}#chat-host .msg-image{border:1px solid var(--v2-border);border-radius:8px;max-width:220px;max-height:150px;margin:0 0 6px auto;display:block}#chat-host .assistant-turn{flex-direction:column;align-items:flex-start;gap:4px;margin:5px 0;display:flex}#chat-host .msg.assistant{background:var(--v2-accent);width:fit-content;color:var(--v2-white);word-break:break-word;border-radius:17px;max-width:85%;margin:0;padding:7px 14px}#chat-host .msg.assistant.errbubble{background:var(--v2-error-bg)}#chat-host .msg.assistant.streaming:after{content:"▌";opacity:.6;animation:1s step-end infinite chat-blink}@keyframes chat-blink{50%{opacity:0}}#chat-host .msg.toolline{color:var(--v2-muted);font-size:12px;font-family:var(--v2-mono);word-break:break-word;margin:4px 0}#chat-host .msg-activity{color:var(--v2-muted);font-size:12px;animation:1.4s ease-in-out infinite chat-pulse}@keyframes chat-pulse{50%{opacity:.35}}#chat-host .msg-interrupted,#chat-host .msg-error-detail{color:var(--v2-muted);font-size:12px}#chat-host .msg-error-detail summary{cursor:pointer;-webkit-user-select:none;user-select:none}#chat-host .msg-error-detail pre{background:var(--v2-overlay-scrim);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:160px;margin:4px 0 0;padding:6px 8px;font-size:11px;overflow-y:auto}#chat-host .msg-thinking{color:var(--v2-muted);font-size:12px}#chat-host div.msg-thinking,#chat-host .msg-thinking summary{align-items:center;gap:8px;display:flex}#chat-host .msg-thinking summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}#chat-host .msg-thinking summary::-webkit-details-marker{display:none}#chat-host .msg-thinking .thinking-caret{opacity:.7;border-top:4px solid #0000;border-bottom:4px solid #0000;border-left:5px solid;flex:none;width:0;height:0;transition:transform .12s}#chat-host .msg-thinking[open] .thinking-caret{transform:rotate(90deg)}#chat-host .msg-thinking .thinking-dots{gap:4px;display:inline-flex}#chat-host .msg-thinking .thinking-dots i{background:currentColor;border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite thinking-bounce}#chat-host .msg-thinking .thinking-dots i:nth-child(2){animation-delay:.18s}#chat-host .msg-thinking .thinking-dots i:nth-child(3){animation-delay:.36s}#chat-host .msg-thinking .thinking-dots+.thinking-label{animation:1.4s ease-in-out infinite chat-pulse}@keyframes thinking-bounce{0%,80%,to{opacity:.3;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}@media (prefers-reduced-motion:reduce){#chat-host .msg-thinking .thinking-dots i,#chat-host .msg-thinking .thinking-label{animation:none}#chat-host .msg-thinking .thinking-dots i{opacity:.6}}#chat-host .msg-thinking-body{background:var(--v2-overlay-scrim);color:var(--v2-muted);border-radius:6px;max-height:160px;padding:0 12px;font-size:12px;overflow-y:auto}#chat-host .msg.md>:first-child,#chat-host .task-notes>:first-child{margin-top:0}#chat-host .msg.md>:last-child,#chat-host .task-notes>:last-child{margin-bottom:0}#chat-host .msg.md p:empty{display:none}#chat-host .msg.md p,#chat-host .task-notes p{margin:.4em 0}#chat-host .msg.md ul,#chat-host .msg.md ol,#chat-host .task-notes ul,#chat-host .task-notes ol{margin:.4em 0;padding-left:1.3em}#chat-host .msg.md li{margin:.1em 0}#chat-host .msg.md h1,#chat-host .msg.md h2,#chat-host .msg.md h3{margin:.5em 0 .3em;font-weight:700;line-height:1.25}#chat-host .msg.md h1{font-size:1.2em}#chat-host .msg.md h2{font-size:1.12em}#chat-host .msg.md h3{font-size:1.05em}#chat-host .msg.md a{color:var(--v2-white);text-underline-offset:2px;text-decoration:underline}#chat-host .msg.md code,#chat-host .task-notes code{font-family:var(--v2-mono);background:var(--v2-overlay-code);border-radius:4px;padding:.1em .35em;font-size:.9em}#chat-host .msg.md pre{background:var(--v2-overlay-code-block);white-space:pre-wrap;word-break:break-word;font-family:var(--v2-mono);border-radius:8px;margin:.5em 0;padding:8px 10px;font-size:.9em;line-height:1.4;overflow-x:auto}#chat-host .msg.md pre code{background:0 0;border-radius:0;padding:0}#chat-host .msg.md blockquote{border-left:3px solid var(--v2-overlay-white-quote);color:var(--v2-overlay-white-dim);margin:.5em 0;padding-left:.8em}.shell-root.docked #chat-host .operator-inset{min-height:0;padding:0 var(--operator-pad);flex-direction:column;flex:1 1 0;display:flex;overflow:hidden}.shell-root.docked #chat-host .chat-divider{background:var(--v2-border);flex:0 0 1px}.task-stack{gap:5px;padding-top:10px}#task-board{border-bottom:1px solid var(--v2-border);scrollbar-width:thin;scrollbar-color:transparent transparent;flex-direction:column;flex:0 auto;max-height:40vh;padding-top:0;padding-bottom:12px;display:flex;overflow-y:auto}#task-board.scrolling{scrollbar-color:var(--v2-dim) transparent}#task-board::-webkit-scrollbar{width:6px}#task-board::-webkit-scrollbar-track{background:0 0}#task-board::-webkit-scrollbar-thumb{background:0 0;border-radius:3px;transition:background .25s}#task-board.scrolling::-webkit-scrollbar-thumb{background:var(--v2-dim)}#chat-host .task{cursor:pointer;border-radius:8px;transition:background .12s,box-shadow .12s}#chat-host .task:hover,#chat-host .task.open{background:var(--v2-overlay-task);box-shadow:inset 0 0 0 1px var(--v2-border)}#chat-host .task-row{align-items:center;gap:10px;padding:5px 6px 5px 4px;display:flex;position:relative}#chat-host .task.open .task-row{align-items:flex-start}#chat-host .pie{border-radius:50%;flex:0 0 32px;width:32px;height:32px;padding:2px;display:flex;position:relative}#chat-host .pie .avatar{background:var(--v2-raised);width:100%;height:100%;color:var(--v2-gutter);border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden}#chat-host .pie .avatar .avatar-icon-wrap{justify-content:center;align-items:center;width:16px;height:16px;display:flex}#chat-host .pie .avatar .avatar-icon-wrap svg{width:16px;height:16px;display:block}#chat-host .task-meta{flex:1;min-width:0}#chat-host .task-head{align-items:center;gap:8px;display:flex}#chat-host .task.open .task-head{min-height:32px}#chat-host .task-text{flex:1;min-width:0}#chat-host .task-name{color:var(--v2-fg);white-space:nowrap;text-overflow:ellipsis;font-size:12px;font-weight:400;overflow:hidden}#chat-host .task-name .tn{color:var(--v2-head);font-weight:600}#chat-host .task-sub{color:var(--v2-muted);white-space:nowrap;text-overflow:ellipsis;font-variant-numeric:tabular-nums;margin-top:2px;font-size:10px;overflow:hidden}#chat-host .task-dismiss{border:1px solid var(--v2-border);color:var(--v2-muted);font:inherit;cursor:pointer;visibility:hidden;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-size:12px}#chat-host .task-dismiss:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-host .task-board-header{z-index:1;background:var(--v2-gutter);border-bottom:1px solid var(--v2-border);justify-content:space-between;align-items:center;gap:8px;padding:10px 2px 8px;display:flex;position:sticky;top:0}#chat-host .task-board-heading{align-items:baseline;gap:8px;min-width:0;display:flex}#chat-host .task-board-title{color:var(--v2-fg);font-size:13px;font-weight:600}#chat-host .task-board-status{color:var(--v2-muted);font-size:12px}#chat-host .task-clear-completed{border:1px solid var(--v2-border);color:var(--v2-muted);font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-size:12px}#chat-host .task-clear-completed:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-host .task:hover .task-dismiss{visibility:visible}#chat-host .task-body{color:var(--v2-fg);padding:0 0 4px;font-size:12px;display:none}#chat-host .task.open .task-body{display:block}#chat-host .task-notes{color:var(--v2-secondary);word-break:break-word;margin-top:6px;font-size:12px}#chat-host .task-notes code{font-size:12px}#chat-host .task-playtest-frames{margin-top:8px}#chat-host .task-playtest-frames-label{color:var(--v2-muted);margin-bottom:4px;font-size:11px}#chat-host .task-playtest-frames-row{flex-wrap:wrap;gap:6px;display:flex}#chat-host .task-playtest-frame{object-fit:cover;border:1px solid var(--v2-border);background:var(--v2-ink);border-radius:4px;width:64px;height:90px;display:block}#chat-host .task-feed{scrollbar-width:none;-ms-overflow-style:none;max-height:96px;color:var(--v2-secondary);cursor:default;word-break:break-word;-webkit-mask-image:linear-gradient(to bottom, transparent, var(--v2-gutter) 5px, var(--v2-gutter) 100%);-webkit-mask-image:linear-gradient(to bottom, transparent, var(--v2-gutter) 5px, var(--v2-gutter) 100%);mask-image:linear-gradient(to bottom, transparent, var(--v2-gutter) 5px, var(--v2-gutter) 100%);margin-top:6px;font-size:12px;line-height:1.5;overflow-y:auto}#chat-host .task-feed::-webkit-scrollbar{width:0;height:0}#chat-host .task-feed-tool{color:var(--v2-muted);font-family:var(--v2-mono);white-space:pre-wrap;padding-left:14px;font-size:12px}#chat-host .task-feed-msg{margin:0}#chat-host .task-feed-msg>:first-child{margin-top:0}#chat-host .task-feed-msg>:last-child{margin-bottom:0}#chat-host .task-feed-msg p{margin:0}#chat-host .task-feed-msg code{background:var(--v2-overlay-feed-code);font-family:var(--v2-mono);border-radius:3px;padding:0 3px;font-size:12px}.chat-input{flex:none;padding:10px 10px 10px 60px}.shell-root.docked .chat-input{padding:0 var(--operator-pad) 10px 60px;pointer-events:none;z-index:6;position:absolute;bottom:0;left:0;right:0}.shell-root.docked .chat-input .ta,.shell-root.docked .chat-input .chat-queue{pointer-events:auto}.shell-root.docked #chat-pending{left:60px;right:var(--operator-pad);bottom:var(--composer-reserve,88px);z-index:6;pointer-events:auto;padding:0;position:absolute}#chat-host .chat-input .ta{background:var(--v2-surface);border:1px solid var(--v2-border);border-radius:var(--panel-chrome-radius);flex-direction:column;gap:6px;width:100%;min-height:60px;padding:8px 4px;transition:width .3s cubic-bezier(.4,0,.2,1),height .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1),padding .3s cubic-bezier(.4,0,.2,1),opacity .18s,transform .18s;display:flex;overflow:hidden}#chat-input{width:100%;min-height:21px;color:var(--v2-fg);font:inherit;resize:none;scrollbar-width:none;-ms-overflow-style:none;background:0 0;border:none;outline:none;max-height:120px;padding:0 6px;font-size:14px;line-height:1.5;display:block;overflow-y:auto}#chat-input::-webkit-scrollbar{width:0;height:0}#chat-input::placeholder{color:var(--v2-muted)}#chat-host .chat-input .ta-bottom{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}#chat-host .composer-settings{flex:auto;min-width:0}#chat-host .composer-pill{max-width:100%;height:26px;color:var(--v2-dim);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:5px;padding:0 6px;font-size:12px;display:inline-flex}#chat-host .composer-pill:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-host .composer-pill.usage-warn{color:var(--v2-warn)}#chat-host .composer-pill.usage-blocked{color:var(--v2-error)}#chat-host .composer-pill-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}#chat-host .composer-pill svg{flex-shrink:0;display:block}#chat-host .composer-pill .mode-caret{opacity:.7}#chat-send{width:26px;height:26px;color:var(--v2-muted);border:1px solid var(--v2-border);cursor:pointer;background:0 0;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-right:6px;padding:0;display:flex}#chat-send:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-send svg{display:block}#chat-pending{flex:none;gap:6px;padding:10px 10px 0;display:flex}#chat-pending img{border:1px solid var(--v2-border);cursor:pointer;border-radius:6px;height:44px}#chat-host .chat-input .chat-queue{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}#chat-host .chat-input .queue-row{background:var(--v2-gutter);border:1px dashed var(--v2-border);color:var(--v2-muted);border-radius:8px;align-items:center;gap:8px;padding:5px 6px 5px 12px;font-size:12px;display:flex}#chat-host .chat-input .queue-snippet{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}#chat-host .chat-input .queue-send-now{border:1px solid var(--v2-border);color:var(--v2-muted);font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex-shrink:0;padding:2px 8px;font-size:11px}#chat-host .chat-input .queue-send-now:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-host .chat-input .queue-remove{width:20px;height:20px;color:var(--v2-muted);cursor:pointer;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:11px;display:flex}#chat-host .chat-input .queue-remove:hover{color:var(--v2-fg);background:var(--v2-hover)}#chat-send.stop{color:var(--v2-fg);border-color:var(--v2-fg)}#chat-send.stop:hover{color:var(--v2-ink);background:var(--v2-fg)}#chat-send:disabled{opacity:.45;cursor:default}#chat-send:disabled:hover{color:var(--v2-muted);background:0 0}#chat-host .picker{background:var(--v2-surface);border:1px dashed var(--v2-border);border-radius:12px;flex-direction:column;align-self:flex-start;gap:12px;width:100%;max-width:100%;margin:4px 0;padding:12px;display:flex}#chat-host .picker-locked{opacity:.72}#chat-host .picker-q{border:none;min-width:0;margin:0;padding:0}#chat-host .picker-q-label{color:var(--v2-head);margin:0 0 6px;padding:0;font-size:13px;font-weight:600}#chat-host .picker-options{flex-wrap:wrap;gap:6px;display:flex}#chat-host .picker-option{background:var(--v2-gutter);border:1px solid var(--v2-border);color:var(--v2-fg);cursor:pointer;border-radius:12px 12px 4px;align-items:center;gap:6px;padding:5px 10px;font-size:13px;line-height:1.3;display:inline-flex}#chat-host .picker:not(.picker-locked) .picker-option:hover{border-color:var(--v2-accent)}#chat-host .picker-option.is-checked{background:var(--v2-accent);border-color:var(--v2-accent);color:var(--v2-white)}#chat-host .picker-option input{accent-color:var(--v2-accent);cursor:inherit;margin:0}#chat-host .picker-locked .picker-option{cursor:default}#chat-host .picker-actions{justify-content:flex-end;display:flex}#chat-host .picker-submit{font:inherit;background:var(--v2-accent);color:var(--v2-white);border:1px solid var(--v2-accent);cursor:pointer;border-radius:8px;padding:6px 16px;font-size:13px}#chat-host .picker-submit:hover{background:var(--v2-accent-hover)}#chat-host .picker-skeleton{pointer-events:none}#chat-host .picker-skeleton-hint{color:var(--v2-muted);letter-spacing:.01em;font-size:12px}#chat-host .picker-skeleton-line,#chat-host .picker-skeleton-chip{background:linear-gradient(90deg, var(--v2-border) 0%, var(--v2-border) 50%, var(--v2-border) 100%);background-size:200% 100%;border-radius:6px;animation:1.3s ease-in-out infinite picker-shimmer;display:block}#chat-host .picker-skeleton-label{width:60%;height:11px;margin-bottom:8px}#chat-host .picker-skeleton-chip{border-radius:12px 12px 4px;height:26px}@keyframes picker-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){#chat-host .picker-skeleton-line,#chat-host .picker-skeleton-chip{animation:none}}.xterm,.xterm-viewport,.xterm-screen,.xterm-helpers{background-color:#0000!important}.xterm{overscroll-behavior:contain}.xterm-viewport{overscroll-behavior:contain;scrollbar-width:none;-ms-overflow-style:none}.xterm-viewport::-webkit-scrollbar{width:0;height:0}.xterm .xterm-scrollable-element>.scrollbar,.xterm .xterm-scrollable-element>.scrollbar.visible,.xterm .xterm-scrollable-element>.visible.scrollbar,.xterm .xterm-scrollable-element>.invisible.scrollbar,.xterm .xterm-scrollable-element>.xterm-scrollbar{opacity:0!important;pointer-events:none!important;width:0!important;min-width:0!important;height:0!important;min-height:0!important;display:none!important}.xterm .xterm-scrollable-element>.scrollbar>.slider,.xterm .xterm-scrollable-element>.scrollbar>.scra,.xterm .xterm-scrollable-element>.xterm-scrollbar>.xterm-slider{width:0!important;height:0!important;display:none!important}.xterm .xterm-scrollable-element>.shadow{display:none!important}.quick-open-backdrop{z-index:2147483100;justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}.quick-open{background:#232323;border:1px solid #3a3a3a;border-radius:8px;flex-direction:column;width:min(600px,90vw);max-height:60vh;display:flex;overflow:hidden;box-shadow:0 16px 48px #0009}.quick-open-input{color:#f0f0f0;background:#161616;border:1px solid #4a4a4a;border-radius:5px;outline:none;flex:none;margin:8px;padding:8px 10px;font-size:14px}.quick-open-input:focus{border-color:#5a8bd6}.quick-open-list{flex:auto;padding:4px;overflow-y:auto}.quick-open-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:baseline;gap:8px;width:100%;padding:5px 8px;font-size:13px;display:flex}.quick-open-item.active{background:#37506f}.quick-open-name{white-space:nowrap;flex:none}.quick-open-dir{text-overflow:ellipsis;white-space:nowrap;color:#8a8a8a;flex:auto;min-width:0;font-size:12px;overflow:hidden}.quick-open-empty{color:#8a8a8a;text-align:center;padding:12px;font-size:13px}.quick-open-keys{color:#b0b0b0;white-space:nowrap;border:1px solid #4a4a4a;border-radius:4px;flex:none;margin-left:8px;padding:1px 6px;font-family:SFMono-Regular,Consolas,monospace;font-size:11px}.chord-hint{z-index:2147483200;color:#c7c7c7;background:#232323;border:1px solid #3a3a3a;border-radius:8px;align-items:center;gap:8px;padding:6px 12px;font-size:12px;display:flex;position:fixed;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #0000008c}.chord-hint kbd{color:#f0f0f0;background:#333;border:1px solid #4a4a4a;border-radius:4px;padding:2px 7px;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}@media (pointer:coarse){input,textarea,select,[contenteditable]:not(.cm-content){font-size:16px!important}}