node-red-contrib-knx-ultimate 4.2.10 → 4.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 4.2.11** - April 2026<br/>
10
+
11
+ - UI: **KNX AI Web** improved assistant workflow with chat-style layout (prompt input under messages), clearer prompt focus, and streamlined Ask page text.<br/>
12
+ - UI: **KNX AI Web** added clearer loading feedback for AI operations (area regeneration/deletion and planner generation), including a centered blocking wait overlay during long-running area generation.<br/>
13
+ - NEW: **KNX AI Web** added bulk action **Delete AI Areas** and localized labels for **Regenerate AI Areas** / **Delete AI Areas** across supported UI languages.<br/>
14
+ - FIX: **KNX AI backend** hardened JSON extraction/parsing for LLM outputs and improved timeout/token-limit diagnostics in error messages.<br/>
15
+ - CHANGE: **KNX AI backend** raised default/forced `llmMaxTokens` handling for structured responses and aligned editor defaults for high-token completions.<br/>
16
+ - Docs/wiki: improved **KNX AI Dashboard** pages for end users, added localized guidance updates, and made support CTA links visible in docs navigation.<br/>
17
+
9
18
  **Version 4.2.10** - April 2026<br/>
10
19
 
11
20
  - UI: **KNX AI Web** sidebar menu style aligned to Homebridge (font size/weight, spacing, icon/text alignment and sidebar widths) for closer visual consistency.<br/>
@@ -36,8 +36,8 @@
36
36
  llmModel: { value: "gpt-5.4" },
37
37
  llmSystemPrompt: { value: "" },
38
38
  llmTemperature: { value: 0.2, required: false, validate: RED.validators.number() },
39
- llmMaxTokens: { value: 10000, required: false, validate: RED.validators.number() },
40
- llmTimeoutMs: { value: 30000, required: false, validate: RED.validators.number() },
39
+ llmMaxTokens: { value: 50000, required: false, validate: RED.validators.number() },
40
+ llmTimeoutMs: { value: 120000, required: false, validate: RED.validators.number() },
41
41
  llmMaxEventsInPrompt: { value: 120, required: false, validate: RED.validators.number() },
42
42
  llmIncludeRaw: { value: false },
43
43
  llmIncludeFlowContext: { value: true },
@@ -254,31 +254,124 @@ const buildLlmSummarySnapshot = (summary) => {
254
254
  const extractJsonFragmentFromText = (value) => {
255
255
  const text = String(value || '').trim()
256
256
  if (!text) throw new Error('Empty AI response')
257
- const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i)
258
- const candidate = fenced && fenced[1] ? String(fenced[1]).trim() : text
257
+ const normalizeCandidate = (input) => String(input || '')
258
+ .replace(/^\uFEFF/, '')
259
+ .replace(/^\s*json\s*\n/i, '')
260
+ .trim()
261
+
259
262
  const tryParse = (input) => {
260
- if (!input) return null
263
+ const source = normalizeCandidate(input)
264
+ if (!source) return null
265
+ try {
266
+ return JSON.parse(source)
267
+ } catch (error) {}
268
+ // Fallback: tolerate comments and trailing commas that some models emit.
269
+ const relaxed = source
270
+ .replace(/\/\*[\s\S]*?\*\//g, '')
271
+ .replace(/^\s*\/\/.*$/gm, '')
272
+ .replace(/,\s*([}\]])/g, '$1')
273
+ .trim()
274
+ if (!relaxed || relaxed === source) return null
261
275
  try {
262
- return JSON.parse(input)
276
+ return JSON.parse(relaxed)
263
277
  } catch (error) {
264
278
  return null
265
279
  }
266
280
  }
267
- const direct = tryParse(candidate)
268
- if (direct !== null) return direct
269
- const objectStart = candidate.indexOf('{')
270
- const objectEnd = candidate.lastIndexOf('}')
271
- if (objectStart !== -1 && objectEnd !== -1 && objectEnd > objectStart) {
272
- const parsedObject = tryParse(candidate.slice(objectStart, objectEnd + 1))
273
- if (parsedObject !== null) return parsedObject
281
+
282
+ const extractBalancedJsonSlices = (input, maxSlices = 24) => {
283
+ const source = String(input || '')
284
+ const out = []
285
+ for (let i = 0; i < source.length; i += 1) {
286
+ const ch = source[i]
287
+ if (ch !== '{' && ch !== '[') continue
288
+ const stack = [ch === '{' ? '}' : ']']
289
+ let inString = false
290
+ let escaped = false
291
+ for (let j = i + 1; j < source.length; j += 1) {
292
+ const current = source[j]
293
+ if (inString) {
294
+ if (escaped) {
295
+ escaped = false
296
+ continue
297
+ }
298
+ if (current === '\\') {
299
+ escaped = true
300
+ continue
301
+ }
302
+ if (current === '"') inString = false
303
+ continue
304
+ }
305
+ if (current === '"') {
306
+ inString = true
307
+ continue
308
+ }
309
+ if (current === '{') {
310
+ stack.push('}')
311
+ continue
312
+ }
313
+ if (current === '[') {
314
+ stack.push(']')
315
+ continue
316
+ }
317
+ if ((current === '}' || current === ']') && stack.length) {
318
+ if (current !== stack[stack.length - 1]) break
319
+ stack.pop()
320
+ if (!stack.length) {
321
+ const slice = normalizeCandidate(source.slice(i, j + 1))
322
+ if (slice) out.push(slice)
323
+ i = j
324
+ break
325
+ }
326
+ }
327
+ }
328
+ if (out.length >= maxSlices) break
329
+ }
330
+ return out
331
+ }
332
+
333
+ const candidates = []
334
+ const seen = new Set()
335
+ const pushCandidate = (input) => {
336
+ const normalized = normalizeCandidate(input)
337
+ if (!normalized || seen.has(normalized)) return
338
+ seen.add(normalized)
339
+ candidates.push(normalized)
274
340
  }
275
- const arrayStart = candidate.indexOf('[')
276
- const arrayEnd = candidate.lastIndexOf(']')
277
- if (arrayStart !== -1 && arrayEnd !== -1 && arrayEnd > arrayStart) {
278
- const parsedArray = tryParse(candidate.slice(arrayStart, arrayEnd + 1))
279
- if (parsedArray !== null) return parsedArray
341
+
342
+ pushCandidate(text)
343
+ const fencedRe = /```(?:[a-zA-Z0-9_-]+)?\s*([\s\S]*?)```/g
344
+ let fenceMatch
345
+ while ((fenceMatch = fencedRe.exec(text)) !== null) {
346
+ pushCandidate(fenceMatch[1])
280
347
  }
281
- throw new Error('The LLM response did not contain valid JSON')
348
+
349
+ for (const candidate of candidates) {
350
+ const direct = tryParse(candidate)
351
+ if (direct !== null) return direct
352
+
353
+ const objectStart = candidate.indexOf('{')
354
+ const objectEnd = candidate.lastIndexOf('}')
355
+ if (objectStart !== -1 && objectEnd !== -1 && objectEnd > objectStart) {
356
+ const parsedObject = tryParse(candidate.slice(objectStart, objectEnd + 1))
357
+ if (parsedObject !== null) return parsedObject
358
+ }
359
+ const arrayStart = candidate.indexOf('[')
360
+ const arrayEnd = candidate.lastIndexOf(']')
361
+ if (arrayStart !== -1 && arrayEnd !== -1 && arrayEnd > arrayStart) {
362
+ const parsedArray = tryParse(candidate.slice(arrayStart, arrayEnd + 1))
363
+ if (parsedArray !== null) return parsedArray
364
+ }
365
+
366
+ const balancedSlices = extractBalancedJsonSlices(candidate)
367
+ for (const slice of balancedSlices) {
368
+ const parsedSlice = tryParse(slice)
369
+ if (parsedSlice !== null) return parsedSlice
370
+ }
371
+ }
372
+
373
+ const preview = text.slice(0, 180).replace(/\s+/g, ' ').trim()
374
+ throw new Error(`The LLM response did not contain valid JSON${preview ? ` (preview: ${preview})` : ''}`)
282
375
  }
283
376
 
284
377
  const normalizeValueForCompare = (value) => {
@@ -2046,15 +2139,25 @@ const buildRelevantDocsContext = ({ moduleRootDir, question, preferredLangDir, m
2046
2139
  }
2047
2140
 
2048
2141
  const postJson = async ({ url, headers, body, timeoutMs }) => {
2142
+ const resolvedTimeoutMs = Math.max(1000, Number(timeoutMs) || 30000)
2049
2143
  const controller = new AbortController()
2050
- const timer = setTimeout(() => controller.abort(), timeoutMs || 30000)
2144
+ const timer = setTimeout(() => controller.abort(), resolvedTimeoutMs)
2051
2145
  try {
2052
- const res = await fetch(url, {
2053
- method: 'POST',
2054
- headers: Object.assign({ 'content-type': 'application/json' }, headers || {}),
2055
- body: JSON.stringify(body || {}),
2056
- signal: controller.signal
2057
- })
2146
+ let res
2147
+ try {
2148
+ res = await fetch(url, {
2149
+ method: 'POST',
2150
+ headers: Object.assign({ 'content-type': 'application/json' }, headers || {}),
2151
+ body: JSON.stringify(body || {}),
2152
+ signal: controller.signal
2153
+ })
2154
+ } catch (error) {
2155
+ const isAbort = (error && error.name === 'AbortError') || /\babort(ed)?\b/i.test(String(error && error.message ? error.message : ''))
2156
+ if (isAbort) {
2157
+ throw new Error(`LLM request timeout after ${Math.round(resolvedTimeoutMs / 1000)}s. Increase "Timeout ms" in the KNX AI node settings or reduce prompt context.`)
2158
+ }
2159
+ throw error
2160
+ }
2058
2161
  const text = await res.text()
2059
2162
  let json
2060
2163
  try {
@@ -2076,8 +2179,9 @@ const postJson = async ({ url, headers, body, timeoutMs }) => {
2076
2179
  }
2077
2180
 
2078
2181
  const getJson = async ({ url, headers, timeoutMs }) => {
2182
+ const resolvedTimeoutMs = Math.max(1000, Number(timeoutMs) || 20000)
2079
2183
  const controller = new AbortController()
2080
- const timer = setTimeout(() => controller.abort(), timeoutMs || 20000)
2184
+ const timer = setTimeout(() => controller.abort(), resolvedTimeoutMs)
2081
2185
  try {
2082
2186
  const res = await fetch(url, { method: 'GET', headers: headers || {}, signal: controller.signal })
2083
2187
  const text = await res.text()
@@ -2616,6 +2720,25 @@ module.exports = function (RED) {
2616
2720
  }
2617
2721
  })
2618
2722
 
2723
+ RED.httpAdmin.post('/knxUltimateAI/sidebar/areas/delete-llm', RED.auth.needsPermission('knxUltimate-config.write'), async (req, res) => {
2724
+ try {
2725
+ const nodeId = req.body?.nodeId ? String(req.body.nodeId) : ''
2726
+ if (!nodeId) {
2727
+ res.status(400).json({ error: 'Missing nodeId' })
2728
+ return
2729
+ }
2730
+ const n = aiRuntimeNodes.get(nodeId) || RED.nodes.getNode(nodeId)
2731
+ if (!n || n.type !== 'knxUltimateAI' || typeof n.deleteAllLlmAreas !== 'function') {
2732
+ res.status(404).json({ error: 'KNX AI node not found' })
2733
+ return
2734
+ }
2735
+ const ret = await n.deleteAllLlmAreas()
2736
+ res.json(ret)
2737
+ } catch (error) {
2738
+ res.status(error.status || 500).json({ error: error.message || String(error) })
2739
+ }
2740
+ })
2741
+
2619
2742
  RED.httpAdmin.post('/knxUltimateAI/sidebar/areas/catalog', RED.auth.needsPermission('knxUltimate-config.read'), async (req, res) => {
2620
2743
  try {
2621
2744
  const nodeId = req.body?.nodeId ? String(req.body.nodeId) : ''
@@ -3207,8 +3330,8 @@ module.exports = function (RED) {
3207
3330
  node.llmModel = config.llmModel || 'gpt-4o-mini'
3208
3331
  node.llmSystemPrompt = config.llmSystemPrompt || 'You are a KNX building automation assistant. Analyze KNX bus traffic and provide actionable insights.'
3209
3332
  node.llmTemperature = (config.llmTemperature === undefined || config.llmTemperature === '') ? 0.2 : Number(config.llmTemperature)
3210
- node.llmMaxTokens = (config.llmMaxTokens === undefined || config.llmMaxTokens === '') ? 10000 : Number(config.llmMaxTokens)
3211
- node.llmTimeoutMs = (config.llmTimeoutMs === undefined || config.llmTimeoutMs === '') ? 30000 : Number(config.llmTimeoutMs)
3333
+ node.llmMaxTokens = (config.llmMaxTokens === undefined || config.llmMaxTokens === '') ? 50000 : Number(config.llmMaxTokens)
3334
+ node.llmTimeoutMs = (config.llmTimeoutMs === undefined || config.llmTimeoutMs === '') ? 120000 : Number(config.llmTimeoutMs)
3212
3335
  node.llmMaxEventsInPrompt = (config.llmMaxEventsInPrompt === undefined || config.llmMaxEventsInPrompt === '') ? 120 : Number(config.llmMaxEventsInPrompt)
3213
3336
  node.llmIncludeRaw = config.llmIncludeRaw !== undefined ? coerceBoolean(config.llmIncludeRaw) : false
3214
3337
  node.llmIncludeFlowContext = config.llmIncludeFlowContext !== undefined ? coerceBoolean(config.llmIncludeFlowContext) : true
@@ -5011,13 +5134,15 @@ module.exports = function (RED) {
5011
5134
  translated: false
5012
5135
  }
5013
5136
  }
5137
+ const jsonMaxTokens = Math.max(50000, Number(node.llmMaxTokens) || 0)
5014
5138
  const llmResponse = await callLLMChat({
5015
5139
  systemPrompt: [
5016
5140
  'You are a KNX installer assistant.',
5017
5141
  'Translate only human-readable KNX test labels.',
5018
5142
  'Return JSON only.'
5019
5143
  ].join(' '),
5020
- userContent: buildTestPlanTranslationPrompt({ language: targetLanguage, languageName: targetLanguageName, plan })
5144
+ userContent: buildTestPlanTranslationPrompt({ language: targetLanguage, languageName: targetLanguageName, plan }),
5145
+ maxTokensOverride: jsonMaxTokens
5021
5146
  })
5022
5147
  const parsed = extractJsonFragmentFromText(llmResponse.content)
5023
5148
  const translatedSteps = Array.isArray(parsed)
@@ -5059,13 +5184,15 @@ module.exports = function (RED) {
5059
5184
  const suggestGaRoleOverridesWithLlm = async ({ gaCatalog }) => {
5060
5185
  const candidates = (Array.isArray(gaCatalog) ? gaCatalog : []).filter(item => item && item.ga && isAmbiguousGaRoleSource(item.baseRoleSource || item.roleSource))
5061
5186
  if (!candidates.length) return {}
5187
+ const jsonMaxTokens = Math.max(50000, Number(node.llmMaxTokens) || 0)
5062
5188
  const llmResponse = await callLLMChat({
5063
5189
  systemPrompt: [
5064
5190
  'You are a KNX installation modeling assistant.',
5065
5191
  'Classify KNX group addresses as command, status, or neutral for installers.',
5066
5192
  'Return JSON only.'
5067
5193
  ].join(' '),
5068
- userContent: buildGaRoleSuggestionPrompt({ gaCatalog: candidates })
5194
+ userContent: buildGaRoleSuggestionPrompt({ gaCatalog: candidates }),
5195
+ maxTokensOverride: jsonMaxTokens
5069
5196
  })
5070
5197
  const parsed = extractJsonFragmentFromText(llmResponse.content)
5071
5198
  const gaCatalogMap = new Map(candidates.map(item => [String(item.ga).trim(), item]))
@@ -5743,17 +5870,38 @@ module.exports = function (RED) {
5743
5870
  }
5744
5871
  }
5745
5872
 
5873
+ node.deleteAllLlmAreas = async () => {
5874
+ const currentOverrides = Object.assign({}, loadAreaOverrides())
5875
+ const llmAreaIds = Object.keys(currentOverrides).filter(key => String(key || '').startsWith('llm:'))
5876
+ llmAreaIds.forEach((areaId) => {
5877
+ delete currentOverrides[areaId]
5878
+ })
5879
+ writeAreaOverrides(currentOverrides)
5880
+ const summary = node._lastSummary || rebuildCachedSummaryNow()
5881
+ return {
5882
+ ok: true,
5883
+ deletedCount: llmAreaIds.length,
5884
+ areas: buildAreasSnapshot({ summary }),
5885
+ profiles: buildProfilesSnapshot(),
5886
+ actuatorTests: buildActuatorTestsSnapshot(),
5887
+ testPlans: buildAiTestPlansSnapshot(),
5888
+ gaCatalog: getGaCatalogSnapshot()
5889
+ }
5890
+ }
5891
+
5746
5892
  node.regenerateLlmAreas = async () => {
5747
5893
  if (!node.llmEnabled) throw new Error('LLM is disabled in the KNX AI node config')
5748
5894
  const gaCatalog = getGaCatalogSnapshot()
5749
5895
  if (!Array.isArray(gaCatalog) || !gaCatalog.length) throw new Error('No ETS group addresses available')
5896
+ const jsonMaxTokens = Math.max(50000, Number(node.llmMaxTokens) || 0)
5750
5897
  const llmResponse = await callLLMChat({
5751
5898
  systemPrompt: [
5752
5899
  'You are a KNX installation modeling assistant.',
5753
5900
  'Group KNX group addresses into practical installer-friendly operational areas.',
5754
5901
  'Return JSON only.'
5755
5902
  ].join(' '),
5756
- userContent: buildAreaRegenerationPrompt({ gaCatalog })
5903
+ userContent: buildAreaRegenerationPrompt({ gaCatalog }),
5904
+ maxTokensOverride: jsonMaxTokens
5757
5905
  })
5758
5906
  const parsed = extractJsonFragmentFromText(llmResponse.content)
5759
5907
  const rawAreas = Array.isArray(parsed)
@@ -5826,6 +5974,7 @@ module.exports = function (RED) {
5826
5974
  if (!installerPrompt) throw new Error('Missing prompt')
5827
5975
  const gaCatalog = getGaCatalogSnapshot()
5828
5976
  if (!Array.isArray(gaCatalog) || !gaCatalog.length) throw new Error('No ETS group addresses available')
5977
+ const jsonMaxTokens = Math.max(50000, Number(node.llmMaxTokens) || 0)
5829
5978
  const llmResponse = await callLLMChat({
5830
5979
  systemPrompt: [
5831
5980
  'You are a KNX installation modeling assistant.',
@@ -5838,7 +5987,8 @@ module.exports = function (RED) {
5838
5987
  draftDescription: description,
5839
5988
  currentGaList: Array.isArray(gaList) ? gaList : [],
5840
5989
  gaCatalog
5841
- })
5990
+ }),
5991
+ maxTokensOverride: jsonMaxTokens
5842
5992
  })
5843
5993
  const parsed = extractJsonFragmentFromText(llmResponse.content)
5844
5994
  const gaCatalogMap = new Map(gaCatalog.map(item => [String(item && item.ga ? item.ga : '').trim(), item]))
@@ -6216,10 +6366,13 @@ module.exports = function (RED) {
6216
6366
  if (!node.llmApiKey && node.llmProvider !== 'ollama') {
6217
6367
  throw new Error('Missing API key: paste only the OpenAI key (starts with sk-), without "Bearer"')
6218
6368
  }
6219
- const maxTokensRaw = (maxTokensOverride !== null && maxTokensOverride !== undefined && maxTokensOverride !== '')
6220
- ? Number(maxTokensOverride)
6221
- : Number(node.llmMaxTokens)
6222
- const resolvedMaxTokens = Number.isFinite(maxTokensRaw) && maxTokensRaw > 0 ? Math.round(maxTokensRaw) : 10000
6369
+ const maxTokensRaw = (maxTokensOverride !== null && maxTokensOverride !== undefined && maxTokensOverride !== '')
6370
+ ? Number(maxTokensOverride)
6371
+ : Number(node.llmMaxTokens)
6372
+ const resolvedMaxTokens = Number.isFinite(maxTokensRaw) && maxTokensRaw > 0 ? Math.round(maxTokensRaw) : 10000
6373
+ const configuredTimeoutMs = Number(node.llmTimeoutMs)
6374
+ const resolvedTimeoutMs = Number.isFinite(configuredTimeoutMs) && configuredTimeoutMs > 0 ? Math.round(configuredTimeoutMs) : 30000
6375
+ const effectiveTimeoutMs = Math.max(120000, resolvedTimeoutMs)
6223
6376
 
6224
6377
  if (node.llmProvider === 'ollama') {
6225
6378
  const url = node.llmBaseUrl || 'http://localhost:11434/api/chat'
@@ -6234,7 +6387,7 @@ module.exports = function (RED) {
6234
6387
  temperature: node.llmTemperature
6235
6388
  }
6236
6389
  }
6237
- const json = await postJson({ url, body, timeoutMs: node.llmTimeoutMs })
6390
+ const json = await postJson({ url, body, timeoutMs: effectiveTimeoutMs })
6238
6391
  const content = json && json.message && typeof json.message.content === 'string' ? json.message.content : safeStringify(json)
6239
6392
  return { provider: 'ollama', model: body.model, content, finishReason: String(json && json.done_reason ? json.done_reason : '') }
6240
6393
  }
@@ -6279,26 +6432,26 @@ module.exports = function (RED) {
6279
6432
 
6280
6433
  let json
6281
6434
  try {
6282
- json = await postJson({ url, headers, body: bodyWithMaxTokens, timeoutMs: node.llmTimeoutMs })
6435
+ json = await postJson({ url, headers, body: bodyWithMaxTokens, timeoutMs: effectiveTimeoutMs })
6283
6436
  } catch (error) {
6284
6437
  const msg = (error && error.message) ? String(error.message) : ''
6285
6438
  if (isResponseFormatCompatibilityError(msg)) {
6286
6439
  try {
6287
- json = await postJson({ url, headers, body: plainBodyWithMaxTokens, timeoutMs: node.llmTimeoutMs })
6440
+ json = await postJson({ url, headers, body: plainBodyWithMaxTokens, timeoutMs: effectiveTimeoutMs })
6288
6441
  } catch (innerError) {
6289
6442
  const innerMsg = (innerError && innerError.message) ? String(innerError.message) : ''
6290
6443
  if (innerMsg.includes("Unsupported parameter: 'max_tokens'") || innerMsg.includes('max_completion_tokens')) {
6291
- json = await postJson({ url, headers, body: plainBodyWithMaxCompletionTokens, timeoutMs: node.llmTimeoutMs })
6444
+ json = await postJson({ url, headers, body: plainBodyWithMaxCompletionTokens, timeoutMs: effectiveTimeoutMs })
6292
6445
  } else if (innerMsg.includes("Unsupported parameter: 'max_completion_tokens'")) {
6293
- json = await postJson({ url, headers, body: plainBodyWithMaxTokens, timeoutMs: node.llmTimeoutMs })
6446
+ json = await postJson({ url, headers, body: plainBodyWithMaxTokens, timeoutMs: effectiveTimeoutMs })
6294
6447
  } else {
6295
6448
  throw innerError
6296
6449
  }
6297
6450
  }
6298
6451
  } else if (msg.includes("Unsupported parameter: 'max_tokens'") || msg.includes('max_completion_tokens')) {
6299
- json = await postJson({ url, headers, body: bodyWithMaxCompletionTokens, timeoutMs: node.llmTimeoutMs })
6452
+ json = await postJson({ url, headers, body: bodyWithMaxCompletionTokens, timeoutMs: effectiveTimeoutMs })
6300
6453
  } else if (msg.includes("Unsupported parameter: 'max_completion_tokens'")) {
6301
- json = await postJson({ url, headers, body: bodyWithMaxTokens, timeoutMs: node.llmTimeoutMs })
6454
+ json = await postJson({ url, headers, body: bodyWithMaxTokens, timeoutMs: effectiveTimeoutMs })
6302
6455
  } else {
6303
6456
  throw error
6304
6457
  }
@@ -1 +1 @@
1
- .page-shell[data-v-151c7c88]{--sidebar-expanded-width: 210px;--sidebar-collapsed-width: 60px;--sidebar-current-width: var(--sidebar-expanded-width);width:min(1600px,calc(100% - 24px));min-height:calc(100vh - 24px);margin:12px auto;display:grid;grid-template-columns:var(--sidebar-current-width) minmax(0,1fr);gap:16px;align-items:stretch;transition:grid-template-columns .26s ease}.page-shell.sidebar-collapsed[data-v-151c7c88]{--sidebar-current-width: var(--sidebar-collapsed-width)}.m-header[data-v-151c7c88]{position:fixed;top:0;left:0;right:0;z-index:210;display:none;align-items:center;justify-content:space-between;gap:12px;height:62px;padding:0 12px 0 14px;background:var(--hb-primary-dark);color:#fff;border-bottom:1px solid rgba(255,255,255,.12)}.m-header-brand[data-v-151c7c88]{display:inline-flex;align-items:center;gap:10px}.m-logo-mark[data-v-151c7c88]{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.4);border-radius:var(--soft-radius);font-size:14px;font-weight:800;color:#fff}.hb-logo-text-mobile[data-v-151c7c88]{font-size:21px;font-weight:700;letter-spacing:.02em}.hamburger-icon[data-v-151c7c88]{position:relative;width:30px;height:22px;border:0;background:transparent;color:inherit;cursor:pointer}.hamburger-icon span[data-v-151c7c88]{display:block;position:absolute;left:0;width:100%;height:2px;border-radius:2px;background:#fff;transition:.24s ease}.hamburger-icon span[data-v-151c7c88]:nth-child(1){top:0}.hamburger-icon span[data-v-151c7c88]:nth-child(2),.hamburger-icon span[data-v-151c7c88]:nth-child(3){top:9px}.hamburger-icon span[data-v-151c7c88]:nth-child(4){top:18px}.hamburger-icon-cross span[data-v-151c7c88]:nth-child(1),.hamburger-icon-cross span[data-v-151c7c88]:nth-child(4){left:50%;width:0}.hamburger-icon-cross span[data-v-151c7c88]:nth-child(2){transform:rotate(45deg)}.hamburger-icon-cross span[data-v-151c7c88]:nth-child(3){transform:rotate(-45deg)}.sidebar-overlay[data-v-151c7c88]{position:fixed;inset:0;z-index:180;border:0;background:#090c137a}[data-v-151c7c88] *{--soft-radius: 4px;--hb-primary: #ff9800;--hb-primary-dark: #ef6c00}.app-sidebar[data-v-151c7c88]{display:flex;flex-direction:column;gap:14px;padding:18px 16px 16px;border-radius:var(--soft-radius);background:var(--hb-primary-dark);box-shadow:0 26px 60px #080a1057;color:#f6f8fb;overflow:hidden}.sidebar-brand-wrap[data-v-151c7c88]{display:grid;grid-template-columns:34px minmax(0,1fr) 28px;align-items:start;gap:10px}.sidebar-brand-mark[data-v-151c7c88]{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.35);border-radius:var(--soft-radius);font-weight:800;font-size:15px;color:#fff}.sidebar-collapse-toggle[data-v-151c7c88]{width:28px;min-width:28px;height:28px;padding:0;border:1px solid rgba(255,255,255,.24);border-radius:var(--soft-radius);background:#ffffff14;color:#f4f8ff;cursor:pointer}.sidebar-collapse-icon[data-v-151c7c88]{display:inline-flex;align-items:center;justify-content:center;width:100%;font-size:18px;line-height:1;font-weight:700}.sidebar-collapse-toggle[data-v-151c7c88]:hover{background:#ffffff29}.workspace-shell[data-v-151c7c88]{min-width:0;padding:10px;border-radius:var(--soft-radius);background:#f4f4f4;box-shadow:0 24px 60px #19203024;transition:padding .2s ease}.topbar[data-v-151c7c88]{padding:20px 22px 14px;border:1px solid rgba(160,170,186,.22);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffffa,#f5f7fbf0);box-shadow:0 12px 30px #1a202c14}.workspace-header[data-v-151c7c88]{margin-bottom:16px}.brand[data-v-151c7c88],.sidebar-brand[data-v-151c7c88]{margin-bottom:6px;min-width:0}.eyebrow[data-v-151c7c88]{margin:0 0 6px;color:inherit;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;opacity:.75}.brand h1[data-v-151c7c88],.sidebar-brand h1[data-v-151c7c88]{margin:0;font-size:clamp(24px,3.4vw,34px);line-height:1}.workspace-brand h2[data-v-151c7c88]{margin:0;font-size:clamp(24px,3vw,32px);line-height:1.02;color:#111723}.subhead[data-v-151c7c88]{max-width:860px;margin:8px 0 0;color:inherit;font-size:12px;line-height:1.4;opacity:.78}.toolbar[data-v-151c7c88],.statusbar[data-v-151c7c88],.tab-strip[data-v-151c7c88],.checkbox[data-v-151c7c88],.pill-row[data-v-151c7c88],.preset-row[data-v-151c7c88],.ask-row[data-v-151c7c88]{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.toolbar[data-v-151c7c88]{justify-content:space-between}.toolbar-cluster[data-v-151c7c88],.action-cluster[data-v-151c7c88]{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.workspace-toolbar[data-v-151c7c88]{margin-top:16px}.primary-button[data-v-151c7c88],.preset-button[data-v-151c7c88],.danger-button[data-v-151c7c88],.primary-link[data-v-151c7c88],.secondary-button[data-v-151c7c88],.tab-button[data-v-151c7c88]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#607d8b;color:#fff;text-decoration:none;font-size:12px;font-weight:700;padding:8px 12px;transition:.18s ease}.primary-button[data-v-151c7c88],.primary-link[data-v-151c7c88],.tab-button.active[data-v-151c7c88]{border-color:transparent;background:var(--hb-primary);color:#fff}.secondary-button[data-v-151c7c88],.preset-button[data-v-151c7c88],.tab-button[data-v-151c7c88]{border-color:transparent;background:#607d8b;color:#fff}.danger-button[data-v-151c7c88]{border-color:transparent;background:#d32f2f;color:#fff}.preset-button[data-v-151c7c88]:hover,.danger-button[data-v-151c7c88]:hover,.secondary-button[data-v-151c7c88]:hover,.tab-button[data-v-151c7c88]:hover{background:#546e7a;border-color:transparent}.danger-button[data-v-151c7c88]:hover{background:#c62828;border-color:transparent}.new-button[data-v-151c7c88]{background:linear-gradient(180deg,#62c27a,#43a85f);border-color:transparent;color:#fff}.new-button[data-v-151c7c88]:hover{background:linear-gradient(180deg,#74cf8b,#4fb46b);border-color:transparent}.primary-button[data-v-151c7c88]:hover,.primary-link[data-v-151c7c88]:hover,.tab-button.active[data-v-151c7c88]:hover{background:#e68900;border-color:transparent}.primary-button[data-v-151c7c88]:disabled,.preset-button[data-v-151c7c88]:disabled,.danger-button[data-v-151c7c88]:disabled,.secondary-button[data-v-151c7c88]:disabled{opacity:.6;cursor:not-allowed}.hidden-file-input[data-v-151c7c88]{display:none}.node-select[data-v-151c7c88]{min-width:min(360px,100%)}.sidebar-select[data-v-151c7c88]{min-width:0;width:100%;border-color:#ffffff14;background:#ffffff0f;color:#f6f8fb}.sidebar-select option[data-v-151c7c88]{color:#0f1520}.node-select[data-v-151c7c88],.checkbox[data-v-151c7c88],.summary-pre[data-v-151c7c88],.chat-log[data-v-151c7c88],.anomaly-card pre[data-v-151c7c88]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe0}.node-select[data-v-151c7c88]{padding:8px 10px;color:var(--text);font-size:12px}.checkbox[data-v-151c7c88]{padding:8px 10px;gap:8px;font-size:12px}.sidebar-checkbox[data-v-151c7c88]{border-color:#ffffff14;background:#ffffff0f;color:#eef3f9}.sidebar-panel[data-v-151c7c88]{padding:12px;border:1px solid rgba(255,255,255,.14);border-radius:var(--soft-radius);background:#ffffff0d}.sidebar-field[data-v-151c7c88]{display:flex;flex-direction:column;gap:6px;font-size:11px;font-weight:800;color:#f6f8fce0}.sidebar-nav[data-v-151c7c88]{display:flex;flex-direction:column;gap:0}.sidebar-nav .tab-button[data-v-151c7c88]{width:100%;display:flex;align-items:center;justify-content:flex-start;text-align:left;padding:15px 10px;border-radius:0;border-color:transparent;background:transparent;color:#edf1f8;font-size:17px;font-weight:400;line-height:1.2;transition:.2s}.sidebar-nav-icon[data-v-151c7c88]{flex:0 0 38px;width:38px;min-width:38px;display:flex;align-items:center;justify-content:center}.sidebar-nav-svg[data-v-151c7c88]{width:17px;height:17px;fill:currentColor}.sidebar-nav-copy[data-v-151c7c88]{flex:1;min-width:0;overflow:hidden;white-space:nowrap;padding-left:10px}.sidebar-nav .sidebar-nav-child[data-v-151c7c88]{width:100%;margin-left:0}.sidebar-nav .tab-button.active[data-v-151c7c88]{background:transparent;color:#fff}.sidebar-nav .tab-button[data-v-151c7c88]:hover{background:var(--hb-primary)}.sidebar-nav .tab-button[data-v-151c7c88]:disabled{opacity:.42;cursor:not-allowed;background:#ffffff0d;color:#edf1f89e}.sidebar-nav .tab-button[data-v-151c7c88]:disabled:hover{background:#ffffff0d}.sidebar-nav .tab-button:disabled .sidebar-nav-icon[data-v-151c7c88]{color:#edf1f89e}.sidebar-nav .tab-button.active .sidebar-nav-icon[data-v-151c7c88]{color:var(--hb-primary)}.sidebar-nav .tab-button.active:hover .sidebar-nav-icon[data-v-151c7c88]{color:#fff}.sidebar-nav-title[data-v-151c7c88]{display:block;font-size:17px;font-weight:400}.sidebar-nav-meta[data-v-151c7c88]{display:block;margin-top:3px;font-size:11px;opacity:.72;font-weight:600}.page-shell.sidebar-collapsed .sidebar-panel[data-v-151c7c88],.page-shell.sidebar-collapsed .sidebar-footer[data-v-151c7c88],.page-shell.sidebar-collapsed .sidebar-brand .eyebrow[data-v-151c7c88],.page-shell.sidebar-collapsed .sidebar-brand h1[data-v-151c7c88],.page-shell.sidebar-collapsed .sidebar-brand .subhead[data-v-151c7c88]{display:none}.page-shell.sidebar-collapsed .sidebar-brand-wrap[data-v-151c7c88]{grid-template-columns:1fr;justify-items:center}.page-shell.sidebar-collapsed .app-sidebar[data-v-151c7c88]{align-items:center;padding:14px 10px}.page-shell.sidebar-collapsed .sidebar-collapse-toggle[data-v-151c7c88]{margin-top:4px}.page-shell.sidebar-collapsed .sidebar-nav .tab-button[data-v-151c7c88]{justify-content:center;padding:15px 10px}.page-shell.sidebar-collapsed .sidebar-nav .sidebar-nav-child[data-v-151c7c88]{width:100%;margin-left:0}.page-shell.sidebar-collapsed .sidebar-nav-copy[data-v-151c7c88]{display:none}.sidebar-actions[data-v-151c7c88]{gap:8px}.sidebar-section-toggle[data-v-151c7c88]{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0;border:0;background:transparent;color:#f6f8fb;text-align:left;font:inherit}.sidebar-section-toggle strong[data-v-151c7c88]{display:block;font-size:13px;font-weight:800}.sidebar-section-toggle small[data-v-151c7c88]{display:block;margin-top:3px;font-size:11px;opacity:.72}.sidebar-test-results[data-v-151c7c88]{display:flex;flex-direction:column;gap:10px}.sidebar-results-list[data-v-151c7c88]{display:flex;flex-direction:column;gap:8px;max-height:320px;overflow:auto;padding-right:2px}.sidebar-result-row[data-v-151c7c88]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.sidebar-result-delete-button[data-v-151c7c88]{width:74px;min-width:74px;padding:10px 8px;border:1px solid rgba(136,18,26,.88);background:linear-gradient(180deg,#b72b2bfa,#941717fa);color:#fff;font:inherit;font-size:11px;font-weight:800;letter-spacing:.01em}.sidebar-result-delete-button[data-v-151c7c88]:hover:not(:disabled){background:linear-gradient(180deg,#c73030,#a01b1b)}.sidebar-result-delete-button[data-v-151c7c88]:disabled{opacity:.72;cursor:wait}.sidebar-result-item[data-v-151c7c88]{display:flex;flex-direction:column;justify-content:center;width:100%;min-height:78px;text-align:left;border-color:#ffffff1f;background:#ffffff14;color:#edf1f8;transition:border-color .18s ease,background .18s ease,box-shadow .18s ease}.sidebar-result-item.active[data-v-151c7c88]{border-color:#ffffff57;background:linear-gradient(180deg,#6877b3a3,#45517cb8);box-shadow:inset 0 0 0 1px #ffffff14}.sidebar-result-item.running[data-v-151c7c88]{box-shadow:inset 0 0 0 1px #f0b3228c}.sidebar-result-head[data-v-151c7c88]{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.sidebar-result-head strong[data-v-151c7c88]{font-size:12px;font-weight:800}.sidebar-result-title[data-v-151c7c88]{display:inline-flex;align-items:center;gap:8px;min-width:0}.sidebar-result-item .area-list-meta[data-v-151c7c88],.sidebar-result-item .area-list-tags[data-v-151c7c88]{color:#edf1f8c7}.sidebar-result-status[data-v-151c7c88]{display:inline-flex;align-items:center;justify-content:flex-start;min-width:0;padding:0;border:0;background:transparent;color:#fff;font-size:11px;font-weight:800;text-transform:none}.sidebar-result-status.status-pass[data-v-151c7c88]{color:#8fe0a8}.sidebar-result-status.status-warn[data-v-151c7c88]{color:#ffd17a}.sidebar-result-status.status-fail[data-v-151c7c88]{color:#ffb9c3}.sidebar-empty-state[data-v-151c7c88]{margin:0;color:#f6f8fcc2}.results-page-layout[data-v-151c7c88]{grid-template-columns:minmax(320px,420px) minmax(0,1fr)}.results-page-list[data-v-151c7c88]{max-height:min(68vh,760px);padding-right:4px}.results-page-list .sidebar-result-item[data-v-151c7c88]{border-color:#7e889a4d;background:linear-gradient(180deg,#fdfeff,#f2f7fd);color:#243042}.results-page-list .sidebar-result-item.active[data-v-151c7c88]{border-color:#ef6c005c;background:linear-gradient(180deg,#fff7e9,#ffeccf);box-shadow:inset 0 0 0 1px #ef6c001f}.results-page-list .sidebar-result-item.running[data-v-151c7c88]{box-shadow:inset 0 0 0 1px #ff980080}.results-page-list .sidebar-result-item .area-list-meta[data-v-151c7c88],.results-page-list .sidebar-result-item .area-list-tags[data-v-151c7c88]{color:#556071}.results-page-list .sidebar-result-status[data-v-151c7c88]{color:#374151}.results-page-list .sidebar-result-status.status-pass[data-v-151c7c88]{color:#2f8d53}.results-page-list .sidebar-result-status.status-warn[data-v-151c7c88]{color:#ad730b}.results-page-list .sidebar-result-status.status-fail[data-v-151c7c88]{color:#b73845}.sidebar-action-button[data-v-151c7c88]{width:100%;justify-content:center}.sidebar-footer[data-v-151c7c88]{margin-top:auto;display:flex;flex-direction:column;gap:8px;padding-top:8px}.sidebar-doc-link[data-v-151c7c88]{display:inline-flex;align-items:center;width:fit-content;color:var(--hb-primary-dark);text-decoration:none;font-size:12px;font-weight:700}.sidebar-doc-link[data-v-151c7c88]:hover{text-decoration:underline}.statusbar[data-v-151c7c88]{justify-content:space-between}.status-pill[data-v-151c7c88],.meta-chip[data-v-151c7c88],.pill[data-v-151c7c88]{display:inline-flex;align-items:center;gap:6px;border-radius:0;padding:0;border:0;background:transparent;font-size:12px;font-weight:700}.status-pill[data-v-151c7c88],.meta-chip[data-v-151c7c88],.pill.neutral[data-v-151c7c88]{color:var(--text)}.status-pill.error[data-v-151c7c88],.pill.danger[data-v-151c7c88]{color:#a4333a}.pill.success[data-v-151c7c88]{color:#1b7d36}.status-detail[data-v-151c7c88]{color:inherit;font-size:12px;font-weight:700;opacity:.7}.content-grid[data-v-151c7c88]{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:16px}.workspace-main[data-v-151c7c88]{padding:0 2px 6px}.card[data-v-151c7c88]{grid-column:span 6;min-height:240px;padding:15px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#fffffff0;box-shadow:0 16px 34px #121c2d14}.card-summary[data-v-151c7c88],.card-bus[data-v-151c7c88],.card-chat[data-v-151c7c88],.card-flow[data-v-151c7c88],.card-areas[data-v-151c7c88],.card-profiles[data-v-151c7c88],.card-anomalies[data-v-151c7c88]{grid-column:span 6}.card-flow[data-v-151c7c88],.card-areas[data-v-151c7c88],.card-profiles[data-v-151c7c88],.card-settings[data-v-151c7c88]{grid-column:span 12}.card-chat[data-v-151c7c88]{grid-column:1 / -1;max-width:50vw}.card-profiles[data-v-151c7c88]{border-color:#54607461;background:linear-gradient(180deg,#f4f7fbfa,#e9eef4fa);box-shadow:0 18px 36px #1118271f}.card-head[data-v-151c7c88]{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:14px}.card-head-actions[data-v-151c7c88]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-tab-strip[data-v-151c7c88]{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px;margin-bottom:14px;padding:4px;border:1px solid rgba(123,133,151,.26);border-radius:var(--soft-radius);background:linear-gradient(180deg,#f4f7fbf2,#e9eef5f2)}.settings-tab-button[data-v-151c7c88]{border:1px solid transparent;border-radius:var(--soft-radius);background:transparent;color:#4a5565;font:inherit;font-size:12px;font-weight:800;padding:8px 12px;transition:.16s ease}.settings-tab-button[data-v-151c7c88]:hover{background:#66769424;color:#243042}.settings-tab-button.active[data-v-151c7c88]{border-color:#ef6c0057;background:linear-gradient(180deg,#fff7e9,#ffeccf);color:#8e4f00}.settings-panel[data-v-151c7c88]{border-color:#616c8057;background:linear-gradient(180deg,#fff,#f7fafd);box-shadow:0 2px #79839629}.settings-panel-head[data-v-151c7c88]{padding-bottom:10px;border-bottom:1px solid rgba(148,158,176,.32);margin-bottom:12px}.settings-node-grid[data-v-151c7c88]{display:grid;grid-template-columns:minmax(240px,420px) auto;gap:12px;align-items:end;margin-top:12px}.settings-node-checkbox[data-v-151c7c88]{width:fit-content;min-height:36px}.settings-config-actions[data-v-151c7c88]{margin-top:12px}@media(max-width:900px){.settings-node-grid[data-v-151c7c88]{grid-template-columns:minmax(0,1fr);align-items:start}.settings-node-checkbox[data-v-151c7c88]{width:100%}}.plan-run-actions[data-v-151c7c88]{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px;border:1px solid rgba(255,152,0,.42);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fff1daf5,#ffe5b7eb)}.card-head h2[data-v-151c7c88]{margin:0;font-size:16px}.summary-pre[data-v-151c7c88],.chat-log[data-v-151c7c88]{margin:0;padding:14px;white-space:pre-wrap;word-break:break-word;font-family:JetBrains Mono,SFMono-Regular,monospace;font-size:12px;line-height:1.5}.metric-grid[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:14px}.metric[data-v-151c7c88]{display:flex;flex-direction:column;gap:6px;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.metric span[data-v-151c7c88]{display:block;margin-bottom:0;color:var(--muted);font-size:12px;font-weight:700}.metric strong[data-v-151c7c88]{font-size:17px}.rank-list[data-v-151c7c88],.event-list[data-v-151c7c88],.anomaly-list[data-v-151c7c88]{margin:0;padding:0;list-style:none}.rank-row[data-v-151c7c88],.event-row[data-v-151c7c88]{display:grid;gap:8px;align-items:center;padding:10px 0;border-bottom:1px solid rgba(120,120,120,.14)}.rank-row[data-v-151c7c88]{grid-template-columns:minmax(86px,120px) minmax(0,1fr) auto}.event-row[data-v-151c7c88]{grid-template-columns:minmax(0,1fr) minmax(0,1.6fr) auto}.rank-title[data-v-151c7c88],.event-name[data-v-151c7c88]{font-weight:800}.rank-label[data-v-151c7c88]{color:var(--muted);font-size:12px}.event-bar[data-v-151c7c88]{height:10px;overflow:hidden;border-radius:var(--soft-radius);background:#ff98001f}.event-bar-fill[data-v-151c7c88]{display:block;height:100%;border-radius:var(--soft-radius);background:linear-gradient(90deg,var(--accent),#4bbf77)}.areas-toolbar[data-v-151c7c88]{display:flex;flex-wrap:wrap;gap:12px;align-items:end;margin-bottom:16px}.areas-layout[data-v-151c7c88]{display:flex;flex-direction:column;gap:16px}.area-list-item[data-v-151c7c88]{display:flex;flex-direction:column;gap:6px;align-items:flex-start;padding:11px 12px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe6;color:var(--text);text-align:left;transition:.18s ease}.area-list-item[data-v-151c7c88]:hover,.area-list-item.active[data-v-151c7c88]{border-color:#ff980057;background:var(--accent-soft)}.area-list-title[data-v-151c7c88]{font-weight:800}.area-listbox-shell[data-v-151c7c88]{width:100%}.area-search-select[data-v-151c7c88]{position:relative}.area-search-select-input[data-v-151c7c88]{width:100%;border:1px solid var(--line);background:#ffffffeb;color:var(--text);padding:8px 10px;font-size:12px;line-height:1.35;border-radius:var(--soft-radius)}.area-search-select-menu[data-v-151c7c88]{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:8;max-height:280px;overflow:auto;border:1px solid var(--line);background:#fffffffa;border-radius:var(--soft-radius)}.area-search-select-option[data-v-151c7c88]{display:block;width:100%;padding:8px 10px;border:0;border-bottom:1px solid rgba(120,120,120,.1);background:transparent;color:var(--text);text-align:left;font-size:12px;line-height:1.35}.area-search-select-option[data-v-151c7c88]:hover,.area-search-select-option.active[data-v-151c7c88]{background:var(--accent-soft)}.area-list-meta[data-v-151c7c88],.area-list-tags[data-v-151c7c88],.area-detail-subhead[data-v-151c7c88]{color:var(--muted);font-size:12px}.area-detail[data-v-151c7c88]{min-width:0;width:100%;padding:14px;border:1px solid var(--line);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffff5,#f8f5ffeb)}.profiles-layout[data-v-151c7c88]{display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr);gap:16px}.test-planner-layout[data-v-151c7c88]{display:flex;flex-direction:column;gap:16px;align-items:stretch}.result-only-layout[data-v-151c7c88]{grid-template-columns:minmax(0,1fr)}.card-results-focus[data-v-151c7c88]{grid-column:span 12}.profile-list[data-v-151c7c88],.profile-editor-stack[data-v-151c7c88]{display:flex;flex-direction:column;gap:12px}.planner-sidecard[data-v-151c7c88]{gap:12px}.card-profiles .area-detail[data-v-151c7c88]{border-color:#616c8057;background:linear-gradient(180deg,#fff,#f7fafd);box-shadow:0 2px #79839629}.card-profiles .card-head[data-v-151c7c88]{padding-bottom:10px;border-bottom:1px solid rgba(148,158,176,.32)}.card-profiles .area-detail-subhead[data-v-151c7c88]{color:#4b5565}.card-profiles .meta-chip[data-v-151c7c88],.card-profiles .pill.neutral[data-v-151c7c88]{border:0;background:transparent;color:#1c2430}.card-profiles .planner-list .area-list-item[data-v-151c7c88]{border-color:#8892a559;background:linear-gradient(180deg,#fffffffa,#f4f7fbfa);box-shadow:0 1px #99a3b524}.card-profiles .planner-list .area-list-item[data-v-151c7c88]:hover,.card-profiles .planner-list .area-list-item.active[data-v-151c7c88]{border-color:#4a5a909e;background:linear-gradient(180deg,#e0e6f3f5,#d6deeef5)}.card-profiles .metric[data-v-151c7c88]{padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.card-profiles .metric span[data-v-151c7c88]{color:#475163}.card-profiles .metric strong[data-v-151c7c88]{color:#161d29;font-size:20px}.ai-planner-shell[data-v-151c7c88]{margin-top:12px;padding:12px;border:1px solid rgba(120,120,120,.24);background:#f4f7fcf5;border-radius:var(--soft-radius)}.ai-planner-shell-head[data-v-151c7c88]{margin-bottom:12px}.ai-planner-shell-head.template-builder-focus-head[data-v-151c7c88]{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}.ai-planner-shell-head h4[data-v-151c7c88]{margin:0}.planner-pairs[data-v-151c7c88]{margin-top:12px}.planner-generation[data-v-151c7c88]{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:14px;padding:10px 12px;border:1px solid rgba(126,136,154,.24);background:linear-gradient(180deg,#f0f4f9fa,#e7edf4fa)}.planner-error-banner[data-v-151c7c88]{margin:14px 0 0;padding:10px 12px;border:1px solid #b42318;background:#fef3f2;color:#b42318;font-weight:700;white-space:pre-wrap;word-break:break-word}.planner-step-card[data-v-151c7c88]{border:1px solid rgba(132,143,160,.28);border-left:5px solid rgba(112,122,141,.66);background:linear-gradient(180deg,#fff,#f4f8fc);box-shadow:0 2px #7b859724;cursor:default}.planner-step-running[data-v-151c7c88]{border-left-color:#3d5ca8;background:linear-gradient(180deg,#f5f9ff,#e9f0fb);box-shadow:0 0 0 2px #3d5ca829}.planner-step-dragging[data-v-151c7c88]{opacity:.56;cursor:grabbing}.planner-step-drop-target[data-v-151c7c88]{box-shadow:0 0 0 2px #46b86d2e;border-left-color:#46b86d}.planner-step-title[data-v-151c7c88]{display:flex;align-items:center;gap:10px}.planner-step-summary[data-v-151c7c88]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:10px;padding:10px 12px;border:1px solid rgba(155,165,183,.24);background:#f1f5f9f0;color:#4c5566;font-size:12px}.drag-handle[data-v-151c7c88]{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid rgba(120,120,120,.18);border-radius:var(--soft-radius);background:#ffffffd6;color:var(--muted);font-size:12px;font-weight:800;cursor:grab;-webkit-user-select:none;user-select:none}.collapse-toggle[data-v-151c7c88]{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;border:1px solid rgba(120,120,120,.18);border-radius:var(--soft-radius);background:#ffffffd6;color:var(--text);cursor:pointer}.collapse-icon[data-v-151c7c88]{display:inline-block;font-size:12px;line-height:1;transition:transform .16s ease}.collapse-icon.collapsed[data-v-151c7c88]{transform:rotate(-90deg)}.planner-step-editor[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;margin-top:10px;padding:12px;border:1px solid rgba(155,165,183,.24);background:#f7fafdf5}.planner-field-group[data-v-151c7c88]{padding:10px 12px 12px;border:1px solid rgba(155,165,183,.28);background:#ffffffe6}.planner-field-group h4[data-v-151c7c88]{margin:0 0 10px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:#1d2433}.planner-field-group-grid[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px}.planner-field-group-grid .group-span[data-v-151c7c88]{grid-column:1 / -1}.planner-check-sections[data-v-151c7c88]{display:grid;gap:10px;margin-top:10px}.planner-check-section[data-v-151c7c88]{padding:10px 12px;border:1px solid rgba(155,165,183,.28);background:#ffffffdb}.planner-check-section h4[data-v-151c7c88]{margin:0 0 8px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:#1d2433}.planner-check-section .area-detail-subhead[data-v-151c7c88]{margin:0 0 8px}.running-headline[data-v-151c7c88]{display:inline-flex;align-items:center;gap:10px;margin:0}.running-spinner[data-v-151c7c88]{width:14px;height:14px;display:inline-block;border:2px solid rgba(29,36,51,.18);border-top-color:var(--hb-primary);animation:running-spin-151c7c88 .85s linear infinite}@keyframes running-spin-151c7c88{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.editor-check-sections[data-v-151c7c88]{grid-column:1 / -1}.compact-grid[data-v-151c7c88]{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:0}.result-check-sections .planner-check-section[data-v-151c7c88]{background:#fafcfffa}.planner-step-grid[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px;margin-top:10px;color:#4c5566;font-size:12px}.area-detail h3[data-v-151c7c88],.area-detail h4[data-v-151c7c88]{margin:0}.area-detail-subhead[data-v-151c7c88]{margin:6px 0 0}.area-metrics[data-v-151c7c88]{margin-top:4px}.area-chips[data-v-151c7c88]{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}.area-editor[data-v-151c7c88]{margin:14px 0 18px;padding:12px;border:1px solid rgba(120,120,120,.16);border-radius:var(--soft-radius);background:#ffffffb8}.area-editor-grid[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.area-editor-span[data-v-151c7c88]{grid-column:1 / -1}.area-editor-note[data-v-151c7c88]{margin:12px 0 0;color:var(--muted);font-size:12px}.compact-preset-row[data-v-151c7c88]{margin-top:10px}.compact-preset-row .preset-button[data-v-151c7c88]{text-align:left;font-size:11px;padding:7px 10px}.area-ga-editor[data-v-151c7c88]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;margin-top:16px}.area-ga-list[data-v-151c7c88],.area-ga-catalog[data-v-151c7c88]{max-height:320px;overflow:auto}.area-ga-item[data-v-151c7c88]{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid rgba(120,120,120,.12)}.area-ga-main[data-v-151c7c88]{min-width:0;flex:1}.area-ga-actions[data-v-151c7c88]{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.area-ga-role-field[data-v-151c7c88]{min-width:148px}.area-ga-item strong[data-v-151c7c88],.planner-step-grid strong[data-v-151c7c88]{color:var(--text)}.area-ga-item span[data-v-151c7c88]{display:block;color:var(--muted);font-size:12px}.profile-runbar[data-v-151c7c88]{display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:center;margin-top:16px;padding:10px 12px;border:1px solid rgba(118,129,147,.22);background:linear-gradient(180deg,#eff4fafa,#e6ecf4fa)}.area-columns[data-v-151c7c88]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin:16px 0}.simple-list[data-v-151c7c88]{margin:10px 0 0;padding-left:18px}.simple-list li[data-v-151c7c88]{margin-bottom:6px}.simple-list-mono[data-v-151c7c88]{font-family:JetBrains Mono,SFMono-Regular,monospace;font-size:11px}.report-checks[data-v-151c7c88]{display:grid;gap:10px;margin:16px 0}.plan-steps-stack[data-v-151c7c88]{margin-left:12px;padding-left:12px}.plan-draft-shell[data-v-151c7c88]{margin-left:12px;width:calc(100% - 12px)}.report-check[data-v-151c7c88]{padding:12px;border:1px solid rgba(139,149,167,.28);border-radius:var(--soft-radius);border-left:4px solid var(--line);background:#fffffff5;box-shadow:0 1px #8c96a824}.report-pass[data-v-151c7c88]{border-left-color:#46b86d;background:linear-gradient(180deg,#f7fcf8,#eef7f0)}.report-warn[data-v-151c7c88]{border-left-color:#d99a34;background:linear-gradient(180deg,#fffaf2,#fcf4e5)}.report-fail[data-v-151c7c88]{border-left-color:#d94b55;background:linear-gradient(180deg,#fff6f6,#fceced)}.bus-track[data-v-151c7c88]{position:relative;height:18px;margin-top:16px;overflow:hidden;border:1px solid rgba(120,120,120,.2);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fff8ea,#fff2dc)}.bus-segment[data-v-151c7c88]{position:absolute;top:0;bottom:0}.segment-connected[data-v-151c7c88]{background:linear-gradient(90deg,#4ad06d,#38c45f)}.segment-disconnected[data-v-151c7c88]{background:linear-gradient(90deg,#eb6a74,#d94b55)}.bus-scale[data-v-151c7c88]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:10px;color:var(--muted);font-size:12px;font-weight:700}.bus-scale span[data-v-151c7c88]:nth-child(2){text-align:center}.bus-scale span[data-v-151c7c88]:nth-child(3){text-align:right}.bus-note[data-v-151c7c88],.flow-note[data-v-151c7c88],.empty-state[data-v-151c7c88]{color:var(--muted);line-height:1.5}.flow-toolbar[data-v-151c7c88]{display:grid;grid-template-columns:120px minmax(180px,1fr) minmax(220px,1.2fr) auto;gap:12px;align-items:start}.flow-field[data-v-151c7c88]{display:flex;flex-direction:column;gap:6px;color:var(--muted);font-size:11px;font-weight:700}.flow-field input[data-v-151c7c88],.flow-field select[data-v-151c7c88],.flow-field textarea[data-v-151c7c88]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe0;color:var(--text);padding:7px 10px;min-height:36px;box-sizing:border-box;line-height:1.25;font-size:12px}.flow-field select[data-v-151c7c88]{padding-right:28px}.flow-field textarea[data-v-151c7c88]{resize:vertical;min-height:62px;font:inherit}.flow-field select[multiple][data-v-151c7c88],.flow-field-select select[data-v-151c7c88]{min-height:108px;padding-right:10px}.compact-actions[data-v-151c7c88]{justify-content:flex-end}.compact-toggle[data-v-151c7c88]{min-height:40px}.modal-backdrop[data-v-151c7c88]{position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;padding:20px;background:#221d3057;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.modal-card[data-v-151c7c88]{width:min(420px,100%);padding:18px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#fffffffa;box-shadow:var(--shadow)}.modal-card h3[data-v-151c7c88]{margin:0 0 8px;font-size:18px}.modal-actions[data-v-151c7c88]{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}.flow-legend[data-v-151c7c88]{grid-column:1 / -1;display:flex;flex-wrap:nowrap;gap:10px 14px;align-items:center;padding:10px 0 0;color:var(--muted);font-size:12px;font-weight:700;white-space:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.flow-legend span[data-v-151c7c88]{display:inline-flex;align-items:center;white-space:nowrap;flex:0 0 auto}.flow-toggle[data-v-151c7c88]{align-self:end;min-height:44px;white-space:nowrap}.flow-toggle-inline[data-v-151c7c88]{align-self:flex-start;min-height:auto;margin-top:6px}.legend-line[data-v-151c7c88],.legend-dot[data-v-151c7c88]{display:inline-block;vertical-align:middle;margin-right:6px}.legend-line[data-v-151c7c88]{width:18px;border-top:3px solid currentColor}.legend-write[data-v-151c7c88]{color:#ff9800}.legend-response[data-v-151c7c88]{color:#46b86d}.legend-read[data-v-151c7c88]{color:#d99a34}.legend-repeat[data-v-151c7c88]{color:#c34747}.legend-dot[data-v-151c7c88]{width:10px;height:10px;border-radius:var(--soft-radius)}.legend-anomaly[data-v-151c7c88]{background:#f08f92}.legend-external[data-v-151c7c88]{background:#f5d9a2}.flow-frame[data-v-151c7c88]{margin-top:16px;overflow:auto;border:1px solid var(--line);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffffa,#f8f5fff5)}.card-flow.is-fullscreen[data-v-151c7c88]{width:100%;height:100%;margin:0;padding:18px;border-radius:var(--soft-radius);background:#fffffffa;overflow:auto}.card-flow.is-fullscreen .flow-frame[data-v-151c7c88]{height:calc(100vh - 260px)}.card-flow.is-fullscreen .flow-svg[data-v-151c7c88]{min-height:calc(100vh - 260px)}.flow-svg[data-v-151c7c88]{width:100%;min-width:1180px;min-height:420px;display:block}.flow-empty[data-v-151c7c88]{padding:24px}.flow-edge[data-v-151c7c88]{fill:none;stroke-linecap:round;vector-effect:non-scaling-stroke}.flow-edge-active[data-v-151c7c88]{stroke-dasharray:10 7;animation:graph-flow-151c7c88 1.25s linear infinite}.flow-edge-idle[data-v-151c7c88]{stroke-dasharray:8 8;animation:none}@keyframes graph-flow-151c7c88{0%{stroke-dashoffset:0}to{stroke-dashoffset:-34}}.flow-node circle[data-v-151c7c88]{fill:#edf9ef;stroke:#4caf66;stroke-width:2}.flow-node.is-anomaly circle[data-v-151c7c88]{fill:#fff1f1;stroke:#e53935}.flow-node.is-external circle[data-v-151c7c88]{fill:#fff8ea;stroke:#c98a1a;stroke-dasharray:4 3}.flow-node.is-idle circle[data-v-151c7c88]{opacity:.7}.node-label[data-v-151c7c88],.node-subtitle[data-v-151c7c88],.node-payload[data-v-151c7c88],.node-badge[data-v-151c7c88]{text-anchor:middle;dominant-baseline:middle}.node-label[data-v-151c7c88]{fill:#2f7f48;font-size:12px;font-weight:800}.flow-node.is-external .node-label[data-v-151c7c88]{fill:#9a6b24}.node-subtitle[data-v-151c7c88]{fill:#7a7368;font-size:10px}.node-payload[data-v-151c7c88]{fill:#746d62;font-size:9px;font-family:JetBrains Mono,SFMono-Regular,monospace}.node-badge[data-v-151c7c88]{fill:#b3261e;font-size:9px;font-weight:800}.anomaly-list[data-v-151c7c88]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.anomaly-card[data-v-151c7c88]{padding:14px;border-left:4px solid var(--warn-border);border-radius:var(--soft-radius);background:var(--warn-bg)}.anomaly-head[data-v-151c7c88]{display:flex;justify-content:space-between;gap:10px;align-items:baseline}.anomaly-time[data-v-151c7c88]{margin:8px 0 10px;color:var(--muted);font-size:12px}.anomaly-card pre[data-v-151c7c88]{margin:0;padding:12px;white-space:pre-wrap;word-break:break-word;font-size:12px}.chat-log[data-v-151c7c88]{min-height:280px}.ask-row[data-v-151c7c88]{margin-bottom:12px}.ask-input[data-v-151c7c88]{flex:1 1 260px;min-width:0;border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe0;color:var(--text);padding:11px 14px}.chat-message[data-v-151c7c88]{margin-bottom:12px;padding:12px;border-radius:var(--soft-radius)}.chat-message pre[data-v-151c7c88]{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit}.chat-user[data-v-151c7c88]{background:#ff98001f}.chat-assistant[data-v-151c7c88]{background:#5bbf731f}.chat-error[data-v-151c7c88]{background:var(--err-bg)}.chat-pending[data-v-151c7c88]{background:#78787814;color:var(--muted)}[data-v-151c7c88] .chat-svg-wrap{margin-top:10px;overflow:auto;border:1px solid rgba(255,152,0,.25);border-radius:var(--soft-radius);background:#fff;padding:8px}[data-v-151c7c88] .chat-svg-wrap svg{width:100%;height:auto;display:block}[data-v-151c7c88] .chat-table-wrap{overflow:auto}[data-v-151c7c88] .chat-table-wrap table,[data-v-151c7c88] table{width:100%;border-collapse:collapse;margin-top:8px}[data-v-151c7c88] th,[data-v-151c7c88] td{padding:6px 8px;border:1px solid rgba(120,120,120,.16)}@media(max-width:1100px){.page-shell[data-v-151c7c88]{width:min(100% - 12px,1600px);min-height:100vh;margin-top:6px;grid-template-columns:1fr;gap:10px}.m-header[data-v-151c7c88]{display:flex}.app-sidebar[data-v-151c7c88]{position:fixed;top:0;left:0;z-index:200;width:210px;height:100vh;margin:0;border-radius:0;transform:translate(-104%);transition:transform .24s ease;overflow-y:auto}.page-shell.sidebar-mobile-open .app-sidebar[data-v-151c7c88]{transform:translate(0)}.workspace-shell[data-v-151c7c88]{padding-top:70px}.app-sidebar[data-v-151c7c88],.workspace-shell[data-v-151c7c88]{border-radius:var(--soft-radius)}.sidebar-nav[data-v-151c7c88]{display:flex;grid-template-columns:none}.card[data-v-151c7c88],.card-summary[data-v-151c7c88],.card-bus[data-v-151c7c88],.card-chat[data-v-151c7c88],.card-flow[data-v-151c7c88],.card-anomalies[data-v-151c7c88],.card-areas[data-v-151c7c88],.card-profiles[data-v-151c7c88]{grid-column:span 12}.card-chat[data-v-151c7c88]{max-width:100%}}@media(max-width:720px){.page-shell[data-v-151c7c88]{width:min(100% - 8px,1440px);gap:8px}.workspace-shell[data-v-151c7c88]{padding:12px}.topbar[data-v-151c7c88],.card[data-v-151c7c88]{padding:14px;border-radius:var(--soft-radius)}.sidebar-nav[data-v-151c7c88]{grid-template-columns:none}.rank-row[data-v-151c7c88],.event-row[data-v-151c7c88],.metric-grid[data-v-151c7c88],.flow-toolbar[data-v-151c7c88],.areas-layout[data-v-151c7c88],.area-columns[data-v-151c7c88],.profiles-layout[data-v-151c7c88],.area-ga-editor[data-v-151c7c88],.area-editor-grid[data-v-151c7c88],.planner-step-editor[data-v-151c7c88],.planner-step-grid[data-v-151c7c88]{grid-template-columns:1fr}.statusbar[data-v-151c7c88]{align-items:flex-start}.plan-steps-stack[data-v-151c7c88]{margin-left:6px;padding-left:8px}.plan-draft-shell[data-v-151c7c88]{margin-left:6px;width:calc(100% - 6px)}}:root{color-scheme:light;--bg: #f4f4f4;--panel: #ffffff;--panel-soft: #efefef;--text: #333333;--muted: #666666;--line: rgba(0, 0, 0, .125);--accent: #ff9800;--accent-soft: #fff3e0;--ok-bg: #edf9ef;--ok-border: #5bbf73;--err-bg: #ffe9ea;--err-border: #d95b63;--warn-bg: #fff5e3;--warn-border: #d99a34;--card-radius: 4px;--shadow: 0 12px 32px rgba(0, 0, 0, .12);font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}*{box-sizing:border-box}html,body,#app{min-height:100%;margin:0}body{background:#f4f4f4;color:var(--text)}button,input,select,textarea{font:inherit}a{color:inherit}
1
+ .page-shell[data-v-d23f4b5c]{--sidebar-expanded-width: 210px;--sidebar-collapsed-width: 60px;--sidebar-current-width: var(--sidebar-expanded-width);width:min(1600px,calc(100% - 24px));min-height:calc(100vh - 24px);margin:12px auto;display:grid;grid-template-columns:var(--sidebar-current-width) minmax(0,1fr);gap:16px;align-items:stretch;transition:grid-template-columns .26s ease}.page-shell.sidebar-collapsed[data-v-d23f4b5c]{--sidebar-current-width: var(--sidebar-collapsed-width)}.m-header[data-v-d23f4b5c]{position:fixed;top:0;left:0;right:0;z-index:210;display:none;align-items:center;justify-content:space-between;gap:12px;height:62px;padding:0 12px 0 14px;background:var(--hb-primary-dark);color:#fff;border-bottom:1px solid rgba(255,255,255,.12)}.m-header-brand[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:10px}.m-logo-mark[data-v-d23f4b5c]{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.4);border-radius:var(--soft-radius);font-size:14px;font-weight:800;color:#fff}.hb-logo-text-mobile[data-v-d23f4b5c]{font-size:21px;font-weight:700;letter-spacing:.02em}.hamburger-icon[data-v-d23f4b5c]{position:relative;width:30px;height:22px;border:0;background:transparent;color:inherit;cursor:pointer}.hamburger-icon span[data-v-d23f4b5c]{display:block;position:absolute;left:0;width:100%;height:2px;border-radius:2px;background:#fff;transition:.24s ease}.hamburger-icon span[data-v-d23f4b5c]:nth-child(1){top:0}.hamburger-icon span[data-v-d23f4b5c]:nth-child(2),.hamburger-icon span[data-v-d23f4b5c]:nth-child(3){top:9px}.hamburger-icon span[data-v-d23f4b5c]:nth-child(4){top:18px}.hamburger-icon-cross span[data-v-d23f4b5c]:nth-child(1),.hamburger-icon-cross span[data-v-d23f4b5c]:nth-child(4){left:50%;width:0}.hamburger-icon-cross span[data-v-d23f4b5c]:nth-child(2){transform:rotate(45deg)}.hamburger-icon-cross span[data-v-d23f4b5c]:nth-child(3){transform:rotate(-45deg)}.sidebar-overlay[data-v-d23f4b5c]{position:fixed;inset:0;z-index:180;border:0;background:#090c137a}[data-v-d23f4b5c] *{--soft-radius: 4px;--hb-primary: #ff9800;--hb-primary-dark: #ef6c00}.app-sidebar[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:14px;padding:18px 16px 16px;border-radius:var(--soft-radius);background:var(--hb-primary-dark);box-shadow:0 26px 60px #080a1057;color:#f6f8fb;overflow:hidden}.sidebar-brand-wrap[data-v-d23f4b5c]{display:grid;grid-template-columns:34px minmax(0,1fr) 28px;align-items:start;gap:10px}.sidebar-brand-mark[data-v-d23f4b5c]{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.35);border-radius:var(--soft-radius);font-weight:800;font-size:15px;color:#fff}.sidebar-collapse-toggle[data-v-d23f4b5c]{width:28px;min-width:28px;height:28px;padding:0;border:1px solid rgba(255,255,255,.24);border-radius:var(--soft-radius);background:#ffffff14;color:#f4f8ff;cursor:pointer}.sidebar-collapse-icon[data-v-d23f4b5c]{display:inline-flex;align-items:center;justify-content:center;width:100%;font-size:18px;line-height:1;font-weight:700}.sidebar-collapse-toggle[data-v-d23f4b5c]:hover{background:#ffffff29}.workspace-shell[data-v-d23f4b5c]{min-width:0;padding:10px;border-radius:var(--soft-radius);background:#f4f4f4;box-shadow:0 24px 60px #19203024;transition:padding .2s ease}.topbar[data-v-d23f4b5c]{padding:20px 22px 14px;border:1px solid rgba(160,170,186,.22);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffffa,#f5f7fbf0);box-shadow:0 12px 30px #1a202c14}.workspace-header[data-v-d23f4b5c]{margin-bottom:16px}.brand[data-v-d23f4b5c],.sidebar-brand[data-v-d23f4b5c]{margin-bottom:6px;min-width:0}.eyebrow[data-v-d23f4b5c]{margin:0 0 6px;color:inherit;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;opacity:.75}.brand h1[data-v-d23f4b5c],.sidebar-brand h1[data-v-d23f4b5c]{margin:0;font-size:clamp(24px,3.4vw,34px);line-height:1}.workspace-brand h2[data-v-d23f4b5c]{margin:0;font-size:clamp(24px,3vw,32px);line-height:1.02;color:#111723}.subhead[data-v-d23f4b5c]{max-width:860px;margin:8px 0 0;color:inherit;font-size:12px;line-height:1.4;opacity:.78}.toolbar[data-v-d23f4b5c],.statusbar[data-v-d23f4b5c],.tab-strip[data-v-d23f4b5c],.checkbox[data-v-d23f4b5c],.pill-row[data-v-d23f4b5c],.preset-row[data-v-d23f4b5c],.ask-row[data-v-d23f4b5c]{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.toolbar[data-v-d23f4b5c]{justify-content:space-between}.toolbar-cluster[data-v-d23f4b5c],.action-cluster[data-v-d23f4b5c]{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.workspace-toolbar[data-v-d23f4b5c]{margin-top:16px}.primary-button[data-v-d23f4b5c],.preset-button[data-v-d23f4b5c],.danger-button[data-v-d23f4b5c],.primary-link[data-v-d23f4b5c],.secondary-button[data-v-d23f4b5c],.tab-button[data-v-d23f4b5c]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#607d8b;color:#fff;text-decoration:none;font-size:12px;font-weight:700;padding:8px 12px;transition:.18s ease}.primary-button[data-v-d23f4b5c],.primary-link[data-v-d23f4b5c],.tab-button.active[data-v-d23f4b5c]{border-color:transparent;background:var(--hb-primary);color:#fff}.secondary-button[data-v-d23f4b5c],.preset-button[data-v-d23f4b5c],.tab-button[data-v-d23f4b5c]{border-color:transparent;background:#607d8b;color:#fff}.danger-button[data-v-d23f4b5c]{border-color:transparent;background:#d32f2f;color:#fff}.preset-button[data-v-d23f4b5c]:hover,.danger-button[data-v-d23f4b5c]:hover,.secondary-button[data-v-d23f4b5c]:hover,.tab-button[data-v-d23f4b5c]:hover{background:#546e7a;border-color:transparent}.danger-button[data-v-d23f4b5c]:hover{background:#c62828;border-color:transparent}.new-button[data-v-d23f4b5c]{background:linear-gradient(180deg,#62c27a,#43a85f);border-color:transparent;color:#fff}.new-button[data-v-d23f4b5c]:hover{background:linear-gradient(180deg,#74cf8b,#4fb46b);border-color:transparent}.primary-button[data-v-d23f4b5c]:hover,.primary-link[data-v-d23f4b5c]:hover,.tab-button.active[data-v-d23f4b5c]:hover{background:#e68900;border-color:transparent}.primary-button[data-v-d23f4b5c]:disabled,.preset-button[data-v-d23f4b5c]:disabled,.danger-button[data-v-d23f4b5c]:disabled,.secondary-button[data-v-d23f4b5c]:disabled{opacity:.6;cursor:not-allowed}.hidden-file-input[data-v-d23f4b5c]{display:none}.node-select[data-v-d23f4b5c]{min-width:min(360px,100%)}.sidebar-select[data-v-d23f4b5c]{min-width:0;width:100%;border-color:#ffffff14;background:#ffffff0f;color:#f6f8fb}.sidebar-select option[data-v-d23f4b5c]{color:#0f1520}.node-select[data-v-d23f4b5c],.checkbox[data-v-d23f4b5c],.summary-pre[data-v-d23f4b5c],.chat-log[data-v-d23f4b5c],.anomaly-card pre[data-v-d23f4b5c]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe0}.node-select[data-v-d23f4b5c]{padding:8px 10px;color:var(--text);font-size:12px}.checkbox[data-v-d23f4b5c]{padding:8px 10px;gap:8px;font-size:12px}.sidebar-checkbox[data-v-d23f4b5c]{border-color:#ffffff14;background:#ffffff0f;color:#eef3f9}.sidebar-panel[data-v-d23f4b5c]{padding:12px;border:1px solid rgba(255,255,255,.14);border-radius:var(--soft-radius);background:#ffffff0d}.sidebar-field[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:6px;font-size:11px;font-weight:800;color:#f6f8fce0}.sidebar-nav[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:0}.sidebar-nav .tab-button[data-v-d23f4b5c]{width:100%;display:flex;align-items:center;justify-content:flex-start;text-align:left;padding:15px 10px;border-radius:0;border-color:transparent;background:transparent;color:#edf1f8;font-size:17px;font-weight:400;line-height:1.2;transition:.2s}.sidebar-nav-icon[data-v-d23f4b5c]{flex:0 0 38px;width:38px;min-width:38px;display:flex;align-items:center;justify-content:center}.sidebar-nav-svg[data-v-d23f4b5c]{width:17px;height:17px;fill:currentColor}.sidebar-nav-copy[data-v-d23f4b5c]{flex:1;min-width:0;overflow:hidden;white-space:nowrap;padding-left:10px}.sidebar-nav .sidebar-nav-child[data-v-d23f4b5c]{width:100%;margin-left:0}.sidebar-nav .tab-button.active[data-v-d23f4b5c]{background:transparent;color:#fff}.sidebar-nav .tab-button[data-v-d23f4b5c]:hover{background:var(--hb-primary)}.sidebar-nav .tab-button[data-v-d23f4b5c]:disabled{opacity:.42;cursor:not-allowed;background:#ffffff0d;color:#edf1f89e}.sidebar-nav .tab-button[data-v-d23f4b5c]:disabled:hover{background:#ffffff0d}.sidebar-nav .tab-button:disabled .sidebar-nav-icon[data-v-d23f4b5c]{color:#edf1f89e}.sidebar-nav .tab-button.active .sidebar-nav-icon[data-v-d23f4b5c]{color:var(--hb-primary)}.sidebar-nav .tab-button.active:hover .sidebar-nav-icon[data-v-d23f4b5c]{color:#fff}.sidebar-nav-title[data-v-d23f4b5c]{display:block;font-size:17px;font-weight:400}.sidebar-nav-meta[data-v-d23f4b5c]{display:block;margin-top:3px;font-size:11px;opacity:.72;font-weight:600}.page-shell.sidebar-collapsed .sidebar-panel[data-v-d23f4b5c],.page-shell.sidebar-collapsed .sidebar-footer[data-v-d23f4b5c],.page-shell.sidebar-collapsed .sidebar-brand .eyebrow[data-v-d23f4b5c],.page-shell.sidebar-collapsed .sidebar-brand h1[data-v-d23f4b5c],.page-shell.sidebar-collapsed .sidebar-brand .subhead[data-v-d23f4b5c]{display:none}.page-shell.sidebar-collapsed .sidebar-brand-wrap[data-v-d23f4b5c]{grid-template-columns:1fr;justify-items:center}.page-shell.sidebar-collapsed .app-sidebar[data-v-d23f4b5c]{align-items:center;padding:14px 10px}.page-shell.sidebar-collapsed .sidebar-collapse-toggle[data-v-d23f4b5c]{margin-top:4px}.page-shell.sidebar-collapsed .sidebar-nav .tab-button[data-v-d23f4b5c]{justify-content:center;padding:15px 10px}.page-shell.sidebar-collapsed .sidebar-nav .sidebar-nav-child[data-v-d23f4b5c]{width:100%;margin-left:0}.page-shell.sidebar-collapsed .sidebar-nav-copy[data-v-d23f4b5c]{display:none}.sidebar-actions[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:14px}.sidebar-section-toggle[data-v-d23f4b5c]{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0;border:0;background:transparent;color:#f6f8fb;text-align:left;font:inherit}.sidebar-section-toggle strong[data-v-d23f4b5c]{display:block;font-size:13px;font-weight:800}.sidebar-section-toggle small[data-v-d23f4b5c]{display:block;margin-top:3px;font-size:11px;opacity:.72}.sidebar-test-results[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:10px}.sidebar-results-list[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:8px;max-height:320px;overflow:auto;padding-right:2px}.sidebar-result-row[data-v-d23f4b5c]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.sidebar-result-delete-button[data-v-d23f4b5c]{width:74px;min-width:74px;padding:10px 8px;border:1px solid rgba(136,18,26,.88);background:linear-gradient(180deg,#b72b2bfa,#941717fa);color:#fff;font:inherit;font-size:11px;font-weight:800;letter-spacing:.01em}.sidebar-result-delete-button[data-v-d23f4b5c]:hover:not(:disabled){background:linear-gradient(180deg,#c73030,#a01b1b)}.sidebar-result-delete-button[data-v-d23f4b5c]:disabled{opacity:.72;cursor:wait}.sidebar-result-item[data-v-d23f4b5c]{display:flex;flex-direction:column;justify-content:center;width:100%;min-height:78px;text-align:left;border-color:#ffffff1f;background:#ffffff14;color:#edf1f8;transition:border-color .18s ease,background .18s ease,box-shadow .18s ease}.sidebar-result-item.active[data-v-d23f4b5c]{border-color:#ffffff57;background:linear-gradient(180deg,#6877b3a3,#45517cb8);box-shadow:inset 0 0 0 1px #ffffff14}.sidebar-result-item.running[data-v-d23f4b5c]{box-shadow:inset 0 0 0 1px #f0b3228c}.sidebar-result-head[data-v-d23f4b5c]{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%}.sidebar-result-head strong[data-v-d23f4b5c]{font-size:12px;font-weight:800}.sidebar-result-title[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:8px;min-width:0}.sidebar-result-item .area-list-meta[data-v-d23f4b5c],.sidebar-result-item .area-list-tags[data-v-d23f4b5c]{color:#edf1f8c7}.sidebar-result-status[data-v-d23f4b5c]{display:inline-flex;align-items:center;justify-content:flex-start;min-width:0;padding:0;border:0;background:transparent;color:#fff;font-size:11px;font-weight:800;text-transform:none}.sidebar-result-status.status-pass[data-v-d23f4b5c]{color:#8fe0a8}.sidebar-result-status.status-warn[data-v-d23f4b5c]{color:#ffd17a}.sidebar-result-status.status-fail[data-v-d23f4b5c]{color:#ffb9c3}.sidebar-empty-state[data-v-d23f4b5c]{margin:0;color:#f6f8fcc2}.results-page-layout[data-v-d23f4b5c]{grid-template-columns:minmax(320px,420px) minmax(0,1fr)}.results-page-list[data-v-d23f4b5c]{max-height:min(68vh,760px);padding-right:4px}.results-page-list .sidebar-result-item[data-v-d23f4b5c]{border-color:#7e889a4d;background:linear-gradient(180deg,#fdfeff,#f2f7fd);color:#243042}.results-page-list .sidebar-result-item.active[data-v-d23f4b5c]{border-color:#ef6c005c;background:linear-gradient(180deg,#fff7e9,#ffeccf);box-shadow:inset 0 0 0 1px #ef6c001f}.results-page-list .sidebar-result-item.running[data-v-d23f4b5c]{box-shadow:inset 0 0 0 1px #ff980080}.results-page-list .sidebar-result-item .area-list-meta[data-v-d23f4b5c],.results-page-list .sidebar-result-item .area-list-tags[data-v-d23f4b5c]{color:#556071}.results-page-list .sidebar-result-status[data-v-d23f4b5c]{color:#374151}.results-page-list .sidebar-result-status.status-pass[data-v-d23f4b5c]{color:#2f8d53}.results-page-list .sidebar-result-status.status-warn[data-v-d23f4b5c]{color:#ad730b}.results-page-list .sidebar-result-status.status-fail[data-v-d23f4b5c]{color:#b73845}.sidebar-action-button[data-v-d23f4b5c]{width:100%;justify-content:center}.sidebar-footer[data-v-d23f4b5c]{margin-top:auto;display:flex;flex-direction:column;gap:8px;padding-top:8px}.sidebar-doc-link[data-v-d23f4b5c]{display:inline-flex;align-items:center;width:fit-content;color:var(--hb-primary-dark);text-decoration:none;font-size:12px;font-weight:700}.sidebar-doc-link[data-v-d23f4b5c]:hover{text-decoration:underline}.support-link-row[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:8px}.support-link-button[data-v-d23f4b5c]{display:flex;width:100%;justify-content:center;white-space:nowrap}.support-link-button-youtube[data-v-d23f4b5c]{background:#cc2f2f}.support-link-button-youtube[data-v-d23f4b5c]:hover{background:#b72727}.statusbar[data-v-d23f4b5c]{justify-content:space-between}.status-pill[data-v-d23f4b5c],.meta-chip[data-v-d23f4b5c],.pill[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:6px;border-radius:0;padding:0;border:0;background:transparent;font-size:12px;font-weight:700}.status-pill[data-v-d23f4b5c],.meta-chip[data-v-d23f4b5c],.pill.neutral[data-v-d23f4b5c]{color:var(--text)}.status-pill.error[data-v-d23f4b5c],.pill.danger[data-v-d23f4b5c]{color:#a4333a}.status-pill-spinner[data-v-d23f4b5c]{width:11px;height:11px;border-width:2px;border-color:#5a667a3d;border-top-color:currentColor}.pill.success[data-v-d23f4b5c]{color:#1b7d36}.status-detail[data-v-d23f4b5c]{color:inherit;font-size:12px;font-weight:700;opacity:.7}.content-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:16px}.workspace-main[data-v-d23f4b5c]{padding:0 2px 6px}.card[data-v-d23f4b5c]{grid-column:span 6;min-height:240px;padding:15px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#fffffff0;box-shadow:0 16px 34px #121c2d14}.card-summary[data-v-d23f4b5c],.card-bus[data-v-d23f4b5c],.card-chat[data-v-d23f4b5c],.card-flow[data-v-d23f4b5c],.card-areas[data-v-d23f4b5c],.card-profiles[data-v-d23f4b5c],.card-anomalies[data-v-d23f4b5c]{grid-column:span 6}.card-flow[data-v-d23f4b5c],.card-areas[data-v-d23f4b5c],.card-profiles[data-v-d23f4b5c],.card-settings[data-v-d23f4b5c]{grid-column:span 12}.card-chat[data-v-d23f4b5c]{grid-column:1 / -1;max-width:50vw}.card-profiles[data-v-d23f4b5c]{border-color:#54607461;background:linear-gradient(180deg,#f4f7fbfa,#e9eef4fa);box-shadow:0 18px 36px #1118271f}.card-head[data-v-d23f4b5c]{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:14px}.card-head-actions[data-v-d23f4b5c]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-tab-strip[data-v-d23f4b5c]{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px;margin-bottom:14px;padding:4px;border:1px solid rgba(123,133,151,.26);border-radius:var(--soft-radius);background:linear-gradient(180deg,#f4f7fbf2,#e9eef5f2)}.settings-tab-button[data-v-d23f4b5c]{border:1px solid transparent;border-radius:var(--soft-radius);background:transparent;color:#4a5565;font:inherit;font-size:12px;font-weight:800;padding:8px 12px;transition:.16s ease}.settings-tab-button[data-v-d23f4b5c]:hover{background:#66769424;color:#243042}.settings-tab-button.active[data-v-d23f4b5c]{border-color:#ef6c0057;background:linear-gradient(180deg,#fff7e9,#ffeccf);color:#8e4f00}.settings-panel[data-v-d23f4b5c]{border-color:#616c8057;background:linear-gradient(180deg,#fff,#f7fafd);box-shadow:0 2px #79839629}.settings-panel-head[data-v-d23f4b5c]{padding-bottom:10px;border-bottom:1px solid rgba(148,158,176,.32);margin-bottom:12px}.settings-node-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:minmax(240px,420px) auto;gap:12px;align-items:end;margin-top:12px}.settings-node-checkbox[data-v-d23f4b5c]{width:fit-content;min-height:36px}.settings-config-actions[data-v-d23f4b5c]{margin-top:12px}@media(max-width:900px){.settings-node-grid[data-v-d23f4b5c]{grid-template-columns:minmax(0,1fr);align-items:start}.settings-node-checkbox[data-v-d23f4b5c]{width:100%}}.plan-run-actions[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px;border:1px solid rgba(255,152,0,.42);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fff1daf5,#ffe5b7eb)}.card-head h2[data-v-d23f4b5c]{margin:0;font-size:16px}.summary-pre[data-v-d23f4b5c],.chat-log[data-v-d23f4b5c]{margin:0;padding:14px;white-space:pre-wrap;word-break:break-word;font-family:JetBrains Mono,SFMono-Regular,monospace;font-size:12px;line-height:1.5}.metric-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:14px}.metric[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:6px;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.metric span[data-v-d23f4b5c]{display:block;margin-bottom:0;color:var(--muted);font-size:12px;font-weight:700}.metric strong[data-v-d23f4b5c]{font-size:17px}.rank-list[data-v-d23f4b5c],.event-list[data-v-d23f4b5c],.anomaly-list[data-v-d23f4b5c]{margin:0;padding:0;list-style:none}.rank-row[data-v-d23f4b5c],.event-row[data-v-d23f4b5c]{display:grid;gap:8px;align-items:center;padding:10px 0;border-bottom:1px solid rgba(120,120,120,.14)}.rank-row[data-v-d23f4b5c]{grid-template-columns:minmax(86px,120px) minmax(0,1fr) auto}.event-row[data-v-d23f4b5c]{grid-template-columns:minmax(0,1fr) minmax(0,1.6fr) auto}.rank-title[data-v-d23f4b5c],.event-name[data-v-d23f4b5c]{font-weight:800}.rank-label[data-v-d23f4b5c]{color:var(--muted);font-size:12px}.event-bar[data-v-d23f4b5c]{height:10px;overflow:hidden;border-radius:var(--soft-radius);background:#ff98001f}.event-bar-fill[data-v-d23f4b5c]{display:block;height:100%;border-radius:var(--soft-radius);background:linear-gradient(90deg,var(--accent),#4bbf77)}.areas-toolbar[data-v-d23f4b5c]{display:flex;flex-wrap:wrap;gap:12px;align-items:end;margin-bottom:16px}.areas-layout[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:16px}.area-list-item[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:6px;align-items:flex-start;padding:11px 12px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe6;color:var(--text);text-align:left;transition:.18s ease}.area-list-item[data-v-d23f4b5c]:hover,.area-list-item.active[data-v-d23f4b5c]{border-color:#ff980057;background:var(--accent-soft)}.area-list-title[data-v-d23f4b5c]{font-weight:800}.area-listbox-shell[data-v-d23f4b5c]{width:100%}.area-search-select[data-v-d23f4b5c]{position:relative}.area-search-select-input[data-v-d23f4b5c]{width:100%;border:1px solid var(--line);background:#ffffffeb;color:var(--text);padding:8px 10px;font-size:12px;line-height:1.35;border-radius:var(--soft-radius)}.area-search-select-menu[data-v-d23f4b5c]{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:8;max-height:280px;overflow:auto;border:1px solid var(--line);background:#fffffffa;border-radius:var(--soft-radius)}.area-search-select-option[data-v-d23f4b5c]{display:block;width:100%;padding:8px 10px;border:0;border-bottom:1px solid rgba(120,120,120,.1);background:transparent;color:var(--text);text-align:left;font-size:12px;line-height:1.35}.area-search-select-option[data-v-d23f4b5c]:hover,.area-search-select-option.active[data-v-d23f4b5c]{background:var(--accent-soft)}.area-list-meta[data-v-d23f4b5c],.area-list-tags[data-v-d23f4b5c],.area-detail-subhead[data-v-d23f4b5c]{color:var(--muted);font-size:12px}.area-detail[data-v-d23f4b5c]{min-width:0;width:100%;padding:14px;border:1px solid var(--line);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffff5,#f8f5ffeb)}.profiles-layout[data-v-d23f4b5c]{display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr);gap:16px}.test-planner-layout[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:16px;align-items:stretch}.result-only-layout[data-v-d23f4b5c]{grid-template-columns:minmax(0,1fr)}.card-results-focus[data-v-d23f4b5c]{grid-column:span 12}.profile-list[data-v-d23f4b5c],.profile-editor-stack[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:12px}.planner-sidecard[data-v-d23f4b5c]{gap:12px}.card-profiles .area-detail[data-v-d23f4b5c]{border-color:#616c8057;background:linear-gradient(180deg,#fff,#f7fafd);box-shadow:0 2px #79839629}.card-profiles .card-head[data-v-d23f4b5c]{padding-bottom:10px;border-bottom:1px solid rgba(148,158,176,.32)}.card-profiles .area-detail-subhead[data-v-d23f4b5c]{color:#4b5565}.card-profiles .meta-chip[data-v-d23f4b5c],.card-profiles .pill.neutral[data-v-d23f4b5c]{border:0;background:transparent;color:#1c2430}.card-profiles .planner-list .area-list-item[data-v-d23f4b5c]{border-color:#8892a559;background:linear-gradient(180deg,#fffffffa,#f4f7fbfa);box-shadow:0 1px #99a3b524}.card-profiles .planner-list .area-list-item[data-v-d23f4b5c]:hover,.card-profiles .planner-list .area-list-item.active[data-v-d23f4b5c]{border-color:#4a5a909e;background:linear-gradient(180deg,#e0e6f3f5,#d6deeef5)}.card-profiles .metric[data-v-d23f4b5c]{padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}.card-profiles .metric span[data-v-d23f4b5c]{color:#475163}.card-profiles .metric strong[data-v-d23f4b5c]{color:#161d29;font-size:20px}.ai-planner-shell[data-v-d23f4b5c]{margin-top:12px;padding:12px;border:1px solid rgba(120,120,120,.24);background:#f4f7fcf5;border-radius:var(--soft-radius)}.ai-planner-shell-head[data-v-d23f4b5c]{margin-bottom:12px}.ai-planner-shell-head.template-builder-focus-head[data-v-d23f4b5c]{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}.ai-planner-shell-head h4[data-v-d23f4b5c]{margin:0}.planner-pairs[data-v-d23f4b5c]{margin-top:12px}.planner-generation[data-v-d23f4b5c]{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:14px;padding:10px 12px;border:1px solid rgba(126,136,154,.24);background:linear-gradient(180deg,#f0f4f9fa,#e7edf4fa)}.planner-error-banner[data-v-d23f4b5c]{margin:14px 0 0;padding:10px 12px;border:1px solid #b42318;background:#fef3f2;color:#b42318;font-weight:700;white-space:pre-wrap;word-break:break-word}.planner-step-card[data-v-d23f4b5c]{border:1px solid rgba(132,143,160,.28);border-left:5px solid rgba(112,122,141,.66);background:linear-gradient(180deg,#fff,#f4f8fc);box-shadow:0 2px #7b859724;cursor:default}.planner-step-running[data-v-d23f4b5c]{border-left-color:#3d5ca8;background:linear-gradient(180deg,#f5f9ff,#e9f0fb);box-shadow:0 0 0 2px #3d5ca829}.planner-step-dragging[data-v-d23f4b5c]{opacity:.56;cursor:grabbing}.planner-step-drop-target[data-v-d23f4b5c]{box-shadow:0 0 0 2px #46b86d2e;border-left-color:#46b86d}.planner-step-title[data-v-d23f4b5c]{display:flex;align-items:center;gap:10px}.planner-step-summary[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:10px;padding:10px 12px;border:1px solid rgba(155,165,183,.24);background:#f1f5f9f0;color:#4c5566;font-size:12px}.drag-handle[data-v-d23f4b5c]{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid rgba(120,120,120,.18);border-radius:var(--soft-radius);background:#ffffffd6;color:var(--muted);font-size:12px;font-weight:800;cursor:grab;-webkit-user-select:none;user-select:none}.collapse-toggle[data-v-d23f4b5c]{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;border:1px solid rgba(120,120,120,.18);border-radius:var(--soft-radius);background:#ffffffd6;color:var(--text);cursor:pointer}.collapse-icon[data-v-d23f4b5c]{display:inline-block;font-size:12px;line-height:1;transition:transform .16s ease}.collapse-icon.collapsed[data-v-d23f4b5c]{transform:rotate(-90deg)}.planner-step-editor[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;margin-top:10px;padding:12px;border:1px solid rgba(155,165,183,.24);background:#f7fafdf5}.planner-field-group[data-v-d23f4b5c]{padding:10px 12px 12px;border:1px solid rgba(155,165,183,.28);background:#ffffffe6}.planner-field-group h4[data-v-d23f4b5c]{margin:0 0 10px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:#1d2433}.planner-field-group-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px}.planner-field-group-grid .group-span[data-v-d23f4b5c]{grid-column:1 / -1}.planner-check-sections[data-v-d23f4b5c]{display:grid;gap:10px;margin-top:10px}.planner-check-section[data-v-d23f4b5c]{padding:10px 12px;border:1px solid rgba(155,165,183,.28);background:#ffffffdb}.planner-check-section h4[data-v-d23f4b5c]{margin:0 0 8px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:#1d2433}.planner-check-section .area-detail-subhead[data-v-d23f4b5c]{margin:0 0 8px}.running-headline[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:10px;margin:0}.running-spinner[data-v-d23f4b5c]{width:14px;height:14px;display:inline-block;border-radius:50%;border:2px solid rgba(90,102,122,.28);border-top-color:#5a667a;animation:running-spin-d23f4b5c .85s linear infinite}.run-button-spinner[data-v-d23f4b5c]{margin-right:6px;vertical-align:-2px}.run-chip-spinner[data-v-d23f4b5c]{width:12px;height:12px;margin-right:6px}@keyframes running-spin-d23f4b5c{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.editor-check-sections[data-v-d23f4b5c]{grid-column:1 / -1}.compact-grid[data-v-d23f4b5c]{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:0}.result-check-sections .planner-check-section[data-v-d23f4b5c]{background:#fafcfffa}.planner-step-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px;margin-top:10px;color:#4c5566;font-size:12px}.area-detail h3[data-v-d23f4b5c],.area-detail h4[data-v-d23f4b5c]{margin:0}.area-detail-subhead[data-v-d23f4b5c]{margin:6px 0 0}.area-metrics[data-v-d23f4b5c]{margin-top:4px}.area-chips[data-v-d23f4b5c]{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}.area-editor[data-v-d23f4b5c]{margin:14px 0 18px;padding:12px;border:1px solid rgba(120,120,120,.16);border-radius:var(--soft-radius);background:#ffffffb8}.area-editor-grid[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.area-editor-span[data-v-d23f4b5c]{grid-column:1 / -1}.area-editor-note[data-v-d23f4b5c]{margin:12px 0 0;color:var(--muted);font-size:12px}.compact-preset-row[data-v-d23f4b5c]{margin-top:10px}.compact-preset-row .preset-button[data-v-d23f4b5c]{text-align:left;font-size:11px;padding:7px 10px}.area-ga-editor[data-v-d23f4b5c]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;margin-top:16px}.area-ga-list[data-v-d23f4b5c],.area-ga-catalog[data-v-d23f4b5c]{max-height:320px;overflow:auto}.area-ga-item[data-v-d23f4b5c]{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid rgba(120,120,120,.12)}.area-ga-main[data-v-d23f4b5c]{min-width:0;flex:1}.area-ga-actions[data-v-d23f4b5c]{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.area-ga-role-field[data-v-d23f4b5c]{min-width:148px}.area-ga-item strong[data-v-d23f4b5c],.planner-step-grid strong[data-v-d23f4b5c]{color:var(--text)}.area-ga-item span[data-v-d23f4b5c]{display:block;color:var(--muted);font-size:12px}.profile-runbar[data-v-d23f4b5c]{display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:center;margin-top:16px;padding:10px 12px;border:1px solid rgba(118,129,147,.22);background:linear-gradient(180deg,#eff4fafa,#e6ecf4fa)}.area-columns[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin:16px 0}.simple-list[data-v-d23f4b5c]{margin:10px 0 0;padding-left:18px}.simple-list li[data-v-d23f4b5c]{margin-bottom:6px}.simple-list-mono[data-v-d23f4b5c]{font-family:JetBrains Mono,SFMono-Regular,monospace;font-size:11px}.report-checks[data-v-d23f4b5c]{display:grid;gap:10px;margin:16px 0}.plan-steps-stack[data-v-d23f4b5c]{margin-left:12px;padding-left:12px}.plan-draft-shell[data-v-d23f4b5c]{margin-left:12px;width:calc(100% - 12px)}.report-check[data-v-d23f4b5c]{padding:12px;border:1px solid rgba(139,149,167,.28);border-radius:var(--soft-radius);border-left:4px solid var(--line);background:#fffffff5;box-shadow:0 1px #8c96a824}.report-pass[data-v-d23f4b5c]{border-left-color:#46b86d;background:linear-gradient(180deg,#f7fcf8,#eef7f0)}.report-warn[data-v-d23f4b5c]{border-left-color:#d99a34;background:linear-gradient(180deg,#fffaf2,#fcf4e5)}.report-fail[data-v-d23f4b5c]{border-left-color:#d94b55;background:linear-gradient(180deg,#fff6f6,#fceced)}.bus-track[data-v-d23f4b5c]{position:relative;height:18px;margin-top:16px;overflow:hidden;border:1px solid rgba(120,120,120,.2);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fff8ea,#fff2dc)}.bus-segment[data-v-d23f4b5c]{position:absolute;top:0;bottom:0}.segment-connected[data-v-d23f4b5c]{background:linear-gradient(90deg,#4ad06d,#38c45f)}.segment-disconnected[data-v-d23f4b5c]{background:linear-gradient(90deg,#eb6a74,#d94b55)}.bus-scale[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:10px;color:var(--muted);font-size:12px;font-weight:700}.bus-scale span[data-v-d23f4b5c]:nth-child(2){text-align:center}.bus-scale span[data-v-d23f4b5c]:nth-child(3){text-align:right}.bus-note[data-v-d23f4b5c],.flow-note[data-v-d23f4b5c],.empty-state[data-v-d23f4b5c]{color:var(--muted);line-height:1.5}.flow-toolbar[data-v-d23f4b5c]{display:grid;grid-template-columns:120px minmax(180px,1fr) minmax(220px,1.2fr) auto;gap:12px;align-items:start}.flow-field[data-v-d23f4b5c]{display:flex;flex-direction:column;gap:6px;color:var(--muted);font-size:11px;font-weight:700}.flow-field input[data-v-d23f4b5c],.flow-field select[data-v-d23f4b5c],.flow-field textarea[data-v-d23f4b5c]{border:1px solid var(--line);border-radius:var(--soft-radius);background:#ffffffe0;color:var(--text);padding:7px 10px;min-height:36px;box-sizing:border-box;line-height:1.25;font-size:12px}.flow-field select[data-v-d23f4b5c]{padding-right:28px}.flow-field textarea[data-v-d23f4b5c]{resize:vertical;min-height:62px;font:inherit}.flow-field select[multiple][data-v-d23f4b5c],.flow-field-select select[data-v-d23f4b5c]{min-height:108px;padding-right:10px}.compact-actions[data-v-d23f4b5c]{justify-content:flex-end}.compact-toggle[data-v-d23f4b5c]{min-height:40px}.modal-backdrop[data-v-d23f4b5c]{position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;padding:20px;background:#221d3057;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.global-wait-overlay[data-v-d23f4b5c]{position:fixed;inset:0;z-index:260;display:flex;align-items:center;justify-content:center;padding:20px;background:#10141c6b;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.global-wait-card[data-v-d23f4b5c]{width:min(420px,100%);display:flex;flex-direction:column;align-items:center;gap:10px;padding:18px 20px;border:1px solid rgba(118,128,145,.38);background:#fffffff5;color:#1d2433;text-align:center;box-shadow:0 14px 38px #080c1333}.global-wait-card strong[data-v-d23f4b5c]{font-size:15px}.global-wait-card span[data-v-d23f4b5c]{font-size:13px;color:#4d5a6e}.global-wait-spinner[data-v-d23f4b5c]{width:20px;height:20px;border-width:2px}.modal-card[data-v-d23f4b5c]{width:min(420px,100%);padding:18px;border:1px solid var(--line);border-radius:var(--soft-radius);background:#fffffffa;box-shadow:var(--shadow)}.modal-card h3[data-v-d23f4b5c]{margin:0 0 8px;font-size:18px}.modal-actions[data-v-d23f4b5c]{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}.flow-legend[data-v-d23f4b5c]{grid-column:1 / -1;display:flex;flex-wrap:nowrap;gap:10px 14px;align-items:center;padding:10px 0 0;color:var(--muted);font-size:12px;font-weight:700;white-space:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.flow-legend span[data-v-d23f4b5c]{display:inline-flex;align-items:center;white-space:nowrap;flex:0 0 auto}.flow-toggle[data-v-d23f4b5c]{align-self:end;min-height:44px;white-space:nowrap}.flow-toggle-inline[data-v-d23f4b5c]{align-self:flex-start;min-height:auto;margin-top:6px}.legend-line[data-v-d23f4b5c],.legend-dot[data-v-d23f4b5c]{display:inline-block;vertical-align:middle;margin-right:6px}.legend-line[data-v-d23f4b5c]{width:18px;border-top:3px solid currentColor}.legend-write[data-v-d23f4b5c]{color:#ff9800}.legend-response[data-v-d23f4b5c]{color:#46b86d}.legend-read[data-v-d23f4b5c]{color:#d99a34}.legend-repeat[data-v-d23f4b5c]{color:#c34747}.legend-dot[data-v-d23f4b5c]{width:10px;height:10px;border-radius:var(--soft-radius)}.legend-anomaly[data-v-d23f4b5c]{background:#f08f92}.legend-external[data-v-d23f4b5c]{background:#f5d9a2}.flow-frame[data-v-d23f4b5c]{margin-top:16px;overflow:auto;border:1px solid var(--line);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fffffffa,#f8f5fff5)}.card-flow.is-fullscreen[data-v-d23f4b5c]{width:100%;height:100%;margin:0;padding:18px;border-radius:var(--soft-radius);background:#fffffffa;overflow:auto}.card-flow.is-fullscreen .flow-frame[data-v-d23f4b5c]{height:calc(100vh - 260px)}.card-flow.is-fullscreen .flow-svg[data-v-d23f4b5c]{min-height:calc(100vh - 260px)}.flow-svg[data-v-d23f4b5c]{width:100%;min-width:1180px;min-height:420px;display:block}.flow-empty[data-v-d23f4b5c]{padding:24px}.flow-edge[data-v-d23f4b5c]{fill:none;stroke-linecap:round;vector-effect:non-scaling-stroke}.flow-edge-active[data-v-d23f4b5c]{stroke-dasharray:10 7;animation:graph-flow-d23f4b5c 1.25s linear infinite}.flow-edge-idle[data-v-d23f4b5c]{stroke-dasharray:8 8;animation:none}@keyframes graph-flow-d23f4b5c{0%{stroke-dashoffset:0}to{stroke-dashoffset:-34}}.flow-node circle[data-v-d23f4b5c]{fill:#edf9ef;stroke:#4caf66;stroke-width:2}.flow-node.is-anomaly circle[data-v-d23f4b5c]{fill:#fff1f1;stroke:#e53935}.flow-node.is-external circle[data-v-d23f4b5c]{fill:#fff8ea;stroke:#c98a1a;stroke-dasharray:4 3}.flow-node.is-idle circle[data-v-d23f4b5c]{opacity:.7}.node-label[data-v-d23f4b5c],.node-subtitle[data-v-d23f4b5c],.node-payload[data-v-d23f4b5c],.node-badge[data-v-d23f4b5c]{text-anchor:middle;dominant-baseline:middle}.node-label[data-v-d23f4b5c]{fill:#2f7f48;font-size:12px;font-weight:800}.flow-node.is-external .node-label[data-v-d23f4b5c]{fill:#9a6b24}.node-subtitle[data-v-d23f4b5c]{fill:#7a7368;font-size:10px}.node-payload[data-v-d23f4b5c]{fill:#746d62;font-size:9px;font-family:JetBrains Mono,SFMono-Regular,monospace}.node-badge[data-v-d23f4b5c]{fill:#b3261e;font-size:9px;font-weight:800}.anomaly-list[data-v-d23f4b5c]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.anomaly-card[data-v-d23f4b5c]{padding:14px;border-left:4px solid var(--warn-border);border-radius:var(--soft-radius);background:var(--warn-bg)}.anomaly-head[data-v-d23f4b5c]{display:flex;justify-content:space-between;gap:10px;align-items:baseline}.anomaly-time[data-v-d23f4b5c]{margin:8px 0 10px;color:var(--muted);font-size:12px}.anomaly-card pre[data-v-d23f4b5c]{margin:0;padding:12px;white-space:pre-wrap;word-break:break-word;font-size:12px}.chat-log[data-v-d23f4b5c]{min-height:280px}.ask-row[data-v-d23f4b5c]{margin-top:12px;margin-bottom:0;padding:10px;border:1px solid rgba(255,152,0,.34);border-radius:var(--soft-radius);background:linear-gradient(180deg,#fff8e8db,#fff3d6cc)}.ask-input[data-v-d23f4b5c]{flex:1 1 260px;min-width:0;border:2px solid var(--hb-primary);border-radius:var(--soft-radius);background:#fff;color:var(--text);padding:11px 14px;box-shadow:0 0 0 2px #ff980024}.ask-input[data-v-d23f4b5c]:focus{outline:none;border-color:#ef6c00;box-shadow:0 0 0 3px #ef6c0038}.chat-message[data-v-d23f4b5c]{margin-bottom:12px;padding:12px;border-radius:var(--soft-radius)}.chat-message pre[data-v-d23f4b5c]{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit}.chat-user[data-v-d23f4b5c]{background:#ff98001f}.chat-assistant[data-v-d23f4b5c]{background:#5bbf731f}.chat-error[data-v-d23f4b5c]{background:var(--err-bg)}.chat-pending[data-v-d23f4b5c]{display:inline-flex;align-items:center;gap:8px;background:#78787814;color:var(--muted)}.chat-pending-spinner[data-v-d23f4b5c]{width:14px;height:14px;border-radius:50%;border:2px solid rgba(90,102,122,.28);border-top-color:#5a667a;animation:chat-pending-spin-d23f4b5c .75s linear infinite}@keyframes chat-pending-spin-d23f4b5c{0%{transform:rotate(0)}to{transform:rotate(360deg)}}[data-v-d23f4b5c] .chat-svg-wrap{margin-top:10px;overflow:auto;border:1px solid rgba(255,152,0,.25);border-radius:var(--soft-radius);background:#fff;padding:8px}[data-v-d23f4b5c] .chat-svg-wrap svg{width:100%;height:auto;display:block}[data-v-d23f4b5c] .chat-table-wrap{overflow:auto}[data-v-d23f4b5c] .chat-table-wrap table,[data-v-d23f4b5c] table{width:100%;border-collapse:collapse;margin-top:8px}[data-v-d23f4b5c] th,[data-v-d23f4b5c] td{padding:6px 8px;border:1px solid rgba(120,120,120,.16)}@media(max-width:1100px){.page-shell[data-v-d23f4b5c]{width:min(100% - 12px,1600px);min-height:100vh;margin-top:6px;grid-template-columns:1fr;gap:10px}.m-header[data-v-d23f4b5c]{display:flex}.app-sidebar[data-v-d23f4b5c]{position:fixed;top:0;left:0;z-index:200;width:210px;height:100vh;margin:0;border-radius:0;transform:translate(-104%);transition:transform .24s ease;overflow-y:auto}.page-shell.sidebar-mobile-open .app-sidebar[data-v-d23f4b5c]{transform:translate(0)}.workspace-shell[data-v-d23f4b5c]{padding-top:70px}.app-sidebar[data-v-d23f4b5c],.workspace-shell[data-v-d23f4b5c]{border-radius:var(--soft-radius)}.sidebar-nav[data-v-d23f4b5c]{display:flex;grid-template-columns:none}.card[data-v-d23f4b5c],.card-summary[data-v-d23f4b5c],.card-bus[data-v-d23f4b5c],.card-chat[data-v-d23f4b5c],.card-flow[data-v-d23f4b5c],.card-anomalies[data-v-d23f4b5c],.card-areas[data-v-d23f4b5c],.card-profiles[data-v-d23f4b5c]{grid-column:span 12}.card-chat[data-v-d23f4b5c]{max-width:100%}}@media(max-width:720px){.page-shell[data-v-d23f4b5c]{width:min(100% - 8px,1440px);gap:8px}.workspace-shell[data-v-d23f4b5c]{padding:12px}.topbar[data-v-d23f4b5c],.card[data-v-d23f4b5c]{padding:14px;border-radius:var(--soft-radius)}.sidebar-nav[data-v-d23f4b5c]{grid-template-columns:none}.rank-row[data-v-d23f4b5c],.event-row[data-v-d23f4b5c],.metric-grid[data-v-d23f4b5c],.flow-toolbar[data-v-d23f4b5c],.areas-layout[data-v-d23f4b5c],.area-columns[data-v-d23f4b5c],.profiles-layout[data-v-d23f4b5c],.area-ga-editor[data-v-d23f4b5c],.area-editor-grid[data-v-d23f4b5c],.planner-step-editor[data-v-d23f4b5c],.planner-step-grid[data-v-d23f4b5c]{grid-template-columns:1fr}.statusbar[data-v-d23f4b5c]{align-items:flex-start}.plan-steps-stack[data-v-d23f4b5c]{margin-left:6px;padding-left:8px}.plan-draft-shell[data-v-d23f4b5c]{margin-left:6px;width:calc(100% - 6px)}}:root{color-scheme:light;--bg: #f4f4f4;--panel: #ffffff;--panel-soft: #efefef;--text: #333333;--muted: #666666;--line: rgba(0, 0, 0, .125);--accent: #ff9800;--accent-soft: #fff3e0;--ok-bg: #edf9ef;--ok-border: #5bbf73;--err-bg: #ffe9ea;--err-border: #d95b63;--warn-bg: #fff5e3;--warn-border: #d99a34;--card-radius: 4px;--shadow: 0 12px 32px rgba(0, 0, 0, .12);font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}*{box-sizing:border-box}html,body,#app{min-height:100%;margin:0}body{background:#f4f4f4;color:var(--text)}button,input,select,textarea{font:inherit}a{color:inherit}