cardbuddy 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +17 -2
  2. package/dist/cli.js +3 -0
  3. package/dist/config.js +7 -0
  4. package/dist/portGuard.js +293 -0
  5. package/dist/preview-editor/assets/index-C_UKS0NF.css +1 -0
  6. package/dist/preview-editor/assets/index-D1iIJ4sl.js +81 -0
  7. package/dist/preview-editor/index.html +2 -2
  8. package/dist/server-core/assetProxy.js +3 -22
  9. package/dist/server-core/buildDataFromSchema.js +36 -4
  10. package/dist/server-core/cardListCache.js +0 -17
  11. package/dist/server-core/index.js +3 -5
  12. package/dist/server-core/logStream.js +1 -6
  13. package/dist/standalone.js +24 -8
  14. package/dist/vendored/App.vue +187 -77
  15. package/dist/vendored/components/ComponentPalette.vue +1 -1
  16. package/dist/vendored/components/DebugPanel.vue +737 -91
  17. package/dist/vendored/components/NumberStepper.vue +125 -0
  18. package/dist/vendored/components/ProgressSlider.vue +9 -1
  19. package/dist/vendored/components/StructureTree.vue +2 -2
  20. package/dist/vendored/runtime/clipboard-node.js +0 -5
  21. package/dist/vendored/styles/app.css +707 -252
  22. package/dist/vendored/styles/card-gallery.css +3 -3
  23. package/dist/vendored/styles/card-select.css +13 -6
  24. package/dist/vendored/styles/dropdown.css +1 -2
  25. package/dist/vendored/styles/json-tree.css +3 -3
  26. package/dist/vendored/styles/node-inspector.css +7 -294
  27. package/dist/vendored/styles/setters.css +48 -49
  28. package/dist/vendored/styles/structure-tree.css +6 -11
  29. package/package.json +1 -1
  30. package/dist/preview-editor/assets/index-CrcrVs4F.css +0 -1
  31. package/dist/preview-editor/assets/index-DnpHHKWl.js +0 -80
  32. package/dist/vendored/assets/logo.png +0 -0
package/README.md CHANGED
@@ -66,6 +66,7 @@ cardbuddy --preview # 等价短参 -p
66
66
  | --- | --- | --- |
67
67
  | `DSL_CARD_ROOT` | 当前目录 (`cwd`) | 卡片代码仓库根(含 `src/cards`)。可用环境变量二次覆盖。 |
68
68
  | `DSL_DEV_PORT` | `8787` | 本地服务监听端口。 |
69
+ | `DSL_DEV_PORT_TAKEOVER` | `auto` | 端口被占用时的接管策略:`auto` 自动结束占用该端口的旧 cardbuddy 实例后启动;`force` 连无关进程一并结束;`off` 关闭前置检查(退回原生 `EADDRINUSE` 报错)。 |
69
70
  | `EDITOR_URL` | `http://127.0.0.1:5180` | 截图自访问的编辑器实例地址(默认指向本地编辑器)。写入 `.env` 即可持久化。 |
70
71
  | `DSL_DEV_TOKEN` | _(空)_ | 可选鉴权令牌;开启后请求须带 `x-dev-token` 头。默认仅靠 `127.0.0.1` 绑定(不暴露局域网)。 |
71
72
  | `DSL_DEV_HTTPS` | `0` | 设为 `1` 启用自签 HTTPS(兜底旧 Safari / 企业策略的混合内容拦截)。 |
@@ -76,6 +77,20 @@ cardbuddy --preview # 等价短参 -p
76
77
 
77
78
  ---
78
79
 
80
+ ## 端口被占用时自动接管
81
+
82
+ 启动前先探测 `DSL_DEV_PORT`:若被**上一个 cardbuddy 实例**占用(终端直接关掉、`Ctrl+C` 漏杀、后台残留等),
83
+ 自动 `SIGTERM`(宽限 2.5s 后升级 `SIGKILL`)结束旧进程、等端口真正释放,再继续启动,免去手动
84
+ `lsof -ti tcp:8787 | xargs kill`。
85
+
86
+ 判定「占用者是本服务」有两条依据:HTTP 探测 `/__cards` 返回 cardbuddy 响应体(`{ cards: [...] }` 或 token 鉴权 403),
87
+ 或占用进程命令行含 `cardbuddy` / `dsl-card` 字样。**无关进程占着端口时不会动手**,而是直接报错并给出手动处理命令;
88
+ 确需强制接管设 `DSL_DEV_PORT_TAKEOVER=force`。
89
+
90
+ 跨平台:macOS / Linux 用 `lsof` 定位 PID(缺失时回退 `ss`),Windows 用 `netstat -ano` + `taskkill /T /F`。
91
+
92
+ ---
93
+
79
94
  ## HTTPS 模式(混合内容兜底)
80
95
 
81
96
  默认本服务跑在 `http://127.0.0.1:8787`。当公网编辑器是 **HTTPS** 时,浏览器可能因「混合内容(Mixed Content)」或「私有网络访问(PNA)」策略拦截对 `http://127.0.0.1` 的跨源请求。现代 **Chrome / Firefox** 对回环地址(127.0.0.1 / localhost)豁免混合内容,默认即可用;但 **Safari** 等更严格的环境会拦截,此时启用 HTTPS 模式:
@@ -168,7 +183,7 @@ DSL_DEV_HTTPS=1 cardbuddy
168
183
 
169
184
  | 命令 | 编辑器来源 | 后端来源 | 用途 |
170
185
  | --- | --- | --- | --- |
171
- | `npm run dev` | `preview/` 源码(Vite dev + HMR) | Vite 插件同源挂载(5180) | 日常改编辑器 / 卡片(同域,**不**走生产跨域链路) |
186
+ | `npm run dev` | `preview/` 源码(Vite dev + HMR,5180) | `cardbuddy` 服务(8787,由 `tools/dev.mjs` 同起) | 日常改编辑器 / 卡片 |
172
187
  | `npm run dev:prod` | `dist/` **构建产物**(`vite preview`) | `cardbuddy` 服务(8787) | 部署前权威跨域 smoke test(最贴近生产) |
173
188
  | 部署公网 | `dist/` 静态托管(CDN) | 用户本机起 8787 | 生产环境 |
174
189
 
@@ -182,7 +197,7 @@ npm run dev
182
197
  # 浏览器打开 http://localhost:5180
183
198
  ```
184
199
 
185
- `/__cards` `/__card/:id` `/__render-status` `/__node-models` 等后端端点由 Vite 插件 `server/cardServer.js` **同源挂载**,编辑器前端直接同源调用,无需单独起服务。
200
+ `/__cards` `/__card/:id` `/__render-status` `/__node-models` 等后端端点全部由 `cardbuddy`(8787)提供:`server/core` 的中间件经 `mountCoreMiddlewares` 挂到它的 connect 实例,Vite 不承载任何后端插件。编辑器前端在 DEV 下经 `resolveApiBase()` 默认直连 `http://127.0.0.1:8787`(用非回环地址打开时走 `vite.config.mjs` 的 `cardDevProxy` 同源兜底,规避浏览器私有网络访问限制)。
186
201
 
187
202
  ### 模式二:开发期顺手看跨域(可选)
188
203
 
package/dist/cli.js CHANGED
@@ -50,6 +50,9 @@ if (args.includes('--help') || args.includes('-h')) {
50
50
  DSL_DEV_TOKEN 可选鉴权 token
51
51
  DSL_DEV_PREVIEW=1 等价于 --preview
52
52
  DSL_PREVIEW_ROOT 自定义 preview 前端构建产物目录(默认包内 dist/preview-editor,回退 cwd/dist)
53
+ DSL_DEV_PORT_TAKEOVER=auto|force|off
54
+ 端口被占用时的接管策略。auto(默认)自动结束占用端口的旧 cardbuddy 实例后启动;
55
+ force 连无关进程一并结束;off 关闭前置检查(退回原生 EADDRINUSE 报错)
53
56
 
54
57
  已废弃别名(仍生效):--offline / -o、DSL_DEV_OFFLINE、DSL_OFFLINE_ROOT
55
58
  `)
package/dist/config.js CHANGED
@@ -29,6 +29,12 @@ export function loadConfig(env = process.env) {
29
29
  const truthy = (value) => value === '1' || value === 'true'
30
30
  const preview = truthy(env.DSL_DEV_PREVIEW) || truthy(env.DSL_DEV_OFFLINE)
31
31
  const previewRoot = env.DSL_PREVIEW_ROOT || env.DSL_OFFLINE_ROOT || ''
32
+ // 端口接管策略:启动时若目标端口已被「上一个 cardbuddy 实例」占用,主动结束旧进程再接管,
33
+ // 免去手动 lsof + kill(详见 src/portGuard.js)。
34
+ // auto(默认)只结束能确认是本服务的进程;force 连无关进程一并结束;off 关闭前置检查,
35
+ // 退回原生 EADDRINUSE 行为。
36
+ const takeover = String(env.DSL_DEV_PORT_TAKEOVER || 'auto').toLowerCase()
37
+ const portTakeover = ['auto', 'force', 'off'].includes(takeover) ? takeover : 'auto'
32
38
  // FinMall 远端站点基址:资源代理(createAssetProxyMiddleware)回源用。
33
39
  // 由 .env.finmall 的 FINMALL_BASE_URL 经启动器(tools/dev.mjs / prod-preview.mjs)
34
40
  // 注入到本进程 env;缺省空串表示不回源(/minio 等只走占位图兜底)。
@@ -44,6 +50,7 @@ export function loadConfig(env = process.env) {
44
50
  preview,
45
51
  previewRoot,
46
52
  upstream,
53
+ portTakeover,
47
54
  // 包内 vendored 运行时快照(build 阶段从 preview/ 复制到 dist/vendored):SSR 端点
48
55
  // 所需的编辑器运行时(components/* + runtime/*)全量快照,使发布后无需消费者持有编辑器源码。
49
56
  // - 源码运行(src/cli.js,__dirname=.../src):此处指向 .../src/vendored(不存在)→
@@ -0,0 +1,293 @@
1
+ /**
2
+ * 端口占用守卫 —— cardbuddy 启动前置检查。
3
+ *
4
+ * 背景:编辑器 / dev 启动器重启时,上一个 cardbuddy 进程偶尔不会被回收干净(终端直接关掉、
5
+ * Ctrl+C 漏杀、后台残留等),新实例便以 EADDRINUSE 直接启动失败,开发者只能手动
6
+ * `lsof -ti tcp:8787 | xargs kill`。这里把这套动作内置进启动流程:
7
+ * 探测端口 → 定位占用进程 → 确认是本服务 → SIGTERM(宽限期后 SIGKILL)→ 等端口真正释放。
8
+ *
9
+ * 安全边界:默认(mode='auto')只结束「能确认是 cardbuddy」的进程 —— HTTP 探测 /__cards 命中
10
+ * 本服务响应,或命令行含 cardbuddy / dsl-card 字样;占用者是无关进程时不动手,直接报错并给出
11
+ * 手动处理命令。确需强制接管用 DSL_DEV_PORT_TAKEOVER=force,完全关闭前置检查用 off。
12
+ *
13
+ * 跨平台:macOS / Linux 走 lsof(缺失时回退 ss),Windows 走 netstat -ano + taskkill。
14
+ */
15
+ import net from 'node:net'
16
+ import http from 'node:http'
17
+ import https from 'node:https'
18
+ import { execFile } from 'node:child_process'
19
+ import { promisify } from 'node:util'
20
+ import chalk from 'chalk'
21
+
22
+ const execFileAsync = promisify(execFile)
23
+
24
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
25
+
26
+ /** 命令行特征:命中即认为是本服务(覆盖 npx cardbuddy、node .../packages/cardbuddy/src/cli.js 等启动形态)。 */
27
+ const OWN_COMMAND_RE = /cardbuddy|dsl-card/i
28
+
29
+ const POLL_INTERVAL_MS = 120
30
+ const TERM_GRACE_MS = 2500
31
+ const KILL_GRACE_MS = 2000
32
+ const PROBE_TIMEOUT_MS = 900
33
+
34
+ /** 执行外部命令;失败(含 lsof 无匹配时的退出码 1)一律退化为空输出,由调用方按「没找到」处理。 */
35
+ async function tryExec(cmd, args) {
36
+ try {
37
+ const { stdout } = await execFileAsync(cmd, args, { windowsHide: true, timeout: 5000 })
38
+ return String(stdout || '')
39
+ } catch (err) {
40
+ return String(err?.stdout || '')
41
+ }
42
+ }
43
+
44
+ /** 试绑端口判断是否空闲:比 TCP connect 更贴近「我到底能不能 listen」这个真实问题。 */
45
+ export function probePort(port, host = '127.0.0.1') {
46
+ return new Promise((resolve) => {
47
+ const tester = net.createServer()
48
+ tester.once('error', (err) => resolve({ free: false, code: err?.code || 'ERROR' }))
49
+ tester.once('listening', () => tester.close(() => resolve({ free: true, code: null })))
50
+ tester.listen(port, host)
51
+ })
52
+ }
53
+
54
+ function manualHint(port) {
55
+ return process.platform === 'win32'
56
+ ? `netstat -ano | findstr :${port} → taskkill /PID <pid> /F`
57
+ : `lsof -ti tcp:${port} | xargs kill -9`
58
+ }
59
+
60
+ /** Windows:解析 `netstat -ano -p TCP` 的 LISTENING 行。 */
61
+ export function parseWindowsNetstat(stdout, port) {
62
+ const pids = new Set()
63
+ for (const line of String(stdout).split(/\r?\n/)) {
64
+ const cols = line.trim().split(/\s+/)
65
+ if (cols.length < 5 || cols[0].toUpperCase() !== 'TCP') continue
66
+ if (!cols[1].endsWith(`:${port}`) || !/LISTENING/i.test(cols[3])) continue
67
+ const pid = Number(cols[4])
68
+ if (Number.isInteger(pid) && pid > 0) pids.add(pid)
69
+ }
70
+ return [...pids]
71
+ }
72
+
73
+ /** Linux 回退(无 lsof 时):解析 `ss -ltnp` 的 users:(("node",pid=1234,fd=23))。 */
74
+ export function parseSs(stdout, port) {
75
+ const pids = new Set()
76
+ for (const line of String(stdout).split(/\r?\n/)) {
77
+ const cols = line.trim().split(/\s+/)
78
+ if (cols.length < 4 || !/LISTEN/i.test(cols[0])) continue
79
+ if (!cols[3].endsWith(`:${port}`)) continue
80
+ for (const m of line.matchAll(/pid=(\d+)/g)) pids.add(Number(m[1]))
81
+ }
82
+ return [...pids]
83
+ }
84
+
85
+ /** 定位监听该端口的进程 pid(已排除本进程)。 */
86
+ export async function findListenerPids(port) {
87
+ let pids = []
88
+ if (process.platform === 'win32') {
89
+ pids = parseWindowsNetstat(await tryExec('netstat', ['-ano', '-p', 'TCP']), port)
90
+ } else {
91
+ pids = String(await tryExec('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t']))
92
+ .split(/\s+/)
93
+ .map(Number)
94
+ .filter((n) => Number.isInteger(n) && n > 0)
95
+ if (!pids.length) pids = parseSs(await tryExec('ss', ['-ltnp']), port)
96
+ }
97
+ return [...new Set(pids)].filter((pid) => pid !== process.pid)
98
+ }
99
+
100
+ /** 取进程命令行:既用于日志,也是「是不是本服务」的兜底判据。 */
101
+ export async function readProcessCommand(pid) {
102
+ if (process.platform === 'win32') {
103
+ const out = await tryExec('powershell', [
104
+ '-NoProfile',
105
+ '-Command',
106
+ `(Get-CimInstance Win32_Process -Filter 'ProcessId=${pid}').CommandLine`,
107
+ ])
108
+ const line = out.trim().split(/\r?\n/).filter(Boolean).pop()
109
+ if (line) return line
110
+ const csv = await tryExec('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'])
111
+ return csv.split('","')[0].replace(/"/g, '').trim()
112
+ }
113
+ const out = await tryExec('ps', ['-p', String(pid), '-o', 'command='])
114
+ return out.trim().split(/\r?\n/)[0] || ''
115
+ }
116
+
117
+ export async function findPortOwners(port) {
118
+ const owners = []
119
+ for (const pid of await findListenerPids(port)) {
120
+ owners.push({ pid, command: await readProcessCommand(pid) })
121
+ }
122
+ return owners
123
+ }
124
+
125
+ /** 判定响应是否来自 cardbuddy:/__cards 的 { cards: [...] },或 token 鉴权失败的 403。 */
126
+ export function classifyProbe(status, body) {
127
+ const text = String(body || '')
128
+ if (status === 403 && /x-dev-token/i.test(text)) return { ours: true, detail: 'token 鉴权 403' }
129
+ if (status !== 200) return { ours: false, detail: `HTTP ${status}` }
130
+ try {
131
+ const json = JSON.parse(text)
132
+ if (json && Array.isArray(json.cards)) return { ours: true, detail: `${json.cards.length} 张卡片` }
133
+ } catch {
134
+ /* 非 JSON:不是本服务 */
135
+ }
136
+ return { ours: false, detail: 'HTTP 200(非 cardbuddy 响应)' }
137
+ }
138
+
139
+ function probeOnce(client, port, token, timeout) {
140
+ return new Promise((resolve) => {
141
+ const req = client.get(
142
+ {
143
+ host: '127.0.0.1',
144
+ port,
145
+ path: '/__cards',
146
+ timeout,
147
+ rejectUnauthorized: false,
148
+ headers: token ? { 'x-dev-token': token } : {},
149
+ },
150
+ (res) => {
151
+ let body = ''
152
+ res.setEncoding('utf8')
153
+ res.on('data', (chunk) => {
154
+ body += chunk
155
+ if (body.length > 256 * 1024) req.destroy()
156
+ })
157
+ res.on('end', () => resolve(classifyProbe(res.statusCode, body)))
158
+ res.on('error', () => resolve(null))
159
+ }
160
+ )
161
+ req.on('timeout', () => {
162
+ req.destroy()
163
+ resolve(null)
164
+ })
165
+ req.on('error', () => resolve(null))
166
+ })
167
+ }
168
+
169
+ /** 探测端口上的服务是不是 cardbuddy:先按本次启动的协议试,再试另一种(旧实例可能协议不同)。 */
170
+ export async function probeService(port, { token = '', tls = false, timeout = PROBE_TIMEOUT_MS } = {}) {
171
+ let foreign = null
172
+ for (const client of tls ? [https, http] : [http, https]) {
173
+ const hit = await probeOnce(client, port, token, timeout)
174
+ if (hit?.ours) return hit
175
+ if (hit && !foreign) foreign = hit
176
+ }
177
+ return foreign || { ours: false, detail: '无有效响应' }
178
+ }
179
+
180
+ function isAlive(pid) {
181
+ try {
182
+ process.kill(pid, 0)
183
+ return true
184
+ } catch (err) {
185
+ return err?.code === 'EPERM'
186
+ }
187
+ }
188
+
189
+ /** 结束进程:POSIX 走信号(SIGTERM 给旧实例一次优雅关闭的机会),Windows 走 taskkill /T /F。 */
190
+ async function terminate(pid, sig) {
191
+ if (process.platform === 'win32') {
192
+ await tryExec('taskkill', ['/PID', String(pid), '/T', '/F'])
193
+ return
194
+ }
195
+ try {
196
+ process.kill(pid, sig)
197
+ } catch {
198
+ /* ESRCH:已经退出 */
199
+ }
200
+ }
201
+
202
+ async function waitForPortFree(port, host, budgetMs) {
203
+ const deadline = Date.now() + budgetMs
204
+ for (;;) {
205
+ const { free } = await probePort(port, host)
206
+ if (free) return true
207
+ if (Date.now() >= deadline) return false
208
+ await sleep(POLL_INTERVAL_MS)
209
+ }
210
+ }
211
+
212
+ async function terminateOwner(owner, { port, host, log }) {
213
+ await terminate(owner.pid, 'SIGTERM')
214
+ let freed = await waitForPortFree(port, host, TERM_GRACE_MS)
215
+ if (!freed && isAlive(owner.pid)) {
216
+ log(chalk.dim(`PID ${owner.pid} 在 ${TERM_GRACE_MS}ms 内未退出,升级为 SIGKILL …`))
217
+ await terminate(owner.pid, 'SIGKILL')
218
+ freed = await waitForPortFree(port, host, KILL_GRACE_MS)
219
+ }
220
+ if (!freed) {
221
+ throw new Error(`无法释放端口 ${port}(PID ${owner.pid} 仍占用)。手动排查:${manualHint(port)}`)
222
+ }
223
+ log(chalk.green(`旧进程 PID ${owner.pid} 已结束,端口 ${port} 已释放。`))
224
+ }
225
+
226
+ /**
227
+ * 确保端口可用;被旧的 cardbuddy 实例占用时主动结束它。
228
+ *
229
+ * @param {object} opts
230
+ * @param {number} opts.port 目标端口
231
+ * @param {string} [opts.host] 绑定地址(默认 127.0.0.1)
232
+ * @param {boolean} [opts.tls] 本次是否以 HTTPS 启动(决定探测顺序)
233
+ * @param {string} [opts.token] DSL_DEV_TOKEN,探测时带上
234
+ * @param {'auto'|'force'|'off'} [opts.mode] 接管策略(DSL_DEV_PORT_TAKEOVER)
235
+ * @param {(msg: string) => void} [opts.log] 日志输出
236
+ * @returns {Promise<{ freed: Array<{pid:number,command:string}>, skipped: Array<{pid:number,command:string}> }>}
237
+ */
238
+ export async function ensurePortFree({
239
+ port,
240
+ host = '127.0.0.1',
241
+ tls = false,
242
+ token = '',
243
+ mode = 'auto',
244
+ log = (msg) => console.log(msg),
245
+ }) {
246
+ const result = { freed: [], skipped: [] }
247
+ if (mode === 'off') return result
248
+
249
+ const before = await probePort(port, host)
250
+ if (before.free) return result
251
+ if (before.code !== 'EADDRINUSE') {
252
+ throw new Error(`端口 ${port} 无法绑定(${before.code})。请检查权限,或用 FINMALL_CARD_PORT 换一个端口。`)
253
+ }
254
+
255
+ const owners = await findPortOwners(port)
256
+ if (!owners.length) {
257
+ throw new Error(`端口 ${port} 已被占用,但未能定位占用进程。手动排查:${manualHint(port)}`)
258
+ }
259
+
260
+ const identity = await probeService(port, { token, tls })
261
+ for (const owner of owners) {
262
+ const ours = identity.ours || OWN_COMMAND_RE.test(owner.command || '')
263
+ if (!ours && mode !== 'force') {
264
+ result.skipped.push(owner)
265
+ continue
266
+ }
267
+ log(
268
+ chalk.yellow(`端口 ${port} 已被占用`) +
269
+ chalk.dim(` → PID ${owner.pid}${owner.command ? ` ${owner.command}` : ''}`) +
270
+ chalk.dim(
271
+ ours
272
+ ? `(cardbuddy 旧实例${identity.ours ? `,${identity.detail}` : ''}),正在结束并接管…`
273
+ : '(非 cardbuddy 进程,force 接管)'
274
+ )
275
+ )
276
+ await terminateOwner(owner, { port, host, log })
277
+ result.freed.push(owner)
278
+ }
279
+
280
+ if (result.skipped.length) {
281
+ const list = result.skipped.map((o) => `PID ${o.pid}${o.command ? ` — ${o.command}` : ''}`).join('\n ')
282
+ throw new Error(
283
+ `端口 ${port} 被非 cardbuddy 进程占用,未自动结束:\n ${list}\n` +
284
+ `请手动处理(${manualHint(port)}),或用 FINMALL_CARD_PORT 换端口;确需强制接管设 DSL_DEV_PORT_TAKEOVER=force。`
285
+ )
286
+ }
287
+
288
+ const after = await probePort(port, host)
289
+ if (!after.free) {
290
+ throw new Error(`结束旧进程后端口 ${port} 仍被占用(${after.code})。手动排查:${manualHint(port)}`)
291
+ }
292
+ return result
293
+ }
@@ -0,0 +1 @@
1
+ .ce_map_view[data-v-b297e8af]{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%;min-height:160px;position:relative}.ce_map_grid[data-v-b297e8af]{width:100%;height:100%;position:absolute;inset:0}.ce_map_center[data-v-b297e8af]{pointer-events:none;flex-direction:column;align-items:center;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.ce_map_pin[data-v-b297e8af]{filter:drop-shadow(0 2px 3px #00000040)}.ce_map_markname[data-v-b297e8af]{color:#333;white-space:nowrap;text-overflow:ellipsis;background:#ffffffe6;border-radius:4px;max-width:160px;margin-top:2px;padding:2px 6px;font-size:12px;line-height:1.3;overflow:hidden}.ce_multicolumn[data-v-cc3a8cee]{box-sizing:border-box;min-height:24px}.cp__mask[data-v-c3355a9a]{background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));z-index:var(--z-modal);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.cp[data-v-c3355a9a]{background:var(--bg-panel);border:1px solid var(--border-strong);border-radius:var(--radius-lg);width:560px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);box-shadow:var(--shadow-4);color:var(--text);flex-direction:column;display:flex;overflow:hidden}.cp__head[data-v-c3355a9a]{border-bottom:var(--hairline) solid var(--border);align-items:center;gap:10px;padding:10px 16px;display:flex}.cp__title[data-v-c3355a9a]{font-size:13px;font-weight:600}.cp__hint[data-v-c3355a9a]{color:var(--text-faint);font-size:11px}.cp__close[data-v-c3355a9a]{width:22px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;margin-left:auto;padding:0;font-size:15px;line-height:1;transition:background .15s,color .15s;display:inline-flex}.cp__close[data-v-c3355a9a]:hover{background:var(--bg-hover);color:var(--text)}.cp__body[data-v-c3355a9a]{padding:10px 16px 16px;overflow-y:auto}.cp__group[data-v-c3355a9a]{margin-top:10px}.cp__group-title[data-v-c3355a9a]{color:var(--text-faint);letter-spacing:.04em;margin:0 0 6px;font-size:11px;font-weight:600}.cp__grid[data-v-c3355a9a]{grid-template-columns:repeat(4,1fr);gap:6px;display:grid}.cp__item[data-v-c3355a9a]{border:1px solid var(--border);cursor:pointer;color:var(--text);background:0 0;border-radius:6px;flex-direction:column;align-items:center;gap:4px;padding:8px 6px;transition:border-color .15s,background .15s;display:flex}.cp__item[data-v-c3355a9a]:hover{border-color:var(--accent-border);background:var(--accent-soft)}.cp__avatar[data-v-c3355a9a]{width:28px;height:28px;color:var(--text-dim);background:var(--bg-hover);border-radius:6px;justify-content:center;align-items:center;font-size:15px;font-weight:600;display:flex}.cp__avatar[data-g=layout][data-v-c3355a9a]{color:var(--accent);background:var(--accent-soft)}.cp__avatar[data-g=basic][data-v-c3355a9a]{color:var(--ok);background:var(--ok-soft)}.cp__avatar svg[data-v-c3355a9a]{width:18px;height:18px;display:block}.cp__avatar-text[data-v-c3355a9a]{justify-content:center;align-items:center;width:18px;height:18px;font-size:13px;font-weight:600;display:flex}.cp__item-name[data-v-c3355a9a]{text-align:center;font-size:12px;line-height:1.2}.cp__item-class[data-v-c3355a9a]{color:var(--text-faint);font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:10px}.cp__search[data-v-c3355a9a]{box-sizing:border-box;width:100%;height:28px;color:var(--text);background:var(--bg-input);border:1px solid var(--border);border-radius:6px;outline:none;margin-bottom:10px;padding:0 8px;font-size:12px}.cp__search[data-v-c3355a9a]:focus{border-color:var(--accent)}.cp__empty[data-v-c3355a9a]{color:var(--text-faint);text-align:center;margin:8px 0;font-size:12px}.ce_divider{background-color:#00000026;width:100%;height:1px}.ce_image{aspect-ratio:16/9;display:flex}.ce_image_fill{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%}.ce_input{border:0;width:100%}.ce_input:focus{outline:none}.ce_text{text-overflow:ellipsis;box-orient:vertical;word-wrap:break-word;word-break:break-all;white-space:pre-line;text-align:left;-webkit-box-orient:vertical;width:fit-content;display:-webkit-box;display:-ms-flexbox;overflow:hidden}.ce_multitext{width:fit-content;display:flex}.ce_svgsymbols,.ce_svgcode{fill:#000;width:100%;height:100%}.ce_svgcode svg{width:100%;height:100%;fill:inherit}.ce_icon{font-size:0}.ce_button{-webkit-user-select:none;user-select:none;background-color:#0000;border:0}.ce_button.ce_button_disabled{color:#9a9a9a!important;background-color:#e6e6e6!important;border:none!important}.ce_map{position:relative}.ce_map .ce_map_view{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%}.ce_map .ce_map_view svg{width:100%;height:100%}.ce_map .ce_map_placeholder{z-index:1000;width:100%;height:100%;position:absolute;inset:0}.ce_svgcheckstyle{width:100%;height:100%}.ce_check_group .ce_check_list{flex-wrap:wrap;display:flex;overflow:hidden}.ce_check_group .ce_check_item{cursor:pointer;align-items:center;display:flex}.ce_check_group .ce_check_icon{flex:none;font-size:0}.ce_check_group .ce_check_text{text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.ce_svgradiostyle{width:100%;height:100%}.ce_radio_button .ce_radio_item{cursor:pointer;align-items:center;display:flex}.ce_radio_button .ce_radio_icon{font-size:0}.ce_slider{align-items:center;display:flex}.ce_slider .ce_slider_rect{width:100%;position:relative}.ce_slider .ce_slider_bar{width:0;height:100%;position:absolute;top:0;left:0}.ce_slider .ce_slider_con{position:absolute;top:50%;left:0;transform:translateY(-50%)translate(-50%)}.ce_slider .ce_slider_block{background-repeat:no-repeat;background-size:100% 100%}.ce_slider .ce_hover,.ce_slider .ce_dragging{transform:scale(1.2)}.ce_video{position:relative}.ce_video .ce_video_elem{width:100%;height:100%}.ce_video .ce_video_poster{cursor:pointer;width:100%;height:100%;position:absolute;top:0;left:0}.ce_viewcontainer{width:100%}.ce_root{color:#000;flex-direction:column;line-height:1.5;display:flex;position:relative;overflow:hidden}.ce_row{display:flex}.ce_column{flex-direction:column;max-width:100%;display:flex}.ce_singlecolumn{flex-direction:column;width:100%;display:flex}.ce_multicolumn{justify-content:space-between;width:100%;display:flex}.ce_listlayout{width:100%}.ce_listlayout .ce_listlayout_con{box-sizing:border-box;flex-direction:column;width:100%;display:flex}.ce_listlayout .ce_listlayout_item{width:100%;display:flex}.ce_listlayout .ce_listlayout_horizontal{flex-flow:row;width:100%;height:100%;display:flex;overflow:auto hidden}.ce_listlayout .ce_listlayout_horizontal::-webkit-scrollbar{display:none}.ce_listlayout .ce_listlayout_horizontal .ce_listlayout_item{width:auto;height:100%;display:flex}.ce_gridlayout{flex-wrap:wrap;width:100%;display:flex}.ce_gridlayout .ce_gridlayout_item{width:100%;display:flex}.ce_absolutelayout{flex-direction:column;display:flex;position:relative}.ce_absolutelayout>*{z-index:1;position:absolute}.ce_absolutelayout_bottomright>*{z-index:1;position:static}:root{--bg-app:#0e0f13;--bg-bar:#15171c;--bg-panel:#181b21;--bg-stage:#0b0c0f;--bg-input:#1b1e25;--bg-hover:#232733;--bg-active:#2b2f3d;--bg-pop:#1c1f26f5;--bg-soft:#0f1219;--border:#2a2e38;--border-strong:#353b48;--text:#e8eaf0;--text-dim:#949aab;--text-faint:#626a7d;--accent:#6b83f7;--accent-2:#5a6ff0;--accent-soft:#6b83f724;--accent-border:#6b83f773;--accent-hover:#8195f9;--danger:#f87171;--danger-soft:#f8717124;--danger-hover:#ef4444;--warn:#fbbf24;--warn-soft:#fbbf2424;--warn-border:#fbbf2466;--warn-hover:#f59e0b;--on-warn:#0f1115;--ok:#34d399;--ok-soft:#34d39929;--ok-border:#34d39973;--ok-strong:#34d399;--ok-solid:#17734a;--on-ok:#fff;--info:#6b83f7;--info-soft:#6b83f724;--info-border:#6b83f773;--on-accent:#0f1115;--radius:8px;--radius-sm:6px;--shadow-pop:#0000008c;--shadow-card:#00000080;--shadow-drawer:#00000073;--shadow-toast:#00000047;--scrim:#0000008c;--scrim-soft:#00000073;--scrim-faint:#0006;--scrim-modal:#080a108c;--scrim-modal-blur:2px;--bar-grad:linear-gradient(180deg, #171a20, #131519);--splitter:#5b6cff;--splitter-grip:#ffffff47;--overlay-tint:#ffffff08;--overlay-tint-strong:#ffffff47;--err-item-fg:#ffb3a3;--api-item-fg:#bcd3ff;--api-item-border:#7c8cff33;--api-item-bg:#384c890f;--copy-ok:#8fe39a;--tag-ok-fg:#1a7f37;--tag-ok-bg:#1a7f3724;--tag-warn-fg:#b58105;--tag-warn-bg:#b5810529;--log-warn-fg:#e0b341;--log-warn-bg:#e0b34124;--log-warn-border:#e0b34159;--scroll-thumb:#949aab47;--scroll-thumb-hover:#949aab73;--scroll-thumb-idle:#949aab24;--jt-key:#9db4ff;--jt-string:#8fe39a;--jt-number:#f0b86e;--jt-boolean:#f08e8e;--jt-null:#626a7d;--jt-faint:#8b93a7;--jt-ring:#9db4ff40;--jt-del-fg:#f08e8e;--jt-del-bg:#f0646426;--jt-add-bg:#9db4ff1a;--st-label:#ccc;--st-id:#8b93a7;--st-badge-bg:#6b83f7;--st-badge-fg:#fff;--st-hl-bg:#6b83f747;--code-comment:#6b7280;--code-punc:#9ca3af;--code-prop:#f0883e;--code-str:#7ee787;--code-num:#79c0ff;--code-kw:#ff7b72;--code-fn:#d2a8ff;--code-var:#ffa657;--code-binding:#56d4dd;--type-string:var(--code-str);--type-number:var(--code-num);--type-boolean:var(--code-kw);--type-array:var(--code-fn);--type-object:var(--code-prop);--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-7:32px;--space-8:40px;--space-9:48px;--fs-xs:11px;--lh-xs:16px;--fs-sm:12px;--lh-sm:18px;--fs-base:13px;--lh-base:20px;--fs-md:14px;--lh-md:22px;--fs-lg:15px;--lh-lg:22px;--fs-xl:16px;--lh-xl:24px;--fs-2xl:20px;--lh-2xl:28px;--radius-xs:4px;--radius-md:8px;--radius-lg:10px;--radius-xl:12px;--radius-2xl:16px;--radius-pill:999px;--ctrl-xs:24px;--ctrl-sm:28px;--ctrl-md:32px;--ctrl-lg:36px;--ctrl-xl:40px;--row-h:28px;--icon-xs:12px;--icon-sm:14px;--icon-md:16px;--icon-lg:20px;--icon-xl:24px;--stroke:1.75;--hairline:1px;--shadow-1:0 1px 2px var(--shadow-card);--shadow-2:0 4px 12px var(--shadow-card);--shadow-3:0 8px 24px var(--shadow-card);--shadow-4:0 20px 64px var(--shadow-pop);--shadow-5:-20px 0 32px var(--shadow-drawer);--z-base:1;--z-sticky:20;--z-overlay-low:50;--z-overlay:60;--z-pop:70;--z-panel:100;--z-modal:1000;--z-deviceui:1100;--z-appmodal:2000;--z-toast-app:2100}@media (resolution>=2x),(-webkit-device-pixel-ratio>=2){:root{--hairline:.5px}}:root[data-theme=light]{--bg-app:#f4f6fa;--bg-bar:#fff;--bg-panel:#fff;--bg-stage:#e9edf4;--bg-input:#f6f8fb;--bg-hover:#f1f4f9;--bg-active:#e4e9f2;--bg-pop:#fffffffa;--bg-soft:#eef2f8;--border:#e2e8f0;--border-strong:#cbd5e1;--text:#1e293b;--text-dim:#475569;--text-faint:#5f6b7d;--accent:#4f6bf2;--accent-2:#3d57d9;--accent-soft:#4f6bf21a;--accent-border:#4f6bf259;--accent-hover:#3d57d9;--danger:#ef4444;--danger-soft:#ef44441a;--danger-hover:#dc2626;--warn:#f59e0b;--warn-soft:#f59e0b1f;--warn-border:#f59e0b66;--warn-hover:#d97706;--on-warn:#0f1115;--ok:#10b981;--ok-soft:#10b9811f;--ok-border:#10b98166;--ok-strong:#047857;--ok-solid:#047857;--on-ok:#fff;--info:#4f6bf2;--info-soft:#4f6bf21a;--info-border:#4f6bf259;--on-accent:#fff;--radius:8px;--radius-sm:6px;--shadow-pop:#0f172a24;--shadow-card:#0f172a1a;--shadow-drawer:#0f172a1f;--shadow-toast:#0f172a1a;--scrim:#0f172a66;--scrim-soft:#0f172a4d;--scrim-faint:#0f172a38;--bar-grad:linear-gradient(180deg, #fff, #f6f8fc);--splitter:#4f6bf2;--splitter-grip:#0f172a2e;--overlay-tint:#0f172a08;--overlay-tint-strong:#0f172a14;--err-item-fg:#b91c1c;--api-item-fg:#3d57d9;--api-item-border:#4f6bf238;--api-item-bg:#4f6bf20f;--copy-ok:#047857;--tag-ok-fg:#047857;--tag-ok-bg:#10b9811a;--tag-warn-fg:#b45309;--tag-warn-bg:#f59e0b1a;--log-warn-fg:#b45309;--log-warn-bg:#f59e0b1a;--log-warn-border:#f59e0b59;--scroll-thumb:#0f172a29;--scroll-thumb-hover:#0f172a47;--scroll-thumb-idle:#0f172a14;--jt-key:#953800;--jt-string:#0a3069;--jt-number:#116329;--jt-boolean:#cf222e;--jt-null:#57606a;--jt-faint:#6b7280;--jt-ring:#4f6bf247;--jt-del-fg:#cf222e;--jt-del-bg:#cf222e1f;--jt-add-bg:#4f6bf21a;--st-label:#1e293b;--st-id:#64748b;--st-badge-bg:#4f6bf2;--st-badge-fg:#fff;--st-hl-bg:#4f6bf224;--code-comment:#6e7781;--code-punc:#6e7781;--code-prop:#953800;--code-str:#0a3069;--code-num:#0550ae;--code-kw:#cf222e;--code-fn:#8250df;--code-var:#953800;--code-binding:#0d9488;--type-string:#116329;--type-boolean:#a40e26;--type-array:#6639ba}*{box-sizing:border-box;outline:none}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;margin:0}html,body{background:var(--bg-app);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:PingFang SC,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif}#app{height:100vh}@supports ((-moz-appearance:none)){*{scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) transparent}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--scroll-thumb-idle);border-radius:8px;transition:background-color .2s}:has(:hover)::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}.st-expr:hover .st-expr__editor::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}.st-code:hover .st-code__editor::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}.debug__scope-raw:hover .debug__raw-editor::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}.dlg:hover .dlg__msg::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover)}::-webkit-scrollbar-thumb:active{background:var(--scroll-thumb-hover)}::-webkit-scrollbar-track{background:0 0}.app{background:var(--bg-app);flex-direction:column;height:100vh;display:flex}.app__bar{background:var(--bar-grad);border-bottom:var(--hairline) solid var(--border);flex:none;align-items:center;gap:12px;height:48px;padding:0 16px;display:flex}.app__logo{color:var(--text);white-space:nowrap;align-items:center;gap:8px;font-size:15px;font-weight:600;display:flex}.app__logo-icon{width:var(--icon-xl);height:var(--icon-xl);display:block}.app__logo-version{font-size:var(--fs-xs);letter-spacing:.02em;color:var(--text-faint);font-weight:500;line-height:1}.app__btn{height:var(--ctrl-md);background:var(--bg-input);color:var(--text);border:1px solid var(--border-strong);cursor:pointer;white-space:nowrap;border-radius:8px;flex:none;align-items:center;gap:6px;padding:0 12px;font-size:13px;transition:background .15s,border-color .15s,transform 50ms;display:inline-flex}.app__btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent-border);color:var(--accent)}.app__btn:active:not(:disabled){transform:translateY(1px)}.app__btn:disabled{opacity:.5;cursor:default}.app__btn--icon{height:var(--ctrl-md);aspect-ratio:1;justify-content:center;padding:0}.app__btn--active{background:var(--accent-soft);color:var(--accent);border-color:var(--accent-border)}.app__bar .app__btn--icon{height:var(--ctrl-sm)}.app__btn--remote{height:var(--ctrl-sm);background:var(--accent-soft);color:var(--accent);border-color:var(--accent-border);padding:0 10px;font-size:12px}.app__btn--remote:hover:not(:disabled){background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.app__btn--remote.app__btn--warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--remote.app__btn--warn:hover:not(:disabled){background:var(--warn);color:var(--on-accent);border-color:var(--warn)}.app__remote-menu{display:inline-flex;position:relative}.app__remote-menu .app__btn--remote{gap:6px}.app__icon--chev{transition:transform .15s}.app__remote-item--save:hover{background:var(--accent-soft);color:var(--accent)}.app__remote-item--upload:hover{background:var(--warn-soft);color:var(--warn)}.app__remote-item--sync:hover{background:var(--ok-soft);color:var(--ok)}.app__op-group{display:inline-flex}.app__op-group>.app__btn{background:var(--bg-input);color:var(--text);border:1px solid var(--border);height:var(--ctrl-sm);border-radius:0;margin-left:-1px;padding:0 10px;font-size:12px}.app__op-group>.app__btn:first-child{border-top-left-radius:var(--radius-sm,6px);border-bottom-left-radius:var(--radius-sm,6px);margin-left:0}.app__op-group>.app__btn:last-child{border-top-right-radius:var(--radius-sm,6px);border-bottom-right-radius:var(--radius-sm,6px)}.app__op-group>.app__btn:hover:not(:disabled){z-index:var(--z-base);border-color:var(--border-strong);background:var(--bg-hover);position:relative}.app__op-group>.app__btn:disabled{opacity:.5;cursor:default}.app__btn--history-save.is-dirty:disabled{background:var(--bg-input);color:var(--text);border-color:var(--border-strong);box-shadow:none;opacity:.5;cursor:default}.app__btn--history-save.is-dirty:not(:disabled){background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.app__btn--history-save.is-dirty:not(:disabled):hover{background:var(--accent-2);border-color:var(--accent-2)}.app__bar-actions{align-items:center;gap:12px;margin-left:auto;display:flex}.app__dev-svc{display:inline-flex;position:relative}.app__btn--warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--connected{background:var(--ok-soft);color:var(--ok);border-color:var(--ok-border)}.app__btn--connected:hover:not(:disabled){background:var(--ok-soft);color:var(--ok-strong);border-color:var(--ok)}.app__btn--reconnecting{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--disconnected{background:var(--danger-soft);color:var(--danger);border-color:var(--danger)}.app__dev-svc-mask{z-index:var(--z-overlay);position:fixed;inset:0}.app__dev-svc-panel{z-index:var(--z-pop);background:var(--bg-panel);border:1px solid var(--border-strong);border-radius:var(--radius-lg);width:300px;box-shadow:var(--shadow-3);color:var(--text);text-align:left;transform-origin:100% 0;position:absolute;top:calc(100% + 8px);right:0;overflow:hidden}.app__dev-svc-head{border-bottom:var(--hairline) solid var(--border);justify-content:space-between;align-items:center;gap:8px;padding:7px 8px 7px 12px;display:flex}.app__dev-svc-title{color:var(--text);font-size:12px;font-weight:600}.app__dev-svc-close{width:22px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;font-size:14px;line-height:1;transition:background .15s,color .15s;display:inline-flex}.app__dev-svc-close:before{content:"✕"}.app__dev-svc-close:hover{background:var(--bg-hover);color:var(--text)}.app__dev-svc-body{flex-direction:column;gap:12px;padding:12px;display:flex}.app__dev-svc-row{color:var(--text-dim);justify-content:space-between;align-items:center;gap:8px;font-size:11px;display:flex}.app__dev-svc-row--col{flex-direction:column;align-items:stretch;gap:6px}.app__dev-svc-row input[type=text],.app__dev-svc-row input[type=password]{width:100%;min-width:0;height:var(--ctrl-sm);background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);outline:none;padding:0 10px;font-family:inherit;font-size:12px;transition:border-color .15s,box-shadow .15s}.app__dev-svc-row input[type=text]:focus,.app__dev-svc-row input[type=password]:focus{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft)}.app__dev-svc-row input::placeholder{color:var(--text-faint)}.app__dev-svc-row .switch{flex:none}.app__dev-svc-hint{border-radius:var(--radius-sm);background:var(--warn-soft);color:var(--warn);margin:0;padding:6px 8px;font-size:11px;line-height:1.55}.app__dev-svc-actions{justify-content:flex-end;gap:8px;display:flex}.app__nosvc-banner{color:var(--warn,#e0a23a);background:var(--warn-soft,#e0a23a1f);padding:8px 14px;font-size:13px}.app__nosvc-banner--disconnected{color:var(--danger,#ef4444);background:var(--danger-soft,#ef44441f)}.app__extreload-banner{color:var(--info,#0079f2);background:var(--info-soft,#0079f21f)}.theme-toggle{color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;gap:7px;padding:0;font-size:12px;transition:color .15s;display:inline-flex}.theme-toggle:hover{color:var(--text)}.theme-toggle__track{background:var(--bg-input);border:1px solid var(--border-strong);border-radius:999px;width:36px;height:20px;transition:background .18s,border-color .18s;position:relative}.theme-toggle__thumb{background:var(--text-faint);border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;transition:transform .18s,background .18s;display:flex;position:absolute;top:50%;left:2px;transform:translateY(-50%)}.theme-toggle__icon{width:11px;height:11px;color:var(--bg-app)}:root[data-theme=light] .theme-toggle__track{background:var(--accent-soft);border-color:var(--accent-border)}:root[data-theme=light] .theme-toggle__thumb{background:var(--accent);transform:translateY(-50%)translate(16px)}:root[data-theme=light] .theme-toggle__icon{color:var(--on-accent)}.switch{cursor:pointer;vertical-align:middle;background:0 0;border:none;margin:0;padding:0;line-height:0;display:inline-flex}.switch--disabled{cursor:not-allowed;opacity:.5}.switch__track{background:var(--bg-input);border:1px solid var(--border-strong);box-sizing:border-box;border-radius:999px;width:36px;height:20px;transition:background .18s,border-color .18s;display:inline-block;position:relative}.switch__thumb{background:var(--text-faint);border-radius:50%;width:16px;height:16px;transition:transform .18s,background .18s;position:absolute;top:50%;left:2px;transform:translateY(-50%)}.switch--on .switch__track{background:var(--accent);border-color:var(--accent)}.switch--on .switch__thumb{background:var(--on-accent);transform:translateY(-50%)translate(16px)}.app__badge{border:1px solid var(--border-strong);background:var(--bg-input);color:var(--text-dim);-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:5px;padding:2px 9px;font-size:11px;font-weight:600;display:inline-flex}.app__badge-dot{background:var(--text-faint);border-radius:50%;flex:none;width:7px;height:7px}.app__badge--ok{color:var(--ok);border-color:var(--ok-border);background:var(--ok-soft)}.app__badge--ok .app__badge-dot{background:var(--ok)}.app__badge--error{color:var(--danger);border-color:var(--danger-soft);background:var(--danger-soft)}.app__badge--error .app__badge-dot{background:var(--danger)}.app__badge--pending{color:var(--warn);border-color:var(--warn-border);background:var(--warn-soft)}.app__badge--pending .app__badge-dot{background:var(--warn);animation:1s ease-in-out infinite app-badge-pulse}.app__badge--nopython,.app__badge--fail{color:var(--text-faint);border-color:var(--border);background:var(--bg-input)}.app__badge--nopython .app__badge-dot,.app__badge--fail .app__badge-dot{background:var(--text-faint)}@keyframes app-badge-pulse{0%,to{opacity:1}50%{opacity:.3}}.app__badge.is-celebrating{animation:.5s app-badge-pop}@keyframes app-badge-pop{0%{transform:scale(1)}35%{transform:scale(1.18)}to{transform:scale(1)}}.app__confetti{pointer-events:none;z-index:9999;position:fixed}.app__confetti-bit{background:linear-gradient(135deg, #fffffff2 0%, var(--c,#52c41a) 42%, color-mix(in srgb, var(--c,#52c41a) 62%, #000) 100%);clip-path:var(--clip,polygon(50% 0%, 0% 100%, 100% 100%));opacity:var(--o,.9);filter:drop-shadow(0 0 1px #0000002e);border-radius:0;animation:.7s ease-out forwards app-confetti-fly;position:absolute;top:0;left:0;transform:translate(-50%,-50%)}@keyframes app-confetti-fly{0%{opacity:var(--o,.9);transform:translate(calc(-50% + var(--sx,0px)), calc(-50% + var(--sy,0px))) rotate(0deg) scale(.4)}to{opacity:0;transform:translate(calc(-50% + var(--sx,0px) + var(--tx)), calc(-50% + var(--sy,0px) + var(--ty))) rotate(var(--rot)) scale(1)}}.app__icon{width:15px;height:15px;display:block}.app__icon--spin{animation:.8s linear infinite app__spin}@keyframes app__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.app__stage{flex:auto;min-height:0;display:flex;position:relative}.workside{border-left:var(--hairline) solid var(--border);flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}.workside__bar{flex:none;order:2}.workside__panels{flex-direction:column;flex:none;order:1;display:flex}.workside__cols{flex:auto;min-width:0;min-height:0;display:flex;position:relative}.phone{background:radial-gradient(circle at 30% 20%, #7c8cff0d, transparent 60%), var(--bg-stage);flex-direction:column;flex:none;justify-content:center;align-items:center;min-height:0;display:flex;overflow:hidden}.phone__frame{flex:auto;justify-content:center;align-items:center;width:100%;min-height:0;display:flex;position:relative;overflow:hidden}.phone__scaler{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.splitter{top:0;bottom:0;left:calc(var(--preview-width) - 3px);cursor:col-resize;width:6px;z-index:var(--z-sticky);transition:background .15s;position:absolute}.splitter--api{left:auto;right:calc(var(--api-panel-width,360px) - 3px)}.splitter:after{content:"";background:var(--splitter);opacity:0;width:3px;transition:opacity .15s;position:absolute;top:0;bottom:0;left:1.5px}.splitter:hover:after,.splitter.is-dragging:after{opacity:1}.phone--dragging,.phone--dragging *{-webkit-user-select:none!important;user-select:none!important;cursor:col-resize!important}.canvas-bar{border-bottom:var(--hairline) solid var(--border);flex:none;align-items:center;gap:4px;width:100%;height:32px;padding:0 8px;display:flex}.canvas-bar__spacer{flex:auto}.canvas-bar__chip{height:24px;color:var(--text-dim);white-space:nowrap;cursor:pointer;border-radius:5px;align-items:center;gap:6px;padding:0 8px;font-size:11.5px;transition:background .15s,color .15s;display:inline-flex}.canvas-bar__chip:hover,.dd--open>.dd__trigger--slot .canvas-bar__chip{background:var(--bg-hover);color:var(--text)}.canvas-bar__chev{width:10px;height:10px;color:var(--text-faint)}.canvas-bar__icn{width:13px;height:13px;color:var(--text-faint);flex:none}.canvas-bar__swatch{border:1px solid var(--border-strong);border-radius:3px;flex:none;width:10px;height:10px}.canvas-bar__swatch--white{background:#fff}.canvas-bar__swatch--gray{background:#f0f0f0}.canvas-bar__swatch--black{background:#1c1c1e}.canvas-bar__swatch--checker{background-color:#fff;background-image:linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%),linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%);background-position:0 0,3px 3px;background-size:6px 6px}.canvas-bar__size{font-variant-numeric:tabular-nums;color:var(--text-faint);white-space:nowrap;padding:0 4px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:11px}.canvas-bar__iconbtn{width:24px;height:24px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:5px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s;display:inline-flex}.canvas-bar__iconbtn:hover:not(:disabled){background:var(--bg-hover);color:var(--accent)}.canvas-bar__iconbtn:disabled{opacity:.4;cursor:default}.canvas-bar__iconbtn.is-loading svg{animation:.8s linear infinite canvas-bar-spin}@keyframes canvas-bar-spin{to{transform:rotate(360deg)}}.canvas-bar--tight .canvas-bar__size,.canvas-bar--tight .canvas-bar__txt{display:none}.statusbar__conn-icon{flex:none;width:14px;height:14px}.statusbar .app__btn--connected,.statusbar .app__btn--reconnecting,.statusbar .app__btn--disconnected,.statusbar .app__btn--warn{background:0 0;border:none;padding:0 10px}.statusbar .app__btn--reconnecting{color:var(--warn)}.statusbar .app__btn--disconnected{color:var(--danger)}.statusbar .app__btn--warn{color:var(--warn)}.statusbar .app__btn--connected{color:var(--text-dim)}.statusbar .app__btn--connected:hover:not(:disabled){background:var(--bg-hover);color:var(--text);border-color:#0000}button.statusbar__conn{cursor:pointer;font:inherit}.statusbar__conn:hover{background:var(--bg-hover)}.vc-sketch-presets{border-top-color:var(--border)!important}.phone-viewport{width:100%;min-height:0;box-shadow:0 12px 48px var(--shadow-pop);cursor:default;flex:auto;position:relative}.phone__screen{scrollbar-width:none;-ms-overflow-style:none;width:100%;height:100%;padding:16px;position:relative;overflow:hidden auto}.phone__screen--bg-checker{background-color:#fff;background-image:linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%),linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%);background-position:0 0,8px 8px;background-size:16px 16px}.phone__screen--bg-white{background:#fff}.phone__screen--bg-gray{background:#f0f0f0}.phone__screen--bg-black{background:#1c1c1e}.phone__screen::-webkit-scrollbar{display:none}.ce-sel-overlay{pointer-events:none;box-sizing:border-box;z-index:var(--z-overlay-low);background:#4285f42e;position:absolute}.ce-guides{pointer-events:none;z-index:var(--z-overlay-low);position:absolute;top:0;left:0}.ce-guide{background:#68ffff;position:absolute}.ce-guide--v{width:1px;height:100%;top:0;transform:translate(-.5px)}.ce-guide--h{width:100%;height:1px;left:0;transform:translateY(-.5px)}.debug{background:var(--bg-panel);flex-direction:column;flex:auto;min-width:33.333vw;display:flex}.apipanel{width:var(--api-panel-width,360px);background:var(--bg-panel);border-left:var(--hairline) solid var(--border);flex-direction:column;flex:none;min-width:320px;min-height:0;display:flex}.apipanel__head{border-bottom:var(--hairline) solid var(--border);flex:none;align-items:center;gap:8px;height:40px;padding:0 12px;display:flex}.apipanel__title{color:var(--text);white-space:nowrap;font-size:13px;font-weight:600}.apipanel__spacer{flex:auto}.apipanel__btn{width:28px;height:28px;color:var(--text-dim);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s,transform 50ms;display:inline-flex}.apipanel__btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border);color:var(--text)}.apipanel__btn:active:not(:disabled){transform:translateY(1px)}.apipanel__btn:disabled{opacity:.5;cursor:default}.apipanel__body{flex:auto;padding:8px 12px;overflow:auto}.empty-state{color:var(--text-faint);flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:56px 16px;display:flex}.empty-state__badge{background:var(--bg-hover);border:1px dashed var(--border-strong);width:48px;height:48px;color:var(--text-faint);border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.empty-state__badge svg{width:20px;height:20px}.empty-state__hint{max-width:240px;color:var(--text-faint);text-align:center;margin:0;font-size:11px;line-height:1.6}.debug__tabs{border-bottom:var(--hairline) solid var(--border);display:flex}.debug__tab{height:39px;color:var(--text-dim);cursor:pointer;background:0 0;border:none;flex:1;padding:10px 8px;font-size:13px;transition:color .15s;position:relative}.debug__tab:hover{color:var(--text)}.debug__tab--active{color:var(--accent)}.debug__tab--active:after{content:"";background:var(--accent);height:2px;position:absolute;bottom:-1px;left:20%;right:20%}.debug__count{background:var(--bg-hover);min-width:16px;color:var(--text-dim);border-radius:999px;margin-left:5px;padding:0 5px;font-size:12px;display:inline-block}.debug__body{flex:auto;position:relative;overflow:auto}.debug__meta{flex-direction:column;min-height:100%;margin:0;padding:8px 12px 0;display:flex}.debug__empty{color:var(--text-faint);text-align:center;font-size:13px}.debug__meta-list{flex-direction:column;gap:8px;margin:0;display:flex}.debug__meta-row{grid-template-columns:72px 1fr;align-items:baseline;gap:8px;font-size:13px;display:grid}.debug__meta-row dt{color:var(--text-faint);margin:0}.debug__meta-row dd{color:var(--text);word-break:break-all;margin:0}.debug__meta-row code{font-family:var(--mono,ui-monospace, monospace);background:var(--bg-hover);border-radius:4px;padding:1px 5px;font-size:12px}.debug__meta-muted{color:var(--text-faint);font-size:12px}.debug__meta-err{color:var(--danger);font-size:12px}.debug__meta-hint{background:var(--bg-panel);border-top:var(--hairline) solid var(--border);color:var(--text-faint);margin:auto -12px 0;padding:10px 12px;font-size:12px;line-height:1.6;position:sticky;bottom:0}.statepanel{background:var(--bg-panel);border-top:var(--hairline) solid var(--border-strong);flex-direction:column;flex:none;height:240px;min-height:120px;max-height:60vh;display:flex;position:relative;overflow:hidden}.statepanel__head{height:var(--ctrl-lg);border-bottom:var(--hairline) solid var(--border);color:var(--text);flex:none;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.panelhead__edge{cursor:row-resize;-webkit-user-select:none;user-select:none;height:6px;z-index:var(--z-sticky);position:absolute;top:0;left:0;right:0}.panelhead__edge:after{content:"";background:var(--splitter);opacity:0;height:3px;transition:opacity .15s;position:absolute;top:0;left:0;right:0}.panelhead__edge:hover:after,.panelhead__edge.is-dragging:after{opacity:1}.statepanel__title{letter-spacing:.2px;font-weight:600}.statepanel__title code{font-family:var(--mono,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--text-dim);background:var(--bg-hover);border-radius:4px;padding:1px 5px;font-size:12px}.statepanel__close{width:24px;height:24px;color:var(--text-dim);cursor:pointer;border-radius:var(--radius-xs);background:0 0;border:none;justify-content:center;align-items:center;margin-left:auto;padding:0;transition:background .15s,color .15s;display:inline-flex}.statepanel__close:hover{background:var(--bg-hover);color:var(--text)}.statepanel__close svg{display:block}.statepanel__tree{flex:auto;padding:8px 12px 10px;overflow:auto}.debug__tag{border-radius:999px;padding:1px 8px;font-size:12px;line-height:1.6;display:inline-block}.debug__tag--ok{color:var(--ok-strong);background:var(--ok-soft)}.debug__tag--warn{color:var(--tag-warn-fg);background:var(--tag-warn-bg)}.debug__tag--err{color:var(--danger);background:var(--danger-soft)}.debug__list{margin:0;padding:0;list-style:none}.debug__item{word-break:normal;overflow-wrap:anywhere;border-radius:8px;margin-bottom:6px;padding:9px 11px;font-size:12px;line-height:1.6}.debug__item--err{border-left:2px solid var(--danger);border-bottom:var(--hairline) solid var(--border);color:var(--err-item-fg);word-break:normal;background:0 0;border-radius:0;grid-template-columns:52px 84px minmax(0,1fr);align-items:baseline;gap:8px;margin-bottom:0;padding:3px 12px 3px 10px;font-size:11px;line-height:1.45;display:grid}.debug__item--err:last-child{border-bottom:none}.debug__item--err:hover{background:var(--danger-soft)}.debug__item--err .debug__kind{color:var(--danger);text-overflow:ellipsis;white-space:nowrap;opacity:1;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:10px;overflow:hidden}.err__msg{word-break:break-word;min-width:0}.debug__item--api{border:1px solid var(--api-item-border);color:var(--api-item-fg);background:var(--api-item-bg);margin-bottom:8px}.debug__item--api:last-child{margin-bottom:0}.debug__item--api .debug__kind{font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.6}.debug__kind{opacity:.85;font-weight:600}.debug__api-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.debug__copy-ic{width:24px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.debug__copy-ic:hover{background:var(--bg-hover);border-color:var(--border);color:var(--text)}.debug__copy-ok{color:var(--copy-ok);font-size:14px;line-height:1}.apt{color:var(--text-dim);margin-top:4px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.6}.apt__list{margin:0;padding:0;list-style:none}.apt__node{position:relative}.apt__branch,.apt__leaf{cursor:pointer;border-radius:4px;align-items:baseline;gap:4px;padding:1px 4px;display:flex}.apt .jt__colon{margin-left:-4px}.apt .jt__key{flex-shrink:0}.apt .jt__val,.apt .jt__preview{min-width:0}.apt__branch:hover,.apt__leaf:hover{background:var(--bg-hover)}.apt__caret{text-align:center;width:12px;color:var(--text-faint);-webkit-user-select:none;user-select:none;flex:none;font-size:9px;transition:transform .15s;transform:rotate(0)}.apt__caret--open{color:var(--accent);transform:rotate(90deg)}.apt__caret--leaf{visibility:hidden}.apt__children{border-left:var(--hairline) solid var(--border);margin-left:4px;padding-left:16px}.apt__close{color:var(--text-faint);padding:1px 4px 1px 20px}.debug__scope-wrap{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.debug__scope-foot{background:var(--bg-bar);border:1px solid var(--border);box-shadow:0 6px 18px var(--shadow-toast);border-radius:10px;justify-content:flex-end;align-items:center;gap:8px;padding:6px;display:flex;position:absolute;bottom:10px;right:10px}.debug__copied{color:var(--accent);margin:0 4px 0 8px;font-size:12px}.debug__copy{background:var(--bg-input);height:26px;color:var(--text-dim);border:1px solid var(--border-strong);cursor:pointer;border-radius:7px;align-items:center;gap:5px;padding:0 10px;font-size:12px;transition:background .15s,border-color .15s,color .15s;display:inline-flex}.debug__copy:hover{background:var(--bg-hover);border-color:var(--accent-border);color:var(--text)}.debug__copy-icn{flex:none;width:13px;height:13px}.debug__copy--primary:hover{background:var(--ok-soft);border-color:var(--ok-border);color:var(--ok)}.debug__copy--warn:hover{background:var(--warn-soft);border-color:var(--warn-border);color:var(--warn)}.debug__sep{width:var(--hairline);background:var(--border-strong);height:16px;margin:0 2px}.debug__scope-wrap--raw{flex-direction:column;min-height:0;display:flex}.debug__scope-raw{flex-direction:column;flex:auto;min-height:0;display:flex}.debug__raw-editor{background:var(--bg-input);width:100%;min-height:160px;color:var(--text);tab-size:2;white-space:pre;outline:none;flex:auto;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.6;overflow:auto}.debug__raw-editor .token.property,.debug__raw-editor .token.tag,.debug__raw-editor .token.boolean,.debug__raw-editor .token.number,.debug__raw-editor .token.constant,.debug__raw-editor .token.symbol,.vars-dlg__code .token.property,.vars-dlg__code .token.tag,.vars-dlg__code .token.boolean,.vars-dlg__code .token.number,.vars-dlg__code .token.constant,.vars-dlg__code .token.symbol{color:var(--code-prop)}.debug__raw-editor .token.selector,.debug__raw-editor .token.attr-name,.debug__raw-editor .token.string,.debug__raw-editor .token.char,.debug__raw-editor .token.builtin,.vars-dlg__code .token.selector,.vars-dlg__code .token.attr-name,.vars-dlg__code .token.string,.vars-dlg__code .token.char,.vars-dlg__code .token.builtin{color:var(--code-str)}.debug__raw-editor .token.operator,.debug__raw-editor .token.entity,.debug__raw-editor .token.url,.vars-dlg__code .token.operator,.vars-dlg__code .token.entity,.vars-dlg__code .token.url{color:var(--code-num)}.debug__raw-editor .token.punctuation,.vars-dlg__code .token.punctuation{color:var(--code-punc)}.debug__raw-editor .token.keyword,.debug__raw-editor .token.null,.vars-dlg__code .token.keyword,.vars-dlg__code .token.null{color:var(--code-kw)}.debug__raw-editor .token.function,.debug__raw-editor .token.class-name,.vars-dlg__code .token.function,.vars-dlg__code .token.class-name{color:var(--code-fn)}.raw-err-bar{color:var(--danger,#ef4444);background:var(--danger-soft,#ef44441f);flex:none;align-items:center;gap:6px;padding:4px 10px;font-size:11px;line-height:1.5;display:flex}.raw-err-bar__icn{flex:0 0 12px;width:12px;height:12px}.raw-err-bar__msg{flex:auto;min-width:0}.raw-err-bar__close{width:18px;height:18px;color:inherit;opacity:.7;cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;font-size:11px;line-height:1;transition:opacity .12s;display:inline-flex}.raw-err-bar__close:hover{opacity:1}.vars{flex-direction:column;height:100%;min-height:0;display:flex;position:relative}.vars__list{flex-direction:column;flex:auto;gap:2px;min-height:0;margin:0;padding:8px 8px 52px;list-style:none;display:flex;overflow-y:auto}.vars__row{-webkit-user-select:none;user-select:none;border-radius:6px;align-items:center;gap:6px;padding:4px 6px;transition:background .12s;display:flex}.vars__row:hover{background:var(--bg-hover)}.vars__key{text-overflow:ellipsis;white-space:nowrap;max-width:46%;color:var(--text);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;overflow:hidden}.vars__type{border-radius:var(--radius-pill);background:var(--bg-active);color:var(--text-dim);flex:none;padding:1px 6px;font-size:10px;line-height:1.5}.vars__type--string{color:var(--type-string);background:color-mix(in srgb, var(--type-string) 14%, transparent)}.vars__type--number{color:var(--type-number);background:color-mix(in srgb, var(--type-number) 14%, transparent)}.vars__type--boolean{color:var(--type-boolean);background:color-mix(in srgb, var(--type-boolean) 14%, transparent)}.vars__type--array{color:var(--type-array);background:color-mix(in srgb, var(--type-array) 14%, transparent)}.vars__type--object{color:var(--type-object);background:color-mix(in srgb, var(--type-object) 14%, transparent)}.vars__mock{background:var(--warn-soft);width:14px;height:14px;color:var(--warn);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:9px;line-height:1;display:inline-flex}.vars__name{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-faint);flex:auto;font-size:11px;overflow:hidden}.vars__ops{opacity:0;flex:none;gap:2px;transition:opacity .12s;display:inline-flex}.vars__row:hover .vars__ops,.vars__row:focus-within .vars__ops{opacity:1}.vars__op{width:20px;height:20px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:inline-flex}.vars__op svg{width:13px;height:13px;display:block}.vars__op:hover{background:var(--bg-active);color:var(--text)}.vars__op--del:hover{background:var(--danger-soft);color:var(--danger)}.vars__op:disabled,.vars__op:disabled:hover{color:var(--text-faint);opacity:.35;cursor:default;background:0 0}.vars__op .debug__copy-ok{font-size:12px}.vars__fabs{background:var(--bg-bar);border:1px solid var(--border);box-shadow:0 6px 18px var(--shadow-toast);border-radius:10px;align-items:center;gap:8px;padding:6px;display:flex;position:absolute;bottom:10px;right:10px}.vars__mockhead{border-bottom:var(--hairline) solid var(--border);flex:none;align-items:center;gap:8px;padding:5px 10px;display:flex}.vars__back{background:var(--bg-bar);border:1px solid var(--border-strong);height:24px;color:var(--text);cursor:pointer;border-radius:6px;flex:none;align-items:center;gap:4px;padding:0 9px 0 7px;font-size:12px;font-weight:500;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.vars__back:hover{background:var(--accent-soft);border-color:var(--accent-border);color:var(--accent)}.vars__back svg{width:12px;height:12px}.vars__mocktitle{color:var(--text-faint);font-size:11px}.ni-panel.vars-dlg{width:560px;height:auto;min-height:0;max-height:80vh}.vars-dlg .ni-field-label i{color:var(--danger);margin-right:2px;font-style:normal}.ni-field-row--top{align-items:flex-start}.ni-field-row--top .ni-field-label{line-height:var(--ctrl-sm)}.vars-dlg__ctrl{flex:auto;min-width:0}.vars-dlg__code,.vars-dlg__str{min-height:171.6px;max-height:264px}.vars-dlg__code{background:var(--bg-input);border:1px solid var(--border-strong);min-width:0;color:var(--text);tab-size:2;white-space:pre;border-radius:6px;outline:none;flex:auto;padding:8px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.6;transition:border-color .15s;overflow:auto}.vars-dlg__code:focus{border-color:var(--accent)}.ni-input.vars-dlg__str{resize:vertical;height:auto;padding:8px 12px;line-height:1.6;overflow:auto}.vars-dlg__desc{resize:vertical;height:auto;min-height:90.8px;max-height:140px;line-height:1.6}.vars-dlg__err{color:var(--danger);margin:2px 0 0;font-size:11px}.vars__mockhint{color:var(--text-faint);margin-left:auto;font-size:11px}.statusbar{background:var(--bg-bar);border-top:var(--hairline) solid var(--border);height:28px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;order:3;align-items:stretch;padding:0 2px;font-size:12px;display:flex}.statusbar__spacer{flex:auto}.statusbar__item{white-space:nowrap;cursor:default;align-items:center;gap:5px;height:100%;padding:0 10px;display:inline-flex}.statusbar__item--right{color:var(--text-faint)}.statusbar__item--prob{cursor:pointer;color:var(--text-dim);background:0 0;border:none;border-radius:0;font-weight:400}.statusbar__item--prob:hover{color:var(--text)}.statusbar__item--prob.is-error,.statusbar__item--prob.is-error:hover{color:var(--danger)}.statusbar__item--prob.is-ok{color:var(--text-faint);cursor:default}.statusbar__item--prob.is-ok:hover{color:var(--text-faint)}.statusbar__icon{font-size:14px;line-height:1}.statusbar__icon.is-dirty{color:var(--warn)}.errpanel{background:var(--bg-panel);border-top:var(--hairline) solid var(--border-strong);flex-direction:column;flex:none;height:240px;min-height:120px;max-height:60vh;display:flex;position:relative;overflow:hidden}.errpanel__head{height:var(--ctrl-lg);border-bottom:var(--hairline) solid var(--border);color:var(--text);flex:none;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.errpanel__title{letter-spacing:.2px;font-weight:600}.errpanel__actions{align-items:center;gap:6px;margin-left:auto;display:flex}.errpanel__iconbtn{width:24px;height:24px;color:var(--text-dim);cursor:pointer;border-radius:var(--radius-xs);background:0 0;border:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s;display:inline-flex}.errpanel__iconbtn:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.errpanel__iconbtn svg{display:block}.errpanel__iconbtn:disabled{opacity:.35;cursor:not-allowed}.errpanel__clear:hover:not(:disabled){color:var(--danger)}.errpanel__tabs{flex:none;align-self:stretch;align-items:stretch;gap:2px;margin-left:4px;display:flex}.errpanel__tab{height:100%;color:var(--text-dim);cursor:pointer;background:0 0;border:none;align-items:center;gap:5px;padding:0 10px;font-size:12px;transition:color .15s;display:inline-flex;position:relative}.errpanel__tab:hover{color:var(--text)}.errpanel__tab--active{color:var(--accent)}.errpanel__tab--active:after{content:"";background:var(--accent);height:2px;position:absolute;bottom:-1px;left:20%;right:20%}.errpanel__tab-count{background:var(--bg-hover);min-width:16px;color:var(--text-faint);text-align:center;border-radius:999px;padding:0 5px;font-size:11px;line-height:15px}.errpanel__tab--active .errpanel__tab-count{background:var(--accent-soft);color:var(--accent)}.errpanel__tab-count.is-hit,.errpanel__tab--active .errpanel__tab-count.is-hit{background:var(--danger-soft);color:var(--danger)}.errpanel__body{flex:auto;padding:4px 0 6px;overflow:auto}.errpanel__body .empty-state{gap:8px;padding:20px 16px}.errpanel__body .empty-state__badge{width:40px;height:40px}.errpanel__body .empty-state__badge svg{width:18px;height:18px}.errpanel__body .empty-state__hint{max-width:460px}.errpanel__body--term{color:#e8eaf0;background:#14161c;padding:0}.svclog{padding:6px 0 10px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.55}.svclog__line{white-space:pre-wrap;word-break:break-word;border-left:2px solid #0000;min-height:1.55em;padding:0 12px;display:flex}.svclog__line:hover{background:#ffffff0b}.svclog__line--ok{border-left-color:#34d3998c}.svclog__line--warn{border-left-color:var(--warn);background:#fbbf2412}.svclog__line--error{border-left-color:var(--danger);background:#f8717114}.svclog__text{min-width:0}.svclog__meta{color:var(--text-faint);white-space:nowrap;align-items:center;gap:5px;margin-left:8px;font-size:11px;display:inline-flex}.svclog__dot{background:var(--text-faint);border-radius:50%;width:6px;height:6px;margin-left:4px}.svclog__dot.is-live{background:var(--ok);box-shadow:0 0 0 2px var(--ok-soft)}.svclog__follow.is-on{color:var(--accent)}.errpanel__iconbtn.is-done{color:var(--ok)}.debug__list--log{flex-direction:column;display:flex}.log__item{border-bottom:var(--hairline) solid var(--border);grid-template-columns:52px 44px minmax(0,1fr);align-items:baseline;gap:8px;padding:2px 12px;display:grid}.log__item:last-child{border-bottom:none}.log__item:hover{background:var(--bg-input)}.log__time,.err__time{font-variant-numeric:tabular-nums;color:var(--text-faint);font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:10px}.log__tag{text-transform:uppercase;letter-spacing:.3px;color:var(--text-dim);background:var(--bg-hover);border:none;border-radius:3px;justify-self:start;padding:0 5px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:10px;font-weight:600;line-height:14px}.log__tag--info{color:var(--accent);background:var(--accent-soft)}.log__tag--warn{color:var(--log-warn-fg);background:var(--log-warn-bg)}.log__tag--error{color:var(--danger);background:var(--danger-soft)}.log__content{min-width:0;color:var(--text);flex-wrap:wrap;flex:auto;align-items:flex-start;gap:3px 8px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:11px;line-height:1.45;display:flex}.log__val{white-space:pre-wrap;word-break:break-word}.log__json{flex:100%;padding:0}.log__json .apt{margin-top:0;font-size:11px;line-height:1.4}.log__json .apt__branch--root{cursor:pointer;border-radius:4px}.log__json .apt__list--nested{border-left:var(--hairline) solid var(--border);margin-left:4px;padding-left:14px}.log__empty{color:var(--text-faint)}.alert-layer{z-index:var(--z-modal);position:absolute;inset:0}.alert-mask{background:#0000008c;padding:16px;display:flex;position:absolute;inset:0}.alert-mask--bottom{justify-content:center;align-items:flex-end}.alert-mask--top{justify-content:center;align-items:flex-start}.alert-mask--center{justify-content:center;align-items:center}.alert-mask--left{justify-content:flex-start;align-items:center}.alert-mask--right{justify-content:flex-end;align-items:center}.alert-panel{background:#fff;border-radius:12px;width:100%;max-width:100%;max-height:92vh;animation:.2s ease-out alert-pop;overflow:hidden auto;box-shadow:0 18px 60px #00000080}@keyframes alert-pop{0%{opacity:0;transform:scale(.96)translateY(8px)}to{opacity:1;transform:scale(1)translateY(0)}}.alert-mask--center .alert-panel,.alert-mask--left .alert-panel,.alert-mask--right .alert-panel{border-radius:12px}.device-ui{z-index:var(--z-deviceui);pointer-events:none;position:absolute;inset:0}.dlg-mask{pointer-events:auto;background:#00000073;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.dlg{text-align:center;background:#fff;border-radius:12px;width:288px;max-width:82%;padding:24px 20px 0;animation:.2s ease-out dlg-pop;box-shadow:0 12px 40px #00000059}@keyframes dlg-pop{0%{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}.dlg__title{color:#333;font-size:16px;font-weight:600}.dlg__msg{color:#666;text-align:left;word-break:break-all;white-space:pre-wrap;max-height:320px;margin-top:10px;font-size:14px;line-height:1.5;overflow-y:auto}.dlg__title+.dlg__msg{margin-top:12px}.dlg__btns{border-top:var(--hairline) solid #e8e8e8;margin:18px -20px 0;display:flex}.dlg__btn{cursor:pointer;background:0 0;border:none;flex:1 1 0;min-width:0;padding:14px 0;font-size:15px}.dlg__btn--ok{color:#1677ff;font-weight:500}.dlg__btn--cancel{color:#1677ff;border-right:var(--hairline) solid #e8e8e8}.dlg__btn--cancel.dlg__btn--gray{color:#888}.dtoast{color:#fff;text-align:center;box-sizing:border-box;pointer-events:none;background:#000000b3;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;gap:8px;min-width:0;max-width:76%;padding:10px 14px;font-size:14px;line-height:20px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dtoast--icon{min-width:96px;padding:16px}.dtoast__icon{flex:none;justify-content:center;align-items:center;width:36px;height:36px;display:inline-flex}.dtoast__icon-svg{fill:none;stroke:#fff;stroke-width:2.4px;stroke-linecap:round;stroke-linejoin:round;width:28px;height:28px}.dtoast__msg{word-break:break-all}.apptoast{z-index:var(--z-toast-app);color:#fff;pointer-events:none;background:#111111d1;border-radius:10px;align-items:center;gap:8px;max-width:76%;padding:12px 20px;font-size:14px;line-height:1.4;display:inline-flex;position:fixed;top:56px;left:50%;transform:translate(-50%);box-shadow:0 6px 24px #00000047}.apptoast__icon{background:var(--text-faint);border-radius:50%;flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.apptoast--ok .apptoast__icon{background:var(--ok)}.apptoast--err .apptoast__icon{background:var(--danger)}.apptoast__icon-svg{fill:none;stroke:#fff;stroke-width:2.6px;stroke-linecap:round;stroke-linejoin:round;width:12px;height:12px}.apptoast__msg{word-break:break-all}.apptoast-fade-enter-active,.apptoast-fade-leave-active{transition:opacity .2s,transform .2s}.apptoast-fade-enter,.apptoast-fade-leave-to{opacity:0;transform:translate(-50%,-8px)}.dlg-fade-enter-active,.dlg-fade-leave-active,.toast-fade-enter-active,.toast-fade-leave-active{transition:opacity .18s}.dlg-fade-enter,.dlg-fade-leave-to,.toast-fade-enter,.toast-fade-leave-to{opacity:0}.pk-mask{pointer-events:auto;background:#0006;align-items:flex-end;display:flex;position:absolute;inset:0}.pk-sheet{background:#fff;border-radius:12px 12px 0 0;width:100%;animation:.2s ease-out pk-up}@keyframes pk-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}.pk-bar{box-sizing:border-box;border-bottom:var(--hairline) solid #eef0f2;justify-content:space-between;align-items:center;height:44px;padding:0 16px;display:flex}.pk-bar__title{color:#333;font-size:15px;font-weight:600}.pk-bar__btn{cursor:pointer;background:0 0;border:none;padding:4px 2px;font-size:15px}.pk-bar__btn--cancel{color:#888}.pk-bar__btn--ok{color:#1677ff;font-weight:600}.pk-cols{height:230px;display:flex;position:relative;overflow:hidden}.pk-col{flex:1 1 0;min-width:0;height:100%;position:relative}.pk-col__band{border-top:var(--hairline) solid #d6e4ff;border-bottom:var(--hairline) solid #d6e4ff;pointer-events:none;background:#1677ff14;height:40px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.pk-col__list{-webkit-overflow-scrolling:touch;height:100%;padding:95px 0;overflow-y:auto}.pk-item{text-align:center;color:#333;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;height:40px;padding:0 6px;font-size:16px;line-height:40px;overflow:hidden}.pk-item--on{color:#1677ff;font-weight:600}.pk-cols--wheel .pk-col{cursor:grab;touch-action:none}.pk-cols--wheel.is-dragging{-webkit-user-select:none;user-select:none;cursor:grabbing}.pk-cols--wheel .pk-col__list{scrollbar-width:none;-ms-overflow-style:none}.pk-cols--wheel .pk-col__list::-webkit-scrollbar{display:none}.picker-fade-enter-active,.picker-fade-leave-active{transition:opacity .18s}.picker-fade-enter,.picker-fade-leave-to{opacity:0}.rp-mask{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.rp-card{background:var(--bg-panel);border:1px solid var(--border);width:300px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);border-radius:14px;overflow:hidden}.rp-head{border-bottom:var(--hairline) solid var(--border);justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.rp-title{font-size:14px;font-weight:600}.rp-x{width:26px;height:26px;color:var(--text-dim);cursor:pointer;background:0 0;border:none;border-radius:7px;font-size:20px;line-height:1;transition:background .15s,color .15s}.rp-x:hover{background:var(--bg-hover);color:var(--text)}.rp-body{flex-direction:column;align-items:center;padding:18px 16px 16px;display:flex}.rp-qr-wrap{box-sizing:border-box;background:#fff;border-radius:10px;justify-content:center;align-items:center;width:220px;height:220px;padding:8px;display:flex;position:relative}.rp-qr{width:204px;height:204px;display:block}.rp-qr--loading{width:100%;height:100%;color:var(--text-placeholder);justify-content:center;align-items:center;font-size:14px;display:flex}.rp-qr--blurred{filter:blur(7px);opacity:.55;transition:filter .25s,opacity .25s}.rp-qr-loading{background:#ffffff80;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:10px;display:flex;position:absolute;inset:0}.rp-spinner{border:3px solid #10131a2e;border-top-color:var(--accent);border-radius:50%;width:30px;height:30px;animation:.8s linear infinite rp-spin}.rp-loading-text{color:var(--text-dim);font-size:13px}@keyframes rp-spin{to{transform:rotate(360deg)}}.rp-tip{color:var(--text-dim);text-align:center;margin:12px 0 10px;font-size:12.5px}.rp-url{align-items:center;gap:8px;width:100%;display:flex}.rp-url-text{min-width:0;color:var(--text-dim);background:var(--bg-input);border:1px solid var(--border);text-overflow:ellipsis;white-space:nowrap;border-radius:7px;flex:auto;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.rp-copy{border:1px solid var(--accent-border);background:var(--accent);color:var(--on-accent);cursor:pointer;border-radius:7px;flex:none;padding:6px 10px;font-size:12px;transition:background .15s,opacity .15s}.rp-copy:hover:not(:disabled){background:var(--accent-hover)}.rp-copy:disabled{opacity:.5;cursor:default}.app--chrome-off .app__stage{justify-content:center}.app--chrome-off .phone-viewport{box-shadow:none}.app--chrome-off .phone__screen{width:375px;margin:0 auto;padding:0}.rp-warn{color:var(--warn);text-align:center;margin:10px 0 0;font-size:11.5px;line-height:1.5}.login-mask{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.login-modal{background:var(--bg-panel);border:1px solid var(--border);width:320px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);box-sizing:border-box;border-radius:14px;padding:18px 18px 16px}.login-modal__title{margin-bottom:6px;font-size:15px;font-weight:600}.login-modal__desc{color:var(--text-dim);margin-bottom:14px;font-size:12px;line-height:1.5}.login-modal__row{align-items:center;gap:10px;margin-bottom:12px;display:flex}.login-modal__label{color:var(--text-dim);flex:0 0 36px;font-size:13px}.login-modal__input{min-width:0;height:34px;color:var(--text);background:var(--bg-input);border:1px solid var(--border);box-sizing:border-box;border-radius:8px;outline:none;flex:auto;padding:0 10px;font-size:13px}.login-modal__input:focus{border-color:var(--accent)}.login-modal__error{color:var(--danger);margin-bottom:10px;font-size:12px}.login-modal__actions{justify-content:flex-end;gap:10px;margin-top:4px;display:flex}.login-modal__btn{border:1px solid var(--border);cursor:pointer;border-radius:8px;padding:7px 14px;font-size:13px;transition:background .15s,opacity .15s,border-color .15s}.login-modal__btn--ghost{color:var(--text-dim);background:0 0}.login-modal__btn--ghost:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.login-modal__btn--primary{border-color:var(--accent-border);background:var(--accent);color:var(--on-accent)}.login-modal__btn--primary:hover:not(:disabled){background:var(--accent-hover)}.login-modal__btn:disabled{opacity:.5;cursor:default}.confirm-mask{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.confirm-modal{background:var(--bg-panel);border:1px solid var(--border);width:360px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);box-sizing:border-box;border-radius:14px;padding:18px 18px 16px}.confirm-modal__title{align-items:center;gap:8px;margin-bottom:8px;font-size:15px;font-weight:600;display:flex}.confirm-modal__title.is-danger{color:var(--danger)}.confirm-modal__title.is-warn{color:var(--warn)}.confirm-modal__icon{flex:none;width:18px;height:18px}.confirm-modal__icon :is(path,line,polyline,circle,rect){vector-effect:non-scaling-stroke}.confirm-modal__desc{color:var(--text-dim);white-space:pre-line;margin-bottom:16px;font-size:12.5px;line-height:1.6}.confirm-modal__actions{justify-content:flex-end;gap:10px;display:flex}.confirm-modal__btn{border:1px solid var(--border);cursor:pointer;border-radius:8px;padding:7px 16px;font-size:13px;transition:background .15s,opacity .15s,border-color .15s}.confirm-modal__btn--ghost{color:var(--text-dim);background:0 0}.confirm-modal__btn--ghost:hover{background:var(--bg-hover);color:var(--text)}.confirm-modal__btn--primary{border-color:var(--accent-border);background:var(--accent);color:var(--on-accent)}.confirm-modal__btn--primary:hover{background:var(--accent-hover)}.confirm-modal__btn--danger{border-color:var(--danger);background:var(--danger);color:var(--on-accent)}.confirm-modal__btn--danger:hover{background:var(--danger-hover)}.confirm-modal__btn--warn{border-color:var(--warn);background:var(--warn);color:var(--on-warn)}.confirm-modal__btn--warn:hover{background:var(--warn-hover)}.pop-enter-active{transition:opacity .15s,transform .26s cubic-bezier(.34,1.56,.64,1)}.pop-leave-active{transition:opacity .12s,transform .12s}.pop-enter-from,.pop-leave-to{opacity:0;transform:translateY(6px)scale(.95)}.modal-enter-active,.modal-leave-active{transition:opacity .2s}.modal-leave-active{transition:opacity .16s}.modal-enter-from,.modal-leave-to{opacity:0}.modal-enter-active .modal-card{transition:transform .34s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active .modal-card{transition:transform .16s}.modal-enter-from .modal-card{transform:translateY(14px)scale(.94)}.modal-leave-to .modal-card{transform:translateY(6px)scale(.98)}.csel{flex:0 auto;width:auto;min-width:240px;max-width:360px;position:relative}.csel__trigger{background:var(--bg-input);border:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:7px 10px 7px 12px;font-size:13px;transition:border-color .15s,background .15s,box-shadow .15s;display:flex}.csel__trigger:hover{border-color:var(--border-strong);background:var(--bg-hover)}.csel__trigger--active{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft);background:var(--bg-hover)}.csel__current{white-space:nowrap;align-items:baseline;gap:8px;display:flex;overflow:hidden}.csel__id{color:var(--text);font-weight:600}.csel__name{color:var(--text-dim);text-overflow:ellipsis;font-size:12px;overflow:hidden}.csel__chev{color:var(--text-dim);flex:none;transition:transform .18s}.csel--open .csel__chev{transform:rotate(180deg)}.csel__pop{z-index:var(--z-pop);background:var(--bg-pop);border:1px solid var(--border-strong);width:max-content;min-width:100%;max-width:min(480px,92vw);box-shadow:0 16px 40px var(--shadow-pop);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:10px;position:absolute;top:calc(100% + 6px);left:0;right:auto;overflow:hidden}.csel__search{border-bottom:var(--hairline) solid var(--border);align-items:center;gap:8px;padding:8px 10px;display:flex}.csel__search-icon{color:var(--text-faint);flex:none}.csel__input{color:var(--text);background:0 0;border:none;outline:none;flex:1;font-size:13px}.csel__input::placeholder{color:var(--text-faint)}.csel__list{max-height:320px;margin:0;padding:4px;list-style:none;overflow-y:auto}.csel__item{cursor:pointer;color:var(--text-dim);border-radius:7px;align-items:center;gap:8px;padding:7px 10px;font-size:13px;display:flex}.csel__item--active{background:var(--bg-hover);color:var(--text)}.csel__item--selected .csel__item-id{color:var(--accent)}.csel__dot{background:var(--text-faint);opacity:.75;border-radius:50%;flex:none;align-self:center;width:6px;height:6px}.csel__dot--imported{background:var(--ok);opacity:1}.csel__item-id{color:var(--text);flex:none;font-weight:600}.csel__item-name{text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim);flex:1;font-size:12px;overflow:hidden}.csel__check{color:var(--accent);flex:none}.csel__empty{text-align:center;color:var(--text-faint);padding:14px;font-size:13px}.csel__foot{border-top:var(--hairline) solid var(--border);justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;display:flex}.csel__count{color:var(--text-faint);white-space:nowrap;font-size:11px}.csel__sort{color:var(--text-dim);border:1px solid var(--border);cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:3px 8px;font-size:11px;transition:background .15s,color .15s,border-color .15s}.csel__sort:hover{background:var(--bg-hover);color:var(--text)}.csel__sort--active{color:var(--accent);border-color:var(--accent-border);background:var(--accent-soft)}.csel-fade-enter-active,.csel-fade-leave-active{transition:opacity .14s,transform .14s}.csel-fade-enter,.csel-fade-leave-to{opacity:0;transform:translateY(-4px)}.csel-combo{height:var(--ctrl-sm);background:var(--bg-input);border:1px solid var(--border);border-radius:8px;flex:0 auto;align-items:stretch;min-width:200px;max-width:360px;transition:border-color .15s,box-shadow .15s,background .15s;display:inline-flex}.csel-combo:hover{border-color:var(--border-strong)}.csel-combo:has(.csel--open){border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft)}.csel--combo{background:0 0;border:none;flex:auto;min-width:0}.csel--combo .csel__trigger{background:0 0;border:none;border-radius:8px 0 0 8px;height:100%;padding:0 10px 0 12px;font-size:12px}.csel--combo .csel__trigger:hover{background:var(--bg-hover)}.csel--combo .csel__trigger--active{box-shadow:none;background:var(--bg-hover);border-color:#0000}.csel-combo__btn{aspect-ratio:1;border:none;border-left:var(--hairline) solid var(--border);color:var(--text);cursor:pointer;background:0 0;border-radius:0 8px 8px 0;flex:none;justify-content:center;align-items:center;margin:0;padding:0;transition:background .15s,color .15s;display:inline-flex}.csel-combo__btn:hover:not(:disabled){background:var(--bg-hover);color:var(--accent)}.csel-combo__btn:active:not(:disabled){background:var(--bg-active)}.csel-combo__btn:disabled{opacity:.4;cursor:default}.cg-mask{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.cg-modal{background:var(--bg-panel,#fff);border:1px solid var(--border);width:min(960px,100%);height:84vh;max-height:84vh;box-shadow:0 24px 64px var(--shadow-pop);border-radius:12px;flex-direction:column;display:flex;overflow:hidden}.cg-modal__head{border-bottom:var(--hairline) solid var(--border);flex:none;align-items:center;gap:12px;padding:12px 16px;display:flex}.cg-modal__title{color:var(--text);white-space:nowrap;align-items:center;gap:8px;font-size:14px;font-weight:600;display:flex}.cg-modal__count{color:var(--text-faint);font-size:12px;font-weight:500}.cg-modal__search{flex:auto;align-items:center;min-width:0;display:flex;position:relative}.cg-modal__search-icon{color:var(--text-faint);pointer-events:none;position:absolute;left:10px}.cg-modal__input{width:100%;height:var(--ctrl-md);background:var(--bg-input);border:1px solid var(--border);color:var(--text);border-radius:8px;outline:none;padding:0 10px 0 30px;font-size:13px;transition:border-color .15s,box-shadow .15s}.cg-modal__input:focus{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft)}.cg-modal__close{width:var(--ctrl-md);height:var(--ctrl-md);border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0;border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.cg-modal__close:hover{background:var(--bg-hover);color:var(--accent);border-color:var(--accent-border)}.cg-modal__sort{height:var(--ctrl-md);background:var(--bg-input);color:var(--text);border:1px solid var(--border);white-space:nowrap;cursor:pointer;border-radius:8px;flex:none;padding:0 10px;font-size:12px;transition:background .15s,border-color .15s,color .15s}.cg-modal__sort:hover{background:var(--bg-hover);border-color:var(--border-strong)}.cg-modal__sort--active{background:var(--accent-soft);color:var(--accent);border-color:var(--accent-border)}.cg-grid{flex:auto;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-auto-rows:max-content;align-content:start;gap:14px;min-height:0;padding:16px;display:grid;overflow-y:auto}.cg-tile{background:var(--bg-input);border:1px solid var(--border);height:220px;color:inherit;text-align:left;cursor:pointer;border-radius:10px;flex-direction:column;padding:0;transition:border-color .15s,background .15s,transform 80ms,box-shadow .15s;display:flex;overflow:hidden}.cg-tile:hover{border-color:var(--accent-border);background:var(--bg-hover);transform:translateY(-2px)}.cg-tile--active{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.cg-tile__thumb{border-bottom:var(--hairline) solid var(--border);background:#fff;flex:auto;min-height:0;position:relative}.cg-tile__tag{z-index:1;border-radius:var(--radius-xs);background:var(--ok-strong);color:var(--on-ok);font-size:var(--fs-xs);white-space:nowrap;-webkit-user-select:none;user-select:none;pointer-events:none;padding:2px 8px;font-weight:600;line-height:1.5;position:absolute;top:6px;right:6px}.cg-tile__img{object-fit:contain;width:100%;height:100%;display:block}.cg-tile__skeleton,.cg-tile__fallback{color:var(--text-faint);flex-direction:column;justify-content:center;align-items:center;gap:6px;font-size:12px;display:flex;position:absolute;inset:0}.cg-tile__fallback .app__icon{opacity:.7;width:28px;height:28px}.cg-tile__meta{flex-direction:column;gap:2px;padding:8px 10px;display:flex}.cg-tile__name{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.cg-tile__id{color:var(--text-faint);white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.cg-empty{text-align:center;color:var(--text-faint);grid-column:1/-1;padding:48px 0;font-size:13px}.jt{color:var(--text-dim);font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.6}.jt__toolbar{z-index:var(--z-sticky);justify-content:flex-start;gap:12px;padding:8px 12px;display:flex;position:sticky;top:0}.jt__tool{height:var(--ctrl-sm);background:var(--bg-input);border:1px solid var(--border);color:var(--text-dim);cursor:pointer;border-radius:6px;padding:0 10px;font-size:12px;transition:background .15s,border-color .15s,color .15s}.jt__tool:hover{background:var(--bg-hover);border-color:var(--accent-border);color:var(--text)}.jt__list{margin:0;padding:0;list-style:none}.jt__list--root{padding-bottom:52px;padding-left:2px}.jt__child{border-left:var(--hairline) solid var(--border);margin-left:4px;padding-left:16px}.jt__node{position:relative}.jt__row{cursor:pointer;border-radius:4px;align-items:center;gap:4px;padding:1px 4px;display:flex}.jt__row--branch{cursor:pointer}.jt__row--branch:hover,.jt__row--leaf:hover{background:var(--bg-hover)}.jt__row--selected,.jt__row--selected:hover{background:var(--accent-soft)}.jt__caret{text-align:center;width:12px;color:var(--text-faint);-webkit-user-select:none;user-select:none;flex:none;font-size:9px;transition:transform .15s;transform:rotate(0)}.jt__caret--open{color:var(--accent);transform:rotate(90deg)}.jt__caret--leaf{visibility:hidden}.jt__key{color:var(--jt-key);font-weight:500}.jt__colon,.jt__bracket{color:var(--jt-faint)}.jt__preview{color:var(--jt-faint);text-overflow:ellipsis;white-space:nowrap;max-width:60%;font-style:italic;overflow:hidden}.jt__count{color:var(--jt-faint);margin-left:4px;font-size:11px}.jt__val--string{color:var(--jt-string)}.jt__val--number{color:var(--jt-number)}.jt__val--boolean{color:var(--jt-boolean)}.jt__val--null{color:var(--jt-null);font-style:italic}.jt__val--array,.jt__val--object{color:var(--accent)}.jt__editable{cursor:text;border-radius:2px;transition:background .12s}.jt__editable:hover{background:var(--bg-hover)}.jt__edit{background:var(--bg-input);border:1px solid var(--accent);color:var(--text);font:inherit;border-radius:3px;outline:none;min-width:40px;max-width:200px;padding:0 4px;font-size:12px;line-height:1.5}.jt__edit:focus{box-shadow:0 0 0 2px var(--jt-ring)}.jt__del{width:16px;height:16px;color:var(--text-faint);cursor:pointer;opacity:0;background:0 0;border:none;border-radius:3px;flex:none;justify-content:center;align-items:center;margin-left:auto;padding:0;font-size:14px;line-height:1;transition:opacity .12s,background .12s,color .12s;display:inline-flex}.jt__node:hover>.jt__row--leaf .jt__del{opacity:1}.jt__del:hover{background:var(--jt-del-bg);color:var(--jt-del-fg)}.jt__tool--add{color:var(--accent);border-color:var(--accent-border);margin-left:auto}.jt__tool--add:hover{background:var(--jt-add-bg);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.jt__json-edit{background:var(--bg-input);border:1px solid var(--accent);box-shadow:0 4px 16px var(--shadow-toast);border-radius:6px;margin:4px 0 4px 16px;padding:8px;position:relative}.jt__json-textarea{background:var(--bg-input);border:1px solid var(--border);width:100%;min-height:120px;max-height:400px;color:var(--text);resize:vertical;tab-size:2;border-radius:4px;outline:none;padding:8px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;display:block}.jt__json-textarea:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--jt-ring)}.jt__json-actions{align-items:center;gap:8px;margin-top:8px;display:flex}.jt__json-btn{background:var(--accent);color:var(--on-accent);cursor:pointer;border:none;border-radius:4px;padding:4px 12px;font-size:12px;transition:opacity .15s}.jt__json-btn:hover{opacity:.85}.jt__json-btn--cancel{background:var(--bg-hover);color:var(--text-dim)}.jt__json-btn--cancel:hover{background:var(--border)}.jt__json-hint{color:var(--text-faint);margin-left:auto;font-size:11px}.jt__ctxmenu{z-index:calc(var(--z-toast-app) + 1);background:var(--bg-pop);border:1px solid var(--border-strong);min-width:120px;box-shadow:0 8px 24px var(--shadow-pop);color:var(--text);border-radius:8px;padding:4px;position:fixed}.jt__ctxmenu-item{text-align:left;width:100%;color:var(--text);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:6px 12px;font-size:12px;transition:background .12s,color .12s;display:block}.jt__ctxmenu-item:hover{background:var(--accent-soft);color:var(--accent)}.jt__ctxmenu-item--del{color:var(--danger)}.jt__ctxmenu-item--del:hover{background:var(--danger-soft);color:var(--danger)}.jt__ctxmenu-mask{z-index:var(--z-toast-app);background:0 0;position:fixed;inset:0}.st{flex-direction:column;min-height:100%;display:flex;position:relative}.st__toolbar{z-index:var(--z-sticky);justify-content:flex-start;gap:12px;padding:8px 12px;display:flex;position:sticky;top:0}.st__toolbar--top{flex-wrap:nowrap;align-items:center}.st__toolbar--top .jt__tool{flex:none}.st__locate{color:var(--text-dim);justify-content:center;align-items:center;padding:6px;display:inline-flex}.st__locate:hover{color:var(--text)}.st__locate--active{color:var(--accent);border-color:var(--accent-border);background:var(--accent-soft);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.st__locate svg{pointer-events:none;display:block}.st__search{box-sizing:border-box;min-width:0;height:28px;color:var(--text);background:var(--bg-input);border:1px solid var(--border);border-radius:6px;outline:none;flex:auto;padding:0 8px;font-size:12px}.st__search:focus{border-color:var(--accent)}.st__label--hl{background:var(--st-hl-bg);border-radius:3px;padding:0 2px}.st__list{margin:0;padding:4px 0;list-style:none}.st__help-wrap{height:0;z-index:var(--z-pop);margin-top:auto;position:sticky;bottom:10px}.st__help{background:var(--bg-input);width:28px;height:28px;color:var(--text-dim);border:1px solid var(--border-strong);cursor:pointer;box-shadow:0 2px 8px var(--shadow-toast);border-radius:50%;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s;display:inline-flex;position:absolute;bottom:0;left:10px}.st__help svg{transition:transform 50ms}.st__help:hover{background:var(--bg-hover);border-color:var(--accent-border);color:var(--accent)}.st__help:active svg{transform:translateY(1px)}.st__help--open{background:var(--accent-soft);border-color:var(--accent-border);color:var(--accent)}.st__help-pop{transform-origin:0 100%;background:var(--bg-panel);border:1px solid var(--border-strong);width:300px;box-shadow:0 8px 24px var(--shadow-pop);border-radius:10px;position:absolute;bottom:36px;left:10px}.st__help-pop-head{border-bottom:var(--hairline) solid var(--border);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.st__help-pop-title{color:var(--text);font-size:12px;font-weight:600}.st__help-pop-close{width:18px;height:18px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:0;font-size:12px;transition:background .15s,color .15s;display:inline-flex}.st__help-pop-close:hover{background:var(--bg-hover);color:var(--text)}.st__help-pop-body{color:var(--text-dim);margin:0;padding:10px 12px;font-size:12px;line-height:1.6}.st__keys{flex-direction:column;gap:8px;list-style:none;display:flex}.st__keys-row{align-items:center;gap:10px;display:flex}.st__keys-combo{white-space:nowrap;flex:0 0 108px;align-items:center;gap:3px;display:inline-flex}.st__kbd{background:var(--bg-input);min-width:20px;height:20px;color:var(--text);border:1px solid var(--border-strong);font-family:var(--mono,ui-monospace, SFMono-Regular, Menlo, monospace);border-bottom-width:2px;border-radius:5px;justify-content:center;align-items:center;padding:0 5px;font-size:11px;line-height:1;display:inline-flex}.st__kbd-plus{color:var(--text-faint);font-size:11px}.st__keys-desc{color:var(--text-dim);flex:auto;font-size:12px;line-height:1.5}.st__node{list-style:none}.st__row{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;height:var(--row-h);align-items:center;gap:4px;padding:0 8px;transition:background .1s;display:flex}.st__row:hover{background:var(--bg-hover)}.st__row--selected{background:var(--accent-soft)!important}.st__row--selected .st__label{color:var(--accent);font-weight:500}.st__handle{width:12px;height:14px;color:var(--text-faint);cursor:grab;opacity:0;flex:0 0 12px;justify-content:center;align-items:center;margin-right:-2px;transition:opacity .15s,color .15s;display:inline-flex}.st__row:hover .st__handle{opacity:.75}.st__handle:hover{color:var(--text);opacity:1}.st__handle:active{cursor:grabbing}.st__handle svg{pointer-events:none;display:block}.st__row--dragging{opacity:.4}.st__row--drop-before{box-shadow:inset 0 2px 0 0 var(--accent)}.st__row--drop-after{box-shadow:inset 0 -2px 0 0 var(--accent)}.st__row--drop-inside{background:var(--accent-soft);outline:1px dashed var(--accent);outline-offset:-1px}.st__row--drop-blocked{cursor:no-drop}.st__caret{width:12px;height:12px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:0 0 12px;justify-content:center;align-items:center;font-size:10px;line-height:1;transition:transform .15s;display:inline-flex}.st__caret--open{transform:rotate(90deg)}.st__caret--leaf{visibility:hidden}.st__label{color:var(--st-label);font-size:12px}.st__id{color:var(--st-id);font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:11px}.st__badge{border-radius:var(--radius-xs);border:1px solid #0000;flex:none;margin-left:auto;padding:0 6px;font-size:11px;line-height:16px}.st__badge--clickable{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-border);cursor:pointer;transition:color .15s,background .15s,border-color .15s}.st__badge--clickable:hover{color:var(--accent-hover)}.st__badge--muted{cursor:pointer;color:var(--text-faint);border-color:var(--border);background:0 0;transition:opacity .15s,color .15s,background .15s,border-color .15s}.st__badge--muted:hover{color:var(--text-dim);background:var(--bg-hover);border-color:var(--border-strong)}.st__gear{width:20px;height:20px;color:var(--text-faint);cursor:pointer;border-radius:var(--radius-xs);background:0 0;border:none;flex:none;justify-content:center;align-items:center;margin-left:2px;padding:0;transition:background .15s,color .15s;display:inline-flex}.st__gear:hover{background:var(--bg-hover);color:var(--text)}.st__gear svg{display:block}.st__children{border-left:var(--hairline) solid var(--border);margin:0 0 0 14px;padding:0 0 0 16px;list-style:none}.st__ctx{z-index:var(--z-overlay);background:var(--bg-pop);border:1px solid var(--border);border-radius:var(--radius-md);min-width:132px;box-shadow:var(--shadow-3);-webkit-user-select:none;user-select:none;padding:4px;position:fixed}.st__ctx-item{text-align:left;width:100%;color:var(--text);border-radius:var(--radius-xs);cursor:pointer;background:0 0;border:none;padding:6px 10px;font-size:12px;display:block}.st__ctx-item:hover:not(:disabled){background:var(--accent-soft);color:var(--accent)}.st__ctx-item:disabled{color:var(--text-faint);cursor:not-allowed;opacity:.6}.st__ctx-item--danger:hover:not(:disabled){background:var(--danger-soft);color:var(--danger)}.st__ctx-sep{height:var(--hairline);background:var(--border);margin:4px 2px}.ni-overlay{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.ni-panel{background:var(--bg-panel);border:1px solid var(--border-strong);width:560px;max-width:94vw;height:80vh;min-height:420px;box-shadow:var(--shadow-4);border-radius:10px;flex-direction:column;display:flex;position:relative;overflow:hidden}.ni-head{border-bottom:var(--hairline) solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;padding:10px 16px;display:flex}.ni-title{color:var(--text);font-size:13px;font-weight:600}.ni-close{width:22px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background .15s,color .15s;display:inline-flex}.ni-close:before{content:"✕"}.ni-close:hover{background:var(--bg-hover);color:var(--text)}.ni-body{flex-direction:column;flex:auto;min-height:0;padding:16px 0;display:flex}.ni-body .ni-empty{padding:0 16px}.ni-scroll{flex:auto;min-height:0;padding:0 16px 12px;overflow-y:auto}.ni-body>.ni-sec{margin-bottom:12px}.ni-body>.ni-sec:last-child{margin-bottom:0}.ni-sec-head{color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;margin-bottom:12px;font-size:13px;font-weight:600;display:flex}.ni-caret,.ptree__caret{width:12px;height:12px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:0 0 12px;justify-content:center;align-items:center;font-size:10px;line-height:1;transition:transform .15s;display:inline-flex}.ni-caret.is-open,.ptree__caret.is-open{transform:rotate(90deg)}.ni-sec-body{margin-bottom:0}.ni-empty{color:var(--text-faint);margin:0;font-size:12px}.ni-field-row{align-items:center;gap:10px;margin-bottom:12px;display:flex}.ni-field-row .ni-field-label{color:var(--text-dim);text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 0 88px;font-size:12px;font-weight:500;overflow:hidden}.ni-field-row .ni-input{flex:auto;min-width:0}.ni-input{box-sizing:border-box;width:100%;min-width:0;height:var(--ctrl-sm);background:var(--bg-input);color:var(--text);border:1px solid var(--border-strong);border-radius:6px;outline:none;padding:6px 12px;font-size:12px;transition:border-color .15s}.ni-input:focus{border-color:var(--accent)}select.ni-input{height:var(--ctrl-sm)}.ni-cls{color:var(--text-faint);margin-left:6px;font-size:11px;font-style:normal}.ni-static{color:var(--text);font-size:13px}.ptree{gap:var(--space-3);flex-direction:column;display:flex}.ptree__group{flex-direction:column;gap:4px;display:flex}.ptree__group-head{cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;transition:background .15s;display:flex}.ptree:not(.ptree--plain) .ptree__group-head:hover{background:var(--bg-hover)}.ptree__group-name{min-width:0;color:var(--text);white-space:nowrap;text-overflow:ellipsis;flex:auto;font-size:12px;font-weight:600;overflow:hidden}.ptree__group-count{color:var(--text-faint);flex:none;font-size:11px}.ptree__group-body>.ptree__group>.ptree__group-head{background:0 0;padding-left:2px;font-weight:500}.ptree:not(.ptree--plain) .ptree__group-body>.ptree__group>.ptree__group-head:hover{background:var(--bg-hover)}.ptree__group-body{border-left:var(--hairline) solid var(--border);flex-direction:column;gap:4px;margin-left:6px;padding:6px 0 2px 10px;display:flex}.ptree__row{min-height:var(--ctrl-md);border-radius:6px;align-items:center;gap:10px;padding:0 8px;display:flex}.ptree:not(.ptree--plain) .ptree__row:hover{background:var(--bg-hover)}.ptree__label{color:var(--text-dim);text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 0 88px;font-size:12px;overflow:hidden}.ptree__control{flex:auto;min-width:0}.ni-foot{background:var(--bg-bar);border-top:var(--hairline) solid var(--border);flex:none;justify-content:space-between;align-items:center;gap:10px;padding:10px 16px;display:flex}.ni-tip{color:var(--text-faint);font-size:12px;line-height:1.5}.ni-foot-btns{flex-shrink:0;gap:8px;display:flex}.ni-btn{white-space:nowrap;height:var(--ctrl-sm);border:1px solid var(--accent-border);color:var(--accent);cursor:pointer;background:0 0;border-radius:6px;padding:0 14px;font-size:12px;transition:background .15s,color .15s}.ni-btn:hover{background:var(--accent-soft)}.ni-btn--ghost{color:var(--text-dim);border-color:var(--border-strong);background:0 0}.ni-btn--ghost:hover{background:var(--bg-hover);color:var(--text)}.ptree__row--block{flex-direction:column;align-items:stretch;gap:4px}.ptree__row--block .ptree__label{flex:none;padding-top:0}@media (width<=600px){.ni-panel{border-radius:0;width:100vw;max-width:100vw;height:100vh}}.ee-overlay{z-index:var(--z-appmodal);background:var(--scrim-modal);-webkit-backdrop-filter:blur(var(--scrim-modal-blur));backdrop-filter:blur(var(--scrim-modal-blur));position:fixed;inset:0}.ee-panel{background:var(--bg-panel);border-left:var(--hairline) solid var(--border-strong);width:100%;max-width:720px;height:100vh;box-shadow:var(--shadow-5);flex-direction:column;display:flex;position:absolute;top:0;bottom:0;right:0;overflow:hidden}.ee-drawer-enter-active,.ee-drawer-leave-active{transition:opacity .18s}.ee-drawer-leave-active{transition:opacity .24s}.ee-drawer-enter-active .ee-panel{transition:transform .34s cubic-bezier(.32,1.32,.45,1)}.ee-drawer-leave-active .ee-panel{transition:transform .24s cubic-bezier(.4,0,.6,1)}.ee-drawer-enter-from,.ee-drawer-leave-to{opacity:0}.ee-drawer-enter-from .ee-panel,.ee-drawer-leave-to .ee-panel{transform:translate(100%)}.ee-head{border-bottom:var(--hairline) solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;padding:10px 16px;display:flex}.ee-title{color:var(--text);font-size:13px;font-weight:600}.ee-cls{color:var(--text-faint);margin-left:6px;font-size:11px;font-style:normal}.ee-close{width:var(--ctrl-sm);height:var(--ctrl-sm);color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background .15s,color .15s;display:inline-flex}.ee-close:before{content:"✕"}.ee-close:hover{background:var(--bg-hover);color:var(--text)}.ee-body{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.ee-side{border-bottom:var(--hairline) solid var(--border);flex:none;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:8px 16px;display:flex;position:relative}.ee-side>.ee-empty{flex:auto}.ee-evt-list{flex-wrap:wrap;flex:auto;gap:2px 8px;min-width:0;max-height:108px;display:flex;overflow-y:auto}.ee-evt{cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;height:24px;padding:0 8px 0 6px;transition:background .15s;display:flex}.ee-evt:hover{background:var(--bg-hover)}.ee-evt.is-on .ee-evt-name{color:var(--text)}.ee-evt.is-sel{background:var(--bg-input)}.ee-evt.is-sel .ee-evt-name{color:var(--accent)}.ee-evt-name{min-width:0;color:var(--text-faint);white-space:nowrap;text-overflow:ellipsis;flex:auto;font-size:12px;font-weight:500;overflow:hidden}.ee-detail{flex-direction:column;flex:auto;min-width:0;padding:12px 16px;display:flex;overflow:hidden}.ee-detail-head{flex:none}.ee-detail-body{flex-direction:column;flex:auto;min-height:0;margin-top:8px;display:flex;overflow:hidden}.ee-detail-body .ptree{flex:auto;min-height:0}.ee-detail-body .ptree__row{padding:0}.ee-detail-body .ptree__row--block{flex:auto;min-height:0}.ee-detail-body .ptree__row--block .ptree__label{display:none}.ee-detail-body .st-code{flex:auto;gap:2px;min-height:0}.ee-detail-body .st-code__foot{flex:none;padding:4px 2px 2px;font-size:11px;line-height:normal}.ee-detail-body .ptree__row--block .ptree__control{flex-direction:column;min-height:0;display:flex}.ee-detail-body .ptree__row--block .ptree__control>.pc{flex:auto;min-height:0}.ee-detail-body .pc-body{flex-direction:column;flex:auto;min-height:0;display:flex}.ee-detail-body .pc-body>.st-code{flex:auto;min-height:0}.ee-detail-body .st-code__editor{flex:auto;min-height:120px;max-height:none}.ee-detail-empty{text-align:center;margin:auto}.ee-empty{color:var(--text-faint);margin:0;font-size:12px}.ee-field-row{align-items:center;gap:10px;display:flex}.ee-field-label{color:var(--text-dim);text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 0 64px;font-size:12px;overflow:hidden}.ee-help{width:22px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:color .15s,background .15s;display:inline-flex}.ee-help:hover{color:var(--text);background:var(--bg-hover)}.ee-help__mask{z-index:6;position:fixed;inset:0}.ee-help__pop{z-index:7;transform-origin:100% 0;border:1px solid var(--border-strong);background:var(--bg-panel);width:min(340px,78%);box-shadow:var(--shadow-3);border-radius:8px;padding:8px 10px;position:absolute;top:calc(100% + 4px);right:12px}.ee-help__text{color:var(--text-dim);white-space:pre-wrap;margin:0;font-size:11px;line-height:1.6}.ee-switch{background:var(--border-strong);cursor:pointer;border:none;border-radius:8px;flex:none;width:30px;height:16px;margin:0;padding:0;transition:background .18s;position:relative}.ee-switch.is-on{background:var(--accent)}.ee-switch__dot{background:var(--on-accent);border-radius:50%;width:12px;height:12px;transition:transform .18s;position:absolute;top:2px;left:2px}.ee-switch.is-on .ee-switch__dot{transform:translate(14px)}.ee-evt-orphan{color:var(--warn);flex:none;margin:10px 0 0;font-size:11px}.ee-foot{background:var(--bg-bar);border-top:var(--hairline) solid var(--border);flex:none;justify-content:space-between;align-items:center;gap:10px;padding:10px 16px;display:flex}.ee-tip{color:var(--text-faint);font-size:11px;line-height:1.4}.ee-foot-btns{flex-shrink:0;gap:8px;display:flex}.ee-btn{white-space:nowrap;height:var(--ctrl-sm);border:1px solid var(--accent-border);color:var(--accent);cursor:pointer;background:0 0;border-radius:6px;padding:0 14px;font-size:12px;transition:background .15s,color .15s}.ee-btn:hover{background:var(--accent-soft)}.ee-btn--ghost{color:var(--text-dim);border-color:var(--border-strong);background:0 0}.ee-btn--ghost:hover{background:var(--bg-hover)}.dd{flex-direction:column;min-width:0;display:inline-flex;position:relative}.dd--block{width:100%;display:flex}.dd--disabled{opacity:.6;pointer-events:none}.dd__trigger{box-sizing:border-box;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm,6px);width:100%;color:var(--text);text-align:left;cursor:pointer;appearance:none;justify-content:space-between;align-items:center;gap:8px;padding:0 10px 0 12px;font-family:inherit;font-size:12px;line-height:1;transition:border-color .15s,background .15s,box-shadow .15s;display:flex;position:relative}.dd__trigger:hover{border-color:var(--border-strong);background:var(--bg-hover)}.dd__trigger--active{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft);background:var(--bg-hover)}.dd--borderless .dd__trigger{background:0 0;border-color:#0000}.dd--borderless .dd__trigger:hover{background:var(--bg-hover);border-color:#0000}.dd--borderless .dd__trigger--active{box-shadow:none;background:var(--bg-hover);border-color:#0000}.dd__trigger:disabled{opacity:.5;cursor:not-allowed}.dd__trigger--slot{background:0 0;border:0;padding:0}.dd--xs .dd__trigger{height:28px;padding:0 6px 0 8px;font-size:11px}.dd--sm .dd__trigger{height:28px;font-size:12px}.dd--md .dd__trigger{border-radius:var(--radius,8px);height:32px;padding:0 10px 0 12px;font-size:14px}.dd--lg .dd__trigger{border-radius:var(--radius,8px);height:40px;padding:0 12px 0 14px;font-size:14px}.dd__label{white-space:nowrap;text-overflow:ellipsis;min-width:0;color:var(--text);flex:auto;overflow:hidden}.dd__chev{color:var(--text-dim);flex:none;transition:transform .18s}.dd__clear{width:16px;height:16px;color:var(--text-faint);cursor:pointer;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;font-size:12px;line-height:1;transition:background .15s,color .15s;display:none;position:absolute;top:50%;right:22px;transform:translateY(-50%)}.dd__trigger:hover .dd__clear{display:inline-flex}.dd__clear:hover{background:var(--bg-hover);color:var(--text)}.dd--open .dd__chev{transform:rotate(180deg)}.dd__pop{z-index:var(--z-pop);background:var(--bg-pop);border:1px solid var(--border-strong);border-radius:var(--radius,8px);min-width:100%;box-shadow:var(--shadow-3);line-height:normal;position:absolute;top:calc(100% + 6px);overflow:hidden}.dd__pop--bottom-start{left:0}.dd__pop--bottom-end{right:0}.dd--dropup .dd__pop{top:auto;bottom:calc(100% + 6px)}.dd__list{max-height:280px;margin:0;padding:4px;list-style:none;overflow-y:auto}.dd__item{cursor:pointer;color:var(--text-dim);border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:13px;display:flex}.dd--xs .dd__item,.dd--sm .dd__item{padding:6px 9px;font-size:12px}.dd__item:hover{background:var(--bg-hover);color:var(--text)}.dd__item--selected{color:var(--accent)}.dd__item--selected .dd__item-text{color:var(--accent);font-weight:500}.dd__item--disabled{opacity:.45;cursor:not-allowed}.dd__item--disabled:hover{background:0 0}.dd__item-text{white-space:nowrap;text-overflow:ellipsis;flex:auto;min-width:0;overflow:hidden}.dd__check{color:var(--accent);flex:none}.dd__empty{text-align:center;color:var(--text-faint);cursor:default;padding:12px;font-size:12px}.dd-fade-enter-active,.dd-fade-leave-active{transition:opacity .14s,transform .14s}.dd-fade-enter-from,.dd-fade-leave-to{opacity:0;transform:translateY(-4px)}.dd__menu{min-width:168px;margin:0;padding:4px;list-style:none}.app__remote-pop.dd__menu{min-width:120px;padding:4px}.app__remote-item{cursor:pointer;color:var(--text-dim);border-radius:6px;align-items:center;gap:8px;padding:6px 9px;font-size:12px;display:flex}.app__remote-item.is-disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.app__remote-item .app__icon{flex:0 0 16px;width:16px;height:16px}.dd__trigger--slot,.dd--xs .dd__trigger--slot,.dd--sm .dd__trigger--slot,.dd--md .dd__trigger--slot,.dd--lg .dd__trigger--slot{background:0 0;border:0;height:auto;padding:0}.app__icon--chev--open{transform:rotate(180deg)}.st-textarea{box-sizing:border-box;width:100%;min-width:0;height:var(--ctrl-sm);background:var(--bg-input);border:1px solid var(--border-strong);color:var(--text);resize:none;border-radius:6px;outline:none;height:auto;min-height:96px;padding:6px 12px;font-family:inherit;font-size:12px;line-height:1.5;transition:border-color .15s,box-shadow .15s}.st-textarea:focus{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft)}.st-textarea:disabled{opacity:.5;cursor:not-allowed}.st-textarea::placeholder{color:var(--text-faint)}.st-select{box-sizing:border-box;width:100%;min-width:0;height:var(--ctrl-sm);background:var(--bg-input) url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23949aab' d='M0 0h10L5 6z'/%3E%3C/svg%3E") no-repeat right 8px center;border:1px solid var(--border-strong);color:var(--text);appearance:none;cursor:pointer;border-radius:6px;outline:none;padding:0 24px 0 12px;font-family:inherit;font-size:12px}.st-select:focus{border-color:var(--accent-border)}.st-select option{background:var(--bg-panel);color:var(--text)}.st-number{box-sizing:border-box;width:100%;min-width:0;height:var(--ctrl-sm);background:var(--bg-input);border:1px solid var(--border-strong);border-radius:6px;align-items:center;transition:border-color .15s;display:flex;overflow:hidden}.st-number:focus-within{border-color:var(--accent-border)}.st-number__field{min-width:0;height:100%;color:var(--text);background:0 0;border:0;outline:none;flex:auto;padding:0 10px;font-family:inherit;font-size:12px}.st-number__field::placeholder{color:var(--text-faint)}.st-number__symbol{border-left:var(--hairline) solid var(--border);background:var(--overlay-tint);min-width:24px;height:100%;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.st-number__symbol--btn{cursor:pointer}.st-number__symbol--btn:hover{background:var(--bg-hover);color:var(--text)}.st-number__caret{border-left:var(--hairline) solid var(--border);width:20px;height:100%;color:var(--text-faint);cursor:pointer;flex:none;justify-content:center;align-items:center;display:inline-flex}.st-number__caret:hover{background:var(--bg-hover);color:var(--text)}.st-number__field:disabled{cursor:not-allowed;opacity:.55}.st-number__step{background:var(--overlay-tint);border:0;border-right:var(--hairline) solid var(--border);width:26px;height:100%;color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;flex:0 0 26px;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:inline-flex}.st-number__step--inc{border-right:0;border-left:var(--hairline) solid var(--border)}.st-number__step:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.st-number__step:active:not(:disabled){background:var(--bg-active)}.st-number__step:disabled{opacity:.4;cursor:default}.st-number--step .st-number__field{text-align:center;padding:0 4px}.st-number-wrap,.st-numberstyle{width:100%;min-width:0;position:relative}.st-pop-mask{z-index:var(--z-overlay);position:fixed;inset:0}.st-pop{z-index:var(--z-pop);background:var(--bg-panel);border:1px solid var(--border);min-width:80px;box-shadow:var(--shadow-3);border-radius:6px;padding:6px;position:absolute;top:calc(100% + 4px);right:0}.st-pop__item{color:var(--text-dim);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;border-radius:4px;padding:8px 12px;font-size:13px;line-height:1;transition:background .12s,color .12s}.st-pop__item:hover{background:var(--bg-hover);color:var(--text)}.st-pop__item--on{color:var(--accent);background:var(--accent-soft)}.st-seg{border:1px solid var(--border);border-radius:2px;align-items:stretch;width:100%;min-width:0;display:flex}.st-seg__item{min-width:0;height:calc(var(--ctrl-sm) - 2px);background:var(--bg-input);border-left:var(--hairline) solid var(--border);color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;flex:1 1 0;justify-content:center;align-items:center;gap:3px;padding:0 4px;font-size:12px;line-height:1;transition:background .12s,color .12s;display:inline-flex}.st-seg__item:first-child{border-left:0;border-top-left-radius:2px;border-bottom-left-radius:2px}.st-seg__item:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.st-seg__item:hover{background:var(--bg-hover);color:var(--text)}.st-seg__item--on{background:var(--accent-soft);color:var(--accent);position:relative}.st-seg__item--on:after{content:"";border:1px solid var(--accent-border);border-radius:2px;width:100%;height:100%;position:absolute;top:-1px;left:-1px}.st-seg__item--on:hover{background:var(--accent-soft);color:var(--accent)}.st-seg__icon{fill:none;stroke:currentColor;stroke-width:1.4px;stroke-linecap:round;width:14px;height:14px;display:block}.st-switch{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}.st-switch__track{background:var(--bg-hover);border:1px solid var(--border-strong);border-radius:999px;flex:none;width:34px;height:18px;transition:background .16s,border-color .16s;position:relative}.st-switch__knob{background:var(--text-dim);border-radius:50%;width:14px;height:14px;transition:transform .16s,background .16s;position:absolute;top:1px;left:1px}.st-switch--on .st-switch__track{background:var(--accent-soft);border-color:var(--accent-border)}.st-switch--on .st-switch__knob{background:var(--accent);transform:translate(16px)}.st-switch__text{color:var(--text-dim);font-size:12px}.st-image{width:100%;min-width:0}.st-image__row{align-items:center;gap:6px;display:flex}.st-ic{fill:none;stroke:currentColor;stroke-width:1.4px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px;display:block}.st-image__clear,.st-color__clear{border:1px solid var(--border);background:var(--bg-input);width:26px;height:26px;color:var(--text-dim);cursor:pointer;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.st-image__clear:hover,.st-color__clear:hover{background:var(--bg-hover);color:var(--text);border-color:var(--border-strong)}.st-bgpos{flex-direction:column;gap:8px;width:100%;min-width:0;display:flex}.st-bgpos__xy,.st-bgsize__xy{gap:8px;display:flex}.st-bgpos__xy>*,.st-bgsize__xy>*{flex:1 1 0;min-width:0}.st-bgsize{flex-direction:column;gap:8px;width:100%;min-width:0;display:flex}.st-color{flex-direction:column;gap:4px;width:100%;min-width:0;display:flex}.st-color__top{align-items:center;gap:6px;display:flex}.st-color__swatch{border:1px solid var(--border-strong);cursor:pointer;background:var(--bg-input);border-radius:5px;flex:none;width:28px;height:28px;padding:0;position:relative;overflow:hidden}.st-color__swatch:disabled{cursor:not-allowed;opacity:.6}.st-color__checker{background-image:linear-gradient(45deg, var(--text-faint) 25%, transparent 25%), linear-gradient(-45deg, var(--text-faint) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--text-faint) 75%), linear-gradient(-45deg, transparent 75%, var(--text-faint) 75%);background-position:0 0,0 4px,4px -4px,-4px 0;background-size:8px 8px;position:absolute;inset:0}.st-color__fill{border-radius:4px;position:absolute;inset:0}.st-color__pop{background:var(--bg-panel);border:1px solid var(--border-strong);max-width:calc(100vw - 16px);box-shadow:0 16px 48px var(--shadow-card);border-radius:8px;overflow:hidden}.st-color__pop .vc-sketch{box-shadow:none;background:var(--bg-panel);box-sizing:border-box;border-radius:0;width:100%!important}.st-color__text{flex:auto;min-width:0}.st-color__alpha-row{align-items:center;gap:6px;display:flex}.st-color__alpha-label{color:var(--text-dim);flex:0 0 36px;font-size:11px}.st-color__alpha-slider{appearance:none;background:linear-gradient(to right, transparent 0%, var(--text) 100%);opacity:.7;border-radius:7px;outline:none;flex:auto;height:14px;transition:opacity .15s}.st-color__alpha-slider:hover{opacity:1}.st-color__alpha-slider::-webkit-slider-thumb{-webkit-appearance:none;background:var(--on-accent);border:2px solid var(--border-strong);width:14px;height:14px;box-shadow:0 1px 3px var(--shadow-toast);cursor:pointer;border-radius:50%}.st-color__alpha-slider::-moz-range-thumb{background:var(--on-accent);border:2px solid var(--border-strong);width:14px;height:14px;box-shadow:0 1px 3px var(--shadow-toast);cursor:pointer;border-radius:50%}.st-color__alpha-val{color:var(--text-dim);text-align:right;flex:0 0 32px;font-size:11px}.st-grid9{background:var(--bg-input);border:1px solid var(--border);border-radius:5px;grid-template-columns:repeat(3,1fr);gap:4px;width:100%;padding:6px;display:grid}.st-grid9__cell{cursor:pointer;border-radius:3px;justify-content:center;align-items:center;height:20px;display:flex}.st-grid9__dot{border:1px solid var(--border-strong);border-radius:2px;width:14px;height:14px;transition:background .12s,border-color .12s}.st-grid9__cell:hover .st-grid9__dot{border-color:var(--accent-border);background:var(--accent-soft)}.st-grid9__cell--on .st-grid9__dot{background:var(--accent);border-color:var(--accent)}.st-pad{grid-template-columns:1fr 1fr;gap:6px;width:100%;display:grid}.st-gradient{flex-direction:column;gap:6px;width:100%;display:flex}.st-gradient__preview{border:1px solid var(--border);border-radius:4px;height:20px}.st-gradient__stop{align-items:center;gap:6px;display:flex}.st-gradient__del{border:1px solid var(--border);background:var(--bg-input);width:22px;height:22px;color:var(--text-faint);cursor:pointer;border-radius:4px;flex:none;font-size:12px;line-height:1}.st-gradient__del:hover{border-color:var(--danger);color:var(--danger)}.st-minibtn{background:var(--bg-input);border:1px dashed var(--border-strong);height:24px;color:var(--text-dim);cursor:pointer;white-space:nowrap;border-radius:5px;padding:0 10px;font-size:11px;transition:color .12s,border-color .12s}.st-minibtn:hover{color:var(--accent);border-color:var(--accent-border)}.st-iconsel{align-items:center;gap:6px;width:100%;display:flex}.st-iconsel__preview{background:var(--bg-input);border:1px solid var(--border);width:28px;height:28px;color:var(--text);border-radius:5px;flex:none;justify-content:center;align-items:center;display:inline-flex}.st-iconsel__grid{background:var(--bg-input);border:1px solid var(--border);border-radius:5px;grid-template-columns:repeat(8,1fr);gap:4px;width:100%;max-height:168px;margin-top:6px;padding:6px;display:grid;overflow:auto}.st-iconsel__cell{aspect-ratio:1;cursor:pointer;color:var(--text-dim);border-radius:4px;justify-content:center;align-items:center;display:inline-flex}.st-iconsel__cell:hover{background:var(--bg-hover);color:var(--text)}.st-iconsel__cell--on{background:var(--accent-soft);color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent-border)}.st-customsel{flex-wrap:wrap;gap:6px;width:100%;display:flex}.st-customsel__item{background:var(--bg-input);border:1px solid var(--border);cursor:pointer;border-radius:5px;padding:3px 8px;font-size:12px;line-height:18px}.st-customsel__item:hover{border-color:var(--accent-border)}.st-list{flex-direction:column;gap:6px;width:100%;display:flex}.st-list__item{border:1px solid var(--border);background:var(--overlay-tint);border-radius:6px;overflow:hidden}.st-list__head{background:var(--overlay-tint);border-bottom:var(--hairline) solid var(--border);color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:4px 8px;font-size:11px;display:flex}.st-list__op{width:22px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;font-size:14px;line-height:1}.st-list__op:hover{background:var(--bg-hover);color:var(--text)}.st-list__op--del:hover{background:var(--danger-soft);color:var(--danger)}.st-list__body{padding:6px 8px}.st-list__empty{color:var(--text-faint);padding:4px 0;font-size:11px}.st-list__row{align-items:center;gap:8px;padding:3px 0;display:flex}.st-list__label{color:var(--text-dim);text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 0 72px;font-size:11px;line-height:1;overflow:hidden}.st-list__control{flex:auto;min-width:0}.st-code{flex-direction:column;gap:4px;min-width:0;display:flex;position:relative}.st-code__lang{border:1px solid var(--border);background:var(--bg-bar);color:var(--text-faint);letter-spacing:.4px;pointer-events:none;-webkit-user-select:none;user-select:none;border-radius:4px;padding:0 5px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:10px;line-height:16px;position:absolute;top:6px;right:8px}.st-code__editor{box-sizing:border-box;background:var(--bg-input);border:1px solid var(--border-strong);min-height:140px;max-height:340px;color:var(--text);tab-size:2;white-space:pre;border-radius:6px;outline:none;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.6;overflow:auto}.st-code__editor:focus{border-color:var(--accent)}.st-code__editor.is-disabled{opacity:.6;pointer-events:none}.st-code__editor.is-bridged{border-color:var(--accent-border)}.st-code__foot-actions{flex:none;align-items:center;gap:8px;margin-left:auto;display:inline-flex}.st-code__bridge-tag{color:var(--accent);white-space:nowrap;font-size:11px}.st-code__vscode{height:22px;color:var(--text-faint);white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;gap:4px;padding:0 5px;font-size:11px;line-height:normal;transition:color .15s,background .15s;display:inline-flex}.st-code__vscode-label{letter-spacing:.2px;font-size:11px;line-height:normal}.st-code__vscode:hover{color:var(--text);background:var(--bg-hover)}.st-code__vscode.is-on{color:var(--accent)}.st-code__vscode.is-on:hover{background:var(--accent-soft);color:var(--accent)}.st-code__vscode:disabled{opacity:.5;cursor:not-allowed}.st-code__vscode svg{fill:currentColor;display:block}.st-code__foot{color:var(--text-faint);align-items:center;gap:10px;font-size:11px;line-height:normal;display:flex}.st-code__hint{line-height:normal}.st-code__editor .token.comment,.st-code__editor .token.prolog,.st-code__editor .token.doctype,.st-code__editor .token.cdata{color:var(--code-comment)}.st-code__editor .token.punctuation{color:var(--code-punc)}.st-code__editor .token.property,.st-code__editor .token.tag,.st-code__editor .token.boolean,.st-code__editor .token.number,.st-code__editor .token.constant,.st-code__editor .token.symbol{color:var(--code-prop)}.st-code__editor .token.selector,.st-code__editor .token.attr-name,.st-code__editor .token.string,.st-code__editor .token.char,.st-code__editor .token.builtin{color:var(--code-str)}.st-code__editor .token.operator,.st-code__editor .token.entity,.st-code__editor .token.url{color:var(--code-num)}.st-code__editor .token.keyword{color:var(--code-kw)}.st-code__editor .token.function,.st-code__editor .token.class-name{color:var(--code-fn)}.st-code__editor .token.regex,.st-code__editor .token.important,.st-code__editor .token.variable{color:var(--code-var)}.st-expr{resize:vertical;border:1px solid var(--border);border-radius:var(--radius-sm,6px);background:var(--bg-input);flex-direction:column;height:120px;min-height:96px;display:flex;position:relative;overflow:hidden}.st-expr:focus-within{border-color:var(--accent)}.st-expr--disabled{opacity:.6;cursor:not-allowed}.st-expr__editor{color:var(--text);white-space:pre-wrap;word-break:break-word;outline:none;flex:auto;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.5;overflow:auto}.st-expr__editor.is-disabled{pointer-events:none}.st-expr__foot{color:var(--text-dim);border-top:var(--hairline) solid var(--border);background:var(--bg-soft);-webkit-user-select:none;user-select:none;flex:none;justify-content:flex-end;padding:2px 8px;font-size:11px;line-height:1.5;display:flex}.st-expr__hint{white-space:nowrap;line-height:normal}.st-expr__ph{color:var(--text-faint);white-space:pre-wrap;word-break:break-word;pointer-events:none;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.5;position:absolute;top:0;left:0;right:0}.st-expr__editor .token.comment,.st-expr__editor .token.prolog,.st-expr__editor .token.doctype,.st-expr__editor .token.cdata{color:var(--code-comment)}.st-expr__editor .token.punctuation{color:var(--code-punc)}.st-expr__editor .token.property,.st-expr__editor .token.tag,.st-expr__editor .token.boolean,.st-expr__editor .token.number,.st-expr__editor .token.constant,.st-expr__editor .token.symbol{color:var(--code-prop)}.st-expr__editor .token.selector,.st-expr__editor .token.attr-name,.st-expr__editor .token.string,.st-expr__editor .token.char,.st-expr__editor .token.builtin{color:var(--code-str)}.st-expr__editor .token.operator,.st-expr__editor .token.entity,.st-expr__editor .token.url{color:var(--code-num)}.st-expr__editor .token.keyword{color:var(--code-kw)}.st-expr__editor .token.function,.st-expr__editor .token.class-name{color:var(--code-fn)}.st-expr__editor .token.regex,.st-expr__editor .token.important,.st-expr__editor .token.variable{color:var(--code-var)}.st-expr__editor .token.binding-var{color:var(--code-binding)}.st-ifform{flex-direction:column;gap:8px;width:100%;min-width:0;display:flex}.pc[data-v-c0ff0a96]{flex-direction:column;gap:6px;display:flex}.pc-body[data-v-c0ff0a96]{line-height:0}.pc-srcs[data-v-c0ff0a96]{gap:4px;line-height:1.5;display:flex}.pc-src[data-v-c0ff0a96]{border:1px solid var(--border);height:24px;color:var(--text-dim);cursor:pointer;background:0 0;border-radius:6px;flex:1;padding:0 10px;font-size:12px;transition:background .12s,color .12s,border-color .12s}.pc-src[data-v-c0ff0a96]:hover{background:var(--bg-hover);color:var(--text)}.pc-src.is-active[data-v-c0ff0a96]{background:var(--accent-soft);color:var(--accent);border-color:var(--accent-border)}.pc-src.is-active[data-v-c0ff0a96]:hover{background:var(--accent-soft);color:var(--accent)}.pc--readonly .pc-src[data-v-c0ff0a96]{opacity:.6;cursor:not-allowed}