dsh-codegraph-visualizer 0.3.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.css","names":[],"sources":["src/client/styles/views-panel.css","src/client/styles/tokens.css","src/client/styles/layout.css","src/client/styles/overlays.css","src/client/styles/graph.css","src/client/styles/node-detail.css","src/client/styles/import-workspace.css","src/client/styles/path-finder.css","src/client/styles/health-score-card.css","src/client/styles/rule-config-panel.css","src/client/styles/hotspot-godmodule-panel.css","src/client/styles/impact-panel.css","src/client/styles/cycle-panel.css","src/client/styles/deadcode-panel.css","src/client/styles/registry-panel.css","src/client/styles/tour-panel.css","src/client/styles/responsive.css","src/client/styles/misc.css","src/client/styles/runtime-panel.css","src/client/styles/diff-panel.css","src/client/styles/keyword-query-panel.css","src/client/styles/path-pattern-panel.css","src/client/styles/graph-manage-panel.css"],"sourcesContent":["/* ---- cycle-141 workstream E: Π 视图划分面板(ViewsPanel) ----\n * 只消费 `tokens.css` 的设计令牌(`--cg-*`),不出现任何原始色值或\n * 带色值回退的 var() 写法——由 `tests/unit/tokensContract.test.ts` 守。\n * 四个视图的语义色借用既有令牌:结构=accent、时序=info、所有权=warning、领域=success。\n */\n\n/* —— 状态行(加载 / 错误 / 未构建)—— */\n\n.cg-views-state {\n padding: 12px 10px;\n font-size: 12px;\n line-height: 1.6;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-state-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--cg-error);\n}\n\n.cg-views-state-empty {\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-retry {\n padding: 2px 8px;\n font-size: 11px;\n color: var(--cg-text);\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n cursor: pointer;\n transition: background-color var(--cg-transition), border-color var(--cg-transition);\n}\n\n.cg-views-retry:hover {\n background: var(--cg-surface-active);\n}\n\n/* —— 四张视图摘要卡 —— */\n\n.cg-views-cards {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n margin-bottom: 10px;\n}\n\n.cg-views-card {\n padding: 8px 8px 6px;\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n border-left: 3px solid var(--cg-accent);\n}\n\n.cg-views-card-temporal { border-left-color: var(--cg-info); }\n.cg-views-card-ownership { border-left-color: var(--cg-warning); }\n.cg-views-card-domain { border-left-color: var(--cg-success); }\n\n.cg-views-card-off {\n opacity: 0.72;\n border-style: dashed;\n}\n\n.cg-views-card-title {\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.03em;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n}\n\n.cg-views-card-count {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-top: 2px;\n font-family: var(--cg-font-mono);\n font-size: 16px;\n font-weight: 700;\n color: var(--cg-accent);\n}\n\n.cg-views-card-temporal .cg-views-card-count { color: var(--cg-info); }\n.cg-views-card-ownership .cg-views-card-count { color: var(--cg-warning); }\n.cg-views-card-domain .cg-views-card-count { color: var(--cg-success); }\n\n.cg-views-card-unit {\n font-family: var(--cg-font-sans);\n font-size: 9px;\n font-weight: 400;\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-card-hint {\n margin-top: 2px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-card-reason {\n margin-top: 2px;\n font-size: 9px;\n color: var(--cg-warning);\n}\n\n/* —— 通用分节 —— */\n\n.cg-views-section {\n margin-bottom: 10px;\n}\n\n.cg-views-section-title {\n margin: 0 0 6px;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--cg-text-tertiary);\n}\n\n/* —— 视图分布条 —— */\n\n.cg-views-bar {\n display: flex;\n width: 100%;\n height: 10px;\n overflow: hidden;\n background: var(--cg-surface-active);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-bar-seg {\n height: 100%;\n min-width: 2px;\n transition: width var(--cg-transition-slow);\n}\n\n.cg-views-bar-structural { background: var(--cg-accent); }\n.cg-views-bar-temporal { background: var(--cg-info); }\n.cg-views-bar-ownership { background: var(--cg-warning); }\n.cg-views-bar-domain { background: var(--cg-success); }\n\n.cg-views-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 10px;\n margin-top: 5px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-legend-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cg-views-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-dot-structural { background: var(--cg-accent); }\n.cg-views-dot-temporal { background: var(--cg-info); }\n.cg-views-dot-ownership { background: var(--cg-warning); }\n.cg-views-dot-domain { background: var(--cg-success); }\n\n/* —— 节点视图矩阵 —— */\n\n.cg-views-sampled {\n margin-bottom: 6px;\n padding: 4px 6px;\n font-size: 9px;\n color: var(--cg-warning);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-empty {\n padding: 10px 8px;\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-matrix {\n max-height: 240px;\n overflow: auto;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-matrix-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) repeat(4, 30px);\n align-items: center;\n gap: 4px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-matrix-row:last-child {\n border-bottom: none;\n}\n\n.cg-views-matrix-head {\n position: sticky;\n top: 0;\n z-index: 1;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n background: var(--cg-surface-active);\n}\n\n.cg-views-matrix-id {\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-views-cell {\n text-align: center;\n font-family: var(--cg-font-mono);\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-cell-on {\n color: var(--cg-accent);\n font-weight: 700;\n}\n\n/* —— 领域分解 —— */\n\n.cg-views-domains {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 180px;\n overflow: auto;\n}\n\n.cg-views-domain {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-domain:last-child {\n border-bottom: none;\n}\n\n.cg-views-domain-name {\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-views-domain-count {\n font-family: var(--cg-font-mono);\n color: var(--cg-text-secondary);\n}\n\n/* —— 页脚 —— */\n\n.cg-views-footnote {\n margin-top: 8px;\n padding-top: 6px;\n font-size: 9px;\n color: var(--cg-text-tertiary);\n border-top: 1px solid var(--cg-border);\n}\n\n/* —— 时序窗口工具条(cycle-145 T2)—— */\n\n.cg-views-window {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 8px;\n}\n\n.cg-views-window-label {\n font-size: 10px;\n color: var(--cg-text-secondary);\n margin-right: 2px;\n}\n\n.cg-views-window-btn {\n padding: 2px 8px;\n font-size: 10px;\n font-family: inherit;\n color: var(--cg-text-secondary);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n cursor: pointer;\n}\n\n.cg-views-window-btn:hover {\n color: var(--cg-text);\n border-color: var(--cg-text-tertiary);\n}\n\n.cg-views-window-btn-active {\n color: var(--cg-on-accent);\n background: var(--cg-accent);\n border-color: var(--cg-accent);\n}\n\n/* —— 数据来源披露区(cycle-145 T1)—— */\n\n.cg-views-sources {\n display: flex;\n flex-direction: column;\n}\n\n.cg-views-source-row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-source-row:last-child {\n border-bottom: none;\n}\n\n.cg-views-source-name {\n flex: 0 0 auto;\n min-width: 56px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-source-value {\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-views-source-value-off {\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-source-reason {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","/* ============================================================================\r\n * DSH CodeGraph Visualizer — Modern UI Styles\r\n * Follows dsh-web-ui design tokens (--dsw-* CSS custom properties).\r\n * WCAG 2.2 AA compliant contrast, backdrop-blur glassmorphism, smooth motion.\r\n * ============================================================================ */\r\n\r\n:root {\r\n /* DSH theme bridge — consume host --dsw-* tokens with safe fallbacks.\r\n * DSH does not expose CSS custom properties; fallbacks below match the\r\n * actual computed values from DSH's light theme (measured via DevTools). */\r\n --cg-bg: var(--dsw-bg, #ffffff);\r\n --cg-surface: var(--dsw-surface, #f9fafb);\r\n --cg-surface-hover: var(--dsw-surface-hover, #f3f4f6);\r\n --cg-surface-active: var(--dsw-surface-active, #e5e7eb);\r\n --cg-bg-elevated: var(--dsw-bg-elevated, #ffffff);\r\n --cg-border: var(--dsw-border, rgba(0, 0, 0, 0.04));\r\n --cg-border-strong: var(--dsw-border-strong, rgba(0, 0, 0, 0.1));\r\n --cg-text: var(--dsw-fg, #0f1115);\r\n --cg-text-secondary: var(--dsw-fg-secondary, #61666b);\r\n --cg-text-tertiary: var(--dsw-fg-tertiary, #4d5156);\r\n --cg-accent: var(--dsw-accent, #263148);\r\n --cg-accent-hover: var(--dsw-accent-hover, #1a2230);\r\n --cg-accent-soft: var(--dsw-accent-soft, rgba(38, 49, 72, 0.1));\r\n --cg-on-accent: var(--dsw-on-accent, #ffffff);\r\n --cg-success: #10b981;\r\n --cg-warning: #f59e0b;\r\n --cg-error: #ef4444;\r\n --cg-info: #3b82f6;\r\n --cg-cycle-highlight: #e74c3c;\r\n\r\n /* Dead-code analysis — panel accents (badge / border / highlight). */\r\n --cg-deadcode-highlight: #e74c3c;\r\n --cg-deadcode-confirmed: #e74c3c;\r\n --cg-deadcode-suspected: #f39c12;\r\n\r\n /* Dead-code analysis — canvas node palette. These are read through\r\n * `readCssVarCached('--cg-deadcode-node…')` in\r\n * `src/client/renderer/styles/ThemeStylesheet.ts`, whose fallback literals are\r\n * locked to these values by `tests/unit/tokensContract.test.ts`. */\r\n --cg-deadcode-node: #9ca3af;\r\n --cg-deadcode-node-border: #6b7280;\r\n --cg-deadcode-node-suspected: #d1d5db;\r\n --cg-deadcode-node-suspected-border: #9ca3af;\r\n\r\n /* Tour step layer palette — guided-tour legend chips and step badges. */\r\n --cg-tour-layer-entry: #4caf50;\r\n --cg-tour-layer-api: #2196f3;\r\n --cg-tour-layer-service: #ff9800;\r\n --cg-tour-layer-data: #9c27b0;\r\n --cg-tour-layer-ui: #e91e63;\r\n --cg-tour-layer-utility: #607d8b;\r\n\r\n /* Node type semantic colors — light theme */\r\n --cg-node-default: #263148;\r\n --cg-node-function: #059669;\r\n --cg-node-function-text: #047857;\r\n --cg-node-class: #1a2230;\r\n --cg-node-variable: #d97706;\r\n --cg-node-module: #db2777;\r\n --cg-node-interface: #0d9488;\r\n --cg-node-type: #7c3aed;\r\n --cg-node-dep-npm: #cc3535;\r\n --cg-node-dep-cargo: #ce422b;\r\n --cg-node-dep-gomod: #007d9b;\r\n --cg-node-dep-pip: #3776ab;\r\n --cg-node-package: #263148;\r\n\r\n /* CFG / flowchart semantic colors — light theme */\r\n --cg-cfg-loop: #7c3aed;\r\n --cg-cfg-switch: #ec4899;\r\n --cg-cfg-try: #3b82f6;\r\n --cg-cfg-finally: #10b981;\r\n --cg-cfg-process: #3b82f6;\r\n --cg-cfg-subprocess: #f59e0b;\r\n\r\n /* Sequence diagram semantic colors — light theme */\r\n --cg-seq-external: #db2777;\r\n --cg-seq-fragment: #263148;\r\n --cg-seq-async: #f59e0b;\r\n /* 时序图网格线 / 片段底色(原先在 TS 里硬编码 rgba(0,0,0,0.03),深色下不可见) */\r\n --cg-seq-grid: rgba(0, 0, 0, 0.03);\r\n\r\n /* Package diagram semantic colors — light theme */\r\n --cg-package-border: #1a2230;\r\n --cg-edge-package: #263148;\r\n\r\n /* Edge type semantic colors — light theme */\r\n --cg-edge-default: rgba(0, 0, 0, 0.1);\r\n --cg-edge-call: #3b82f6;\r\n --cg-edge-import: #10b981;\r\n --cg-edge-extend: #ec4899;\r\n --cg-edge-implement: #0d9488;\r\n --cg-edge-dependency: #f59e0b;\r\n --cg-edge-contains: #7c3aed;\r\n --cg-edge-dep-prod: #f59e0b;\r\n --cg-edge-dep-dev: #3b82f6;\r\n --cg-edge-dep-peer: #10b981;\r\n --cg-edge-dep-optional: #7c3aed;\r\n /* UML relation kinds that are not package-manager edges. */\r\n --cg-edge-aggregation: #6366f1;\r\n --cg-edge-composition: #db2777;\r\n\r\n /* Highlight / analysis colors — light theme */\r\n --cg-hover-border: #1a2230;\r\n --cg-impact-d1: #f59e0b;\r\n --cg-impact-d2: #fbbf24;\r\n --cg-impact-d3: #fde68a;\r\n --cg-inheritance-extend: #ec4899;\r\n --cg-inheritance-implement: #14b8a6;\r\n --cg-cluster-bg: rgba(38, 49, 72, 0.10);\r\n --cg-cluster-border: #263148;\r\n --cg-cluster-hover-bg: rgba(38, 49, 72, 0.25);\r\n --cg-cluster-hover-border: #1a2230;\r\n --cg-cluster-edge: #263148;\r\n --cg-cluster-edge-label-bg: #f9fafb;\r\n\r\n /* Cluster hue colors — light theme */\r\n --cg-cluster-hue-0-bg: rgba(99,102,241,0.10);\r\n --cg-cluster-hue-0-border: #6366f1;\r\n --cg-cluster-hue-1-bg: rgba(16,185,129,0.10);\r\n --cg-cluster-hue-1-border: #10b981;\r\n --cg-cluster-hue-2-bg: rgba(236,72,153,0.10);\r\n --cg-cluster-hue-2-border: #ec4899;\r\n --cg-cluster-hue-3-bg: rgba(245,158,11,0.10);\r\n --cg-cluster-hue-3-border: #f59e0b;\r\n --cg-cluster-hue-4-bg: rgba(6,182,212,0.10);\r\n --cg-cluster-hue-4-border: #06b6d4;\r\n --cg-cluster-hue-5-bg: rgba(168,85,247,0.10);\r\n --cg-cluster-hue-5-border: #8b5cf6;\r\n --cg-cluster-hue-6-bg: rgba(239,68,68,0.10);\r\n --cg-cluster-hue-6-border: #ef4444;\r\n --cg-cluster-hue-7-bg: rgba(132,204,22,0.10);\r\n --cg-cluster-hue-7-border: #84cc16;\r\n --cg-cluster-hue-8-bg: rgba(251,113,133,0.10);\r\n --cg-cluster-hue-8-border: #f43f5e;\r\n --cg-cluster-hue-9-bg: rgba(96,165,250,0.10);\r\n --cg-cluster-hue-9-border: #3b82f6;\r\n --cg-cluster-hue-10-bg: rgba(52,211,153,0.10);\r\n --cg-cluster-hue-10-border: #14b8a6;\r\n --cg-cluster-hue-11-bg: rgba(251,191,36,0.10);\r\n --cg-cluster-hue-11-border: #eab308;\r\n\r\n /* Node role semantic colors — light theme */\r\n --cg-role-entry: #059669;\r\n --cg-role-orphan: #9ca3af;\r\n --cg-role-leaf: #d97706;\r\n --cg-role-hub: #dc2626;\r\n\r\n /* Heatmap gradient colors — light theme */\r\n --cg-heatmap-stable: #10b981;\r\n --cg-heatmap-unstable: #ef4444;\r\n --cg-heatmap-low: #3b82f6;\r\n --cg-heatmap-high: #ef4444;\r\n\r\n /* Typography — match DSH's actual font stack including CJK fonts */\r\n --cg-font-sans: var(--dsw-font-sans, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Helvetica Neue\", Helvetica, Arial, sans-serif);\r\n --cg-font-mono: var(--dsw-font-mono, \"JetBrains Mono\", \"Fira Code\", Consolas, \"Microsoft YaHei\", monospace);\r\n\r\n /* Elevation */\r\n --cg-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);\r\n --cg-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\r\n --cg-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.14);\r\n --cg-shadow-active: 0 1px 4px rgba(0, 0, 0, 0.3);\r\n --cg-overlay-bg: rgba(0, 0, 0, 0.3);\r\n /* Neutral shadow tints for `box-shadow` / `filter: drop-shadow` that need a\r\n * bare colour instead of one of the composed elevation tokens above. */\r\n --cg-shadow-soft: rgba(0, 0, 0, 0.15);\r\n --cg-shadow-strong: rgba(0, 0, 0, 0.2);\r\n\r\n /* Radii */\r\n --cg-radius: 12px;\r\n --cg-radius-sm: 8px;\r\n --cg-radius-xs: 4px;\r\n --cg-radius-lg: 16px;\r\n\r\n /* Motion */\r\n --cg-ease: cubic-bezier(0.4, 0, 0.2, 1);\r\n --cg-ease-out: cubic-bezier(0, 0, 0.2, 1);\r\n --cg-transition: 180ms var(--cg-ease);\r\n --cg-transition-slow: 280ms var(--cg-ease);\r\n\r\n /* Layout */\r\n --cg-toolbar-h: 44px;\r\n --cg-statusbar-h: 28px;\r\n --cg-panel-min-h: 240px;\r\n\r\n /* Z-index hierarchy — semantic layers.\r\n * Each layer has a clear purpose; values are spaced to allow\r\n * fine-tuning within a layer without crossing into the next.\r\n * 0–4 stay free so a future base layer can be inserted without renumbering. */\r\n --cg-z-canvas-ui: 5;\r\n --cg-z-panel: 10;\r\n --cg-z-panel-stack: 15;\r\n --cg-z-dropdown: 20;\r\n --cg-z-search: 25;\r\n --cg-z-overlay: 30;\r\n --cg-z-resize: 35;\r\n --cg-z-modal: 50;\r\n --cg-z-modal-action: 55;\r\n --cg-z-context-menu: 60;\r\n\r\n /* Portal layers — 浮层被 portal 到 document.body 后不再受面板 contain/overflow 约束,\r\n * 因此必须压过 DSH 宿主外壳自身的 chrome。实测宿主外壳最高层级为 40,\r\n * 故 portal 子阶梯从 50 起(与 --cg-z-modal 同起点,靠数值区分先后)。\r\n * 悬浮提示原先的 --cg-z-tooltip(40) 已随 portal 化并入此子阶梯,故不再单列。\r\n * 定位钩子由组件在 layout 阶段写入行内自定义属性,媒体查询仍可覆盖。 */\r\n --cg-z-portal-tooltip: 50;\r\n --cg-z-portal-dropdown: 55;\r\n --cg-portal-left: auto;\r\n --cg-portal-top: auto;\r\n --cg-portal-bottom: auto;\r\n --cg-portal-width: auto;\r\n}\r\n\r\n/* DSH Dark theme — activated when body[data-ds-dark-theme] is set.\r\n * Values measured from DSH's actual dark theme via DevTools. */\r\nbody[data-ds-dark-theme] {\r\n --cg-bg: var(--dsw-bg, #151517);\r\n --cg-surface: var(--dsw-surface, #232324);\r\n --cg-surface-hover: var(--dsw-surface-hover, #2a2a2c);\r\n --cg-surface-active: var(--dsw-surface-active, #333335);\r\n --cg-bg-elevated: var(--dsw-bg-elevated, #2a2a2c);\r\n --cg-border: var(--dsw-border, rgba(255, 255, 255, 0.08));\r\n --cg-border-strong: var(--dsw-border-strong, rgba(255, 255, 255, 0.14));\r\n --cg-text: var(--dsw-fg, #f9fafb);\r\n --cg-text-secondary: var(--dsw-fg-secondary, #cfd3d6);\r\n --cg-text-tertiary: var(--dsw-fg-tertiary, #a8acb0);\r\n --cg-accent: var(--dsw-accent, #6366f1);\r\n --cg-accent-hover: var(--dsw-accent-hover, #5457e5);\r\n --cg-accent-soft: var(--dsw-accent-soft, rgba(99, 102, 241, 0.12));\r\n --cg-on-accent: var(--dsw-on-accent, #ffffff);\r\n\r\n /* Semantic status colors — dark theme */\r\n --cg-success: #34d399;\r\n --cg-warning: #fbbf24;\r\n --cg-error: #f87171;\r\n --cg-info: #60a5fa;\r\n --cg-cycle-highlight: #ff6b6b;\r\n\r\n /* Dead-code analysis — dark theme (panel accents + canvas node palette) */\r\n --cg-deadcode-highlight: #f87171;\r\n --cg-deadcode-confirmed: #f87171;\r\n --cg-deadcode-suspected: #fbbf24;\r\n --cg-deadcode-node: #6b7280;\r\n --cg-deadcode-node-border: #4b5563;\r\n --cg-deadcode-node-suspected: #9ca3af;\r\n --cg-deadcode-node-suspected-border: #6b7280;\r\n\r\n /* Tour step layer palette — dark theme (brighter Material-400 weights) */\r\n --cg-tour-layer-entry: #66bb6a;\r\n --cg-tour-layer-api: #42a5f5;\r\n --cg-tour-layer-service: #ffa726;\r\n --cg-tour-layer-data: #ab47bc;\r\n --cg-tour-layer-ui: #ec407a;\r\n --cg-tour-layer-utility: #78909c;\r\n\r\n /* Node type semantic colors — dark theme */\r\n --cg-node-default: #6366f1;\r\n --cg-node-function: #10b981;\r\n --cg-node-function-text: #34d399;\r\n --cg-node-class: #818cf8;\r\n --cg-node-variable: #f59e0b;\r\n --cg-node-module: #ec4899;\r\n --cg-node-interface: #14b8a6;\r\n --cg-node-type: #a78bfa;\r\n --cg-node-dep-npm: #cb3837;\r\n --cg-node-dep-cargo: #dea584;\r\n --cg-node-dep-gomod: #00add8;\r\n --cg-node-dep-pip: #3776ab;\r\n --cg-node-package: #6366f1;\r\n\r\n /* CFG / flowchart semantic colors — dark theme */\r\n --cg-cfg-loop: #a78bfa;\r\n --cg-cfg-switch: #f472b6;\r\n --cg-cfg-try: #60a5fa;\r\n --cg-cfg-finally: #34d399;\r\n --cg-cfg-process: #60a5fa;\r\n --cg-cfg-subprocess: #fbbf24;\r\n\r\n /* Sequence diagram semantic colors — dark theme */\r\n --cg-seq-external: #ec4899;\r\n --cg-seq-fragment: #818cf8;\r\n --cg-seq-async: #fbbf24;\r\n --cg-seq-grid: rgba(255, 255, 255, 0.03);\r\n\r\n /* Package diagram semantic colors — dark theme */\r\n --cg-package-border: #818cf8;\r\n --cg-edge-package: #818cf8;\r\n\r\n /* Edge type semantic colors — dark theme */\r\n --cg-edge-default: rgba(255, 255, 255, 0.14);\r\n --cg-edge-call: #60a5fa;\r\n --cg-edge-import: #34d399;\r\n --cg-edge-extend: #f472b6;\r\n --cg-edge-implement: #2dd4bf;\r\n --cg-edge-dependency: #fbbf24;\r\n --cg-edge-contains: #a78bfa;\r\n --cg-edge-dep-prod: #fbbf24;\r\n --cg-edge-dep-dev: #60a5fa;\r\n --cg-edge-dep-peer: #34d399;\r\n --cg-edge-dep-optional: #a78bfa;\r\n --cg-edge-aggregation: #818cf8;\r\n --cg-edge-composition: #ec4899;\r\n\r\n /* Highlight / analysis colors — dark theme */\r\n --cg-hover-border: #818cf8;\r\n --cg-impact-d1: #f59e0b;\r\n --cg-impact-d2: #fbbf24;\r\n --cg-impact-d3: #fde68a;\r\n --cg-inheritance-extend: #f472b6;\r\n --cg-inheritance-implement: #2dd4bf;\r\n --cg-cluster-bg: rgba(99, 102, 241, 0.15);\r\n --cg-cluster-border: #818cf8;\r\n --cg-cluster-hover-bg: rgba(99, 102, 241, 0.35);\r\n --cg-cluster-hover-border: #a5b4fc;\r\n --cg-cluster-edge: #818cf8;\r\n --cg-cluster-edge-label-bg: #232324;\r\n\r\n /* Cluster hue colors — dark theme */\r\n --cg-cluster-hue-0-bg: rgba(99,102,241,0.15);\r\n --cg-cluster-hue-0-border: #818cf8;\r\n --cg-cluster-hue-1-bg: rgba(16,185,129,0.15);\r\n --cg-cluster-hue-1-border: #34d399;\r\n --cg-cluster-hue-2-bg: rgba(236,72,153,0.15);\r\n --cg-cluster-hue-2-border: #f472b6;\r\n --cg-cluster-hue-3-bg: rgba(245,158,11,0.15);\r\n --cg-cluster-hue-3-border: #fbbf24;\r\n --cg-cluster-hue-4-bg: rgba(6,182,212,0.15);\r\n --cg-cluster-hue-4-border: #22d3ee;\r\n --cg-cluster-hue-5-bg: rgba(168,85,247,0.15);\r\n --cg-cluster-hue-5-border: #a78bfa;\r\n --cg-cluster-hue-6-bg: rgba(239,68,68,0.15);\r\n --cg-cluster-hue-6-border: #f87171;\r\n --cg-cluster-hue-7-bg: rgba(132,204,22,0.15);\r\n --cg-cluster-hue-7-border: #a3e635;\r\n --cg-cluster-hue-8-bg: rgba(251,113,133,0.15);\r\n --cg-cluster-hue-8-border: #fb7185;\r\n --cg-cluster-hue-9-bg: rgba(96,165,250,0.15);\r\n --cg-cluster-hue-9-border: #60a5fa;\r\n --cg-cluster-hue-10-bg: rgba(52,211,153,0.15);\r\n --cg-cluster-hue-10-border: #34d399;\r\n --cg-cluster-hue-11-bg: rgba(251,191,36,0.15);\r\n --cg-cluster-hue-11-border: #fbbf24;\r\n\r\n /* Node role semantic colors — dark theme */\r\n --cg-role-entry: #10b981;\r\n --cg-role-orphan: #6b7280;\r\n --cg-role-leaf: #f59e0b;\r\n --cg-role-hub: #ef4444;\r\n\r\n /* Heatmap gradient colors — dark theme */\r\n --cg-heatmap-stable: #10b981;\r\n --cg-heatmap-unstable: #ef4444;\r\n --cg-heatmap-low: #60a5fa;\r\n --cg-heatmap-high: #ef4444;\r\n\r\n --cg-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.18);\r\n --cg-shadow: 0 4px 16px rgba(0, 0, 0, 0.28);\r\n --cg-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.36);\r\n --cg-shadow-active: 0 1px 4px rgba(0, 0, 0, 0.5);\r\n --cg-overlay-bg: rgba(0, 0, 0, 0.5);\r\n}\r\n\r\nbody[data-ds-dark-theme] .cg-filter-select,\r\nbody[data-ds-dark-theme] .cg-depth-select {\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.cg-w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23a8acb0' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E\");\r\n}\r\nbody[data-ds-dark-theme] .cg-filter-select option,\r\nbody[data-ds-dark-theme] .cg-depth-select option {\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n}\r\n/* Theme transition — smooth color shift when toggling light/dark */\r\n.cg-graph-panel,\r\n.cg-graph-panel > *,\r\n.cg-floating-panel,\r\n.cg-floating-panel > * {\r\n transition: background-color 280ms var(--cg-ease),\r\n color 280ms var(--cg-ease),\r\n border-color 280ms var(--cg-ease),\r\n box-shadow 280ms var(--cg-ease);\r\n}\r\n","/* ---- Panel container ------------------------------------------------------ */\r\n\r\n.cg-graph-panel {\r\n position: relative;\r\n box-sizing: border-box;\r\n width: 100%;\r\n height: 100%;\r\n min-height: var(--cg-panel-min-h, 240px);\r\n\r\n display: flex;\r\n flex-direction: column;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow-lg);\r\n overflow: hidden;\r\n pointer-events: auto;\r\n font-family: var(--cg-font-sans);\r\n color: var(--cg-text);\r\n transition:\r\n opacity var(--cg-transition),\r\n transform var(--cg-transition);\r\n contain: layout paint style;\r\n container-type: inline-size;\r\n container-name: graphpanel;\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed {\r\n width: 52px;\r\n height: 52px;\r\n /* Integration modes set `min-height: 200px` on the panel (responsive.css);\r\n * without this the collapsed FAB would be stretched to the minimum height. */\r\n min-height: 52px;\r\n border-radius: 50%;\r\n box-shadow: var(--cg-shadow);\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed .cg-graph-toolbar,\r\n.cg-graph-panel.cg-collapsed .cg-graph-container,\r\n.cg-graph-panel.cg-collapsed .cg-search-bar,\r\n.cg-graph-panel.cg-collapsed .cg-loading-overlay,\r\n.cg-graph-panel.cg-collapsed .cg-error-overlay,\r\n.cg-graph-panel.cg-collapsed .cg-empty-state,\r\n.cg-graph-panel.cg-collapsed .cg-node-detail-panel,\r\n.cg-graph-panel.cg-collapsed .cg-status-bar,\r\n.cg-graph-panel.cg-collapsed .cg-resize-handle,\r\n.cg-graph-panel.cg-collapsed .cg-mini-map {\r\n display: none;\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed .cg-collapse-fab {\r\n display: flex;\r\n}\r\n\r\n/* ---- Collapse FAB --------------------------------------------------------- */\r\n\r\n.cg-collapse-fab {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n cursor: pointer;\r\n font-size: 22px;\r\n color: var(--cg-text);\r\n user-select: none;\r\n transition: transform var(--cg-transition);\r\n}\r\n\r\n.cg-collapse-fab:hover {\r\n transform: scale(1.08);\r\n}\r\n/* ---- Toolbar ------------------------------------------------------------- */\r\n\r\n.cg-graph-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n min-height: var(--cg-toolbar-h);\r\n padding: 4px 10px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n flex-wrap: nowrap;\r\n overflow-x: auto;\r\n overflow-y: visible;\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--cg-border-strong) transparent;\r\n /* The toolbar is persistent chrome: it must stay above the empty / loading / error\r\n overlays (which are absolutely positioned with z-index: var(--cg-z-overlay)) so its\r\n controls remain visible and clickable while the graph area has no data. Without a\r\n stacking context here the overlays cover the whole panel, toolbar included.\r\n `overflow-y: visible` computes to `auto` while `overflow-x` is `auto`, so this box\r\n used to clip its own dropdowns (J0: a 231.6px menu showed only 3px). Dropdown\r\n contents are now portalled to document.body and no longer live inside this box,\r\n which keeps horizontal scrolling intact without the clipping. */\r\n position: relative;\r\n z-index: calc(var(--cg-z-overlay) + 1);\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar {\r\n height: 3px;\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar-thumb {\r\n background: var(--cg-border-strong);\r\n border-radius: 2px;\r\n}\r\n\r\n\r\n.cg-toolbar-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: nowrap;\r\n font-variant-numeric: tabular-nums;\r\n /* Measured at 420px panel width: the toolbar used to overflow by 72px and push\r\n `.cg-more-btn` / `.cg-collapse-btn` out of the visible area. The stats text is\r\n the right thing to sacrifice, so it truncates instead of forcing the row wider. */\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.cg-toolbar-center {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1;\r\n justify-content: center;\r\n /* The center group is the flexible one: it may be squeezed (and clipped) before the\r\n right group — export / more / collapse, the controls the panel cannot live\r\n without — is pushed past the edge. */\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-toolbar-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 3px;\r\n}\r\n\r\n.cg-toolbar-separator {\r\n width: 1px;\r\n height: 18px;\r\n background: var(--cg-border);\r\n opacity: 0.6;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Compact toolbars drop the group separators. They are pure decoration and cost the\r\n center group ~18px of the width it needs between the compact (768px) and narrow\r\n (480px) tiers. Driven by the measured `data-cg-compact` flag rather than a media\r\n query, because a media query sees the viewport, not the DSH panel's width. */\r\n.cg-graph-toolbar[data-cg-compact] .cg-toolbar-separator {\r\n display: none;\r\n}\r\n\r\n/* The center group's own visibility is decided by `responsive.css`\r\n `@container graphpanel (max-width: 600px)`: it needs 150px for its three icon-only\r\n triggers, and a container query measures the panel width directly — including on hosts\r\n where `ResizeObserver` is missing and the measured flags stay false. */\r\n\r\n.cg-node-count {\r\n font-weight: 600;\r\n letter-spacing: 0.01em;\r\n}\r\n\r\n.cg-node-count .cg-dot-sep {\r\n color: var(--cg-text-tertiary);\r\n margin: 0 4px;\r\n}\r\n\r\n/* ---- Type badges (node type stats in toolbar) ---------------------------- */\r\n\r\n.cg-type-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 1px 6px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n font-family: var(--cg-font-mono);\r\n border-radius: var(--cg-radius-xs);\r\n letter-spacing: 0.02em;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-type-badge.cg-function {\r\n background: color-mix(in srgb, var(--cg-success) 14%, transparent);\r\n color: var(--cg-node-function-text);\r\n}\r\n\r\nbody[data-ds-dark-theme] .cg-type-badge.cg-function {\r\n color: var(--cg-node-function-text);\r\n}\r\n\r\n.cg-type-badge.cg-class {\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-type-badge.cg-interface {\r\n background: color-mix(in srgb, var(--cg-node-interface) 14%, transparent);\r\n color: var(--cg-node-interface);\r\n}\r\n\r\n/* ---- Layout switcher (segmented control) --------------------------------- */\r\n\r\n.cg-layout-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-layout-btn {\r\n padding: 3px 8px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n text-transform: capitalize;\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-layout-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-layout-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n/* ---- Dagre rank direction switcher --------------------------------------- */\r\n\r\n.cg-rank-dir-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-rank-dir-btn {\r\n padding: 3px 6px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), color var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-rank-dir-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-rank-dir-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n}\r\n\r\n/* ---- Graph type switcher (segmented control) ----------------------------- */\r\n\r\n.cg-graph-type-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-graph-type-btn {\r\n padding: 3px 8px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-graph-type-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-graph-type-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-mode-buttons {\r\n display: inline-flex;\r\n gap: 2px;\r\n margin-left: 4px;\r\n}\r\n\r\n.cg-view-mode-btn {\r\n padding: 3px 8px;\r\n border: 1px solid var(--cg-border);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 600;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n margin-left: 2px;\r\n}\r\n\r\n.cg-view-mode-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-view-mode-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-mode-divider {\r\n display: inline-block;\r\n width: 1px;\r\n height: 16px;\r\n background: var(--cg-border);\r\n margin: 0 4px;\r\n vertical-align: middle;\r\n}\r\n\r\n.cg-view-mode-btn--micro {\r\n border-style: dashed;\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-view-mode-btn--micro.cg-active {\r\n border-style: solid;\r\n opacity: 1;\r\n}\r\n\r\n.cg-view-mode-btn--micro:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n border-style: dotted;\r\n}\r\n\r\n.cg-layer-selector {\r\n display: inline-flex;\r\n gap: 2px;\r\n margin-left: 4px;\r\n align-items: center;\r\n}\r\n\r\n.cg-layer-btn {\r\n padding: 3px 6px;\r\n border: 1px solid var(--cg-border);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 700;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n min-width: 28px;\r\n text-align: center;\r\n}\r\n\r\n.cg-layer-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-layer-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-hierarchy-selector {\r\n display: inline-flex;\r\n gap: 1px;\r\n margin-left: 4px;\r\n align-items: center;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n}\r\n\r\n.cg-hierarchy-btn {\r\n padding: 4px 7px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n min-width: 30px;\r\n text-align: center;\r\n}\r\n\r\n.cg-hierarchy-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-hierarchy-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n}\r\n\r\n/* ---- Select -------------------------------------------------------------- */\r\n\r\n.cg-filter-select,\r\n.cg-depth-select {\r\n padding: 5px 24px 5px 8px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n outline: none;\r\n appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.cg-w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%239ca0b8' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 8px center;\r\n transition: border-color var(--cg-transition);\r\n}\r\n\r\n.cg-filter-select:hover,\r\n.cg-depth-select:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-select:focus-visible,\r\n.cg-depth-select:focus-visible {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 2px var(--cg-accent-soft);\r\n}\r\n\r\n/* ---- Icon buttons -------------------------------------------------------- */\r\n\r\n.cg-icon-btn,\r\n.cg-search-btn,\r\n.cg-theme-btn,\r\n.cg-export-btn,\r\n.cg-collapse-btn,\r\n.cg-chain-btn,\r\n.cg-cycle-btn,\r\n.cg-impact-btn,\r\n.cg-inheritance-btn,\r\n.cg-minimap-btn,\r\n.cg-refresh-btn,\r\n.cg-undo-btn,\r\n.cg-redo-btn,\r\n.cg-import-btn,\r\n.cg-legend-btn,\r\n.cg-lang-btn,\r\n.cg-pathfind-btn,\r\n.cg-health-btn,\r\n.cg-rules-btn,\r\n.cg-hotspot-btn,\r\n.cg-godmodule-btn,\r\n.cg-corefunction-btn {\r\n width: 28px;\r\n height: 28px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n position: relative;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-icon-btn:hover,\r\n.cg-search-btn:hover,\r\n.cg-theme-btn:hover,\r\n.cg-export-btn:hover,\r\n.cg-collapse-btn:hover,\r\n.cg-chain-btn:hover,\r\n.cg-cycle-btn:hover,\r\n.cg-impact-btn:hover,\r\n.cg-inheritance-btn:hover,\r\n.cg-minimap-btn:hover,\r\n.cg-refresh-btn:hover,\r\n.cg-undo-btn:hover,\r\n.cg-redo-btn:hover,\r\n.cg-import-btn:hover,\r\n.cg-legend-btn:hover,\r\n.cg-lang-btn:hover,\r\n.cg-pathfind-btn:hover,\r\n.cg-health-btn:hover,\r\n.cg-rules-btn:hover,\r\n.cg-hotspot-btn:hover,\r\n.cg-godmodule-btn:hover,\r\n.cg-corefunction-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-icon-btn:focus-visible,\r\n.cg-search-btn:focus-visible,\r\n.cg-theme-btn:focus-visible,\r\n.cg-export-btn:focus-visible,\r\n.cg-collapse-btn:focus-visible,\r\n.cg-chain-btn:focus-visible,\r\n.cg-cycle-btn:focus-visible,\r\n.cg-impact-btn:focus-visible,\r\n.cg-inheritance-btn:focus-visible,\r\n.cg-minimap-btn:focus-visible,\r\n.cg-refresh-btn:focus-visible,\r\n.cg-undo-btn:focus-visible,\r\n.cg-redo-btn:focus-visible,\r\n.cg-import-btn:focus-visible,\r\n.cg-legend-btn:focus-visible,\r\n.cg-lang-btn:focus-visible,\r\n.cg-pathfind-btn:focus-visible,\r\n.cg-health-btn:focus-visible,\r\n.cg-rules-btn:focus-visible,\r\n.cg-hotspot-btn:focus-visible,\r\n.cg-godmodule-btn:focus-visible,\r\n.cg-corefunction-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.cg-icon-btn.cg-active,\r\n.cg-search-btn.cg-active,\r\n.cg-chain-btn.cg-active,\r\n.cg-cycle-btn.cg-active,\r\n.cg-impact-btn.cg-active,\r\n.cg-inheritance-btn.cg-active,\r\n.cg-minimap-btn.cg-active,\r\n.cg-import-btn.cg-active,\r\n.cg-legend-btn.cg-active,\r\n.cg-lang-btn.cg-active,\r\n.cg-pathfind-btn.cg-active,\r\n.cg-health-btn.cg-active,\r\n.cg-rules-btn.cg-active,\r\n.cg-hotspot-btn.cg-active,\r\n.cg-godmodule-btn.cg-active,\r\n.cg-corefunction-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n/* ---- Export menu --------------------------------------------------------- */\r\n\r\n.cg-export-menu {\r\n position: relative;\r\n}\r\n\r\n/* 下拉内容被 portal 到 document.body,脱离工具栏与面板的裁剪链;\r\n * 位置由组件写入 --cg-portal-* 行内自定义属性,\r\n * 因此这里不写 inline 可覆盖的 left/top,窄面板抽屉由 .cg-portal-drawer 接管。 */\r\n.cg-export-dropdown {\r\n position: fixed;\r\n left: var(--cg-portal-left, auto);\r\n top: var(--cg-portal-top, auto);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n z-index: var(--cg-z-portal-dropdown);\r\n min-width: 120px;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-dropdown-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-export-dropdown button {\r\n padding: 7px 14px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-export-dropdown button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n/* ---- Dropdown menu (analysis & quality groups) --------------------------- */\r\n\r\n.cg-dropdown-menu {\r\n position: relative;\r\n}\r\n\r\n.cg-tools-dropdown-btn,\r\n.cg-search-standalone-btn,\r\n.cg-data-dropdown-btn,\r\n.cg-history-dropdown-btn,\r\n.cg-more-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n width: auto;\r\n min-width: 28px;\r\n height: 28px;\r\n padding: 0 4px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-tools-dropdown-btn:hover,\r\n.cg-search-standalone-btn:hover,\r\n.cg-data-dropdown-btn:hover,\r\n.cg-history-dropdown-btn:hover,\r\n.cg-more-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tools-dropdown-btn.cg-active,\r\n.cg-search-standalone-btn.cg-active,\r\n.cg-data-dropdown-btn.cg-active,\r\n.cg-history-dropdown-btn.cg-active,\r\n.cg-more-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-tools-dropdown-btn:focus-visible,\r\n.cg-search-standalone-btn:focus-visible,\r\n.cg-data-dropdown-btn:focus-visible,\r\n.cg-history-dropdown-btn:focus-visible,\r\n.cg-more-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* 与 .cg-export-dropdown 同理:内容 portal 到 body,靠自定义属性定位。 */\r\n.cg-dropdown-content {\r\n position: fixed;\r\n left: var(--cg-portal-left, auto);\r\n top: var(--cg-portal-top, auto);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n z-index: var(--cg-z-portal-dropdown);\r\n min-width: 160px;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n/* 窄面板抽屉形态:内容 portal 到 body 后不再是 `.cg-graph-panel` 的后代,\r\n * `@container graphpanel (max-width: 320px)` 的底部抽屉规则无法命中,\r\n * 故由 Dropdown 组件测量面板宽度后加 `.cg-portal-drawer` 并写定位变量。 */\r\n.cg-portal-drawer {\r\n /* 宽度由组件按「面板宽 - 两侧内缩」写入,若沿用默认 content-box,\r\n * 内边距与边框会把这 309px 撑成 318.6px 并溢出面板右侧,故改 border-box。 */\r\n box-sizing: border-box;\r\n left: var(--cg-portal-left, auto);\r\n right: auto;\r\n top: auto;\r\n bottom: var(--cg-portal-bottom, auto);\r\n width: var(--cg-portal-width, auto);\r\n min-width: unset;\r\n max-height: 60vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-dropdown-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 7px 12px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n width: 100%;\r\n}\r\n\r\n.cg-dropdown-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-dropdown-item.cg-active {\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-dropdown-item:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-dropdown-separator {\r\n height: 1px;\r\n background: var(--cg-border);\r\n margin: 4px 2px;\r\n opacity: 0.6;\r\n}\r\n\r\n.cg-dropdown-section-label {\r\n padding: 4px 12px 2px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n user-select: none;\r\n}\r\n\r\n.cg-dropdown-item:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-dropdown-item:disabled:hover {\r\n background: transparent;\r\n}\r\n\r\n.cg-view-dropdown-btn,\r\n.cg-layout-dropdown-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n height: 28px;\r\n padding: 0 8px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-view-dropdown-btn:hover,\r\n.cg-layout-dropdown-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-view-dropdown-btn.cg-active,\r\n.cg-layout-dropdown-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-dropdown-btn:focus-visible,\r\n.cg-layout-dropdown-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.cg-view-dropdown {\r\n min-width: 140px;\r\n}\r\n/* ---- Search bar ---------------------------------------------------------- */\r\n\r\n.cg-search-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 12px;\r\n background: var(--cg-bg);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n position: relative;\r\n animation: cg-slide-down 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-down {\r\n from { opacity: 0; transform: translateY(-8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-search-bar input {\r\n flex: 1;\r\n padding: 7px 12px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 13px;\r\n font-family: var(--cg-font-sans);\r\n outline: none;\r\n transition: border-color var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-search-bar input:focus {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\r\n}\r\n\r\n.cg-search-bar input::placeholder {\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-search-bar button {\r\n width: 30px;\r\n height: 30px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 13px;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-search-bar button:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-search-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n margin-left: 4px;\r\n font-family: var(--cg-font-mono);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-results {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-search);\r\n list-style: none;\r\n margin: 0;\r\n padding: 4px 0;\r\n}\r\n\r\n.cg-search-result-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-search-result-item:hover,\r\n.cg-search-result-item:focus,\r\n.cg-search-result-item.cg-active {\r\n background: var(--cg-surface-hover);\r\n outline: none;\r\n}\r\n\r\n.cg-search-result-type {\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n color: var(--cg-text-tertiary);\r\n background: var(--cg-bg);\r\n padding: 2px 6px;\r\n border-radius: var(--cg-radius-sm);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-search-result-label {\r\n font-size: 13px;\r\n color: var(--cg-text);\r\n font-weight: 500;\r\n flex-shrink: 0;\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* cycle-132:「索引命中」徽标——该条来自 /query 远程索引回退(本地显示层未命中)。 */\r\n.cg-search-remote-badge {\r\n font-size: 10px;\r\n color: var(--cg-accent);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 1px 5px;\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-result-path {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-result-more {\r\n padding: 6px 12px;\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n}\r\n/* ---- Status bar ---------------------------------------------------------- */\r\n\r\n.cg-status-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n height: var(--cg-statusbar-h);\r\n padding: 0 12px;\r\n background: var(--cg-surface);\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n.cg-status-bar .cg-status-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot {\r\n width: 7px;\r\n height: 7px;\r\n border-radius: 50%;\r\n background: var(--cg-success);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot.cg-loading {\r\n background: var(--cg-warning);\r\n animation: cg-pulse 1s ease-in-out infinite;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot.cg-error {\r\n background: var(--cg-error);\r\n}\r\n\r\n.cg-status-bar .cg-status-workspace {\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n padding: 0 6px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n}\r\n\r\n/* cycle-130 · T2:数据来源徽章——上游索引 / 原生扫描 白盒透出。 */\r\n.cg-status-bar .cg-status-graph-layer {\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n padding: 0 6px;\r\n border-left: 1px solid var(--cg-border);\r\n color: var(--cg-text-tertiary);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-graph-layer--native {\r\n color: var(--cg-warning);\r\n}\r\n\r\n.cg-status-bar .cg-status-truncated {\r\n color: var(--cg-warning);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n cursor: help;\r\n}\r\n\r\n.cg-status-bar .cg-status-degradation {\r\n color: var(--cg-warning);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n cursor: help;\r\n max-width: 300px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-spacer {\r\n flex: 1;\r\n}\r\n\r\n.cg-status-github {\r\n display: flex;\r\n align-items: center;\r\n color: var(--cg-text-tertiary);\r\n text-decoration: none;\r\n padding: 0 4px;\r\n border-radius: 3px;\r\n transition: color 0.15s ease;\r\n}\r\n\r\n.cg-status-github:hover {\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-status-bar .cg-status-time {\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n}\r\n/* ---- Resize handle ------------------------------------------------------- */\r\n\r\n/* Host-sized integration modes drop `cg-resizable`, so the handle must not linger as an\r\n * unstyled empty block inside the panel's flex column. */\r\n.cg-graph-panel:not(.cg-resizable) .cg-resize-handle {\r\n display: none;\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle {\r\n position: absolute;\r\n width: 18px;\r\n height: 18px;\r\n bottom: 0;\r\n right: 0;\r\n cursor: nwse-resize;\r\n z-index: var(--cg-z-resize);\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 4px;\r\n right: 4px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid var(--cg-text-tertiary);\r\n border-bottom: 2px solid var(--cg-text-tertiary);\r\n transition: border-color var(--cg-transition);\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle:hover::after {\r\n border-right-color: var(--cg-accent);\r\n border-bottom-color: var(--cg-accent);\r\n}\r\n\r\n/* ---- Scrollbar styling --------------------------------------------------- */\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar,\r\n.cg-mini-map::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-track,\r\n.cg-mini-map::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-thumb,\r\n.cg-mini-map::-webkit-scrollbar-thumb {\r\n background: var(--cg-border-strong);\r\n border-radius: 3px;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-thumb:hover,\r\n.cg-mini-map::-webkit-scrollbar-thumb:hover {\r\n background: var(--cg-text-tertiary);\r\n}\r\n/* ---- Panel stack containers (prevent overlapping) ------------------------- */\r\n\r\n.cg-panel-stack {\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n z-index: var(--cg-z-panel-stack);\r\n pointer-events: none;\r\n}\r\n\r\n.cg-panel-stack > * {\r\n pointer-events: auto;\r\n}\r\n\r\n.cg-panel-stack-left {\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n}\r\n\r\n.cg-panel-stack-right {\r\n right: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n align-items: flex-end;\r\n}\r\n\r\n.cg-panel-stack-left .cg-path-bar,\r\n.cg-panel-stack-left .cg-health-score-card,\r\n.cg-panel-stack-left .cg-rule-panel,\r\n.cg-panel-stack-left .cg-node-detail-panel,\r\n.cg-panel-stack-left .cg-legend-panel,\r\n.cg-panel-stack-left .cg-import-panel,\r\n.cg-panel-stack-left .cg-search-bar {\r\n position: relative;\r\n left: auto;\r\n top: auto;\r\n}\r\n\r\n.cg-panel-stack-right .cg-analysis-panel,\r\n.cg-panel-stack-right .cg-impact-panel,\r\n.cg-panel-stack-right .cg-cycle-panel,\r\n.cg-panel-stack-right .cg-filter-panel,\r\n.cg-panel-stack-right .cg-mini-map {\r\n position: relative;\r\n right: auto;\r\n top: auto;\r\n bottom: auto;\r\n}\r\n","/* ---- Overlays (loading / error / empty) ---------------------------------- */\r\n\r\n.cg-error-boundary-fallback {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n gap: 14px;\r\n background: var(--cg-bg);\r\n z-index: var(--cg-z-overlay);\r\n padding: 24px;\r\n}\r\n\r\n.cg-error-boundary-fallback h3 {\r\n margin: 0;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--cg-error);\r\n}\r\n\r\n.cg-error-boundary-fallback p {\r\n margin: 0;\r\n font-size: 13px;\r\n color: var(--cg-text-secondary);\r\n text-align: center;\r\n max-width: 320px;\r\n word-break: break-word;\r\n}\r\n\r\n.cg-error-boundary-fallback button {\r\n padding: 6px 16px;\r\n border-radius: var(--cg-radius-xs);\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-error-boundary-fallback button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-loading-overlay,\r\n.cg-error-overlay,\r\n.cg-empty-state {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n gap: 14px;\r\n background: var(--cg-bg);\r\n z-index: var(--cg-z-overlay);\r\n}\r\n\r\n.cg-loading-overlay {\r\n opacity: 0.9;\r\n -webkit-backdrop-filter: blur(4px);\r\n backdrop-filter: blur(4px);\r\n}\r\n\r\n.cg-spinner {\r\n width: 40px;\r\n height: 40px;\r\n position: relative;\r\n}\r\n\r\n.cg-spinner::before,\r\n.cg-spinner::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: 50%;\r\n border: 2px solid transparent;\r\n}\r\n\r\n.cg-spinner::before {\r\n border-top-color: var(--cg-accent);\r\n border-right-color: var(--cg-accent);\r\n animation: cg-spin 0.8s var(--cg-ease) infinite;\r\n}\r\n\r\n.cg-spinner::after {\r\n border-bottom-color: var(--cg-accent-hover);\r\n border-left-color: var(--cg-accent-hover);\r\n animation: cg-spin 1.2s var(--cg-ease) infinite reverse;\r\n inset: 6px;\r\n}\r\n\r\n@keyframes cg-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n@keyframes cg-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.55; }\r\n}\r\n\r\n.cg-loading-overlay span,\r\n.cg-empty-state span {\r\n color: var(--cg-text-secondary);\r\n font-size: 13px;\r\n}\r\n\r\n.cg-empty-state .cg-empty-icon {\r\n font-size: 40px;\r\n opacity: 0.5;\r\n}\r\n\r\n.cg-error-overlay span {\r\n color: var(--cg-error);\r\n font-size: 13px;\r\n}\r\n\r\n.cg-error-overlay-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-error-overlay-actions {\r\n display: flex;\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-error-overlay-btn {\r\n padding: 6px 14px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n}\r\n\r\n.cg-error-overlay-retry {\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-error-overlay-retry:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-error-overlay-back {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-error-overlay-back:hover {\r\n background: var(--cg-accent-hover);\r\n border-color: var(--cg-accent-hover);\r\n}\r\n/* ---- Empty state (enhanced) ---------------------------------------------- */\r\n\r\n.cg-empty-state .cg-empty-icon {\r\n font-size: 40px;\r\n opacity: 0.5;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-empty-state .cg-empty-title {\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-empty-state .cg-empty-subtitle {\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n max-width: 280px;\r\n text-align: center;\r\n line-height: 1.5;\r\n}\r\n\r\n.cg-empty-actions {\r\n display: flex;\r\n gap: 10px;\r\n align-items: center;\r\n}\r\n\r\n.cg-empty-import-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 16px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n box-shadow: 0 2px 8px color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n}\r\n\r\n.cg-empty-import-btn:hover {\r\n background: var(--cg-accent-hover);\r\n transform: translateY(-1px);\r\n box-shadow: 0 4px 12px color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n}\r\n\r\n.cg-empty-scan-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 16px;\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-empty-scan-btn:hover {\r\n background: var(--cg-surface-hover);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-empty-prereq-warning {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n padding: 12px 14px;\r\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-warning) 100%, transparent);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n line-height: 1.4;\r\n max-width: 400px;\r\n text-align: left;\r\n}\r\n\r\n.cg-prereq-item {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding: 8px 0;\r\n border-top: 1px solid color-mix(in srgb, var(--cg-warning) 30%, transparent);\r\n}\r\n\r\n.cg-prereq-item:first-of-type {\r\n border-top: none;\r\n padding-top: 4px;\r\n}\r\n\r\n.cg-prereq-item-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-prereq-status-dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-prereq-status-dot.cg-ok {\r\n background: var(--cg-success);\r\n}\r\n\r\n.cg-prereq-status-dot.cg-missing {\r\n background: var(--cg-error);\r\n}\r\n\r\n.cg-prereq-item-label {\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-prereq-item-status {\r\n font-size: 11px;\r\n color: var(--cg-error);\r\n margin-left: auto;\r\n}\r\n\r\n.cg-prereq-item-desc {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n padding-left: 14px;\r\n}\r\n\r\n.cg-watch-indicator {\r\n color: var(--cg-success);\r\n font-size: 8px;\r\n animation: cg-pulse 2s ease-in-out infinite;\r\n}\r\n/* ---- Degraded mode notice ------------------------------------------------ */\r\n\r\n.cg-empty-degraded-notice {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n padding: 10px 14px;\r\n background: color-mix(in srgb, var(--cg-accent) 10%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: var(--cg-radius-sm);\r\n max-width: 400px;\r\n text-align: left;\r\n}\r\n\r\n.cg-degraded-label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-degraded-hint {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n line-height: 1.4;\r\n}\r\n\r\n/* ---- Prereq warning header / title --------------------------------------- */\r\n\r\n.cg-prereq-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-prereq-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n/* ---- Prereq command row -------------------------------------------------- */\r\n\r\n.cg-prereq-cmd-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-prereq-cmd {\r\n flex: 1;\r\n font-family: var(--cg-font-mono, monospace);\r\n font-size: 11px;\r\n padding: 4px 8px;\r\n background: color-mix(in srgb, var(--cg-surface) 80%, transparent);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n color: var(--cg-text);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-prereq-copy-btn {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n}\r\n\r\n.cg-prereq-copy-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n}\r\n\r\n/* ---- Prereq install button ----------------------------------------------- */\r\n\r\n.cg-prereq-install-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n margin-top: 6px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 12px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-prereq-install-btn:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-prereq-install-btn:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* ---- Prereq copied hint -------------------------------------------------- */\r\n\r\n.cg-prereq-copied {\r\n font-size: 11px;\r\n color: var(--cg-success);\r\n text-align: center;\r\n}\r\n","/* ---- Graph container ----------------------------------------------------- */\r\n\r\n.cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n position: relative;\r\n background: var(--cg-bg);\r\n transition: opacity 200ms var(--cg-ease);\r\n}\r\n\r\n.cg-graph-container canvas {\r\n display: block;\r\n}\r\n\r\n.cg-filter-empty-state {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n text-align: center;\r\n padding: 16px 24px;\r\n background: var(--cg-bg-elevated);\r\n border-radius: 8px;\r\n pointer-events: none;\r\n}\r\n/* ---- Sequence diagram container ----------------------------------------- */\r\n\r\n.cg-sequence-diagram-container {\r\n flex: 1;\r\n min-height: 0;\r\n position: relative;\r\n overflow: hidden;\r\n background: var(--cg-bg);\r\n user-select: none;\r\n}\r\n\r\n.cg-sequence-diagram-container svg {\r\n display: block;\r\n}\r\n\r\n.cg-sequence-diagram-container text {\r\n pointer-events: none;\r\n}\r\n\r\n.cg-seq-zoom-controls {\r\n position: absolute;\r\n bottom: 8px;\r\n right: 8px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-seq-zoom-btn {\r\n width: 28px;\r\n height: 28px;\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 14px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-seq-zoom-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-seq-zoom-btn:active {\r\n background: var(--cg-surface-active);\r\n}\r\n\r\n.cg-seq-zoom-btn.cg-seq-reset {\r\n font-size: 10px;\r\n}\r\n\r\n.cg-seq-zoom-indicator {\r\n position: absolute;\r\n bottom: 8px;\r\n left: 8px;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-seq-empty-state {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n}\r\n\r\n.cg-seq-participant-group {\r\n cursor: pointer;\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-seq-participant-group:hover {\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-seq-participant-group:hover .cg-seq-participant-box {\r\n stroke-width: 3;\r\n filter: drop-shadow(0 2px 4px var(--cg-shadow-soft));\r\n}\r\n\r\n.cg-seq-participant-box {\r\n transition: stroke-width var(--cg-transition), filter var(--cg-transition);\r\n}\r\n\r\n.cg-seq-message-group {\r\n cursor: pointer;\r\n}\r\n\r\n.cg-seq-message-group:hover .cg-seq-message-line {\r\n stroke-width: 2.5;\r\n}\r\n\r\n.cg-seq-message-line {\r\n transition: stroke-width var(--cg-transition);\r\n}\r\n\r\n.cg-seq-fragment-group {\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-seq-fragment-group:hover {\r\n opacity: 0.9;\r\n}\r\n/* ---- Mini-map ------------------------------------------------------------ */\r\n\r\n.cg-mini-map {\r\n position: absolute;\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n width: 200px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-canvas-ui);\r\n backdrop-filter: blur(10px);\r\n -webkit-backdrop-filter: blur(10px);\r\n overflow: hidden;\r\n animation: cg-slide-up 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-up {\r\n from { opacity: 0; transform: translateY(8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-mini-map-header {\r\n padding: 7px 12px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n border-bottom: 1px solid var(--cg-border);\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.cg-mini-map-content {\r\n padding: 10px 12px;\r\n}\r\n\r\n.cg-mini-map-thumbnail {\r\n position: relative;\r\n margin-bottom: 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n background: var(--cg-surface);\r\n}\r\n\r\n.cg-mini-map-viewport {\r\n border: 2px solid var(--cg-accent);\r\n background: color-mix(in srgb, var(--cg-accent) 10%, transparent);\r\n pointer-events: none;\r\n transition: background var(--cg-transition-slow), border-color var(--cg-transition-slow), color var(--cg-transition-slow);\r\n}\r\n\r\n.cg-mini-map-stats {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.cg-mini-map-stats div {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-mini-map-stats .cg-dot {\r\n width: 9px;\r\n height: 9px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-mini-map-total {\r\n margin-top: 8px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n/* ---- Tooltip (node hover) ------------------------------------------------ */\r\n\r\n/* 提示框 portal 到 body:位置已是视口坐标,层级需压过宿主外壳 chrome。 */\r\n.cg-tooltip {\r\n position: fixed;\r\n z-index: var(--cg-z-portal-tooltip);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n color: var(--cg-text);\r\n pointer-events: none;\r\n max-width: 320px;\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n animation: cg-tooltip-in 100ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-tooltip-in {\r\n from { opacity: 0; transform: translateY(4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-name {\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-path {\r\n color: var(--cg-text-secondary);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n word-break: break-all;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-type {\r\n display: inline-block;\r\n margin-top: 4px;\r\n padding: 1px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links {\r\n display: flex;\r\n gap: 8px;\r\n margin-top: 4px;\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links-in {\r\n color: var(--cg-edge-import);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links-out {\r\n color: var(--cg-edge-call);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-source {\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-arrow {\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-target {\r\n font-weight: 600;\r\n margin-bottom: 4px;\r\n}\r\n/* ---- Smooth graph transitions --------------------------------------------- */\r\n\r\n\r\n.cg-graph-container.cg-loading {\r\n opacity: 0.4;\r\n}\r\n\r\n/* ---- Canvas controls overlay (GraphCanvasControls) ------------------------- */\r\n/* 浮在画布右下角的交互式控制层:缩放按钮 + 统计信息 + 交互式小地图。\r\n * 容器 pointer-events: none,子元素 pointer-events: auto,\r\n * 不拦截画布的拖拽/滚轮事件。 */\r\n\r\n.cg-canvas-controls-overlay {\r\n position: absolute;\r\n bottom: 8px;\r\n right: 8px;\r\n z-index: var(--cg-z-canvas-ui, 10);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n gap: 8px;\r\n pointer-events: none;\r\n}\r\n\r\n/* ---- 统计信息浮层 ---- */\r\n.cg-canvas-stats {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 4px 10px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n pointer-events: auto;\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow-sm);\r\n white-space: nowrap;\r\n user-select: none;\r\n}\r\n\r\n.cg-canvas-stat-item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 3px;\r\n}\r\n\r\n.cg-canvas-stat-item svg {\r\n opacity: 0.7;\r\n}\r\n\r\n.cg-canvas-stat-sep {\r\n color: var(--cg-text-tertiary);\r\n opacity: 0.5;\r\n}\r\n\r\n.cg-canvas-stat-ratio {\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n/* ---- 缩放按钮组 ---- */\r\n.cg-canvas-zoom-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius);\r\n pointer-events: auto;\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow);\r\n}\r\n\r\n.cg-canvas-btn {\r\n width: 30px;\r\n height: 30px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n border-radius: var(--cg-radius-xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background var(--cg-transition, 150ms ease),\r\n color var(--cg-transition, 150ms ease);\r\n padding: 0;\r\n}\r\n\r\n.cg-canvas-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-canvas-btn:active {\r\n background: var(--cg-surface-active);\r\n}\r\n\r\n.cg-canvas-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n/* ---- 交互式小地图 ---- */\r\n.cg-canvas-minimap {\r\n position: relative;\r\n width: 140px;\r\n height: 100px;\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n cursor: crosshair;\r\n pointer-events: auto;\r\n background: var(--cg-bg);\r\n box-shadow: var(--cg-shadow);\r\n transition: border-color var(--cg-transition, 150ms ease);\r\n}\r\n\r\n.cg-canvas-minimap:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-canvas-minimap-img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n display: block;\r\n pointer-events: none;\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-canvas-minimap-viewport {\r\n position: absolute;\r\n border: 2px solid var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n transition: left 100ms linear, top 100ms linear,\r\n width 100ms linear, height 100ms linear;\r\n}\r\n\r\n/* ---- 响应式:小屏隐藏小地图,缩小按钮 ---- */\r\n@media (max-width: 768px) {\r\n .cg-canvas-minimap {\r\n display: none;\r\n }\r\n .cg-canvas-stats {\r\n font-size: 10px;\r\n padding: 3px 6px;\r\n }\r\n .cg-canvas-btn {\r\n width: 26px;\r\n height: 26px;\r\n }\r\n}\r\n\r\n/* ---- 深色主题适配 ---- */\r\n:where([data-theme='dark'], [data-ds-dark-theme]) {\r\n .cg-canvas-minimap-img {\r\n opacity: 0.7;\r\n }\r\n}\r\n","/* ---- Node detail panel --------------------------------------------------- */\r\n\r\n.cg-node-detail-panel {\r\n position: absolute;\r\n left: 12px;\r\n top: 12px;\r\n width: 260px;\r\n max-height: calc(100% - 24px);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n padding: 14px;\r\n z-index: var(--cg-z-panel);\r\n overflow-y: auto;\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-right {\r\n from { opacity: 0; transform: translateX(-12px); }\r\n to { opacity: 1; transform: translateX(0); }\r\n}\r\n\r\n.cg-node-detail-panel h3 {\r\n margin: 0 0 10px;\r\n font-size: 14px;\r\n color: var(--cg-text);\r\n font-weight: 600;\r\n word-break: break-word;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-header h3 {\r\n margin: 0;\r\n flex: 1;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-type-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n border: 1.5px solid;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n font-weight: 700;\r\n font-family: var(--cg-font-mono);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-row {\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding: 5px 0;\r\n font-size: 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-label {\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n font-weight: 500;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-value {\r\n color: var(--cg-text);\r\n text-align: right;\r\n word-break: break-all;\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-close-btn {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n width: 24px;\r\n height: 24px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 14px;\r\n border-radius: var(--cg-radius-xs);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.cg-node-detail-panel .cg-close-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n/* ---- Node detail extra properties ---------------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-extra {\r\n margin-top: 10px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-extra-title {\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 6px;\r\n}\r\n\r\n/* ---- Node detail edge list ------------------------------------------------ */\r\n\r\n.cg-node-detail-panel .cg-detail-edges {\r\n margin-top: 10px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges .cg-detail-section-title {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n gap: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-count {\r\n font-size: 10px;\r\n font-weight: 500;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n text-transform: none;\r\n letter-spacing: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-aggregated {\r\n margin: 4px 0 2px;\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n font-style: italic;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-status {\r\n padding: 6px 0;\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-list {\r\n list-style: none;\r\n margin: 4px 0 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n max-height: 220px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 3px 0;\r\n font-size: 11px;\r\n border-bottom: 1px solid var(--cg-border);\r\n min-width: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir {\r\n flex-shrink: 0;\r\n width: 20px;\r\n text-align: center;\r\n font-size: 9px;\r\n font-weight: 700;\r\n border-radius: var(--cg-radius-xs);\r\n padding: 1px 0;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir--out {\r\n color: var(--cg-node-function);\r\n background: color-mix(in srgb, var(--cg-node-function) 14%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir--in {\r\n color: var(--cg-accent);\r\n background: color-mix(in srgb, var(--cg-accent) 14%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-label {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-type {\r\n flex-shrink: 0;\r\n font-size: 9px;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n/* cycle-126 · T3:AST 增补边徽章——披露「这条继承边来自 AST 推断」。 */\r\n.cg-node-detail-panel .cg-detail-edge-ast-badge {\r\n flex-shrink: 0;\r\n font-size: 8px;\r\n line-height: 1;\r\n padding: 1px 3px;\r\n border-radius: 3px;\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n font-family: var(--cg-font-mono);\r\n cursor: help;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more {\r\n margin-top: 6px;\r\n width: 100%;\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n background: transparent;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more:disabled {\r\n opacity: 0.5;\r\n cursor: default;\r\n}\r\n\r\n/* 聚合态下的「展开明细边」是唯一出口:聚合页不可分页(hasMore 恒为 false),\r\n 所以这个按钮必须比普通「显示更多」更醒目,否则用户会以为边就这么多。\r\n 见 docs/图谱按需加载.md:64-65 / :106-110「展开后分页拉取明细」。 */\r\n.cg-node-detail-panel .cg-detail-edges-expand-aggregated {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-expand-aggregated:hover:not(:disabled) {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n opacity: 0.88;\r\n}\r\n\r\n/* ---- Expandable node indicators ------------------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-expand-hint {\r\n margin-top: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connections {\r\n margin-top: 8px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connections-title {\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 3px 0;\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-type {\r\n display: inline-block;\r\n padding: 1px 5px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-surface-active);\r\n color: var(--cg-text-tertiary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-name {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* ---- Depth level indicator ------------------------------------------------ */\r\n\r\n.cg-depth-level-indicator {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 3px;\r\n padding: 2px 8px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-depth-level-dot {\r\n width: 6px;\r\n height: 6px;\r\n border-radius: 50%;\r\n background: var(--cg-accent);\r\n}\r\n\r\n.cg-depth-level-dot.cg-active {\r\n background: var(--cg-success);\r\n box-shadow: 0 0 4px var(--cg-success);\r\n}\r\n\r\n/* ---- Expanded node badge in detail panel ---------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-expanded-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: color-mix(in srgb, var(--cg-success) 12%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-success) 30%, transparent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-success);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-exported-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 2px 6px;\r\n background: color-mix(in srgb, var(--cg-accent) 12%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-signature {\r\n margin: 8px 0;\r\n padding: 8px 10px;\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-section-title {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 4px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-code {\r\n display: block;\r\n font-family: var(--cg-font-mono);\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n line-height: 1.5;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-docstring {\r\n margin: 8px 0;\r\n padding: 8px 10px;\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-doc-text {\r\n font-family: var(--cg-font-sans);\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n line-height: 1.5;\r\n margin: 0;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-actions {\r\n margin-top: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-body-budget {\r\n margin-bottom: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-label {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n display: block;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-bar {\r\n height: 4px;\r\n background: var(--cg-surface);\r\n border-radius: 2px;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-fill {\r\n height: 100%;\r\n background: var(--cg-accent);\r\n border-radius: 2px;\r\n transition: width var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n display: block;\r\n margin-top: 4px;\r\n}\r\n\r\n/* 预算出口按钮(展开更多 / 收起已展开 / 只看调用链 / 展开全部)。\r\n 依据 docs/图谱按需加载.md 第五节「提供入口」与风险 8「UI 必须明确不是数据没有」。 */\r\n.cg-node-detail-panel .cg-detail-budget-actions {\r\n display: flex;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n margin-top: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn--wide {\r\n width: 100%;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn--danger {\r\n border-color: color-mix(in srgb, var(--cg-warning) 45%, transparent);\r\n background: color-mix(in srgb, var(--cg-warning) 15%, transparent);\r\n color: var(--cg-warning);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn:disabled {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-confirm {\r\n margin-top: 6px;\r\n padding: 6px 8px;\r\n border: 1px solid color-mix(in srgb, var(--cg-warning) 40%, transparent);\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-warning) 10%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-warning {\r\n display: block;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-warning);\r\n}\r\n\r\n/* 单符号 AST 折叠披露(超 SYMBOL_AST.MAX_NODES 时服务端只回一页)。\r\n 依据 docs/图谱按需加载.md:155「超限时显示\"该函数过大,已折叠为摘要 / 分段加载\"」。 */\r\n.cg-node-detail-panel .cg-detail-ast-fold {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex-wrap: wrap;\r\n margin-top: 6px;\r\n padding: 6px 8px;\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-accent) 8%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-ast-fold-text {\r\n flex: 1 1 140px;\r\n min-width: 0;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-hint {\r\n margin-top: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-surface-hover);\r\n border: 1px dashed var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btns {\r\n display: flex;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn {\r\n padding: 4px 10px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: all var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-chain-btn {\r\n margin-top: 4px;\r\n width: 100%;\r\n background: color-mix(in srgb, var(--cg-accent) 15%, transparent);\r\n border-color: color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n color: var(--cg-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-chain-btn:hover {\r\n background: color-mix(in srgb, var(--cg-accent) 25%, transparent);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-cluster-functions {\r\n margin-top: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 4px;\r\n padding: 2px 4px;\r\n border-radius: var(--cg-radius-xs);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-micro-btns {\r\n display: inline-flex;\r\n gap: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-name {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n flex: 1;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn--small {\r\n padding: 2px 6px;\r\n font-size: 10px;\r\n}\r\n\r\n/* ---- Collapse-all button -------------------------------------------------- */\r\n\r\n.cg-collapse-all-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 3px 8px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-collapse-all-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n border-color: var(--cg-accent);\r\n}","/* ---- Import panel -------------------------------------------------------- */\n\n.cg-import-panel {\n position: absolute;\n inset: var(--cg-toolbar-h) 0 var(--cg-statusbar-h) 0;\n background: var(--cg-bg);\n z-index: var(--cg-z-panel-stack);\n display: flex;\n flex-direction: column;\n animation: cg-slide-down 160ms var(--cg-ease-out);\n}\n\n.cg-import-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-import-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-import-close {\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--cg-text-secondary);\n cursor: pointer;\n border-radius: var(--cg-radius-xs);\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-close:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-import-tabs {\n display: flex;\n gap: 2px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-import-tabs button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--cg-border);\n background: transparent;\n color: var(--cg-text-secondary);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n border-radius: var(--cg-radius-sm);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-tabs button:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-import-tabs button.cg-active {\n background: var(--cg-accent);\n border-color: var(--cg-accent-hover);\n color: var(--cg-on-accent);\n}\n\n.cg-import-body {\n flex: 1;\n padding: 16px 14px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.cg-paste-zone,\n.cg-workspace-zone {\n display: flex;\n flex-direction: column;\n gap: 10px;\n flex: 1;\n}\n\n.cg-workspace-zone {\n padding: 4px 0;\n}\n\n.cg-workspace-path-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.cg-workspace-path-icon {\n color: var(--cg-text-tertiary);\n}\n\n.cg-workspace-path-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n}\n\n.cg-workspace-path-value {\n padding: 8px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n word-break: break-all;\n line-height: 1.5;\n}\n\n.cg-workspace-hint {\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-workspace-path-input {\n padding: 8px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n outline: none;\n transition: border-color var(--cg-transition);\n}\n\n.cg-workspace-path-input:focus {\n border-color: var(--cg-accent);\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\n}\n\n.cg-workspace-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.cg-import-submit.cg-secondary {\n background: var(--cg-surface);\n color: var(--cg-text);\n border: 1px solid var(--cg-border);\n}\n\n.cg-import-submit.cg-secondary:hover:not(:disabled) {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n background: var(--cg-accent-soft);\n}\n\n.cg-watch-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background: transparent;\n color: var(--cg-text-secondary);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n align-self: flex-start;\n}\n\n.cg-watch-toggle:hover {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-watch-toggle.cg-active {\n background: var(--cg-accent-soft);\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-init-feedback {\n padding: 6px 12px;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n}\n\n.cg-init-feedback.cg-ok {\n background: color-mix(in srgb, var(--cg-success) 10%, transparent);\n color: var(--cg-success);\n}\n\n.cg-init-feedback.cg-err {\n background: color-mix(in srgb, var(--cg-error) 10%, transparent);\n color: var(--cg-error);\n}\n\n.cg-prereq-warning {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n margin: 0 14px 8px;\n background: color-mix(in srgb, var(--cg-warning) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--cg-warning) 30%, transparent);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-warning);\n font-size: 12px;\n line-height: 1.4;\n flex-wrap: wrap;\n}\n\n.cg-prereq-install {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding-top: 6px;\n}\n\n.cg-prereq-install code {\n flex: 1;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--cg-warning) 12%, transparent);\n border: 1px dashed color-mix(in srgb, var(--cg-warning) 40%, transparent);\n border-radius: var(--cg-radius-sm);\n font-family: var(--cg-font-mono);\n font-size: 11px;\n color: color-mix(in srgb, var(--cg-warning) 85%, white);\n overflow-x: auto;\n white-space: nowrap;\n}\n\n.cg-prereq-copy {\n flex-shrink: 0;\n padding: 4px 10px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--cg-warning) 40%, transparent);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-warning);\n font-size: 11px;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-prereq-copy:hover {\n background: color-mix(in srgb, var(--cg-warning) 20%, transparent);\n}\n\n.cg-paste-input {\n flex: 1;\n min-height: 160px;\n padding: 10px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n resize: vertical;\n outline: none;\n transition: border-color var(--cg-transition);\n}\n\n.cg-paste-input:focus {\n border-color: var(--cg-accent);\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\n}\n\n.cg-import-submit {\n align-self: flex-start;\n padding: 8px 18px;\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n border: none;\n border-radius: var(--cg-radius-sm);\n font-size: 13px;\n font-weight: 500;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-submit:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n transform: translateY(-1px);\n}\n\n.cg-import-submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.cg-import-feedback {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n margin: 0 14px 12px;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n}\n\n.cg-import-feedback.cg-ok {\n background: color-mix(in srgb, var(--cg-success) 15%, transparent);\n color: var(--cg-success);\n}\n\n.cg-import-feedback.cg-err {\n background: color-mix(in srgb, var(--cg-error) 15%, transparent);\n color: var(--cg-error);\n}\n\n/* ---- Legend panel -------------------------------------------------------- */\n\n.cg-legend-panel {\n position: absolute;\n left: 12px;\n bottom: calc(var(--cg-statusbar-h) + 12px);\n width: 180px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n overflow: hidden;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-legend-header {\n padding: 7px 12px;\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n border-bottom: 1px solid var(--cg-border);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.cg-legend-close {\n background: transparent;\n border: none;\n color: var(--cg-text-secondary);\n cursor: pointer;\n font-size: 14px;\n padding: 0 4px;\n border-radius: var(--cg-radius-xs);\n line-height: 1;\n}\n\n.cg-legend-close:hover {\n color: var(--cg-text);\n}\n\n.cg-legend-body {\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.cg-legend-section-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 4px;\n}\n\n.cg-legend-row {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: var(--cg-text-secondary);\n padding: 2px 0;\n}\n\n/* cycle-146 T146-4:图例行交互化——button 化 + 隐藏态视觉(半透明 + 删除线语义) */\nbutton.cg-legend-row.cg-legend-toggle {\n background: none;\n border: none;\n cursor: pointer;\n width: 100%;\n text-align: left;\n border-radius: 4px;\n transition: opacity 0.15s ease, background-color 0.15s ease;\n}\n\nbutton.cg-legend-row.cg-legend-toggle:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-legend-row.cg-legend-row-hidden {\n opacity: 0.38;\n}\n\n.cg-legend-row.cg-legend-row-hidden .cg-legend-swatch,\n.cg-legend-row.cg-legend-row-hidden .cg-legend-line {\n filter: grayscale(1);\n}\n\n.cg-legend-swatch {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.cg-legend-line {\n width: 18px;\n height: 0;\n border-top: 2px solid var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* ---- Workspace selector --------------------------------------------------- */\n\n.cg-workspace-selector {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.cg-workspace-trigger {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition);\n max-width: 160px;\n}\n\n.cg-workspace-trigger:hover {\n background: var(--cg-surface-active);\n border-color: var(--cg-border-strong);\n}\n\n.cg-workspace-trigger:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-workspace-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.cg-workspace-chevron {\n opacity: 0.6;\n flex-shrink: 0;\n}\n\n.cg-workspace-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 240px;\n max-width: 320px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-sm);\n box-shadow: var(--cg-shadow-lg);\n z-index: var(--cg-z-dropdown);\n overflow: hidden;\n animation: ws-slide-in 120ms var(--cg-ease-out);\n}\n\n.cg-workspace-dropdown-portal {\n position: fixed;\n z-index: var(--cg-z-modal);\n}\n\n@keyframes ws-slide-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.cg-workspace-dropdown-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 11px;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-workspace-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text-secondary);\n cursor: pointer;\n transition: background var(--cg-transition), color var(--cg-transition);\n}\n\n.cg-workspace-add-btn:hover {\n background: var(--cg-accent-soft);\n color: var(--cg-accent);\n border-color: var(--cg-accent);\n}\n\n.cg-workspace-add-form {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-workspace-add-form input {\n flex: 1;\n padding: 4px 8px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n outline: none;\n}\n\n.cg-workspace-add-form input:focus {\n border-color: var(--cg-accent);\n}\n\n.cg-workspace-add-form button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n background: var(--cg-accent);\n border: none;\n border-radius: var(--cg-radius-xs);\n color: white;\n cursor: pointer;\n transition: background var(--cg-transition);\n}\n\n.cg-workspace-add-form button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.cg-workspace-add-form button:not(:disabled):hover {\n background: var(--cg-accent-hover);\n}\n\n.cg-workspace-list {\n max-height: 260px;\n overflow-y: auto;\n padding: 4px 0;\n}\n\n.cg-workspace-item {\n display: grid;\n grid-template-columns: auto 1fr auto auto;\n align-items: center;\n gap: 6px;\n padding: 7px 10px;\n cursor: pointer;\n transition: background var(--cg-transition);\n position: relative;\n}\n\n.cg-workspace-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-workspace-item.cg-current {\n background: var(--cg-accent-soft);\n}\n\n.cg-workspace-item-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-workspace-item-path {\n grid-column: 2;\n font-size: 10px;\n color: var(--cg-text-tertiary);\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.2;\n}\n\n.cg-workspace-item-time {\n font-size: 10px;\n color: var(--cg-text-tertiary);\n white-space: nowrap;\n}\n\n.cg-workspace-item-badge {\n font-size: 9px;\n padding: 1px 5px;\n background: var(--cg-accent);\n color: white;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n white-space: nowrap;\n}\n\n.cg-workspace-item-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background: transparent;\n border: none;\n border-radius: 3px;\n color: var(--cg-text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--cg-transition), color var(--cg-transition);\n}\n\n.cg-workspace-item:hover .cg-workspace-item-remove {\n opacity: 1;\n}\n\n.cg-workspace-item-remove:hover {\n color: var(--cg-error);\n background: color-mix(in srgb, var(--cg-error) 10%, transparent);\n}\n\n.cg-workspace-empty {\n padding: 16px 10px;\n text-align: center;\n font-size: 12px;\n color: var(--cg-text-tertiary);\n}\n\n/* ---- Keyboard help -------------------------------------------------------- */\n\n.cg-keyboard-help-overlay {\n position: fixed;\n inset: 0;\n background: var(--cg-overlay-bg);\n -webkit-backdrop-filter: blur(2px);\n backdrop-filter: blur(2px);\n z-index: var(--cg-z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n animation: cg-fade-in 120ms var(--cg-ease-out);\n}\n\n.cg-keyboard-help-panel {\n background: var(--cg-surface);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow-lg);\n min-width: 280px;\n max-width: 360px;\n padding: 0;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-keyboard-help-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 14px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-keyboard-help-close {\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text-tertiary);\n cursor: pointer;\n font-size: 16px;\n transition: color var(--cg-transition), background var(--cg-transition);\n}\n\n.cg-keyboard-help-close:hover {\n color: var(--cg-text);\n background: var(--cg-surface-hover);\n}\n\n.cg-keyboard-help-list {\n padding: 8px 16px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.cg-keyboard-help-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.cg-keyboard-help-key {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 24px;\n padding: 0 8px;\n background: var(--cg-surface-active);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n font-family: var(--cg-font-mono);\n font-size: 11px;\n color: var(--cg-text);\n box-shadow: 0 1px 0 var(--cg-border-strong);\n}\n\n.cg-keyboard-help-desc {\n font-size: 13px;\n color: var(--cg-text-secondary);\n}\n\n@keyframes cg-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n/* ── 会话跟随徽标(session-follow,见 src/client/runtime/sessionFollow.ts)────\n * 透明化纪律:跟随中 / 已固定状态必须一眼可见(白盒可观测),且两个形态\n * 用色差区分——跟随=信息态(accent 描边),固定=动作态(warning 底色+可点击)。 */\n.cg-workspace-follow-badge {\n margin-left: auto;\n margin-right: 6px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n letter-spacing: 0.02em;\n text-transform: none;\n white-space: nowrap;\n}\n.cg-workspace-follow-badge.cg-following-active {\n color: var(--cg-accent);\n border: 1px solid var(--cg-accent);\n background: transparent;\n cursor: default;\n}\n.cg-workspace-follow-badge.cg-following-pinned {\n color: var(--cg-warning);\n border: 1px solid var(--cg-warning);\n background: color-mix(in srgb, var(--cg-warning) 12%, transparent);\n cursor: pointer;\n}\n.cg-workspace-follow-badge.cg-following-pinned:hover {\n background: color-mix(in srgb, var(--cg-warning) 22%, transparent);\n}\n","/* ---- PathBar (FR-25: Path Finding) ---------------------------------------- */\r\n\r\n.cg-path-bar {\r\n position: absolute;\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n width: 280px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-panel);\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n overflow: hidden;\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-path-bar-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-path-bar-content {\r\n padding: 10px 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.cg-path-input-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n position: relative;\r\n}\r\n\r\n.cg-path-input-group label {\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.04em;\r\n}\r\n\r\n.cg-path-input-group input {\r\n padding: 6px 10px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n outline: none;\r\n transition: border-color var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-path-input-group input:focus {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\r\n}\r\n\r\n.cg-path-input-group input::placeholder {\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-path-suggestions {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n margin-top: 2px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-dropdown);\r\n max-height: 160px;\r\n overflow-y: auto;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-path-suggestions button {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n width: 100%;\r\n padding: 6px 10px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-path-suggestions button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-suggestion-type {\r\n display: inline-block;\r\n padding: 1px 5px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-suggestion-label {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-path-selected {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 3px 8px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n.cg-path-actions {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n\r\n.cg-path-find-btn,\r\n.cg-path-clear-btn {\r\n padding: 6px 14px;\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 12px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-path-find-btn {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n flex: 1;\r\n}\r\n\r\n.cg-path-find-btn:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-path-find-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-path-clear-btn {\r\n background: var(--cg-surface);\r\n color: var(--cg-text-secondary);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-path-clear-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-path-result {\r\n display: flex;\r\n gap: 12px;\r\n padding: 6px 10px;\r\n background: var(--cg-accent-soft);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n/* ---- FocusModeBar (FR-26/28: Focus Mode) ---------------------------------- */\r\n\r\n.cg-focus-mode-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 12px;\r\n background: var(--cg-accent-soft);\r\n border-bottom: 1px solid var(--cg-accent);\r\n font-size: 12px;\r\n color: var(--cg-accent);\r\n flex-shrink: 0;\r\n animation: cg-slide-down 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-focus-label {\r\n font-weight: 600;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 200px;\r\n}\r\n\r\n.cg-focus-depth {\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n padding: 1px 6px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border-radius: 10px;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-focus-expand-btn,\r\n.cg-focus-contract-btn,\r\n.cg-focus-exit-btn {\r\n width: 24px;\r\n height: 24px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n flex-shrink: 0;\r\n margin-left: auto;\r\n}\r\n\r\n.cg-focus-expand-btn:hover,\r\n.cg-focus-contract-btn:hover,\r\n.cg-focus-exit-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-focus-expand-btn:first-of-type {\r\n margin-left: auto;\r\n}\r\n\r\n.cg-focus-contract-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-focus-exit-btn:hover {\r\n border-color: var(--cg-error);\r\n color: var(--cg-error);\r\n}","/* ---- HealthScoreCard (FR-32: Health Score) -------------------------------- */\n\n.cg-health-score-card {\n position: absolute;\n left: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 260px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n animation: cg-slide-right 160ms var(--cg-ease-out);\n}\n\n.cg-health-score-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-health-score-empty {\n padding: 20px 12px;\n text-align: center;\n font-size: 12px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-health-score-overall {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 14px 12px 10px;\n}\n\n.cg-health-score-circle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 64px;\n height: 64px;\n border: 3px solid;\n border-radius: 50%;\n font-size: 22px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-health-score-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-health-dimensions {\n padding: 0 12px 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.cg-health-dimension {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.cg-health-dimension-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.cg-health-dimension-name {\n font-size: 11px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n}\n\n.cg-health-dimension-score {\n font-size: 12px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-health-dimension-bar {\n height: 6px;\n background: var(--cg-surface-active);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.cg-health-dimension-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 400ms var(--cg-ease-out);\n}\n\n.cg-health-dimension-desc {\n font-size: 10px;\n color: var(--cg-text-tertiary);\n line-height: 1.3;\n}\n\n","/* ---- RuleConfigPanel (FR-34: Rule Engine) --------------------------------- */\n\n.cg-rule-panel {\n position: absolute;\n left: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 280px;\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: cg-slide-right 160ms var(--cg-ease-out);\n}\n\n.cg-rule-panel-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n flex-shrink: 0;\n}\n\n.cg-rule-panel-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.cg-rule-config-section {\n padding: 10px 12px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-rule-config-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.cg-rule-config-header span {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-rule-preset-btn {\n padding: 3px 8px;\n background: var(--cg-accent-soft);\n border: 1px solid var(--cg-accent);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-accent);\n font-size: 10px;\n font-weight: 500;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-rule-preset-btn:hover {\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n}\n\n.cg-rule-empty {\n padding: 8px 0;\n text-align: center;\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-rule-item {\n padding: 4px 0;\n}\n\n.cg-rule-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.cg-rule-toggle input[type=\"checkbox\"] {\n width: 14px;\n height: 14px;\n accent-color: var(--cg-accent);\n cursor: pointer;\n}\n\n.cg-rule-name {\n flex: 1;\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-rule-severity {\n display: inline-block;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-rule-severity.cg-error {\n background: color-mix(in srgb, var(--cg-error) 100%, transparent);\n color: var(--cg-error);\n}\n\n.cg-rule-severity.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 100%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-rule-check-btn {\n width: 100%;\n margin-top: 8px;\n padding: 6px 14px;\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n border: none;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-rule-check-btn:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n}\n\n.cg-rule-check-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cg-rule-violations-section {\n padding: 10px 12px;\n}\n\n.cg-rule-violations-header {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n margin-bottom: 6px;\n}\n\n.cg-rule-violations-header span:first-child {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-violation-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-violation-badge.cg-error {\n background: color-mix(in srgb, var(--cg-error) 100%, transparent);\n color: var(--cg-error);\n}\n\n.cg-violation-badge.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 100%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-rule-violations-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.cg-violation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 5px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n line-height: 1.4;\n}\n\n.cg-violation-item.cg-error {\n background: color-mix(in srgb, var(--cg-error) 80%, transparent);\n color: var(--cg-error);\n}\n\n.cg-violation-item.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-violation-message {\n flex: 1;\n word-break: break-word;\n}\n\n","/* ---- Analysis panels (FR-33: Hotspot, FR-36: God Module) ------------------ */\n\n.cg-analysis-panel {\n position: absolute;\n right: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 240px;\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-analysis-panel-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n flex-shrink: 0;\n}\n\n\n.cg-analysis-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Hotspot items */\n\n.cg-hotspot-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n transition: background var(--cg-transition);\n}\n\n.cg-hotspot-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-hotspot-item.cg-critical {\n background: color-mix(in srgb, var(--cg-error) 80%, transparent);\n}\n\n.cg-hotspot-item.cg-high {\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\n}\n\n.cg-hotspot-item.cg-medium {\n background: color-mix(in srgb, var(--cg-info) 60%, transparent);\n}\n\n.cg-hotspot-level-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 40px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-hotspot-item.cg-critical .cg-hotspot-level-badge {\n background: var(--cg-error);\n color: white;\n}\n\n.cg-hotspot-item.cg-high .cg-hotspot-level-badge {\n background: var(--cg-warning);\n color: white;\n}\n\n.cg-hotspot-item.cg-medium .cg-hotspot-level-badge {\n background: var(--cg-info);\n color: white;\n}\n\n.cg-hotspot-item.cg-low .cg-hotspot-level-badge {\n background: var(--cg-text-tertiary);\n color: white;\n}\n\n.cg-hotspot-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-hotspot-indegree {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* God Module items */\n\n.cg-godmodule-item {\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 8px;\n border-radius: var(--cg-radius-xs);\n background: color-mix(in srgb, var(--cg-error) 60%, transparent);\n border: 1px solid color-mix(in srgb, var(--cg-error) 150%, transparent);\n}\n\n.cg-godmodule-path {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n word-break: break-all;\n line-height: 1.3;\n}\n\n.cg-godmodule-stats {\n font-size: 10px;\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n}\n\n.cg-godmodule-suggestion {\n font-size: 10px;\n color: var(--cg-error);\n line-height: 1.4;\n padding-top: 2px;\n border-top: 1px solid color-mix(in srgb, var(--cg-error) 120%, transparent);\n}\n\n/* ---- cycle-113: God Module 阈值控件与诚实空态 ---- */\n\n.cg-godmodule-empty {\n padding: 10px 8px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-godmodule-wait {\n color: var(--cg-text-tertiary);\n font-style: italic;\n}\n\n.cg-godmodule-threshold {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 6px 8px;\n border-top: 1px solid var(--cg-border);\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-godmodule-threshold label {\n flex: 1;\n}\n\n.cg-godmodule-threshold-input {\n width: 72px;\n padding: 3px 6px;\n font-size: 11px;\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-godmodule-threshold-input:focus {\n outline: none;\n border-color: var(--cg-accent);\n}\n\n/* Core Function items */\n\n.cg-core-function-item {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 8px;\n padding: 6px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n cursor: pointer;\n transition: background var(--cg-transition);\n}\n\n.cg-core-function-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-core-function-item:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: -2px;\n}\n\n.cg-core-function-category-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n color: white;\n flex-shrink: 0;\n}\n\n.cg-core-function-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n font-weight: 500;\n}\n\n.cg-core-function-score {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 700;\n color: var(--cg-accent);\n flex-shrink: 0;\n}\n\n.cg-core-function-reasons {\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n width: 100%;\n}\n\n.cg-core-function-reason-tag {\n display: inline-block;\n padding: 0 4px;\n border-radius: 2px;\n font-size: 8px;\n font-weight: 600;\n background: color-mix(in srgb, var(--cg-accent) 20%, transparent);\n color: var(--cg-text-secondary);\n}\n\n.cg-core-function-stats {\n display: flex;\n gap: 8px;\n width: 100%;\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-corefunction-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--cg-radius-xs);\n background: transparent;\n color: var(--cg-text-secondary);\n cursor: pointer;\n transition: all var(--cg-transition);\n}\n\n.cg-corefunction-btn:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-corefunction-btn.cg-active {\n background: color-mix(in srgb, var(--cg-accent) 20%, transparent);\n color: var(--cg-accent);\n}\n\n/* ---- cycle-105: Hotspot churn 状态行与多列布局 ---- */\n\n.cg-hotspot-churn-status {\n padding: 6px 12px;\n font-size: 11px;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border-bottom: 1px solid var(--cg-border);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n}\n\n.cg-hotspot-churn-reason {\n color: var(--cg-text-tertiary);\n font-size: 10px;\n}\n\n.cg-hotspot-churn-truncated {\n color: var(--cg-warning);\n font-size: 10px;\n}\n\n.cg-hotspot-column-header {\n display: grid;\n grid-template-columns: 28px 1fr 48px 48px 48px;\n gap: 4px;\n padding: 4px 12px;\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n border-bottom: 1px solid var(--cg-border);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-hotspot-item {\n display: grid;\n grid-template-columns: 28px 1fr 48px 48px 48px;\n gap: 4px;\n align-items: center;\n}\n\n.cg-hotspot-churn,\n.cg-hotspot-score {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n color: var(--cg-text-tertiary);\n text-align: right;\n}\n\n","/* ---- Impact stats panel (FR-35) ------------------------------------------ */\n\n.cg-impact-panel {\n right: 12px;\n bottom: calc(var(--cg-statusbar-h) + 12px);\n top: auto;\n width: 160px;\n}\n\n.cg-impact-stat-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.cg-impact-stat-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-impact-stat-badge.cg-d1 {\n background: var(--cg-impact-d1);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-badge.cg-d2 {\n background: var(--cg-impact-d2);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-badge.cg-d3 {\n background: var(--cg-impact-d3);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-count {\n font-family: var(--cg-font-mono);\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n","/* ---- Cycle details panel ------------------------------------------------ */\r\n\r\n.cg-cycle-panel {\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n top: auto;\r\n width: 220px;\r\n max-height: 40vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-cycle-count-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--cg-cycle-highlight);\r\n color: var(--cg-on-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-cycle-empty {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n padding: 12px 0;\r\n}\r\n\r\n.cg-cycle-item {\r\n padding: 6px 0;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-cycle-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.cg-cycle-item-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-cycle-index {\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n font-weight: 700;\r\n color: var(--cg-cycle-highlight);\r\n}\r\n\r\n.cg-cycle-length {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-cycle-nodes {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 2px;\r\n}\r\n\r\n.cg-cycle-node-tag {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 2px;\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n color: var(--cg-text);\r\n background: var(--cg-surface-active);\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n}\r\n\r\n.cg-cycle-arrow {\r\n font-size: 9px;\r\n color: var(--cg-cycle-highlight);\r\n margin: 0 1px;\r\n}\r\n\r\n.cg-filter-panel {\r\n position: absolute;\r\n top: 48px;\r\n right: 8px;\r\n width: 240px;\r\n max-height: 70vh;\r\n overflow-y: auto;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 8px;\r\n box-shadow: 0 4px 16px var(--cg-shadow-strong);\r\n z-index: var(--cg-z-dropdown);\r\n padding: 12px;\r\n}\r\n\r\n.cg-filter-panel-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.cg-filter-panel-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-panel-close {\r\n background: none;\r\n border: none;\r\n color: var(--cg-text-tertiary);\r\n cursor: pointer;\r\n font-size: 16px;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n}\r\n\r\n.cg-filter-panel-close:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-panel-section {\r\n margin-bottom: 14px;\r\n}\r\n\r\n.cg-filter-section-label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n margin-bottom: 6px;\r\n}\r\n\r\n.cg-filter-slider-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-filter-slider-row input[type=\"range\"] {\r\n flex: 1;\r\n accent-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-slider-value {\r\n min-width: 28px;\r\n text-align: center;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-filter-checkbox-grid {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 4px 8px;\r\n}\r\n\r\n.cg-filter-checkbox-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n font-size: 11px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-filter-checkbox-item input[type=\"checkbox\"] {\r\n accent-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-type-badge {\r\n padding: 1px 6px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n font-weight: 500;\r\n}\r\n\r\n.cg-filter-type-badge[data-type=\"function\"] { background: var(--cg-node-function); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"class\"] { background: var(--cg-node-class); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"variable\"] { background: var(--cg-node-variable); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"module\"] { background: var(--cg-node-module); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"interface\"] { background: var(--cg-node-interface); color: var(--cg-on-accent); }\r\n\r\n.cg-filter-edge-badge {\r\n padding: 1px 6px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-reset-btn {\r\n width: 100%;\r\n padding: 6px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-filter-reset-btn:hover {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-filter-quick-actions {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n\r\n.cg-filter-quick-btn {\r\n flex: 1;\r\n padding: 5px 8px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-filter-quick-btn:hover {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-impact-stat-total {\r\n margin-top: 6px;\r\n padding-top: 6px;\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n","/* ---- Dead code panel ------------------------------------------------------ */\r\n\r\n.cg-deadcode-panel {\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n top: auto;\r\n width: 240px;\r\n max-height: 40vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-deadcode-count-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--cg-deadcode-highlight);\r\n color: var(--cg-on-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-deadcode-stats {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.cg-deadcode-stat-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 2px 0;\r\n}\r\n\r\n.cg-deadcode-stat-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 28px;\r\n padding: 1px 6px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-deadcode-stat-badge.cg-confirmed {\r\n background: var(--cg-deadcode-confirmed);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-stat-badge.cg-suspected {\r\n background: var(--cg-deadcode-suspected);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-stat-count {\r\n font-family: var(--cg-font-mono);\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-deadcode-filters {\r\n display: flex;\r\n gap: 6px;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.cg-deadcode-filters select {\r\n flex: 1;\r\n padding: 3px 6px;\r\n font-size: 11px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n}\r\n\r\n.cg-deadcode-filters select:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-deadcode-empty {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n padding: 12px 0;\r\n}\r\n\r\n.cg-deadcode-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 0;\r\n border-bottom: 1px solid var(--cg-border);\r\n cursor: pointer;\r\n}\r\n\r\n.cg-deadcode-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.cg-deadcode-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-deadcode-item.cg-confirmed {\r\n border-left: 2px solid var(--cg-deadcode-confirmed);\r\n padding-left: 4px;\r\n}\r\n\r\n.cg-deadcode-item.cg-suspected {\r\n border-left: 2px solid var(--cg-deadcode-suspected);\r\n padding-left: 4px;\r\n}\r\n\r\n.cg-deadcode-category-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n font-size: 9px;\r\n font-weight: 500;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-unreachable {\r\n background: var(--cg-deadcode-confirmed);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-no-incoming {\r\n background: var(--cg-deadcode-suspected);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-orphan {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-deadcode-label {\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex: 1;\r\n}\r\n\r\n.cg-deadcode-filepath {\r\n font-size: 9px;\r\n color: var(--cg-text-tertiary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex-shrink: 0;\r\n max-width: 80px;\r\n}","/* ---- cycle-117: 注册矩阵看板面板 ---- */\n\n.cg-registry-empty {\n padding: 10px 8px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-wait {\n color: var(--cg-text-tertiary);\n font-style: italic;\n}\n\n.cg-registry-faces {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 4px;\n margin-bottom: 8px;\n}\n\n.cg-registry-face {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 6px 4px;\n background: var(--cg-surface-hover);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-face-count {\n font-family: var(--cg-font-mono);\n font-size: 14px;\n font-weight: 700;\n color: var(--cg-accent);\n}\n\n.cg-registry-face-name {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-registry-broken {\n padding: 6px 8px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n margin-bottom: 8px;\n}\n\n.cg-registry-broken-active {\n color: var(--cg-error);\n border-color: color-mix(in srgb, var(--cg-error) 100%, transparent);\n background: color-mix(in srgb, var(--cg-error) 8%, transparent);\n}\n\n.cg-registry-live {\n display: flex;\n gap: 8px;\n padding: 0 2px 6px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-registry-live-live { color: var(--cg-success, var(--cg-text)); }\n.cg-registry-live-idle { color: var(--cg-text-tertiary); }\n.cg-registry-live-unknown { color: var(--cg-text-tertiary); font-style: italic; }\n\n.cg-registry-section-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 4px 2px;\n}\n\n.cg-registry-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n font-size: 10px;\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-row:hover { background: var(--cg-surface-hover); }\n\n.cg-registry-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--cg-text-tertiary);\n}\n\n.cg-registry-dot.cg-registry-live-live { background: var(--cg-success, var(--cg-accent)); }\n.cg-registry-dot.cg-registry-live-idle { background: var(--cg-text-tertiary); opacity: 0.5; }\n\n.cg-registry-id {\n flex: 1;\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-registry-lifecycle {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n font-family: var(--cg-font-mono);\n}\n\n.cg-registry-footnote {\n margin-top: 8px;\n padding-top: 6px;\n border-top: 1px solid var(--cg-border);\n font-size: 9px;\n color: var(--cg-text-tertiary);\n line-height: 1.4;\n}\n","/* ---- TourPanel (Guided Tours) --------------------------------------------- */\r\n\r\n.cg-tour-panel {\r\n position: absolute;\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n width: 280px;\r\n max-height: calc(100% - var(--cg-toolbar-h) - 24px);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-panel);\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-panel-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n}\r\n\r\n.cg-tour-panel-close {\r\n background: none;\r\n border: none;\r\n color: var(--cg-text-secondary);\r\n font-size: 16px;\r\n cursor: pointer;\r\n padding: 0 4px;\r\n line-height: 1;\r\n}\r\n\r\n.cg-tour-panel-close:hover {\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tour-empty {\r\n padding: 24px 12px;\r\n text-align: center;\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-tour-progress {\r\n padding: 8px 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-progress-text {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n margin-bottom: 4px;\r\n display: block;\r\n}\r\n\r\n.cg-tour-progress-bar {\r\n height: 4px;\r\n background: var(--cg-border);\r\n border-radius: 2px;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-tour-progress-fill {\r\n height: 100%;\r\n background: var(--cg-accent);\r\n transition: width 200ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-step-detail {\r\n padding: 10px 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-step-layer {\r\n display: inline-block;\r\n font-size: 10px;\r\n font-weight: 600;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n margin-bottom: 6px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-tour-step-layer[data-layer=\"entry\"] { background: var(--cg-tour-layer-entry); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"api\"] { background: var(--cg-tour-layer-api); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"service\"] { background: var(--cg-tour-layer-service); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"data\"] { background: var(--cg-tour-layer-data); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"ui\"] { background: var(--cg-tour-layer-ui); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"utility\"] { background: var(--cg-tour-layer-utility); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"other\"] { background: var(--cg-border); color: var(--cg-text); }\r\n\r\n.cg-tour-step-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-description {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n line-height: 1.4;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-path {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n font-family: monospace;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-meta {\r\n display: flex;\r\n gap: 8px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-tour-meta-item {\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-tour-step-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 4px 0;\r\n}\r\n\r\n.cg-tour-step-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n width: 100%;\r\n padding: 4px 12px;\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n text-align: left;\r\n}\r\n\r\n.cg-tour-step-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-tour-step-item.cg-active {\r\n background: var(--cg-surface-active);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-tour-step-number {\r\n flex-shrink: 0;\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 10px;\r\n font-weight: 600;\r\n border-radius: 50%;\r\n background: var(--cg-border);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tour-step-item.cg-active .cg-tour-step-number {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-tour-step-label {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-tour-step-layer-badge {\r\n flex-shrink: 0;\r\n font-size: 9px;\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n text-transform: uppercase;\r\n}\r\n\r\n.cg-tour-step-layer-badge[data-layer=\"entry\"] { background: var(--cg-tour-layer-entry); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"api\"] { background: var(--cg-tour-layer-api); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"service\"] { background: var(--cg-tour-layer-service); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"data\"] { background: var(--cg-tour-layer-data); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"ui\"] { background: var(--cg-tour-layer-ui); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"utility\"] { background: var(--cg-tour-layer-utility); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"other\"] { background: var(--cg-border); color: var(--cg-text); }\r\n\r\n.cg-tour-nav {\r\n display: flex;\r\n gap: 8px;\r\n padding: 8px 12px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-nav-btn {\r\n flex: 1;\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n transition: background 120ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-nav-btn:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-tour-nav-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}","/* ---- Responsive ---------------------------------------------------------- */\r\n\r\n/* Extra-narrow panels (DSH sidebar tab minimal width).\r\n * Hide the remaining toolbar extras to prioritize graph canvas.\r\n * The center group is already gone at the 600px tier below. */\r\n@container graphpanel (max-width: 380px) {\r\n .cg-tour-btn,\r\n .cg-minimap-btn,\r\n .cg-legend-btn {\r\n display: none;\r\n }\r\n\r\n /* The separators are siblings of the `.cg-toolbar-group` elements, not descendants,\r\n so the previous `.cg-toolbar-group ... .cg-toolbar-separator` selector never\r\n matched anything. */\r\n .cg-toolbar-separator {\r\n display: none;\r\n }\r\n}\r\n\r\n/* Small panels (DSH sidebar tab, narrow bottom panel).\r\n * Container queries respond to the PANEL width, not the viewport — the plugin\r\n * renders inside DSH panels whose width is unrelated to the window size. */\r\n@container graphpanel (max-width: 480px) {\r\n .cg-graph-panel {\r\n border-radius: var(--cg-radius-sm);\r\n }\r\n\r\n .cg-graph-toolbar {\r\n padding: 0 8px;\r\n gap: 4px;\r\n }\r\n\r\n .cg-toolbar-left {\r\n font-size: 11px;\r\n }\r\n\r\n .cg-toolbar-center {\r\n gap: 4px;\r\n }\r\n\r\n .cg-toolbar-right {\r\n gap: 4px;\r\n }\r\n\r\n .cg-layout-btn,\r\n .cg-graph-type-btn,\r\n .cg-rank-dir-btn {\r\n padding: 3px 6px;\r\n font-size: 10px;\r\n }\r\n\r\n .cg-search-btn,\r\n .cg-theme-btn,\r\n .cg-export-btn,\r\n .cg-collapse-btn,\r\n .cg-chain-btn,\r\n .cg-cycle-btn,\r\n .cg-impact-btn,\r\n .cg-inheritance-btn,\r\n .cg-minimap-btn,\r\n .cg-refresh-btn,\r\n .cg-undo-btn,\r\n .cg-redo-btn,\r\n .cg-import-btn,\r\n .cg-legend-btn,\r\n .cg-lang-btn,\r\n .cg-pathfind-btn,\r\n .cg-health-btn,\r\n .cg-rules-btn,\r\n .cg-hotspot-btn,\r\n .cg-godmodule-btn,\r\n .cg-corefunction-btn,\r\n .cg-analysis-dropdown-btn,\r\n .cg-quality-dropdown-btn,\r\n .cg-tour-btn {\r\n width: 26px;\r\n height: 26px;\r\n font-size: 12px;\r\n }\r\n\r\n .cg-dropdown-content {\r\n min-width: 140px;\r\n }\r\n\r\n .cg-node-detail-panel {\r\n width: calc(100% - 24px);\r\n left: 12px;\r\n top: 12px;\r\n }\r\n\r\n .cg-legend-panel {\r\n width: 140px;\r\n }\r\n\r\n .cg-mini-map {\r\n width: 140px;\r\n }\r\n\r\n .cg-type-badge {\r\n display: none;\r\n }\r\n\r\n .cg-toolbar-separator {\r\n display: none;\r\n }\r\n\r\n .cg-graph-type-buttons {\r\n display: none;\r\n }\r\n\r\n .cg-view-mode-buttons {\r\n gap: 1px;\r\n }\r\n\r\n .cg-view-mode-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n\r\n .cg-search-panel,\r\n .cg-path-panel {\r\n width: calc(100% - 16px);\r\n max-width: 320px;\r\n }\r\n\r\n .cg-filter-panel {\r\n width: calc(100% - 16px);\r\n }\r\n\r\n .cg-heatmap-btn--activate,\r\n .cg-heatmap-btn--deactivate {\r\n width: 26px;\r\n height: 26px;\r\n font-size: 12px;\r\n }\r\n\r\n}\r\n\r\n/* Medium panels (DSH sidebar medium width) */\r\n@container graphpanel (max-width: 768px) {\r\n .cg-graph-toolbar {\r\n padding: 0 8px;\r\n gap: 6px;\r\n }\r\n\r\n .cg-toolbar-center {\r\n gap: 6px;\r\n }\r\n\r\n .cg-toolbar-right {\r\n gap: 6px;\r\n }\r\n\r\n .cg-layout-btn,\r\n .cg-graph-type-btn {\r\n padding: 3px 8px;\r\n font-size: 11px;\r\n }\r\n\r\n .cg-node-detail-panel {\r\n width: 220px;\r\n }\r\n\r\n .cg-legend-panel {\r\n width: 160px;\r\n }\r\n\r\n .cg-mini-map {\r\n width: 160px;\r\n }\r\n\r\n .cg-filter-select {\r\n font-size: 11px;\r\n }\r\n\r\n .cg-toolbar-separator {\r\n margin: 0 2px;\r\n }\r\n\r\n .cg-tour-btn {\r\n display: none;\r\n }\r\n\r\n}\r\n\r\n/* Medium-narrow panels — hide tour and reduce analysis button clutter */\r\n@container graphpanel (max-width: 600px) {\r\n .cg-tour-btn,\r\n .cg-minimap-btn {\r\n display: none;\r\n }\r\n\r\n .cg-toolbar-left .cg-type-badge {\r\n display: none;\r\n }\r\n\r\n /* The center group (layout / view-mode / level) is the widest fixed-width block in the\r\n toolbar: 150px for its three icon-only triggers, measured on the real host. At a 520px\r\n panel it was being squeezed to 115px, which wrapped the level trigger onto two lines\r\n and clipped it; at 600px it still has 45px of slack. Hiding it here instead of letting\r\n it be crushed keeps the workspace chip and every right-hand control (export / more /\r\n collapse) reachable. Of the three controls, only the layout keeps an alternative entry\r\n point (Ctrl+L cycles it, see `usePanelKeyboard`); view mode and hierarchy level lose\r\n their mouse entry below this tier — see the note in `docs/需求分析.md` §28.3. */\r\n .cg-toolbar-center {\r\n display: none;\r\n }\r\n}\r\n\r\n/* Very small panels */\r\n@container graphpanel (max-width: 320px) {\r\n .cg-graph-toolbar {\r\n gap: 2px;\r\n flex-wrap: wrap;\r\n padding: 4px 4px;\r\n }\r\n\r\n .cg-toolbar-left,\r\n .cg-toolbar-center,\r\n .cg-toolbar-right {\r\n flex-wrap: wrap;\r\n gap: 2px;\r\n }\r\n\r\n .cg-layout-buttons,\r\n .cg-graph-type-buttons {\r\n padding: 1px;\r\n }\r\n\r\n .cg-layout-btn,\r\n .cg-graph-type-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n\r\n .cg-filter-select {\r\n padding: 3px 20px 3px 6px;\r\n font-size: 10px;\r\n }\r\n\r\n .cg-node-count {\r\n font-size: 10px;\r\n }\r\n\r\n .cg-legend-panel,\r\n .cg-mini-map {\r\n width: 120px;\r\n }\r\n\r\n /* 下拉内容已 portal 到 document.body,不再是本容器的后代,此处的\r\n * `@container` 抽屉规则永远匹配不到;抽屉形态改由 Dropdown 组件测量面板\r\n * 宽度后加 `.cg-portal-drawer`(见 layout.css)实现。 */\r\n\r\n .cg-search-panel,\r\n .cg-path-panel,\r\n .cg-filter-panel {\r\n width: calc(100% - 8px);\r\n left: 4px;\r\n right: 4px;\r\n }\r\n\r\n .cg-view-mode-buttons {\r\n flex-wrap: wrap;\r\n }\r\n}\r\n\r\n/* Large screens — allow fixed floating panel */\r\n@media (min-width: 1200px) {\r\n .cg-graph-panel.cg-floating {\r\n position: fixed;\r\n right: 16px;\r\n bottom: 16px;\r\n width: 640px;\r\n height: 520px;\r\n }\r\n}\r\n\r\n/* ---- Sidebar tab mode (short height) -------------------------------------- */\r\n/* When the plugin renders inside a DSH sidebar tab, the panel height can be\r\n * very limited. Adapt the layout to prioritize the graph canvas. */\r\n@container graphpanel (max-height: 400px) {\r\n .cg-graph-toolbar {\r\n padding: 0 4px;\r\n gap: 2px;\r\n }\r\n\r\n .cg-toolbar-left .cg-node-count {\r\n font-size: 10px;\r\n }\r\n\r\n .cg-type-badge {\r\n display: none;\r\n }\r\n\r\n .cg-toolbar-separator {\r\n display: none;\r\n }\r\n\r\n .cg-graph-type-buttons {\r\n display: none;\r\n }\r\n\r\n .cg-view-mode-buttons {\r\n gap: 1px;\r\n }\r\n\r\n .cg-view-mode-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n\r\n .cg-node-detail-panel {\r\n max-height: calc(100% - 60px);\r\n overflow-y: auto;\r\n }\r\n\r\n .cg-legend-panel {\r\n max-height: 120px;\r\n overflow-y: auto;\r\n }\r\n\r\n .cg-mini-map {\r\n max-height: 100px;\r\n }\r\n\r\n .cg-search-panel,\r\n .cg-path-panel,\r\n .cg-filter-panel {\r\n max-height: calc(100% - 60px);\r\n overflow-y: auto;\r\n }\r\n}\r\n\r\n@container graphpanel (max-height: 240px) {\r\n .cg-graph-toolbar {\r\n flex-wrap: wrap;\r\n padding: 2px;\r\n }\r\n\r\n .cg-toolbar-left,\r\n .cg-toolbar-center,\r\n .cg-toolbar-right {\r\n flex-wrap: wrap;\r\n gap: 2px;\r\n }\r\n\r\n .cg-layout-buttons {\r\n display: none;\r\n }\r\n\r\n .cg-rank-dir-buttons {\r\n display: none;\r\n }\r\n\r\n .cg-cluster-depth-buttons {\r\n display: none;\r\n }\r\n\r\n .cg-node-detail-panel {\r\n width: calc(100% - 8px);\r\n left: 4px;\r\n top: 4px;\r\n max-height: calc(100% - 40px);\r\n }\r\n}\r\n\r\n/* ---- Reduced motion ------------------------------------------------------ */\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .cg-graph-panel *,\r\n .cg-graph-panel *::before,\r\n .cg-graph-panel *::after,\r\n .cg-floating-panel *,\r\n .cg-floating-panel *::before,\r\n .cg-floating-panel *::after,\r\n .cg-floating-container *,\r\n .cg-floating-container *::before,\r\n .cg-floating-container *::after {\r\n animation-duration: 0.01ms !important;\r\n transition-duration: 0.01ms !important;\r\n }\r\n}\r\n\r\n/* ---- Touch device adaptation --------------------------------------------- */\r\n\r\n@media (pointer: coarse) {\r\n .cg-layout-btn,\r\n .cg-graph-type-btn,\r\n .cg-search-btn,\r\n .cg-theme-btn,\r\n .cg-export-btn,\r\n .cg-collapse-btn,\r\n .cg-chain-btn,\r\n .cg-cycle-btn,\r\n .cg-impact-btn,\r\n .cg-inheritance-btn,\r\n .cg-minimap-btn,\r\n .cg-refresh-btn,\r\n .cg-undo-btn,\r\n .cg-redo-btn,\r\n .cg-import-btn,\r\n .cg-legend-btn,\r\n .cg-lang-btn,\r\n .cg-pathfind-btn,\r\n .cg-health-btn,\r\n .cg-rules-btn,\r\n .cg-hotspot-btn,\r\n .cg-godmodule-btn,\r\n .cg-corefunction-btn,\r\n .cg-analysis-dropdown-btn,\r\n .cg-quality-dropdown-btn,\r\n .cg-tour-btn {\r\n min-width: 44px;\r\n min-height: 44px;\r\n }\r\n\r\n .cg-node-detail-panel .cg-close-btn,\r\n .cg-legend-close,\r\n .cg-import-close,\r\n .cg-close-btn {\r\n min-width: 44px;\r\n min-height: 44px;\r\n }\r\n}\r\n/* ---- Responsive for new components ---------------------------------------- */\r\n\r\n@container graphpanel (max-width: 480px) {\r\n .cg-path-bar,\r\n .cg-health-score-card,\r\n .cg-rule-panel {\r\n width: calc(100% - 24px);\r\n }\r\n\r\n .cg-analysis-panel {\r\n width: calc(100% - 24px);\r\n }\r\n\r\n .cg-focus-label {\r\n max-width: 120px;\r\n }\r\n}\r\n\r\n@container graphpanel (max-width: 768px) {\r\n .cg-path-bar {\r\n width: 240px;\r\n }\r\n\r\n .cg-health-score-card {\r\n width: 220px;\r\n }\r\n\r\n .cg-rule-panel {\r\n width: 240px;\r\n }\r\n\r\n .cg-analysis-panel {\r\n width: 200px;\r\n }\r\n}\r\n/* ---- Container Queries fallback ------------------------------------------- */\r\n@supports not (container-type: inline-size) {\r\n @media (max-width: 380px) {\r\n .cg-tour-btn,\r\n .cg-minimap-btn,\r\n .cg-legend-btn {\r\n display: none;\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .cg-graph-panel {\r\n border-radius: var(--cg-radius-sm);\r\n }\r\n .cg-graph-toolbar {\r\n padding: 0 8px;\r\n gap: 4px;\r\n }\r\n .cg-toolbar-left {\r\n font-size: 11px;\r\n }\r\n .cg-toolbar-center {\r\n gap: 4px;\r\n }\r\n .cg-toolbar-right {\r\n gap: 4px;\r\n }\r\n .cg-layout-btn,\r\n .cg-graph-type-btn,\r\n .cg-rank-dir-btn {\r\n padding: 3px 6px;\r\n font-size: 10px;\r\n }\r\n .cg-search-btn,\r\n .cg-theme-btn,\r\n .cg-export-btn,\r\n .cg-collapse-btn,\r\n .cg-chain-btn,\r\n .cg-cycle-btn,\r\n .cg-impact-btn,\r\n .cg-inheritance-btn,\r\n .cg-minimap-btn,\r\n .cg-refresh-btn,\r\n\r\n .cg-undo-btn,\r\n .cg-redo-btn,\r\n .cg-import-btn,\r\n .cg-legend-btn,\r\n .cg-lang-btn,\r\n .cg-pathfind-btn,\r\n .cg-health-btn,\r\n .cg-rules-btn,\r\n .cg-hotspot-btn,\r\n .cg-godmodule-btn,\r\n .cg-corefunction-btn,\r\n .cg-analysis-dropdown-btn,\r\n .cg-quality-dropdown-btn,\r\n .cg-tour-btn {\r\n width: 26px;\r\n height: 26px;\r\n font-size: 12px;\r\n }\r\n .cg-node-detail-panel {\r\n width: calc(100% - 24px);\r\n left: 12px;\r\n top: 12px;\r\n }\r\n .cg-legend-panel {\r\n width: 140px;\r\n }\r\n .cg-mini-map {\r\n width: 140px;\r\n }\r\n .cg-type-badge {\r\n display: none;\r\n }\r\n .cg-toolbar-separator {\r\n display: none;\r\n }\r\n .cg-graph-type-buttons {\r\n display: none;\r\n }\r\n .cg-dropdown-content {\r\n min-width: 140px;\r\n }\r\n .cg-view-mode-buttons {\r\n gap: 1px;\r\n }\r\n .cg-view-mode-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n .cg-search-panel,\r\n .cg-path-panel {\r\n width: calc(100% - 16px);\r\n max-width: 320px;\r\n }\r\n .cg-filter-panel {\r\n width: calc(100% - 16px);\r\n }\r\n .cg-heatmap-btn--activate,\r\n .cg-heatmap-btn--deactivate {\r\n width: 26px;\r\n height: 26px;\r\n font-size: 12px;\r\n }\r\n .cg-path-bar,\r\n .cg-health-score-card,\r\n .cg-rule-panel {\r\n width: calc(100% - 24px);\r\n }\r\n .cg-analysis-panel {\r\n width: calc(100% - 24px);\r\n }\r\n .cg-focus-label {\r\n max-width: 120px;\r\n }\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .cg-graph-toolbar {\r\n padding: 0 8px;\r\n gap: 6px;\r\n }\r\n .cg-toolbar-center {\r\n gap: 6px;\r\n }\r\n .cg-toolbar-right {\r\n gap: 6px;\r\n }\r\n .cg-layout-btn,\r\n .cg-graph-type-btn {\r\n padding: 3px 8px;\r\n font-size: 11px;\r\n }\r\n .cg-node-detail-panel {\r\n width: 220px;\r\n }\r\n .cg-legend-panel {\r\n width: 160px;\r\n }\r\n .cg-mini-map {\r\n width: 160px;\r\n }\r\n .cg-filter-select {\r\n font-size: 11px;\r\n }\r\n .cg-toolbar-separator {\r\n margin: 0 2px;\r\n }\r\n .cg-tour-btn {\r\n display: none;\r\n }\r\n .cg-path-bar {\r\n width: 240px;\r\n }\r\n .cg-health-score-card {\r\n width: 220px;\r\n }\r\n .cg-rule-panel {\r\n width: 240px;\r\n }\r\n .cg-analysis-panel {\r\n width: 200px;\r\n }\r\n }\r\n\r\n @media (max-width: 600px) {\r\n .cg-tour-btn,\r\n .cg-minimap-btn {\r\n display: none;\r\n }\r\n .cg-toolbar-left .cg-type-badge {\r\n display: none;\r\n }\r\n /* Mirrors the 600px container tier: the center group needs 150px for its three\r\n icon-only triggers and gets crushed below that. */\r\n .cg-toolbar-center {\r\n display: none;\r\n }\r\n }\r\n\r\n @media (max-width: 320px) {\r\n .cg-graph-toolbar {\r\n gap: 2px;\r\n flex-wrap: wrap;\r\n padding: 4px 4px;\r\n }\r\n .cg-toolbar-left,\r\n .cg-toolbar-center,\r\n .cg-toolbar-right {\r\n flex-wrap: wrap;\r\n gap: 2px;\r\n }\r\n .cg-layout-buttons,\r\n .cg-graph-type-buttons {\r\n padding: 1px;\r\n }\r\n .cg-layout-btn,\r\n .cg-graph-type-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n .cg-filter-select {\r\n padding: 3px 20px 3px 6px;\r\n font-size: 10px;\r\n }\r\n .cg-node-count {\r\n font-size: 10px;\r\n }\r\n .cg-legend-panel,\r\n .cg-mini-map {\r\n width: 120px;\r\n }\r\n /* 同上:portal 到 body 后这里也匹配不到,抽屉由 `.cg-portal-drawer` 接管。 */\r\n .cg-search-panel,\r\n .cg-path-panel,\r\n .cg-filter-panel {\r\n width: calc(100% - 8px);\r\n left: 4px;\r\n right: 4px;\r\n }\r\n .cg-view-mode-buttons {\r\n flex-wrap: wrap;\r\n }\r\n }\r\n\r\n @media (max-height: 400px) {\r\n .cg-graph-toolbar {\r\n padding: 0 4px;\r\n gap: 2px;\r\n }\r\n .cg-toolbar-left .cg-node-count {\r\n font-size: 10px;\r\n }\r\n .cg-type-badge {\r\n display: none;\r\n }\r\n .cg-toolbar-separator {\r\n display: none;\r\n }\r\n .cg-graph-type-buttons {\r\n display: none;\r\n }\r\n .cg-view-mode-buttons {\r\n gap: 1px;\r\n }\r\n .cg-view-mode-btn {\r\n padding: 2px 4px;\r\n font-size: 9px;\r\n }\r\n .cg-node-detail-panel {\r\n max-height: calc(100% - 60px);\r\n overflow-y: auto;\r\n }\r\n .cg-legend-panel {\r\n max-height: 120px;\r\n overflow-y: auto;\r\n }\r\n .cg-mini-map {\r\n max-height: 100px;\r\n }\r\n .cg-search-panel,\r\n .cg-path-panel,\r\n .cg-filter-panel {\r\n max-height: calc(100% - 60px);\r\n overflow-y: auto;\r\n }\r\n }\r\n\r\n @media (max-height: 240px) {\r\n .cg-graph-toolbar {\r\n flex-wrap: wrap;\r\n padding: 2px;\r\n }\r\n .cg-toolbar-left,\r\n .cg-toolbar-center,\r\n .cg-toolbar-right {\r\n flex-wrap: wrap;\r\n gap: 2px;\r\n }\r\n .cg-layout-buttons {\r\n display: none;\r\n }\r\n .cg-rank-dir-buttons {\r\n display: none;\r\n }\r\n .cg-cluster-depth-buttons {\r\n display: none;\r\n }\r\n .cg-node-detail-panel {\r\n width: calc(100% - 8px);\r\n left: 4px;\r\n top: 4px;\r\n max-height: calc(100% - 40px);\r\n }\r\n }\r\n}\r\n/* ---- Conversation View Integration Mode ----------------------------------- */\r\n\r\n/* When integrated into DSH's conversation.view slot, the panel fills the\r\n * conversation area. Toolbar is always visible; graph canvas fills remaining\r\n * space. The panel must not collapse or float — it's the primary view. */\r\n[data-cg-integration=\"conversation-view\"] {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 200px;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n[data-cg-integration=\"conversation-view\"] .cg-graph-toolbar {\r\n display: flex;\r\n flex-shrink: 0;\r\n}\r\n\r\n[data-cg-integration=\"conversation-view\"] .cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n}\r\n\r\n[data-cg-integration=\"conversation-view\"] .cg-collapse-fab {\r\n display: none;\r\n}\r\n\r\n[data-cg-integration=\"conversation-view\"] .cg-status-bar {\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Conversation view integration (conversation.view slot) */\r\n.cg-conversation-view-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n}\r\n\r\n.cg-conversation-view-wrapper[data-cg-visible=\"false\"] {\r\n display: none;\r\n}\r\n\r\n/* Generic host container for host-managed embedded panels\r\n * (conversation.view / sidebar-right / better-sidebar). */\r\n.cg-integration-host {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n}\r\n\r\n.cg-integration-host[data-cg-visible=\"false\"] {\r\n display: none;\r\n}\r\n\r\n\r\n/* In conversation-view mode, the panel should not have its own border/radius\r\n * since it's embedded in the DSH conversation area */\r\n[data-cg-integration=\"conversation-view\"].cg-graph-panel:not(.cg-collapsed) {\r\n border: none;\r\n border-radius: 0;\r\n}\r\n/* ---- Sidebar Right Tab Integration Mode ----------------------------------- */\r\n\r\n/* When integrated into DSH's sidebar.right.pane.tab, the panel is in a\r\n * right sidebar tab. Width is typically 300-500px, height is full window. */\r\n[data-cg-integration=\"sidebar-right\"] {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 300px;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n[data-cg-integration=\"sidebar-right\"] .cg-graph-toolbar {\r\n display: flex;\r\n flex-shrink: 0;\r\n}\r\n\r\n[data-cg-integration=\"sidebar-right\"] .cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n}\r\n\r\n[data-cg-integration=\"sidebar-right\"] .cg-collapse-fab {\r\n display: none;\r\n}\r\n\r\n[data-cg-integration=\"sidebar-right\"].cg-graph-panel:not(.cg-collapsed) {\r\n border: none;\r\n border-radius: 0;\r\n}\r\n\r\n/* ---- Better Sidebar Integration Mode -------------------------------------- */\r\n\r\n/* When integrated via betterSidebar API, the panel is in a sidebar tab.\r\n * Similar to sidebar-right but may have different container constraints. */\r\n[data-cg-integration=\"better-sidebar\"] {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 200px;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n[data-cg-integration=\"better-sidebar\"] .cg-graph-toolbar {\r\n display: flex;\r\n flex-shrink: 0;\r\n}\r\n\r\n[data-cg-integration=\"better-sidebar\"] .cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n}\r\n\r\n[data-cg-integration=\"better-sidebar\"] .cg-collapse-fab {\r\n display: none;\r\n}\r\n\r\n[data-cg-integration=\"better-sidebar\"].cg-graph-panel:not(.cg-collapsed) {\r\n border: none;\r\n border-radius: 0;\r\n}\r\n\r\n/* ---- Remote narrow-screen carrier adaptation ------------------------------- */\r\n\r\n/* `@linxin666/dsh-remote-web-ui` is a real, widely-installed plugin, but it\r\n * exposes no panel/tab API at all — its client half only occupies the\r\n * `sidebar.footer.action` seat and writes DOM adaptation marks\r\n * (`lib/client.js:4155 ACTIVE_CLASS = \"dsh-remote-portrait\"`, added to\r\n * `document.body` at `:4368`). So the honest relationship is \"detect it and let\r\n * the layout adapt\", not \"call its API\". The former `remote-web-ui`\r\n * integration mode was a phantom (`ctx.get('remoteWebUI')` exists in no DSH\r\n * generation) and has been removed; these rules replace it.\r\n *\r\n * The toolbar must stay reachable on a phone-width carrier, so it is allowed to\r\n * wrap instead of overflowing. */\r\nbody.dsh-remote-portrait .cg-graph-toolbar {\r\n flex-wrap: wrap;\r\n row-gap: 4px;\r\n}\r\n\r\nbody.dsh-remote-portrait .cg-graph-panel:not(.cg-collapsed) {\r\n border: none;\r\n border-radius: 0;\r\n}\r\n\r\n/* Below 480px the toolbar's own compact breakpoint (see Toolbar.tsx) already\r\n * collapses secondary controls; the graph area just needs the remaining\r\n * height. */\r\nbody.dsh-remote-portrait .cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n}\r\n\r\n/* ---- Toolbar always visible in non-floating modes -------------------------- */\r\n/* In all sidebar/slot integration modes, the toolbar must remain visible\r\n * even when there's no graph data. The toolbar is the primary interaction\r\n * surface and should not disappear.\r\n * Expressed as one rule over `[data-cg-integration]` (the attribute lives on\r\n * `.cg-graph-panel` itself, see GraphPanel.tsx) so every current and future\r\n * integration mode is covered. The `:not(.cg-collapsed)` guard is load-bearing:\r\n * without it this `!important` declaration outranks\r\n * `.cg-graph-panel.cg-collapsed .cg-graph-toolbar { display: none }` and the\r\n * toolbar keeps painting inside the 52px collapsed FAB. */\r\n.cg-graph-panel[data-cg-integration]:not(.cg-collapsed) .cg-graph-toolbar {\r\n display: flex !important;\r\n}\r\n\r\n/* ---- Desktop vs Web distinction ------------------------------------------- */\r\n/* On desktop platforms, the panel may have more space. On web, it's\r\n * constrained by the browser window. */\r\n@media (min-width: 1024px) {\r\n [data-cg-integration=\"conversation-view\"] .cg-graph-toolbar {\r\n padding: 0 12px;\r\n gap: 8px;\r\n }\r\n}\r\n\r\n/* ---- Narrow-tier sheets (cycle-110 / T3) ---------------------------------- */\r\n/*\r\n * 窄面板(≤480px)下的两处版式修正:\r\n * 1. 节点详情面板改为**底部抽屉**(贴边、限高),不再 `max-height: calc(100% - 24px)`\r\n * 从上往下盖住整个画布;\r\n * 2. 抽屉打开时小地图与图例**临时让位**,关闭后回归。\r\n *\r\n * 为什么两条都要:三者都是 `position: absolute` + `z-index: var(--cg-z-panel)` 的绝对定位\r\n * 元素,窄档下面板几乎占满高度,小地图(右下 200px)与图例(左下 180px)会被盖住一半,\r\n * 面板底部的按钮也会与图例重叠 —— 点击落在错误元素上,而所有 DOM 断言照旧通过。\r\n *\r\n * 两套机制**声明必须一致**:\r\n * - `@container graphpanel (max-width: 480px)`:主机制,按面板宽度响应(与视口无关);\r\n * - `[data-cg-tier=\"narrow\"]`:宿主不支持容器查询、或容器查询尺寸不可读时的兜底,\r\n * 由 `hooks/usePanelTier.ts` 实测宽度后写在根元素上。\r\n * `tests/unit/panelTierContract.test.ts` 会逐条比对这两处的声明,任一侧改动都会变红。\r\n */\r\n@container graphpanel (max-width: 480px) {\r\n .cg-node-detail-panel {\r\n top: auto;\r\n bottom: calc(var(--cg-statusbar-h) + 8px);\r\n left: 8px;\r\n right: 8px;\r\n width: auto;\r\n max-height: 52%;\r\n }\r\n\r\n /* 抽屉打开 ⇒ 两个角落的叠加层让位(关闭后自动回归,不需要 JS 复位) */\r\n .cg-graph-panel[data-cg-sheet=\"open\"] .cg-mini-map,\r\n .cg-graph-panel[data-cg-sheet=\"open\"] .cg-legend-panel {\r\n display: none;\r\n }\r\n}\r\n\r\n/* 兜底机制(JS 实测档位):与上面的容器查询分支**逐条等价** */\r\n.cg-graph-panel[data-cg-tier=\"narrow\"] .cg-node-detail-panel {\r\n top: auto;\r\n bottom: calc(var(--cg-statusbar-h) + 8px);\r\n left: 8px;\r\n right: 8px;\r\n width: auto;\r\n max-height: 52%;\r\n}\r\n\r\n.cg-graph-panel[data-cg-tier=\"narrow\"][data-cg-sheet=\"open\"] .cg-mini-map,\r\n.cg-graph-panel[data-cg-tier=\"narrow\"][data-cg-sheet=\"open\"] .cg-legend-panel {\r\n display: none;\r\n}\r\n","/* Visually hidden — for screen reader only content */\r\n.cg-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* Panel close button — shared across hotspot, god-module, path-bar, rule-config, health panels */\r\n.cg-close-btn {\r\n background: transparent;\r\n border: none;\r\n color: inherit;\r\n cursor: pointer;\r\n margin-left: auto;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.cg-close-btn:hover {\r\n opacity: 0.7;\r\n}\r\n\r\n.cg-close-btn--compact {\r\n padding: 0 4px;\r\n}\r\n\r\n/* Node detail expand hint — collapsed state */\r\n.cg-detail-expand-hint--expanded {\r\n background: color-mix(in srgb, var(--cg-success) 80%, transparent);\r\n border-color: color-mix(in srgb, var(--cg-success) 30%, transparent);\r\n color: var(--cg-success);\r\n}\r\n\r\n.cg-detail-collapse-btn {\r\n margin-left: auto;\r\n background: transparent;\r\n border: none;\r\n color: var(--cg-success);\r\n cursor: pointer;\r\n font-size: 11px;\r\n text-decoration: underline;\r\n}\r\n\r\n.cg-export-dropdown button:focus-visible,\r\n.cg-search-bar button:focus-visible,\r\n.cg-import-close:focus-visible,\r\n.cg-legend-close:focus-visible,\r\n.cg-close-btn:focus-visible,\r\n.cg-collapse-fab:focus-visible,\r\n.cg-path-find-btn:focus-visible,\r\n.cg-path-clear-btn:focus-visible,\r\n.cg-focus-expand-btn:focus-visible,\r\n.cg-focus-contract-btn:focus-visible,\r\n.cg-focus-exit-btn:focus-visible,\r\n.cg-empty-import-btn:focus-visible,\r\n.cg-empty-scan-btn:focus-visible,\r\n.cg-import-submit:focus-visible,\r\n.cg-rule-check-btn:focus-visible,\r\n.cg-rule-preset-btn:focus-visible,\r\n.cg-watch-toggle:focus-visible,\r\n.cg-collapse-all-btn:focus-visible,\r\n.cg-workspace-add-btn:focus-visible,\r\n.cg-workspace-item-remove:focus-visible,\r\n.cg-keyboard-help-close:focus-visible,\r\n.cg-path-suggestions button:focus-visible,\r\n.cg-hotspot-item:focus-visible,\r\n.cg-prereq-copy:focus-visible,\r\n.cg-layout-btn:focus-visible,\r\n.cg-graph-type-btn:focus-visible,\r\n.cg-view-mode-btn:focus-visible,\r\n.cg-layer-btn:focus-visible,\r\n.cg-hierarchy-btn:focus-visible,\r\n.cg-corefunction-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* ---- Micro view empty prompt & function bar -------------------------------- */\r\n\r\n.cg-micro-empty-prompt {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n text-align: center;\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n max-width: 320px;\r\n line-height: 1.6;\r\n animation: cg-fade-in 200ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-micro-empty-icon {\r\n font-size: 28px;\r\n font-weight: 700;\r\n margin-bottom: 12px;\r\n opacity: 0.35;\r\n letter-spacing: 2px;\r\n}\r\n\r\n.cg-micro-empty-text {\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-micro-empty-back-btn {\r\n margin-top: 12px;\r\n padding: 6px 16px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-micro-empty-back-btn:hover {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-micro-function-bar {\r\n position: absolute;\r\n top: 8px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 4px 12px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n z-index: var(--cg-z-canvas-ui);\r\n -webkit-backdrop-filter: blur(8px);\r\n backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow-sm);\r\n}\r\n\r\n.cg-micro-function-close {\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-radius: var(--cg-radius-xs);\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-micro-function-close:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-micro-function-mode {\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n padding: 1px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n font-size: 10px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-micro-function-name {\r\n font-weight: 500;\r\n color: var(--cg-text);\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-micro-function-path {\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n opacity: 0.7;\r\n max-width: 160px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n/* ============================================================================\r\n * Sidebar Navigation Button & Floating Graph Panel\r\n * ============================================================================ */\r\n\r\n.cg-sidebar-nav-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-sidebar-nav-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-sidebar-nav-btn-active {\r\n color: var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n}\r\n\r\n.cg-floating-container {\r\n position: fixed;\r\n inset: 0;\r\n z-index: var(--cg-z-modal);\r\n pointer-events: none;\r\n visibility: hidden;\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] {\r\n pointer-events: auto;\r\n visibility: visible;\r\n}\r\n\r\n.cg-floating-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: var(--cg-overlay-bg);\r\n -webkit-backdrop-filter: blur(2px);\r\n backdrop-filter: blur(2px);\r\n opacity: 0;\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] .cg-floating-overlay {\r\n opacity: 1;\r\n}\r\n\r\n.cg-floating-panel {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(0.95);\r\n width: min(90vw, 1200px);\r\n height: min(85vh, 800px);\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-lg);\r\n box-shadow: var(--cg-shadow-lg);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n opacity: 0;\r\n transition: opacity var(--cg-transition), transform var(--cg-transition);\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] .cg-floating-panel {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(1);\r\n}\r\n\r\n.cg-floating-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 16px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-floating-header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-floating-header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.cg-floating-mode-badge {\r\n font-size: 10px;\r\n font-weight: 500;\r\n padding: 2px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-accent) 15%, transparent);\r\n color: var(--cg-accent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n}\r\n\r\n.cg-floating-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-floating-minimize {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 16px;\r\n line-height: 1;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-floating-minimize:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-floating-minimized-btn {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n box-shadow: 0 4px 12px color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n z-index: var(--cg-z-modal-action);\r\n transition: transform var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-floating-minimized-btn:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 6px 16px color-mix(in srgb, var(--cg-accent) 50%, transparent);\r\n}\r\n\r\n.cg-floating-close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 18px;\r\n line-height: 1;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-floating-close:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-floating-content {\r\n flex: 1;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n/* Context menu — right-click node menu */\r\n.cg-context-menu {\r\n min-width: 180px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px var(--cg-shadow-soft);\r\n padding: 4px 0;\r\n font-size: 13px;\r\n z-index: var(--cg-z-context-menu);\r\n}\r\n\r\n.cg-context-menu-item {\r\n display: block;\r\n width: 100%;\r\n padding: 6px 14px;\r\n background: transparent;\r\n border: none;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n text-align: left;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-context-menu-item:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-context-menu-item:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-context-menu-separator {\r\n height: 1px;\r\n margin: 2px 0;\r\n background: var(--cg-border);\r\n}\r\n\r\n/* Visual overlay bar (heatmap + TODO/FIXME combined) */\r\n.cg-overlay-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-overlay-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.cg-overlay-section--collapsed {\r\n padding: 0;\r\n}\r\n\r\n.cg-overlay-label {\r\n color: var(--cg-text-secondary);\r\n font-weight: 500;\r\n margin-right: 2px;\r\n}\r\n\r\n.cg-overlay-btn {\r\n padding: 2px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 11px;\r\n transition: background var(--cg-transition), color var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-overlay-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-overlay-btn.cg-active {\r\n background: var(--cg-accent-soft);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-overlay-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-overlay-btn--activate {\r\n font-weight: 500;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-overlay-divider {\r\n width: 1px;\r\n height: 14px;\r\n background: var(--cg-border);\r\n margin: 0 2px;\r\n flex-shrink: 0;\r\n}\r\n.cg-function-body-budget {\r\n display: flex;\r\n align-items: center;\r\n padding: 2px 8px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\n/* ── 璇玑图增量引擎健康信号(cycle-122,XJ-11 消费端收口)──────────────\n * 白盒透明化:增量命中量化(+N 路径)常显;规则降级染警示色。\n * 信号只在引擎真实跑过时出现(skipped/全量重建不显示——不伪造观测)。 */\n.cg-status-xuanji {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 11px;\n color: var(--cg-accent);\n cursor: help;\n}\n.cg-status-xuanji.cg-xuanji-degraded {\n color: var(--cg-warning);\n}\n","/* ---- Runtime layer panel (cycle-88, P2-1 three-layer independent panels) --- */\n/*\n * 运行时层是 `docs/图谱按需加载.md:196-200` 的第三层(Trace / 日志 / 性能排查),\n * 与结构层/行为层平级且各自独立预算。面板外壳复用 `.cg-analysis-panel`\n * (`src/client/styles/hotspot-godmodule-panel.css:3`),这里只定义本层特有的\n * 内容样式:时间窗口条、日志行、指标行。\n *\n * 刻意**不使用 `color-mix()`**:仓库约定每一个 `color-mix()` 用法都必须在\n * `color-mix-fallback.css` 里配一条 rgba 回退,而这里的着色需求用既有 token\n * (`--cg-success` / `--cg-warning` / `--cg-error` / `--cg-info` /\n * `--cg-accent-soft`)就能表达,少一处需要同步维护的成对文件。\n */\n\n.cg-runtime-panel {\n width: 280px;\n}\n\n.cg-runtime-count-badge {\n margin-left: auto;\n padding: 0 6px;\n border-radius: 8px;\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n}\n\n/* 时间窗口条:让「单次时间窗口 ≤ 5 分钟」这条预算在 UI 上可见 */\n.cg-runtime-window {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 4px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface-hover);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n.cg-runtime-window-label {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-window-value {\n font-family: var(--cg-font-mono);\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-runtime-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: 6px;\n padding-bottom: 2px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-runtime-section-title {\n flex-shrink: 0;\n}\n\n.cg-runtime-section-meta,\n.cg-runtime-level-counts {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n text-transform: none;\n letter-spacing: 0;\n}\n\n.cg-runtime-level-counts {\n display: inline-flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n\n/* 级别着色:与 Logger 的四个级别一一对应 */\n.cg-runtime-level-count.cg-debug { color: var(--cg-text-secondary); }\n.cg-runtime-level-count.cg-info { color: var(--cg-info); }\n.cg-runtime-level-count.cg-warn { color: var(--cg-warning); }\n.cg-runtime-level-count.cg-error { color: var(--cg-error); }\n\n.cg-runtime-level-filter {\n width: 100%;\n padding: 3px 6px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n/* 「共 N 条,已折叠为最近 M 条」——风险 8 要求 UI 明说数据被预算裁过 */\n.cg-runtime-truncated {\n padding: 3px 6px;\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-size: 10px;\n line-height: 1.5;\n}\n\n.cg-runtime-empty {\n padding: 12px 4px;\n text-align: center;\n}\n\n.cg-runtime-empty-title {\n font-size: 11px;\n color: var(--cg-text);\n}\n\n.cg-runtime-empty-hint {\n margin-top: 4px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-empty-line {\n padding: 6px 2px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-log-list,\n.cg-runtime-metric-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cg-runtime-log-row {\n display: grid;\n grid-template-columns: auto auto auto 1fr;\n align-items: baseline;\n gap: 6px;\n padding: 3px 4px;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n line-height: 1.45;\n}\n\n.cg-runtime-log-row:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-runtime-log-time {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n.cg-runtime-log-level {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.cg-runtime-log-level.cg-debug { color: var(--cg-text-secondary); }\n.cg-runtime-log-level.cg-info { color: var(--cg-info); }\n.cg-runtime-log-level.cg-warn { color: var(--cg-warning); }\n.cg-runtime-log-level.cg-error { color: var(--cg-error); }\n\n.cg-runtime-log-scope {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-accent);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-runtime-log-message {\n color: var(--cg-text);\n word-break: break-word;\n}\n\n.cg-runtime-log-row.cg-warn .cg-runtime-log-message { color: var(--cg-warning); }\n.cg-runtime-log-row.cg-error .cg-runtime-log-message { color: var(--cg-error); }\n\n.cg-runtime-metric-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n}\n\n.cg-runtime-metric-row:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-runtime-metric-name {\n font-family: var(--cg-font-mono);\n font-weight: 600;\n color: var(--cg-text);\n flex-shrink: 0;\n}\n\n.cg-runtime-metric-degraded {\n padding: 0 4px;\n border-radius: 6px;\n background: var(--cg-error);\n /* 前景色必须走既有 token:`tokensContract.test.ts:296-307` 禁止样式表里出现裸色值 */\n color: var(--cg-on-accent);\n font-size: 9px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n.cg-runtime-metric-values {\n display: inline-flex;\n gap: 6px;\n margin-left: auto;\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-metric-count {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* 诚实声明:本层未接入 Trace ID / 请求 ID 维度 */\n.cg-runtime-footnote {\n margin-top: 6px;\n padding-top: 6px;\n border-top: 1px solid var(--cg-border);\n font-size: 9px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n/* cycle-141 白盒可观测性计数区 */\n.cg-runtime-obs-section {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--cg-border);\n}\n\n.cg-runtime-obs-group {\n margin-bottom: 6px;\n}\n\n.cg-runtime-obs-group-label {\n font-size: 9px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-runtime-obs-items {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 2px;\n}\n\n.cg-runtime-obs-item {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n font-size: 9px;\n}\n\n.cg-runtime-obs-key {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-obs-value {\n color: var(--cg-accent);\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n/* ── cycle-142 可观测性流动可视化 ─────────────────────────────── */\n\n/* 分段色带容器:段绝对定位,宽度 = 占比 */\n.cg-runtime-flow-band {\n position: relative;\n height: 10px;\n margin-top: 4px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n overflow: hidden;\n}\n\n.cg-runtime-flow-seg {\n position: absolute;\n top: 0;\n height: 100%;\n min-width: 1px;\n}\n\n/* ETag 色带略高,三段对比更醒目 */\n.cg-runtime-flow-band-etag {\n height: 8px;\n}\n\n/* 管线阶段配色:只用 tokens.css 已定义的语义 token(裸色值与内联回退被\n tokensContract 守卫禁止)。数据流方向按 token 语义渐进:信息→强调→成功,\n 降级段用警示色;同色阶段以透明度区分先后。 */\n.cg-flow-stage-scan { background: var(--cg-info); }\n.cg-flow-stage-init { background: var(--cg-info); opacity: 0.8; }\n.cg-flow-stage-import { background: var(--cg-accent); opacity: 0.9; }\n.cg-flow-stage-dbread { background: var(--cg-accent); }\n.cg-flow-stage-merge { background: var(--cg-success); opacity: 0.9; }\n.cg-flow-stage-xuanjidelta { background: var(--cg-success); }\n.cg-flow-stage-xuanjidegraded { background: var(--cg-warning); }\n\n/* ETag 决策配色:200 正常 / 304 节省 / rejected 警示(token 语义对位) */\n.cg-flow-etag-200 { background: var(--cg-info); }\n.cg-flow-etag-304 { background: var(--cg-success); }\n.cg-flow-etag-rejected { background: var(--cg-error); }\n\n/* 无数据段(pct=null 的兜底渲染)淡化 */\n.cg-flow-seg-nodata { opacity: 0.25; }\n\n/* 管线图例 */\n.cg-runtime-flow-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 3px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-flow-legend-item {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n}\n\n.cg-flow-swatch {\n display: inline-block;\n width: 7px;\n height: 7px;\n border-radius: 2px;\n}\n\n/* 缓存命中率行 */\n.cg-runtime-flow-cache-list {\n display: flex;\n flex-direction: column;\n gap: 3px;\n margin-top: 4px;\n}\n\n.cg-runtime-flow-cache-row {\n display: grid;\n grid-template-columns: 58px 1fr 34px;\n align-items: center;\n gap: 6px;\n font-size: 9px;\n}\n\n.cg-runtime-flow-cache-name {\n color: var(--cg-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-runtime-flow-cache-bar {\n position: relative;\n height: 6px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n overflow: hidden;\n}\n\n.cg-runtime-flow-cache-fill {\n position: absolute;\n inset: 0 auto 0 0;\n border-radius: 3px;\n background: var(--cg-success);\n}\n\n.cg-runtime-flow-cache-value {\n color: var(--cg-text-secondary);\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n/* AST 预算用量 */\n.cg-runtime-flow-ast {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n font-size: 9px;\n}\n\n.cg-runtime-flow-ast-bar {\n flex: 0 0 72px;\n}\n\n.cg-runtime-flow-ast-text {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-flow-ast-extra {\n color: var(--cg-warning);\n}\n","/* ---- Version diff panel (cycle-104, research report §6 #13) ---------------- */\r\n/*\r\n * 版本对比面板:把 `/diff` 的「新增/修改/删除」三类变更标到画布上,并显示计数。\r\n * 外壳复用 `.cg-analysis-panel`(见 hotspot-godmodule-panel.css:3),这里只定义\r\n * 本面板特有的内容样式。\r\n *\r\n * 与 `runtime-panel.css` 同一条约定:**不使用 `color-mix()`**。仓库要求每个\r\n * `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退,而这里的三色\r\n * 语义用既有 token(--cg-success / --cg-warning / --cg-error / --cg-accent-soft)\r\n * 就能表达,少一处需要成对维护的文件。\r\n */\r\n\r\n.cg-diff-panel {\r\n width: 260px;\r\n}\r\n\r\n/* 输入表单:两个字段上下排(260px 宽度下并排会让 \"HEAD~1\" 这类引用被截断) */\r\n.cg-diff-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.cg-diff-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n\r\n.cg-diff-field-label {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-diff-input {\r\n width: 100%;\r\n padding: 3px 6px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.cg-diff-input:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-diff-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 2px;\r\n}\r\n\r\n.cg-diff-run-btn,\r\n.cg-diff-clear-btn {\r\n padding: 3px 10px;\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-diff-run-btn {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-diff-run-btn:disabled {\r\n opacity: 0.6;\r\n cursor: progress;\r\n}\r\n\r\n.cg-diff-clear-btn:hover,\r\n.cg-diff-run-btn:not(:disabled):hover {\r\n filter: brightness(1.08);\r\n}\r\n\r\n/* 失败提示:与「0 处变更」必须视觉可分,因此用 error token 独立成块 */\r\n.cg-diff-error {\r\n margin-top: 6px;\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-error);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-error);\r\n font-size: 11px;\r\n line-height: 1.4;\r\n}\r\n\r\n.cg-diff-empty {\r\n margin-top: 8px;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-range {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 8px;\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-range-from,\r\n.cg-diff-range-to {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-diff-range-arrow {\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-diff-counts {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n margin-top: 6px;\r\n}\r\n\r\n.cg-diff-count-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 2px 0;\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-badge {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-diff-badge-added { background: var(--cg-success); }\r\n.cg-diff-badge-modified { background: var(--cg-warning); }\r\n.cg-diff-badge-removed { background: var(--cg-error); }\r\n\r\n.cg-diff-count-label {\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-diff-count-value {\r\n margin-left: auto;\r\n font-family: var(--cg-font-mono);\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n/* 「已标记 / 未渲染」披露:这是本面板的诚实性条款,不隐藏、不折叠 */\r\n.cg-diff-marked {\r\n margin-top: 6px;\r\n padding: 4px 8px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n}\r\n\r\n.cg-diff-nochange {\r\n margin-top: 6px;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n font-style: italic;\r\n}\r\n\r\n/*\r\n 粒度披露(cycle-105 P0-D)。\r\n 这份 diff 是文件级的,必须常驻可见——它解释「为什么只亮了几个文件节点」。\r\n 刻意用最轻的视觉重量(次要色、无背景):它是一条事实说明,不是警告。\r\n*/\r\n.cg-diff-granularity {\r\n margin-top: 6px;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n opacity: 0.85;\r\n}\r\n\r\n/*\r\n 截断披露。\r\n 只在真的截断时渲染(JSX 侧已门控),因此这里可以用警告色:出现即意味着\r\n 「你看到的清单不是全部」,这需要用户主动注意,不能和粒度说明混在一起。\r\n\r\n 刻意**不用背景色**:本仓库的设计令牌里没有 `--cg-warning-soft`,而写一个\r\n 颜色字面色会同时违反 `tokensContract.test.ts`(禁止在非令牌文件里出现颜色字面量)\r\n 与主题切换(深色主题下该字面色不会跟着变)。左侧 2px 竖线 + 文字本身已经足够\r\n 把这个提示从周围内容里区分出来。\r\n*/\r\n.cg-diff-truncated {\r\n margin-top: 6px;\r\n padding: 4px 0 4px 8px;\r\n border-left: 2px solid var(--cg-warning);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n}\r\n","/* ---- 关键词图检索面板(cycle-111 / N-5)--------------------------------- */\r\n/*\r\n * 面板外壳复用 `.cg-analysis-panel`(`src/client/components/AnalysisPanelShell.tsx`),\r\n * 这里只定义本面板特有的内容样式:检索表单、种子列表、子图概要、截断提示、四态块。\r\n *\r\n * 与 `runtime-panel.css` / `diff-panel.css` 同一条约定:**不使用 `color-mix()`**。\r\n * 仓库要求每个 `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退,\r\n * 而这里的着色需求用既有 token(`--cg-accent-soft` / `--cg-success` / `--cg-warning` /\r\n * `--cg-error` / `--cg-text-secondary`)就能表达,少一处需要同步维护的成对文件。\r\n *\r\n * 窄档(`data-cg-narrow` / `@container graphpanel`)下**不把输入框收成 icon-only**:\r\n * 搜索是本面板的唯一核心操作(`docs/agents/01` 的常驻原则),把它藏进图标后面等于\r\n * 让用户在窄面板上找不到这个功能。收窄的是按钮文案与种子行的次要列。\r\n */\r\n\r\n.cg-keywordquery-panel {\r\n width: 300px;\r\n}\r\n\r\n.cg-keywordquery-count-badge {\r\n margin-left: auto;\r\n padding: 0 6px;\r\n border-radius: 8px;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n font-weight: 600;\r\n}\r\n\r\n.cg-keywordquery-body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n}\r\n\r\n/* ---- 检索表单 ---- */\r\n\r\n.cg-keywordquery-form {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n flex-shrink: 0;\r\n margin: 0;\r\n}\r\n\r\n.cg-keywordquery-input {\r\n flex: 1 1 120px;\r\n min-width: 0;\r\n padding: 4px 6px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-keywordquery-input:focus {\r\n outline: none;\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-keywordquery-input::placeholder {\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-submit,\r\n.cg-keywordquery-clear,\r\n.cg-keywordquery-retry {\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-submit {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-keywordquery-submit:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-keywordquery-submit:disabled,\r\n.cg-keywordquery-clear:disabled,\r\n.cg-keywordquery-retry:disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* ---- 阈值控件(cycle-120):深度 / token 预算的紧凑行内调节 ----\r\n 提交按钮之后、播报区之前,占据 form 的第二行(form 是纵向 flex)。\r\n 颜色/边框全部走既有 token,与面板其余部分同源;窄屏(面板 ≤300px)下\r\n 两项各占一半宽度自动换行是容器 flex-wrap 的自然行为,不需要断点。 */\r\n\r\n.cg-keywordquery-tuning {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 6px;\r\n align-items: center;\r\n}\r\n\r\n.cg-keywordquery-tune-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n flex: 1 1 0;\r\n min-width: 96px;\r\n}\r\n\r\n.cg-keywordquery-tune-name {\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-keywordquery-tune-input {\r\n width: 56px;\r\n padding: 2px 4px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-keywordquery-tune-input:focus-visible {\r\n outline: 1px solid var(--cg-accent);\r\n outline-offset: 0;\r\n}\r\n\r\n.cg-keywordquery-tune-input:disabled {\r\n opacity: 0.55;\r\n}\r\n\r\n/* ---- 屏幕阅读器播报区:视觉隐藏但保留在可访问树里 ---- */\r\n\r\n.cg-keywordquery-live {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n margin: -1px;\r\n padding: 0;\r\n overflow: hidden;\r\n clip: rect(0 0 0 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* ---- 四态 ---- */\r\n\r\n.cg-keywordquery-idle,\r\n.cg-keywordquery-empty {\r\n padding: 12px 4px;\r\n text-align: center;\r\n}\r\n\r\n.cg-keywordquery-idle-title,\r\n.cg-keywordquery-empty-title {\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-keywordquery-idle-hint,\r\n.cg-keywordquery-empty-hint {\r\n margin-top: 4px;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-loading {\r\n padding: 8px 4px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n text-align: center;\r\n}\r\n\r\n.cg-keywordquery-error,\r\n.cg-keywordquery-timeout {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 8px;\r\n border: 1px solid var(--cg-error);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n font-size: 10px;\r\n color: var(--cg-text);\r\n flex-shrink: 0;\r\n}\r\n\r\n/* 超时用 warning 而不是 error:它是\"这次太慢了\",不是\"这条路走不通\"。 */\r\n.cg-keywordquery-timeout {\r\n border-color: var(--cg-warning);\r\n}\r\n\r\n.cg-keywordquery-error-title,\r\n.cg-keywordquery-timeout-title {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n/* ---- 截断提示:graphify 原则「截断必须显式」 ---- */\r\n\r\n.cg-keywordquery-truncated {\r\n padding: 4px 6px;\r\n border-left: 3px solid var(--cg-warning);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.5;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* ---- 分区 ---- */\r\n\r\n.cg-keywordquery-section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 3px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-section-header {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding-bottom: 2px;\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.04em;\r\n}\r\n\r\n.cg-keywordquery-section-title {\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-section-meta {\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n font-weight: 500;\r\n color: var(--cg-text-secondary);\r\n text-transform: none;\r\n letter-spacing: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* ---- 种子列表 ---- */\r\n\r\n.cg-keywordquery-seed-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n max-height: 190px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-keywordquery-seed {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 6px;\r\n width: 100%;\r\n padding: 3px 4px;\r\n border: 1px solid transparent;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-keywordquery-seed:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n/* 2.4.7 / 2.4.11:键盘焦点必须可见(鼠标 hover 之外的第二条通道) */\r\n.cg-keywordquery-seed:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-keywordquery-seed.cg-active {\r\n border-color: var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n}\r\n\r\n.cg-keywordquery-seed-label {\r\n font-family: var(--cg-font-mono);\r\n font-weight: 600;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n min-width: 0;\r\n flex: 1 1 auto;\r\n}\r\n\r\n.cg-keywordquery-seed-score {\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-seed-terms {\r\n display: inline-flex;\r\n gap: 3px;\r\n flex-wrap: wrap;\r\n flex-shrink: 0;\r\n max-width: 45%;\r\n justify-content: flex-end;\r\n}\r\n\r\n/* 命中词:用 `<mark>` 的语义(用户可以在浏览器里高亮/朗读到),配色走 token。 */\r\n.cg-keywordquery-term {\r\n padding: 0 3px;\r\n border-radius: 3px;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent);\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n}\r\n\r\n.cg-keywordquery-seeds-empty {\r\n padding: 6px 2px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n/* ---- 子图概要 ---- */\r\n\r\n.cg-keywordquery-summary {\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n color: var(--cg-text);\r\n word-break: break-word;\r\n}\r\n\r\n.cg-keywordquery-summary-reason {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-reason.cg-truncated {\r\n color: var(--cg-warning);\r\n font-weight: 600;\r\n}\r\n\r\n/* ---- 原始文本 ---- */\r\n\r\n.cg-keywordquery-raw {\r\n border-top: 1px solid var(--cg-border);\r\n padding-top: 4px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-raw > summary {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.cg-keywordquery-raw-text {\r\n margin: 4px 0 0;\r\n padding: 4px 6px;\r\n max-height: 160px;\r\n overflow: auto;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n line-height: 1.45;\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n/* ---- 窄档:只收缩次要列,输入框与提交按钮始终可用 ---- */\r\n\r\n.cg-keywordquery-panel[data-cg-narrow] .cg-keywordquery-seed-terms,\r\n:where(.cg-graph-panel[data-cg-narrow]) .cg-keywordquery-seed-terms {\r\n display: none;\r\n}\r\n\r\n.cg-keywordquery-panel[data-cg-narrow] .cg-keywordquery-form,\r\n:where(.cg-graph-panel[data-cg-narrow]) .cg-keywordquery-form {\r\n gap: 3px;\r\n}\r\n\r\n/* 窄档下\"清空\"退成图标级宽度语义靠文字长度自然完成(不改为 icon-only,\r\n 理由见文件头:搜索是核心操作,不允许从界面上消失)。 */\r\n","/* ---- 璇玑图 ρ 路径模式面板(cycle-135)------------------------------------- */\n/*\n * 面板外壳复用 `.cg-analysis-panel`(`src/client/components/AnalysisPanelShell.tsx`),\n * 这里只定义本面板特有的内容样式:ρ 输入表单、路径列表、五态块、截断提示、翻页按钮。\n *\n * 与 `keyword-query-panel.css` 同一条约定:**不使用 `color-mix()`**。\n * 仓库要求每个 `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退;\n * 这里的着色需求用既有 token(`--cg-accent-soft` / `--cg-success` / `--cg-warning` /\n * `--cg-error` / `--cg-text-secondary`)就能表达,少一处需要同步维护的成对文件。\n *\n * 窄档(`data-cg-narrow` / `@container graphpanel`)下**不把输入框收成 icon-only**:\n * ρ 是本面板的唯一核心操作,把它藏进图标后面等于让用户在窄面板上找不到这个功能。\n * 收窄的是按钮文案与路径行的次要列。\n */\n\n.cg-pathpattern-panel {\n width: 300px;\n}\n\n.cg-pathpattern-count-badge {\n margin-left: auto;\n padding: 0 6px;\n border-radius: 8px;\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n}\n\n.cg-pathpattern-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n/* ---- 输入表单 ---- */\n\n.cg-pathpattern-form {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n flex-shrink: 0;\n margin: 0;\n}\n\n.cg-pathpattern-input {\n flex: 1 1 120px;\n min-width: 0;\n padding: 4px 6px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 11px;\n font-family: var(--cg-font-mono);\n}\n\n.cg-pathpattern-input:focus {\n outline: none;\n border-color: var(--cg-accent);\n}\n\n.cg-pathpattern-input::placeholder {\n color: var(--cg-text-secondary);\n}\n\n.cg-pathpattern-submit,\n.cg-pathpattern-clear,\n.cg-pathpattern-retry,\n.cg-pathpattern-more {\n padding: 4px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-submit {\n background: var(--cg-accent);\n border-color: var(--cg-accent);\n color: var(--cg-on-accent);\n font-weight: 600;\n}\n\n.cg-pathpattern-submit:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n}\n\n.cg-pathpattern-submit:disabled,\n.cg-pathpattern-clear:disabled,\n.cg-pathpattern-retry:disabled,\n.cg-pathpattern-more:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n/* ---- 控件行(起点/终点/跳数/上限)-----------------------------------------\n 提交按钮之后、播报区之前,占据 form 的第二行(form 是纵向 flex)。\n 颜色/边框全部走既有 token,与面板其余部分同源;窄屏下各占一半宽度自动换行\n 是容器 flex-wrap 的自然行为,不需要断点。 */\n\n.cg-pathpattern-tuning {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n width: 100%;\n}\n\n.cg-pathpattern-tune-item {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1 1 0;\n min-width: 88px;\n}\n\n.cg-pathpattern-tune-name {\n color: var(--cg-text-secondary);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n white-space: nowrap;\n}\n\n.cg-pathpattern-tune-input {\n width: 100%;\n min-width: 0;\n padding: 2px 4px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 10px;\n font-family: var(--cg-font-mono);\n}\n\n.cg-pathpattern-tune-input:focus-visible {\n outline: 1px solid var(--cg-accent);\n outline-offset: 0;\n}\n\n.cg-pathpattern-tune-input:disabled {\n opacity: 0.55;\n}\n\n/* ---- 屏幕阅读器播报区:视觉隐藏但保留在可访问树里 ---- */\n\n.cg-pathpattern-live {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* ---- 五态(外加 idle) ---- */\n\n.cg-pathpattern-idle,\n.cg-pathpattern-empty {\n padding: 12px 4px;\n text-align: center;\n}\n\n.cg-pathpattern-idle-title,\n.cg-pathpattern-empty-title {\n font-size: 11px;\n color: var(--cg-text);\n}\n\n.cg-pathpattern-idle-hint,\n.cg-pathpattern-empty-hint {\n margin-top: 4px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n.cg-pathpattern-loading {\n padding: 8px 4px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n text-align: center;\n}\n\n/*\n * 拼错类型名(`unknown-types`)与语法错误(`invalid`)用**不同的边框色**:\n * 前者是「改拼写」,后者是「改语法」。两者在画面上都可能是一行红字,\n * 只靠文案区分会让色盲用户与扫读用户都读不出来。\n */\n.cg-pathpattern-unknown,\n.cg-pathpattern-invalid,\n.cg-pathpattern-notfound,\n.cg-pathpattern-error,\n.cg-pathpattern-timeout,\n.cg-pathpattern-syntax-error {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n padding: 6px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n font-size: 10px;\n color: var(--cg-text);\n flex-shrink: 0;\n}\n\n.cg-pathpattern-unknown {\n border-color: var(--cg-warning);\n}\n\n.cg-pathpattern-invalid {\n border-color: var(--cg-error);\n}\n\n/*\n * 逐键语法预检的诊断(cycle-136)。与 `invalid` 终态的诊断共用 `.cg-pathpattern-diagnostic`,\n * 但它是一个**输入框下的即时提示**而不是一块终态,所以这里只给它边框色,布局由基类承担。\n */\n.cg-pathpattern-syntax-error {\n border-color: var(--cg-error);\n}\n\n/*\n * Σ 提示条(cycle-136):动态取自宿主的类型名 chips。\n *\n * 用次级文字色而不是正文色:它是**可选参考**(用户能从宿主拿到完整 Σ),\n * 不是必须阅读的正文。chips 用 mono 字体与输入框里的类型名对齐,\n * 让用户「看到 chip」就能直接照着打。\n */\n.cg-pathpattern-sigma {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n padding: 4px 0 0;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-sigma-label {\n color: var(--cg-text-secondary);\n font-size: 9px;\n font-weight: 600;\n}\n\n/*\n * cycle-139:chip 从 span 变成 button(点击插入)。\n * 按钮默认样式全部复位(border/background/font 继承既有 chip 观感),\n * hover/active/focus-visible 给出可点击反馈;disabled(枚举进行中)降透明度。\n */\n.cg-pathpattern-sigma-chip {\n padding: 1px 5px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n cursor: pointer;\n line-height: 1.4;\n}\n\n.cg-pathpattern-sigma-chip:hover:not(:disabled) {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-pathpattern-sigma-chip:active:not(:disabled) {\n background: var(--cg-surface-hover, var(--cg-surface));\n}\n\n.cg-pathpattern-sigma-chip:focus-visible {\n outline: 1px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-pathpattern-sigma-chip:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.cg-pathpattern-notfound {\n border-color: var(--cg-info);\n}\n\n.cg-pathpattern-error {\n border-color: var(--cg-error);\n}\n\n/* 超时用 warning 而不是 error:它是\"这次太慢了\",不是\"这条路走不通\"。 */\n.cg-pathpattern-timeout {\n border-color: var(--cg-warning);\n}\n\n.cg-pathpattern-unknown-title,\n.cg-pathpattern-invalid-title,\n.cg-pathpattern-notfound-title,\n.cg-pathpattern-error-title,\n.cg-pathpattern-timeout-title {\n font-weight: 600;\n}\n\n.cg-pathpattern-unknown-hint,\n.cg-pathpattern-notfound-hint {\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n/*\n * 语法诊断用等宽 `<pre>` 原样渲染(含宿主给的 `^` 指位)。它的字号比正文更小,\n * 让用户先读\"错在哪\"再看整段 ρ。\n */\n.cg-pathpattern-diagnostic {\n margin: 0;\n padding: 4px 6px;\n max-height: 120px;\n overflow: auto;\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-all;\n width: 100%;\n}\n\n/* ---- 截断提示:graphify 原则「截断必须显式」 ---- */\n\n.cg-pathpattern-truncated {\n padding: 4px 6px;\n border-left: 3px solid var(--cg-warning);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-size: 10px;\n line-height: 1.5;\n flex-shrink: 0;\n}\n\n/* ---- 结果区 ---- */\n\n.cg-pathpattern-section {\n display: flex;\n flex-direction: column;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-section-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n padding-bottom: 2px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-pathpattern-section-title {\n flex-shrink: 0;\n}\n\n.cg-pathpattern-no-paths {\n padding: 6px 2px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n/* ---- 路径列表 ---- */\n\n.cg-pathpattern-path-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: 0;\n padding: 0;\n list-style: none;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cg-pathpattern-path-list li {\n display: flex;\n align-items: baseline;\n gap: 6px;\n padding: 2px 4px;\n border: 1px solid transparent;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n}\n\n.cg-pathpattern-path-list li:hover {\n background: var(--cg-surface-hover);\n}\n\n/* 2.4.7 / 2.4.11:键盘焦点必须可见(鼠标 hover 之外的第二条通道) */\n.cg-pathpattern-path-list li:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-pathpattern-path-labels {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-pathpattern-path-hops {\n flex-shrink: 0;\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n}\n\n.cg-pathpattern-more {\n align-self: flex-start;\n margin-top: 2px;\n}\n\n/* ---- 窄档:只收缩次要列,输入框与提交按钮始终可用 ---- */\n\n.cg-pathpattern-panel[data-cg-narrow] .cg-pathpattern-form,\n:where(.cg-graph-panel[data-cg-narrow]) .cg-pathpattern-form {\n gap: 3px;\n}\n\n.cg-pathpattern-panel[data-cg-narrow] .cg-pathpattern-tune-item,\n:where(.cg-graph-panel[data-cg-narrow]) .cg-pathpattern-tune-item {\n min-width: 80px;\n}\n\n/* 窄档下\"清空\"退成图标级宽度语义靠文字长度自然完成(不改为 icon-only,\n 理由见文件头:ρ 是核心操作,不允许从界面上消失)。 */\n","/**\n * GraphManagePanel 样式(cycle-141)。\n *\n * 只使用 tokens.css 中已定义的 token(`--cg-bg` / `--cg-bg-elevated` /\n * `--cg-text` / `--cg-text-secondary` / `--cg-accent` / `--cg-border` /\n * `--cg-border-strong` / `--cg-success` / `--cg-warning` / `--cg-error`)。\n * 不引入颜色 fallback(tokensContract 禁止 stylesheets 中出现带颜色字面量的 var() 调用)。\n */\n\n/* ── 面板容器 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: var(--cg-bg-elevated);\n color: var(--cg-text);\n font-size: 13px;\n line-height: 1.5;\n}\n\n/* ── 头部 ────────────────────────────────────────────────────────────────── */\n\n.cg-manage-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.cg-manage-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n}\n\n.cg-manage-header .cg-close-btn {\n background: none;\n border: none;\n color: var(--cg-text-secondary);\n font-size: 18px;\n cursor: pointer;\n padding: 0 4px;\n line-height: 1;\n}\n\n.cg-manage-header .cg-close-btn:hover {\n color: var(--cg-text);\n}\n\n/* ── 工作区信息 ──────────────────────────────────────────────────────────── */\n\n.cg-manage-workspace {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-label {\n font-size: 11px;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-path {\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--cg-accent);\n word-break: break-all;\n}\n\n/* ── 操作按钮 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.cg-manage-actions .cg-btn {\n padding: 6px 14px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.cg-manage-actions .cg-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cg-manage-actions .cg-btn-primary {\n background: var(--cg-accent);\n color: var(--cg-bg);\n border-color: var(--cg-accent);\n}\n\n.cg-manage-actions .cg-btn-primary:hover:not(:disabled) {\n filter: brightness(1.15);\n}\n\n.cg-manage-actions .cg-btn-secondary {\n background: var(--cg-bg);\n color: var(--cg-text);\n border-color: var(--cg-border);\n}\n\n.cg-manage-actions .cg-btn-secondary:hover:not(:disabled) {\n border-color: var(--cg-accent);\n}\n\n.cg-manage-actions .cg-btn-danger {\n background: transparent;\n color: var(--cg-error);\n border-color: var(--cg-error);\n}\n\n.cg-manage-actions .cg-btn-danger:hover:not(:disabled) {\n background: var(--cg-bg);\n}\n\n.cg-manage-actions .cg-btn-ghost {\n background: transparent;\n color: var(--cg-text-secondary);\n border: 1px dashed var(--cg-border);\n}\n\n.cg-manage-actions .cg-btn-ghost:hover:not(:disabled) {\n color: var(--cg-text);\n border-color: var(--cg-text-secondary);\n}\n\n/* ── 状态卡片 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-status {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-status-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.cg-manage-status-value {\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-manage-status-value.cg-status-ready { color: var(--cg-success); }\n.cg-manage-status-value.cg-status-building { color: var(--cg-warning); }\n.cg-manage-status-value.cg-status-error { color: var(--cg-error); }\n.cg-manage-status-value.cg-status-idle { color: var(--cg-text-secondary); }\n\n/* ── 指标卡片 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-metrics {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-metrics-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-manage-metric-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n}\n\n.cg-manage-metric {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 6px 8px;\n background: var(--cg-bg-elevated);\n border: 1px solid var(--cg-border);\n border-radius: 3px;\n}\n\n.cg-manage-metric-label {\n font-size: 10px;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-metric-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--cg-accent);\n}\n\n/* ── Top 列表 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-top-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.cg-manage-top-title {\n margin: 0;\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-top-items {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 150px;\n overflow-y: auto;\n}\n\n.cg-manage-top-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 6px;\n border-radius: 3px;\n font-size: 11px;\n}\n\n.cg-manage-top-item:hover {\n background: var(--cg-bg-elevated);\n}\n\n.cg-manage-top-rank {\n color: var(--cg-text-secondary);\n min-width: 24px;\n}\n\n.cg-manage-top-id {\n flex: 1;\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n color: var(--cg-text);\n word-break: break-all;\n}\n\n.cg-manage-top-value {\n color: var(--cg-accent);\n font-weight: 600;\n min-width: 50px;\n text-align: right;\n}\n\n/* ── Loading & Warning ────────────────────────────────────────────────────── */\n\n.cg-manage-loading {\n padding: 8px;\n color: var(--cg-text-secondary);\n font-size: 12px;\n text-align: center;\n}\n\n.cg-manage-warning {\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-warning);\n border-radius: 4px;\n color: var(--cg-warning);\n font-size: 12px;\n}\n\n/* ── 删除确认(内联两步确认) ────────────────────────────────────────────── */\n\n.cg-manage-confirm {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-error);\n border-radius: 4px;\n}\n\n.cg-manage-confirm-text {\n flex: 1;\n min-width: 200px;\n color: var(--cg-error);\n font-size: 12px;\n}\n\n/* ── 白盒信息 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-whitebox {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-whitebox-title {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-whitebox-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n\n.cg-manage-whitebox-value {\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--cg-text);\n word-break: break-all;\n text-align: right;\n}\n\n.cg-manage-truncation {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-top: 6px;\n border-top: 1px dashed var(--cg-border);\n}\n\n.cg-manage-truncation-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 4px 12px;\n}\n\n.cg-manage-metric-grid--extra {\n margin-top: 8px;\n}\n\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/oBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACryBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxQA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACjHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AClOA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrWA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvKA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC19BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AC9aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;ACtcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
1
+ {"version":3,"file":"index.css","names":[],"sources":["src/client/styles/views-panel.css","src/client/styles/tokens.css","src/client/styles/layout.css","src/client/styles/overlays.css","src/client/styles/graph.css","src/client/styles/node-detail.css","src/client/styles/import-workspace.css","src/client/styles/path-finder.css","src/client/styles/health-score-card.css","src/client/styles/rule-config-panel.css","src/client/styles/hotspot-godmodule-panel.css","src/client/styles/impact-panel.css","src/client/styles/cycle-panel.css","src/client/styles/deadcode-panel.css","src/client/styles/registry-panel.css","src/client/styles/tour-panel.css","src/client/styles/responsive.css","src/client/styles/misc.css","src/client/styles/runtime-panel.css","src/client/styles/diff-panel.css","src/client/styles/keyword-query-panel.css","src/client/styles/path-pattern-panel.css","src/client/styles/graph-manage-panel.css"],"sourcesContent":["/* ---- cycle-141 workstream E: Π 视图划分面板(ViewsPanel) ----\n * 只消费 `tokens.css` 的设计令牌(`--cg-*`),不出现任何原始色值或\n * 带色值回退的 var() 写法——由 `tests/unit/tokensContract.test.ts` 守。\n * 四个视图的语义色借用既有令牌:结构=accent、时序=info、所有权=warning、领域=success。\n */\n\n/* —— 状态行(加载 / 错误 / 未构建)—— */\n\n.cg-views-state {\n padding: 12px 10px;\n font-size: 12px;\n line-height: 1.6;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-state-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--cg-error);\n}\n\n.cg-views-state-empty {\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-retry {\n padding: 2px 8px;\n font-size: 11px;\n color: var(--cg-text);\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n cursor: pointer;\n transition: background-color var(--cg-transition), border-color var(--cg-transition);\n}\n\n.cg-views-retry:hover {\n background: var(--cg-surface-active);\n}\n\n/* —— 四张视图摘要卡 —— */\n\n.cg-views-cards {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n margin-bottom: 10px;\n}\n\n.cg-views-card {\n padding: 8px 8px 6px;\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n border-left: 3px solid var(--cg-accent);\n}\n\n.cg-views-card-temporal { border-left-color: var(--cg-info); }\n.cg-views-card-ownership { border-left-color: var(--cg-warning); }\n.cg-views-card-domain { border-left-color: var(--cg-success); }\n\n.cg-views-card-off {\n opacity: 0.72;\n border-style: dashed;\n}\n\n.cg-views-card-title {\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.03em;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n}\n\n.cg-views-card-count {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-top: 2px;\n font-family: var(--cg-font-mono);\n font-size: 16px;\n font-weight: 700;\n color: var(--cg-accent);\n}\n\n.cg-views-card-temporal .cg-views-card-count { color: var(--cg-info); }\n.cg-views-card-ownership .cg-views-card-count { color: var(--cg-warning); }\n.cg-views-card-domain .cg-views-card-count { color: var(--cg-success); }\n\n.cg-views-card-unit {\n font-family: var(--cg-font-sans);\n font-size: 9px;\n font-weight: 400;\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-card-hint {\n margin-top: 2px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-card-reason {\n margin-top: 2px;\n font-size: 9px;\n color: var(--cg-warning);\n}\n\n/* —— 通用分节 —— */\n\n.cg-views-section {\n margin-bottom: 10px;\n}\n\n.cg-views-section-title {\n margin: 0 0 6px;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--cg-text-tertiary);\n}\n\n/* —— 视图分布条 —— */\n\n.cg-views-bar {\n display: flex;\n width: 100%;\n height: 10px;\n overflow: hidden;\n background: var(--cg-surface-active);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-bar-seg {\n height: 100%;\n min-width: 2px;\n transition: width var(--cg-transition-slow);\n}\n\n.cg-views-bar-structural { background: var(--cg-accent); }\n.cg-views-bar-temporal { background: var(--cg-info); }\n.cg-views-bar-ownership { background: var(--cg-warning); }\n.cg-views-bar-domain { background: var(--cg-success); }\n\n.cg-views-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 10px;\n margin-top: 5px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-legend-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cg-views-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-dot-structural { background: var(--cg-accent); }\n.cg-views-dot-temporal { background: var(--cg-info); }\n.cg-views-dot-ownership { background: var(--cg-warning); }\n.cg-views-dot-domain { background: var(--cg-success); }\n\n/* —— 节点视图矩阵 —— */\n\n.cg-views-sampled {\n margin-bottom: 6px;\n padding: 4px 6px;\n font-size: 9px;\n color: var(--cg-warning);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-empty {\n padding: 10px 8px;\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-matrix {\n max-height: 240px;\n overflow: auto;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-views-matrix-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) repeat(4, 30px);\n align-items: center;\n gap: 4px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-matrix-row:last-child {\n border-bottom: none;\n}\n\n.cg-views-matrix-head {\n position: sticky;\n top: 0;\n z-index: 1;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n background: var(--cg-surface-active);\n}\n\n.cg-views-matrix-id {\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-views-cell {\n text-align: center;\n font-family: var(--cg-font-mono);\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-cell-on {\n color: var(--cg-accent);\n font-weight: 700;\n}\n\n/* —— 领域分解 —— */\n\n.cg-views-domains {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 180px;\n overflow: auto;\n}\n\n.cg-views-domain {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-domain:last-child {\n border-bottom: none;\n}\n\n.cg-views-domain-name {\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-views-domain-count {\n font-family: var(--cg-font-mono);\n color: var(--cg-text-secondary);\n}\n\n/* —— 页脚 —— */\n\n.cg-views-footnote {\n margin-top: 8px;\n padding-top: 6px;\n font-size: 9px;\n color: var(--cg-text-tertiary);\n border-top: 1px solid var(--cg-border);\n}\n\n/* —— 时序窗口工具条(cycle-145 T2)—— */\n\n.cg-views-window {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 8px;\n}\n\n.cg-views-window-label {\n font-size: 10px;\n color: var(--cg-text-secondary);\n margin-right: 2px;\n}\n\n.cg-views-window-btn {\n padding: 2px 8px;\n font-size: 10px;\n font-family: inherit;\n color: var(--cg-text-secondary);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n cursor: pointer;\n}\n\n.cg-views-window-btn:hover {\n color: var(--cg-text);\n border-color: var(--cg-text-tertiary);\n}\n\n.cg-views-window-btn-active {\n color: var(--cg-on-accent);\n background: var(--cg-accent);\n border-color: var(--cg-accent);\n}\n\n/* —— 数据来源披露区(cycle-145 T1)—— */\n\n.cg-views-sources {\n display: flex;\n flex-direction: column;\n}\n\n.cg-views-source-row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n padding: 3px 6px;\n font-size: 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-views-source-row:last-child {\n border-bottom: none;\n}\n\n.cg-views-source-name {\n flex: 0 0 auto;\n min-width: 56px;\n color: var(--cg-text-secondary);\n}\n\n.cg-views-source-value {\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-views-source-value-off {\n color: var(--cg-text-tertiary);\n}\n\n.cg-views-source-reason {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","/* ============================================================================\r\n * DSH CodeGraph Visualizer — Modern UI Styles\r\n * Follows dsh-web-ui design tokens (--dsw-* CSS custom properties).\r\n * WCAG 2.2 AA compliant contrast, backdrop-blur glassmorphism, smooth motion.\r\n * ============================================================================ */\r\n\r\n:root {\r\n /* DSH theme bridge — consume host --dsw-* tokens with safe fallbacks.\r\n * DSH does not expose CSS custom properties; fallbacks below match the\r\n * actual computed values from DSH's light theme (measured via DevTools). */\r\n --cg-bg: var(--dsw-bg, #ffffff);\r\n --cg-surface: var(--dsw-surface, #f9fafb);\r\n --cg-surface-hover: var(--dsw-surface-hover, #f3f4f6);\r\n --cg-surface-active: var(--dsw-surface-active, #e5e7eb);\r\n --cg-bg-elevated: var(--dsw-bg-elevated, #ffffff);\r\n --cg-border: var(--dsw-border, rgba(0, 0, 0, 0.04));\r\n --cg-border-strong: var(--dsw-border-strong, rgba(0, 0, 0, 0.1));\r\n --cg-text: var(--dsw-fg, #0f1115);\r\n --cg-text-secondary: var(--dsw-fg-secondary, #61666b);\r\n --cg-text-tertiary: var(--dsw-fg-tertiary, #4d5156);\r\n --cg-accent: var(--dsw-accent, #263148);\r\n --cg-accent-hover: var(--dsw-accent-hover, #1a2230);\r\n --cg-accent-soft: var(--dsw-accent-soft, rgba(38, 49, 72, 0.1));\r\n --cg-on-accent: var(--dsw-on-accent, #ffffff);\r\n --cg-success: #10b981;\r\n --cg-warning: #f59e0b;\r\n --cg-error: #ef4444;\r\n --cg-info: #3b82f6;\r\n --cg-cycle-highlight: #e74c3c;\r\n\r\n /* Dead-code analysis — panel accents (badge / border / highlight). */\r\n --cg-deadcode-highlight: #e74c3c;\r\n --cg-deadcode-confirmed: #e74c3c;\r\n --cg-deadcode-suspected: #f39c12;\r\n\r\n /* Dead-code analysis — canvas node palette. These are read through\r\n * `readCssVarCached('--cg-deadcode-node…')` in\r\n * `src/client/renderer/styles/ThemeStylesheet.ts`, whose fallback literals are\r\n * locked to these values by `tests/unit/tokensContract.test.ts`. */\r\n --cg-deadcode-node: #9ca3af;\r\n --cg-deadcode-node-border: #6b7280;\r\n --cg-deadcode-node-suspected: #d1d5db;\r\n --cg-deadcode-node-suspected-border: #9ca3af;\r\n\r\n /* Tour step layer palette — guided-tour legend chips and step badges. */\r\n --cg-tour-layer-entry: #4caf50;\r\n --cg-tour-layer-api: #2196f3;\r\n --cg-tour-layer-service: #ff9800;\r\n --cg-tour-layer-data: #9c27b0;\r\n --cg-tour-layer-ui: #e91e63;\r\n --cg-tour-layer-utility: #607d8b;\r\n\r\n /* Node type semantic colors — light theme */\r\n --cg-node-default: #263148;\r\n --cg-node-function: #059669;\r\n --cg-node-function-text: #047857;\r\n --cg-node-class: #1a2230;\r\n --cg-node-variable: #d97706;\r\n --cg-node-module: #db2777;\r\n --cg-node-interface: #0d9488;\r\n --cg-node-type: #7c3aed;\r\n --cg-node-dep-npm: #cc3535;\r\n --cg-node-dep-cargo: #ce422b;\r\n --cg-node-dep-gomod: #007d9b;\r\n --cg-node-dep-pip: #3776ab;\r\n --cg-node-package: #263148;\r\n\r\n /* CFG / flowchart semantic colors — light theme */\r\n --cg-cfg-loop: #7c3aed;\r\n --cg-cfg-switch: #ec4899;\r\n --cg-cfg-try: #3b82f6;\r\n --cg-cfg-finally: #10b981;\r\n --cg-cfg-process: #3b82f6;\r\n --cg-cfg-subprocess: #f59e0b;\r\n\r\n /* Sequence diagram semantic colors — light theme */\r\n --cg-seq-external: #db2777;\r\n --cg-seq-fragment: #263148;\r\n --cg-seq-async: #f59e0b;\r\n /* 时序图网格线 / 片段底色(原先在 TS 里硬编码 rgba(0,0,0,0.03),深色下不可见) */\r\n --cg-seq-grid: rgba(0, 0, 0, 0.03);\r\n\r\n /* Package diagram semantic colors — light theme */\r\n --cg-package-border: #1a2230;\r\n --cg-edge-package: #263148;\r\n\r\n /* Edge type semantic colors — light theme */\r\n --cg-edge-default: rgba(0, 0, 0, 0.1);\r\n --cg-edge-call: #3b82f6;\r\n --cg-edge-import: #10b981;\r\n --cg-edge-extend: #ec4899;\r\n --cg-edge-implement: #0d9488;\r\n --cg-edge-dependency: #f59e0b;\r\n --cg-edge-contains: #7c3aed;\r\n --cg-edge-dep-prod: #f59e0b;\r\n --cg-edge-dep-dev: #3b82f6;\r\n --cg-edge-dep-peer: #10b981;\r\n --cg-edge-dep-optional: #7c3aed;\r\n /* UML relation kinds that are not package-manager edges. */\r\n --cg-edge-aggregation: #6366f1;\r\n --cg-edge-composition: #db2777;\r\n\r\n /* Highlight / analysis colors — light theme */\r\n --cg-hover-border: #1a2230;\r\n --cg-impact-d1: #f59e0b;\r\n --cg-impact-d2: #fbbf24;\r\n --cg-impact-d3: #fde68a;\r\n --cg-inheritance-extend: #ec4899;\r\n --cg-inheritance-implement: #14b8a6;\r\n --cg-cluster-bg: rgba(38, 49, 72, 0.10);\r\n --cg-cluster-border: #263148;\r\n --cg-cluster-hover-bg: rgba(38, 49, 72, 0.25);\r\n --cg-cluster-hover-border: #1a2230;\r\n --cg-cluster-edge: #263148;\r\n --cg-cluster-edge-label-bg: #f9fafb;\r\n\r\n /* Cluster hue colors — light theme */\r\n --cg-cluster-hue-0-bg: rgba(99,102,241,0.10);\r\n --cg-cluster-hue-0-border: #6366f1;\r\n --cg-cluster-hue-1-bg: rgba(16,185,129,0.10);\r\n --cg-cluster-hue-1-border: #10b981;\r\n --cg-cluster-hue-2-bg: rgba(236,72,153,0.10);\r\n --cg-cluster-hue-2-border: #ec4899;\r\n --cg-cluster-hue-3-bg: rgba(245,158,11,0.10);\r\n --cg-cluster-hue-3-border: #f59e0b;\r\n --cg-cluster-hue-4-bg: rgba(6,182,212,0.10);\r\n --cg-cluster-hue-4-border: #06b6d4;\r\n --cg-cluster-hue-5-bg: rgba(168,85,247,0.10);\r\n --cg-cluster-hue-5-border: #8b5cf6;\r\n --cg-cluster-hue-6-bg: rgba(239,68,68,0.10);\r\n --cg-cluster-hue-6-border: #ef4444;\r\n --cg-cluster-hue-7-bg: rgba(132,204,22,0.10);\r\n --cg-cluster-hue-7-border: #84cc16;\r\n --cg-cluster-hue-8-bg: rgba(251,113,133,0.10);\r\n --cg-cluster-hue-8-border: #f43f5e;\r\n --cg-cluster-hue-9-bg: rgba(96,165,250,0.10);\r\n --cg-cluster-hue-9-border: #3b82f6;\r\n --cg-cluster-hue-10-bg: rgba(52,211,153,0.10);\r\n --cg-cluster-hue-10-border: #14b8a6;\r\n --cg-cluster-hue-11-bg: rgba(251,191,36,0.10);\r\n --cg-cluster-hue-11-border: #eab308;\r\n\r\n /* Node role semantic colors — light theme */\r\n --cg-role-entry: #059669;\r\n --cg-role-orphan: #9ca3af;\r\n --cg-role-leaf: #d97706;\r\n --cg-role-hub: #dc2626;\r\n\r\n /* Heatmap gradient colors — light theme */\r\n --cg-heatmap-stable: #10b981;\r\n --cg-heatmap-unstable: #ef4444;\r\n --cg-heatmap-low: #3b82f6;\r\n --cg-heatmap-high: #ef4444;\r\n\r\n /* Typography — match DSH's actual font stack including CJK fonts */\r\n --cg-font-sans: var(--dsw-font-sans, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Helvetica Neue\", Helvetica, Arial, sans-serif);\r\n --cg-font-mono: var(--dsw-font-mono, \"JetBrains Mono\", \"Fira Code\", Consolas, \"Microsoft YaHei\", monospace);\r\n\r\n /* Elevation */\r\n --cg-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);\r\n --cg-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\r\n --cg-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.14);\r\n --cg-shadow-active: 0 1px 4px rgba(0, 0, 0, 0.3);\r\n --cg-overlay-bg: rgba(0, 0, 0, 0.3);\r\n /* Neutral shadow tints for `box-shadow` / `filter: drop-shadow` that need a\r\n * bare colour instead of one of the composed elevation tokens above. */\r\n --cg-shadow-soft: rgba(0, 0, 0, 0.15);\r\n --cg-shadow-strong: rgba(0, 0, 0, 0.2);\r\n\r\n /* Radii */\r\n --cg-radius: 12px;\r\n --cg-radius-sm: 8px;\r\n --cg-radius-xs: 4px;\r\n --cg-radius-lg: 16px;\r\n\r\n /* Motion */\r\n --cg-ease: cubic-bezier(0.4, 0, 0.2, 1);\r\n --cg-ease-out: cubic-bezier(0, 0, 0.2, 1);\r\n --cg-transition: 180ms var(--cg-ease);\r\n --cg-transition-slow: 280ms var(--cg-ease);\r\n\r\n /* Layout */\r\n --cg-toolbar-h: 44px;\r\n --cg-statusbar-h: 28px;\r\n --cg-panel-min-h: 240px;\r\n\r\n /* Z-index hierarchy — semantic layers.\r\n * Each layer has a clear purpose; values are spaced to allow\r\n * fine-tuning within a layer without crossing into the next.\r\n * 0–4 stay free so a future base layer can be inserted without renumbering. */\r\n --cg-z-canvas-ui: 5;\r\n --cg-z-panel: 10;\r\n --cg-z-panel-stack: 15;\r\n --cg-z-dropdown: 20;\r\n --cg-z-search: 25;\r\n --cg-z-overlay: 30;\r\n --cg-z-resize: 35;\r\n --cg-z-modal: 50;\r\n --cg-z-modal-action: 55;\r\n --cg-z-context-menu: 60;\r\n\r\n /* Portal layers — 浮层被 portal 到 document.body 后不再受面板 contain/overflow 约束,\r\n * 因此必须压过 DSH 宿主外壳自身的 chrome。实测宿主外壳最高层级为 40,\r\n * 故 portal 子阶梯从 50 起(与 --cg-z-modal 同起点,靠数值区分先后)。\r\n * 悬浮提示原先的 --cg-z-tooltip(40) 已随 portal 化并入此子阶梯,故不再单列。\r\n * 定位钩子由组件在 layout 阶段写入行内自定义属性,媒体查询仍可覆盖。 */\r\n --cg-z-portal-tooltip: 50;\r\n --cg-z-portal-dropdown: 55;\r\n --cg-portal-left: auto;\r\n --cg-portal-top: auto;\r\n --cg-portal-bottom: auto;\r\n --cg-portal-width: auto;\r\n}\r\n\r\n/* DSH Dark theme — activated when body[data-ds-dark-theme] is set.\r\n * Values measured from DSH's actual dark theme via DevTools. */\r\nbody[data-ds-dark-theme] {\r\n --cg-bg: var(--dsw-bg, #151517);\r\n --cg-surface: var(--dsw-surface, #232324);\r\n --cg-surface-hover: var(--dsw-surface-hover, #2a2a2c);\r\n --cg-surface-active: var(--dsw-surface-active, #333335);\r\n --cg-bg-elevated: var(--dsw-bg-elevated, #2a2a2c);\r\n --cg-border: var(--dsw-border, rgba(255, 255, 255, 0.08));\r\n --cg-border-strong: var(--dsw-border-strong, rgba(255, 255, 255, 0.14));\r\n --cg-text: var(--dsw-fg, #f9fafb);\r\n --cg-text-secondary: var(--dsw-fg-secondary, #cfd3d6);\r\n --cg-text-tertiary: var(--dsw-fg-tertiary, #a8acb0);\r\n --cg-accent: var(--dsw-accent, #6366f1);\r\n --cg-accent-hover: var(--dsw-accent-hover, #5457e5);\r\n --cg-accent-soft: var(--dsw-accent-soft, rgba(99, 102, 241, 0.12));\r\n --cg-on-accent: var(--dsw-on-accent, #ffffff);\r\n\r\n /* Semantic status colors — dark theme */\r\n --cg-success: #34d399;\r\n --cg-warning: #fbbf24;\r\n --cg-error: #f87171;\r\n --cg-info: #60a5fa;\r\n --cg-cycle-highlight: #ff6b6b;\r\n\r\n /* Dead-code analysis — dark theme (panel accents + canvas node palette) */\r\n --cg-deadcode-highlight: #f87171;\r\n --cg-deadcode-confirmed: #f87171;\r\n --cg-deadcode-suspected: #fbbf24;\r\n --cg-deadcode-node: #6b7280;\r\n --cg-deadcode-node-border: #4b5563;\r\n --cg-deadcode-node-suspected: #9ca3af;\r\n --cg-deadcode-node-suspected-border: #6b7280;\r\n\r\n /* Tour step layer palette — dark theme (brighter Material-400 weights) */\r\n --cg-tour-layer-entry: #66bb6a;\r\n --cg-tour-layer-api: #42a5f5;\r\n --cg-tour-layer-service: #ffa726;\r\n --cg-tour-layer-data: #ab47bc;\r\n --cg-tour-layer-ui: #ec407a;\r\n --cg-tour-layer-utility: #78909c;\r\n\r\n /* Node type semantic colors — dark theme */\r\n --cg-node-default: #6366f1;\r\n --cg-node-function: #10b981;\r\n --cg-node-function-text: #34d399;\r\n --cg-node-class: #818cf8;\r\n --cg-node-variable: #f59e0b;\r\n --cg-node-module: #ec4899;\r\n --cg-node-interface: #14b8a6;\r\n --cg-node-type: #a78bfa;\r\n --cg-node-dep-npm: #cb3837;\r\n --cg-node-dep-cargo: #dea584;\r\n --cg-node-dep-gomod: #00add8;\r\n --cg-node-dep-pip: #3776ab;\r\n --cg-node-package: #6366f1;\r\n\r\n /* CFG / flowchart semantic colors — dark theme */\r\n --cg-cfg-loop: #a78bfa;\r\n --cg-cfg-switch: #f472b6;\r\n --cg-cfg-try: #60a5fa;\r\n --cg-cfg-finally: #34d399;\r\n --cg-cfg-process: #60a5fa;\r\n --cg-cfg-subprocess: #fbbf24;\r\n\r\n /* Sequence diagram semantic colors — dark theme */\r\n --cg-seq-external: #ec4899;\r\n --cg-seq-fragment: #818cf8;\r\n --cg-seq-async: #fbbf24;\r\n --cg-seq-grid: rgba(255, 255, 255, 0.03);\r\n\r\n /* Package diagram semantic colors — dark theme */\r\n --cg-package-border: #818cf8;\r\n --cg-edge-package: #818cf8;\r\n\r\n /* Edge type semantic colors — dark theme */\r\n --cg-edge-default: rgba(255, 255, 255, 0.14);\r\n --cg-edge-call: #60a5fa;\r\n --cg-edge-import: #34d399;\r\n --cg-edge-extend: #f472b6;\r\n --cg-edge-implement: #2dd4bf;\r\n --cg-edge-dependency: #fbbf24;\r\n --cg-edge-contains: #a78bfa;\r\n --cg-edge-dep-prod: #fbbf24;\r\n --cg-edge-dep-dev: #60a5fa;\r\n --cg-edge-dep-peer: #34d399;\r\n --cg-edge-dep-optional: #a78bfa;\r\n --cg-edge-aggregation: #818cf8;\r\n --cg-edge-composition: #ec4899;\r\n\r\n /* Highlight / analysis colors — dark theme */\r\n --cg-hover-border: #818cf8;\r\n --cg-impact-d1: #f59e0b;\r\n --cg-impact-d2: #fbbf24;\r\n --cg-impact-d3: #fde68a;\r\n --cg-inheritance-extend: #f472b6;\r\n --cg-inheritance-implement: #2dd4bf;\r\n --cg-cluster-bg: rgba(99, 102, 241, 0.15);\r\n --cg-cluster-border: #818cf8;\r\n --cg-cluster-hover-bg: rgba(99, 102, 241, 0.35);\r\n --cg-cluster-hover-border: #a5b4fc;\r\n --cg-cluster-edge: #818cf8;\r\n --cg-cluster-edge-label-bg: #232324;\r\n\r\n /* Cluster hue colors — dark theme */\r\n --cg-cluster-hue-0-bg: rgba(99,102,241,0.15);\r\n --cg-cluster-hue-0-border: #818cf8;\r\n --cg-cluster-hue-1-bg: rgba(16,185,129,0.15);\r\n --cg-cluster-hue-1-border: #34d399;\r\n --cg-cluster-hue-2-bg: rgba(236,72,153,0.15);\r\n --cg-cluster-hue-2-border: #f472b6;\r\n --cg-cluster-hue-3-bg: rgba(245,158,11,0.15);\r\n --cg-cluster-hue-3-border: #fbbf24;\r\n --cg-cluster-hue-4-bg: rgba(6,182,212,0.15);\r\n --cg-cluster-hue-4-border: #22d3ee;\r\n --cg-cluster-hue-5-bg: rgba(168,85,247,0.15);\r\n --cg-cluster-hue-5-border: #a78bfa;\r\n --cg-cluster-hue-6-bg: rgba(239,68,68,0.15);\r\n --cg-cluster-hue-6-border: #f87171;\r\n --cg-cluster-hue-7-bg: rgba(132,204,22,0.15);\r\n --cg-cluster-hue-7-border: #a3e635;\r\n --cg-cluster-hue-8-bg: rgba(251,113,133,0.15);\r\n --cg-cluster-hue-8-border: #fb7185;\r\n --cg-cluster-hue-9-bg: rgba(96,165,250,0.15);\r\n --cg-cluster-hue-9-border: #60a5fa;\r\n --cg-cluster-hue-10-bg: rgba(52,211,153,0.15);\r\n --cg-cluster-hue-10-border: #34d399;\r\n --cg-cluster-hue-11-bg: rgba(251,191,36,0.15);\r\n --cg-cluster-hue-11-border: #fbbf24;\r\n\r\n /* Node role semantic colors — dark theme */\r\n --cg-role-entry: #10b981;\r\n --cg-role-orphan: #6b7280;\r\n --cg-role-leaf: #f59e0b;\r\n --cg-role-hub: #ef4444;\r\n\r\n /* Heatmap gradient colors — dark theme */\r\n --cg-heatmap-stable: #10b981;\r\n --cg-heatmap-unstable: #ef4444;\r\n --cg-heatmap-low: #60a5fa;\r\n --cg-heatmap-high: #ef4444;\r\n\r\n --cg-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.18);\r\n --cg-shadow: 0 4px 16px rgba(0, 0, 0, 0.28);\r\n --cg-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.36);\r\n --cg-shadow-active: 0 1px 4px rgba(0, 0, 0, 0.5);\r\n --cg-overlay-bg: rgba(0, 0, 0, 0.5);\r\n}\r\n\r\nbody[data-ds-dark-theme] .cg-filter-select,\r\nbody[data-ds-dark-theme] .cg-depth-select {\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.cg-w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23a8acb0' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E\");\r\n}\r\nbody[data-ds-dark-theme] .cg-filter-select option,\r\nbody[data-ds-dark-theme] .cg-depth-select option {\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n}\r\n/* Theme transition — smooth color shift when toggling light/dark */\r\n.cg-graph-panel,\r\n.cg-graph-panel > *,\r\n.cg-floating-panel,\r\n.cg-floating-panel > * {\r\n transition: background-color 280ms var(--cg-ease),\r\n color 280ms var(--cg-ease),\r\n border-color 280ms var(--cg-ease),\r\n box-shadow 280ms var(--cg-ease);\r\n}\r\n","/* ---- Panel container ------------------------------------------------------ */\r\n\r\n.cg-graph-panel {\r\n position: relative;\r\n box-sizing: border-box;\r\n width: 100%;\r\n height: 100%;\r\n min-height: var(--cg-panel-min-h, 240px);\r\n\r\n display: flex;\r\n flex-direction: column;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow-lg);\r\n overflow: hidden;\r\n pointer-events: auto;\r\n font-family: var(--cg-font-sans);\r\n color: var(--cg-text);\r\n transition:\r\n opacity var(--cg-transition),\r\n transform var(--cg-transition);\r\n contain: layout paint style;\r\n container-type: inline-size;\r\n container-name: graphpanel;\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed {\r\n width: 52px;\r\n height: 52px;\r\n /* Integration modes set `min-height: 200px` on the panel (responsive.css);\r\n * without this the collapsed FAB would be stretched to the minimum height. */\r\n min-height: 52px;\r\n border-radius: 50%;\r\n box-shadow: var(--cg-shadow);\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed .cg-graph-toolbar,\r\n.cg-graph-panel.cg-collapsed .cg-graph-container,\r\n.cg-graph-panel.cg-collapsed .cg-search-bar,\r\n.cg-graph-panel.cg-collapsed .cg-loading-overlay,\r\n.cg-graph-panel.cg-collapsed .cg-error-overlay,\r\n.cg-graph-panel.cg-collapsed .cg-empty-state,\r\n.cg-graph-panel.cg-collapsed .cg-node-detail-panel,\r\n.cg-graph-panel.cg-collapsed .cg-status-bar,\r\n.cg-graph-panel.cg-collapsed .cg-resize-handle,\r\n.cg-graph-panel.cg-collapsed .cg-mini-map {\r\n display: none;\r\n}\r\n\r\n.cg-graph-panel.cg-collapsed .cg-collapse-fab {\r\n display: flex;\r\n}\r\n\r\n/* ---- Collapse FAB --------------------------------------------------------- */\r\n\r\n.cg-collapse-fab {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n cursor: pointer;\r\n font-size: 22px;\r\n color: var(--cg-text);\r\n user-select: none;\r\n transition: transform var(--cg-transition);\r\n}\r\n\r\n.cg-collapse-fab:hover {\r\n transform: scale(1.08);\r\n}\r\n/* ---- Toolbar ------------------------------------------------------------- */\r\n\r\n.cg-graph-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n min-height: var(--cg-toolbar-h);\r\n padding: 4px 10px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n flex-wrap: nowrap;\r\n overflow-x: auto;\r\n overflow-y: visible;\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--cg-border-strong) transparent;\r\n /* The toolbar is persistent chrome: it must stay above the empty / loading / error\r\n overlays (which are absolutely positioned with z-index: var(--cg-z-overlay)) so its\r\n controls remain visible and clickable while the graph area has no data. Without a\r\n stacking context here the overlays cover the whole panel, toolbar included.\r\n `overflow-y: visible` computes to `auto` while `overflow-x` is `auto`, so this box\r\n used to clip its own dropdowns (J0: a 231.6px menu showed only 3px). Dropdown\r\n contents are now portalled to document.body and no longer live inside this box,\r\n which keeps horizontal scrolling intact without the clipping. */\r\n position: relative;\r\n z-index: calc(var(--cg-z-overlay) + 1);\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar {\r\n height: 3px;\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.cg-graph-toolbar::-webkit-scrollbar-thumb {\r\n background: var(--cg-border-strong);\r\n border-radius: 2px;\r\n}\r\n\r\n\r\n.cg-toolbar-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: nowrap;\r\n font-variant-numeric: tabular-nums;\r\n /* Measured at 420px panel width: the toolbar used to overflow by 72px and push\r\n `.cg-more-btn` / `.cg-collapse-btn` out of the visible area. The stats text is\r\n the right thing to sacrifice, so it truncates instead of forcing the row wider. */\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.cg-toolbar-center {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1;\r\n justify-content: center;\r\n /* The center group is the flexible one: it may be squeezed (and clipped) before the\r\n right group — export / more / collapse, the controls the panel cannot live\r\n without — is pushed past the edge. */\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-toolbar-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 3px;\r\n}\r\n\r\n.cg-toolbar-separator {\r\n width: 1px;\r\n height: 18px;\r\n background: var(--cg-border);\r\n opacity: 0.6;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Compact toolbars drop the group separators. They are pure decoration and cost the\r\n center group ~18px of the width it needs between the compact (768px) and narrow\r\n (480px) tiers. Driven by the measured `data-cg-compact` flag rather than a media\r\n query, because a media query sees the viewport, not the DSH panel's width. */\r\n.cg-graph-toolbar[data-cg-compact] .cg-toolbar-separator {\r\n display: none;\r\n}\r\n\r\n/* The center group's own visibility is decided by `responsive.css`\r\n `@container graphpanel (max-width: 600px)`: it needs 150px for its three icon-only\r\n triggers, and a container query measures the panel width directly — including on hosts\r\n where `ResizeObserver` is missing and the measured flags stay false. */\r\n\r\n.cg-node-count {\r\n font-weight: 600;\r\n letter-spacing: 0.01em;\r\n}\r\n\r\n.cg-node-count .cg-dot-sep {\r\n color: var(--cg-text-tertiary);\r\n margin: 0 4px;\r\n}\r\n\r\n/* ---- Type badges (node type stats in toolbar) ---------------------------- */\r\n\r\n.cg-type-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 1px 6px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n font-family: var(--cg-font-mono);\r\n border-radius: var(--cg-radius-xs);\r\n letter-spacing: 0.02em;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-type-badge.cg-function {\r\n background: color-mix(in srgb, var(--cg-success) 14%, transparent);\r\n color: var(--cg-node-function-text);\r\n}\r\n\r\nbody[data-ds-dark-theme] .cg-type-badge.cg-function {\r\n color: var(--cg-node-function-text);\r\n}\r\n\r\n.cg-type-badge.cg-class {\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-type-badge.cg-interface {\r\n background: color-mix(in srgb, var(--cg-node-interface) 14%, transparent);\r\n color: var(--cg-node-interface);\r\n}\r\n\r\n/* ---- Layout switcher (segmented control) --------------------------------- */\r\n\r\n.cg-layout-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-layout-btn {\r\n padding: 3px 8px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n text-transform: capitalize;\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-layout-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-layout-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n/* ---- Dagre rank direction switcher --------------------------------------- */\r\n\r\n.cg-rank-dir-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-rank-dir-btn {\r\n padding: 3px 6px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), color var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-rank-dir-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-rank-dir-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n}\r\n\r\n/* ---- Graph type switcher (segmented control) ----------------------------- */\r\n\r\n.cg-graph-type-buttons {\r\n display: flex;\r\n gap: 2px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 2px;\r\n}\r\n\r\n.cg-graph-type-btn {\r\n padding: 3px 8px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 500;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-graph-type-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-graph-type-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-mode-buttons {\r\n display: inline-flex;\r\n gap: 2px;\r\n margin-left: 4px;\r\n}\r\n\r\n.cg-view-mode-btn {\r\n padding: 3px 8px;\r\n border: 1px solid var(--cg-border);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 600;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n margin-left: 2px;\r\n}\r\n\r\n.cg-view-mode-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-view-mode-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-mode-divider {\r\n display: inline-block;\r\n width: 1px;\r\n height: 16px;\r\n background: var(--cg-border);\r\n margin: 0 4px;\r\n vertical-align: middle;\r\n}\r\n\r\n.cg-view-mode-btn--micro {\r\n border-style: dashed;\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-view-mode-btn--micro.cg-active {\r\n border-style: solid;\r\n opacity: 1;\r\n}\r\n\r\n.cg-view-mode-btn--micro:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n border-style: dotted;\r\n}\r\n\r\n.cg-layer-selector {\r\n display: inline-flex;\r\n gap: 2px;\r\n margin-left: 4px;\r\n align-items: center;\r\n}\r\n\r\n.cg-layer-btn {\r\n padding: 3px 6px;\r\n border: 1px solid var(--cg-border);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 700;\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n min-width: 28px;\r\n text-align: center;\r\n}\r\n\r\n.cg-layer-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-layer-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-hierarchy-selector {\r\n display: inline-flex;\r\n gap: 1px;\r\n margin-left: 4px;\r\n align-items: center;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n}\r\n\r\n.cg-hierarchy-btn {\r\n padding: 4px 7px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: var(--cg-transition);\r\n font-family: var(--cg-font-sans);\r\n min-width: 30px;\r\n text-align: center;\r\n}\r\n\r\n.cg-hierarchy-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-hierarchy-btn.cg-active {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n}\r\n\r\n/* ---- Select -------------------------------------------------------------- */\r\n\r\n.cg-filter-select,\r\n.cg-depth-select {\r\n padding: 5px 24px 5px 8px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n outline: none;\r\n appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.cg-w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%239ca0b8' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 8px center;\r\n transition: border-color var(--cg-transition);\r\n}\r\n\r\n.cg-filter-select:hover,\r\n.cg-depth-select:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-select:focus-visible,\r\n.cg-depth-select:focus-visible {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 2px var(--cg-accent-soft);\r\n}\r\n\r\n/* ---- Icon buttons -------------------------------------------------------- */\r\n\r\n.cg-icon-btn,\r\n.cg-search-btn,\r\n.cg-theme-btn,\r\n.cg-export-btn,\r\n.cg-collapse-btn,\r\n.cg-chain-btn,\r\n.cg-cycle-btn,\r\n.cg-impact-btn,\r\n.cg-inheritance-btn,\r\n.cg-minimap-btn,\r\n.cg-refresh-btn,\r\n.cg-undo-btn,\r\n.cg-redo-btn,\r\n.cg-import-btn,\r\n.cg-legend-btn,\r\n.cg-lang-btn,\r\n.cg-pathfind-btn,\r\n.cg-health-btn,\r\n.cg-rules-btn,\r\n.cg-hotspot-btn,\r\n.cg-godmodule-btn,\r\n.cg-corefunction-btn {\r\n width: 28px;\r\n height: 28px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n position: relative;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-icon-btn:hover,\r\n.cg-search-btn:hover,\r\n.cg-theme-btn:hover,\r\n.cg-export-btn:hover,\r\n.cg-collapse-btn:hover,\r\n.cg-chain-btn:hover,\r\n.cg-cycle-btn:hover,\r\n.cg-impact-btn:hover,\r\n.cg-inheritance-btn:hover,\r\n.cg-minimap-btn:hover,\r\n.cg-refresh-btn:hover,\r\n.cg-undo-btn:hover,\r\n.cg-redo-btn:hover,\r\n.cg-import-btn:hover,\r\n.cg-legend-btn:hover,\r\n.cg-lang-btn:hover,\r\n.cg-pathfind-btn:hover,\r\n.cg-health-btn:hover,\r\n.cg-rules-btn:hover,\r\n.cg-hotspot-btn:hover,\r\n.cg-godmodule-btn:hover,\r\n.cg-corefunction-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-icon-btn:focus-visible,\r\n.cg-search-btn:focus-visible,\r\n.cg-theme-btn:focus-visible,\r\n.cg-export-btn:focus-visible,\r\n.cg-collapse-btn:focus-visible,\r\n.cg-chain-btn:focus-visible,\r\n.cg-cycle-btn:focus-visible,\r\n.cg-impact-btn:focus-visible,\r\n.cg-inheritance-btn:focus-visible,\r\n.cg-minimap-btn:focus-visible,\r\n.cg-refresh-btn:focus-visible,\r\n.cg-undo-btn:focus-visible,\r\n.cg-redo-btn:focus-visible,\r\n.cg-import-btn:focus-visible,\r\n.cg-legend-btn:focus-visible,\r\n.cg-lang-btn:focus-visible,\r\n.cg-pathfind-btn:focus-visible,\r\n.cg-health-btn:focus-visible,\r\n.cg-rules-btn:focus-visible,\r\n.cg-hotspot-btn:focus-visible,\r\n.cg-godmodule-btn:focus-visible,\r\n.cg-corefunction-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.cg-icon-btn.cg-active,\r\n.cg-search-btn.cg-active,\r\n.cg-chain-btn.cg-active,\r\n.cg-cycle-btn.cg-active,\r\n.cg-impact-btn.cg-active,\r\n.cg-inheritance-btn.cg-active,\r\n.cg-minimap-btn.cg-active,\r\n.cg-import-btn.cg-active,\r\n.cg-legend-btn.cg-active,\r\n.cg-lang-btn.cg-active,\r\n.cg-pathfind-btn.cg-active,\r\n.cg-health-btn.cg-active,\r\n.cg-rules-btn.cg-active,\r\n.cg-hotspot-btn.cg-active,\r\n.cg-godmodule-btn.cg-active,\r\n.cg-corefunction-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n/* ---- Export menu --------------------------------------------------------- */\r\n\r\n.cg-export-menu {\r\n position: relative;\r\n}\r\n\r\n/* 下拉内容被 portal 到 document.body,脱离工具栏与面板的裁剪链;\r\n * 位置由组件写入 --cg-portal-* 行内自定义属性,\r\n * 因此这里不写 inline 可覆盖的 left/top,窄面板抽屉由 .cg-portal-drawer 接管。 */\r\n.cg-export-dropdown {\r\n position: fixed;\r\n left: var(--cg-portal-left, auto);\r\n top: var(--cg-portal-top, auto);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n z-index: var(--cg-z-portal-dropdown);\r\n min-width: 120px;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-dropdown-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-export-dropdown button {\r\n padding: 7px 14px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-export-dropdown button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n/* ---- Dropdown menu (analysis & quality groups) --------------------------- */\r\n\r\n.cg-dropdown-menu {\r\n position: relative;\r\n}\r\n\r\n.cg-tools-dropdown-btn,\r\n.cg-search-standalone-btn,\r\n.cg-data-dropdown-btn,\r\n.cg-history-dropdown-btn,\r\n.cg-more-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n width: auto;\r\n min-width: 28px;\r\n height: 28px;\r\n padding: 0 4px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-tools-dropdown-btn:hover,\r\n.cg-search-standalone-btn:hover,\r\n.cg-data-dropdown-btn:hover,\r\n.cg-history-dropdown-btn:hover,\r\n.cg-more-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tools-dropdown-btn.cg-active,\r\n.cg-search-standalone-btn.cg-active,\r\n.cg-data-dropdown-btn.cg-active,\r\n.cg-history-dropdown-btn.cg-active,\r\n.cg-more-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-tools-dropdown-btn:focus-visible,\r\n.cg-search-standalone-btn:focus-visible,\r\n.cg-data-dropdown-btn:focus-visible,\r\n.cg-history-dropdown-btn:focus-visible,\r\n.cg-more-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* 与 .cg-export-dropdown 同理:内容 portal 到 body,靠自定义属性定位。 */\r\n.cg-dropdown-content {\r\n position: fixed;\r\n left: var(--cg-portal-left, auto);\r\n top: var(--cg-portal-top, auto);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n z-index: var(--cg-z-portal-dropdown);\r\n min-width: 160px;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n/* 窄面板抽屉形态:内容 portal 到 body 后不再是 `.cg-graph-panel` 的后代,\r\n * `@container graphpanel (max-width: 320px)` 的底部抽屉规则无法命中,\r\n * 故由 Dropdown 组件测量面板宽度后加 `.cg-portal-drawer` 并写定位变量。 */\r\n.cg-portal-drawer {\r\n /* 宽度由组件按「面板宽 - 两侧内缩」写入,若沿用默认 content-box,\r\n * 内边距与边框会把这 309px 撑成 318.6px 并溢出面板右侧,故改 border-box。 */\r\n box-sizing: border-box;\r\n left: var(--cg-portal-left, auto);\r\n right: auto;\r\n top: auto;\r\n bottom: var(--cg-portal-bottom, auto);\r\n width: var(--cg-portal-width, auto);\r\n min-width: unset;\r\n max-height: 60vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-dropdown-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 7px 12px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n width: 100%;\r\n}\r\n\r\n.cg-dropdown-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-dropdown-item.cg-active {\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-dropdown-item:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-dropdown-separator {\r\n height: 1px;\r\n background: var(--cg-border);\r\n margin: 4px 2px;\r\n opacity: 0.6;\r\n}\r\n\r\n.cg-dropdown-section-label {\r\n padding: 4px 12px 2px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n user-select: none;\r\n}\r\n\r\n.cg-dropdown-item:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-dropdown-item:disabled:hover {\r\n background: transparent;\r\n}\r\n\r\n.cg-view-dropdown-btn,\r\n.cg-layout-dropdown-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n height: 28px;\r\n padding: 0 8px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-sm);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-view-dropdown-btn:hover,\r\n.cg-layout-dropdown-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-view-dropdown-btn.cg-active,\r\n.cg-layout-dropdown-btn.cg-active {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent-hover);\r\n color: var(--cg-on-accent);\r\n box-shadow: var(--cg-shadow-active);\r\n}\r\n\r\n.cg-view-dropdown-btn:focus-visible,\r\n.cg-layout-dropdown-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.cg-view-dropdown {\r\n min-width: 140px;\r\n}\r\n/* ---- Search bar ---------------------------------------------------------- */\r\n\r\n.cg-search-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 12px;\r\n background: var(--cg-bg);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n position: relative;\r\n animation: cg-slide-down 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-down {\r\n from { opacity: 0; transform: translateY(-8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-search-bar input {\r\n flex: 1;\r\n padding: 7px 12px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 13px;\r\n font-family: var(--cg-font-sans);\r\n outline: none;\r\n transition: border-color var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-search-bar input:focus {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\r\n}\r\n\r\n.cg-search-bar input::placeholder {\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-search-bar button {\r\n width: 30px;\r\n height: 30px;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 13px;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-search-bar button:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-search-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n margin-left: 4px;\r\n font-family: var(--cg-font-mono);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-results {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-search);\r\n list-style: none;\r\n margin: 0;\r\n padding: 4px 0;\r\n}\r\n\r\n.cg-search-result-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-search-result-item:hover,\r\n.cg-search-result-item:focus,\r\n.cg-search-result-item.cg-active {\r\n background: var(--cg-surface-hover);\r\n outline: none;\r\n}\r\n\r\n.cg-search-result-type {\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n color: var(--cg-text-tertiary);\r\n background: var(--cg-bg);\r\n padding: 2px 6px;\r\n border-radius: var(--cg-radius-sm);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-search-result-label {\r\n font-size: 13px;\r\n color: var(--cg-text);\r\n font-weight: 500;\r\n flex-shrink: 0;\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* cycle-132:「索引命中」徽标——该条来自 /query 远程索引回退(本地显示层未命中)。 */\r\n.cg-search-remote-badge {\r\n font-size: 10px;\r\n color: var(--cg-accent);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-sm);\r\n padding: 1px 5px;\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-result-path {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-search-result-more {\r\n padding: 6px 12px;\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n}\r\n/* ---- Status bar ---------------------------------------------------------- */\r\n\r\n.cg-status-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n height: var(--cg-statusbar-h);\r\n padding: 0 12px;\r\n background: var(--cg-surface);\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n.cg-status-bar .cg-status-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot {\r\n width: 7px;\r\n height: 7px;\r\n border-radius: 50%;\r\n background: var(--cg-success);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot.cg-loading {\r\n background: var(--cg-warning);\r\n animation: cg-pulse 1s ease-in-out infinite;\r\n}\r\n\r\n.cg-status-bar .cg-status-dot.cg-error {\r\n background: var(--cg-error);\r\n}\r\n\r\n.cg-status-bar .cg-status-workspace {\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n padding: 0 6px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n}\r\n\r\n/* cycle-130 · T2:数据来源徽章——上游索引 / 原生扫描 白盒透出。 */\r\n.cg-status-bar .cg-status-graph-layer {\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n padding: 0 6px;\r\n border-left: 1px solid var(--cg-border);\r\n color: var(--cg-text-tertiary);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-graph-layer--native {\r\n color: var(--cg-warning);\r\n}\r\n\r\n.cg-status-bar .cg-status-truncated {\r\n color: var(--cg-warning);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n cursor: help;\r\n}\r\n\r\n.cg-status-bar .cg-status-degradation {\r\n color: var(--cg-warning);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-left: 1px solid var(--cg-border);\r\n margin-left: 4px;\r\n cursor: help;\r\n max-width: 300px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-status-bar .cg-status-spacer {\r\n flex: 1;\r\n}\r\n\r\n.cg-status-github {\r\n display: flex;\r\n align-items: center;\r\n color: var(--cg-text-tertiary);\r\n text-decoration: none;\r\n padding: 0 4px;\r\n border-radius: 3px;\r\n transition: color 0.15s ease;\r\n}\r\n\r\n.cg-status-github:hover {\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-status-bar .cg-status-time {\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n}\r\n/* ---- Resize handle ------------------------------------------------------- */\r\n\r\n/* Host-sized integration modes drop `cg-resizable`, so the handle must not linger as an\r\n * unstyled empty block inside the panel's flex column. */\r\n.cg-graph-panel:not(.cg-resizable) .cg-resize-handle {\r\n display: none;\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle {\r\n position: absolute;\r\n width: 18px;\r\n height: 18px;\r\n bottom: 0;\r\n right: 0;\r\n cursor: nwse-resize;\r\n z-index: var(--cg-z-resize);\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 4px;\r\n right: 4px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid var(--cg-text-tertiary);\r\n border-bottom: 2px solid var(--cg-text-tertiary);\r\n transition: border-color var(--cg-transition);\r\n}\r\n\r\n.cg-graph-panel.cg-resizable .cg-resize-handle:hover::after {\r\n border-right-color: var(--cg-accent);\r\n border-bottom-color: var(--cg-accent);\r\n}\r\n\r\n/* ---- Scrollbar styling --------------------------------------------------- */\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar,\r\n.cg-mini-map::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-track,\r\n.cg-mini-map::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-thumb,\r\n.cg-mini-map::-webkit-scrollbar-thumb {\r\n background: var(--cg-border-strong);\r\n border-radius: 3px;\r\n}\r\n\r\n.cg-node-detail-panel::-webkit-scrollbar-thumb:hover,\r\n.cg-mini-map::-webkit-scrollbar-thumb:hover {\r\n background: var(--cg-text-tertiary);\r\n}\r\n/* ---- Panel stack containers (prevent overlapping) ------------------------- */\r\n\r\n.cg-panel-stack {\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n z-index: var(--cg-z-panel-stack);\r\n pointer-events: none;\r\n}\r\n\r\n.cg-panel-stack > * {\r\n pointer-events: auto;\r\n}\r\n\r\n.cg-panel-stack-left {\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n}\r\n\r\n.cg-panel-stack-right {\r\n right: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n align-items: flex-end;\r\n}\r\n\r\n.cg-panel-stack-left .cg-path-bar,\r\n.cg-panel-stack-left .cg-health-score-card,\r\n.cg-panel-stack-left .cg-rule-panel,\r\n.cg-panel-stack-left .cg-node-detail-panel,\r\n.cg-panel-stack-left .cg-legend-panel,\r\n.cg-panel-stack-left .cg-import-panel,\r\n.cg-panel-stack-left .cg-search-bar {\r\n position: relative;\r\n left: auto;\r\n top: auto;\r\n}\r\n\r\n.cg-panel-stack-right .cg-analysis-panel,\r\n.cg-panel-stack-right .cg-impact-panel,\r\n.cg-panel-stack-right .cg-cycle-panel,\r\n.cg-panel-stack-right .cg-filter-panel,\r\n.cg-panel-stack-right .cg-mini-map {\r\n position: relative;\r\n right: auto;\r\n top: auto;\r\n bottom: auto;\r\n}\r\n","/* ---- Overlays (loading / error / empty) ---------------------------------- */\r\n\r\n.cg-error-boundary-fallback {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n gap: 14px;\r\n background: var(--cg-bg);\r\n z-index: var(--cg-z-overlay);\r\n padding: 24px;\r\n}\r\n\r\n.cg-error-boundary-fallback h3 {\r\n margin: 0;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--cg-error);\r\n}\r\n\r\n.cg-error-boundary-fallback p {\r\n margin: 0;\r\n font-size: 13px;\r\n color: var(--cg-text-secondary);\r\n text-align: center;\r\n max-width: 320px;\r\n word-break: break-word;\r\n}\r\n\r\n.cg-error-boundary-fallback button {\r\n padding: 6px 16px;\r\n border-radius: var(--cg-radius-xs);\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-error-boundary-fallback button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-loading-overlay,\r\n.cg-error-overlay,\r\n.cg-empty-state {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n gap: 14px;\r\n background: var(--cg-bg);\r\n z-index: var(--cg-z-overlay);\r\n}\r\n\r\n.cg-loading-overlay {\r\n opacity: 0.9;\r\n -webkit-backdrop-filter: blur(4px);\r\n backdrop-filter: blur(4px);\r\n}\r\n\r\n.cg-spinner {\r\n width: 40px;\r\n height: 40px;\r\n position: relative;\r\n}\r\n\r\n.cg-spinner::before,\r\n.cg-spinner::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: 50%;\r\n border: 2px solid transparent;\r\n}\r\n\r\n.cg-spinner::before {\r\n border-top-color: var(--cg-accent);\r\n border-right-color: var(--cg-accent);\r\n animation: cg-spin 0.8s var(--cg-ease) infinite;\r\n}\r\n\r\n.cg-spinner::after {\r\n border-bottom-color: var(--cg-accent-hover);\r\n border-left-color: var(--cg-accent-hover);\r\n animation: cg-spin 1.2s var(--cg-ease) infinite reverse;\r\n inset: 6px;\r\n}\r\n\r\n@keyframes cg-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n@keyframes cg-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.55; }\r\n}\r\n\r\n.cg-loading-overlay span,\r\n.cg-empty-state span {\r\n color: var(--cg-text-secondary);\r\n font-size: 13px;\r\n}\r\n\r\n.cg-empty-state .cg-empty-icon {\r\n font-size: 40px;\r\n opacity: 0.5;\r\n}\r\n\r\n.cg-error-overlay span {\r\n color: var(--cg-error);\r\n font-size: 13px;\r\n}\r\n\r\n.cg-error-overlay-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-error-overlay-actions {\r\n display: flex;\r\n gap: 8px;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-error-overlay-btn {\r\n padding: 6px 14px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n}\r\n\r\n.cg-error-overlay-retry {\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-error-overlay-retry:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-error-overlay-back {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-error-overlay-back:hover {\r\n background: var(--cg-accent-hover);\r\n border-color: var(--cg-accent-hover);\r\n}\r\n/* ---- Empty state (enhanced) ---------------------------------------------- */\r\n\r\n.cg-empty-state .cg-empty-icon {\r\n font-size: 40px;\r\n opacity: 0.5;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-empty-state .cg-empty-title {\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-empty-state .cg-empty-subtitle {\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n max-width: 280px;\r\n text-align: center;\r\n line-height: 1.5;\r\n}\r\n\r\n.cg-empty-actions {\r\n display: flex;\r\n gap: 10px;\r\n align-items: center;\r\n}\r\n\r\n.cg-empty-import-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 16px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n box-shadow: 0 2px 8px color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n}\r\n\r\n.cg-empty-import-btn:hover {\r\n background: var(--cg-accent-hover);\r\n transform: translateY(-1px);\r\n box-shadow: 0 4px 12px color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n}\r\n\r\n.cg-empty-scan-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 16px;\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-empty-scan-btn:hover {\r\n background: var(--cg-surface-hover);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-empty-prereq-warning {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n padding: 12px 14px;\r\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-warning) 100%, transparent);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n line-height: 1.4;\r\n max-width: 400px;\r\n text-align: left;\r\n}\r\n\r\n.cg-prereq-item {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding: 8px 0;\r\n border-top: 1px solid color-mix(in srgb, var(--cg-warning) 30%, transparent);\r\n}\r\n\r\n.cg-prereq-item:first-of-type {\r\n border-top: none;\r\n padding-top: 4px;\r\n}\r\n\r\n.cg-prereq-item-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-prereq-status-dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-prereq-status-dot.cg-ok {\r\n background: var(--cg-success);\r\n}\r\n\r\n.cg-prereq-status-dot.cg-missing {\r\n background: var(--cg-error);\r\n}\r\n\r\n.cg-prereq-item-label {\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-prereq-item-status {\r\n font-size: 11px;\r\n color: var(--cg-error);\r\n margin-left: auto;\r\n}\r\n\r\n.cg-prereq-item-desc {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n padding-left: 14px;\r\n}\r\n\r\n.cg-watch-indicator {\r\n color: var(--cg-success);\r\n font-size: 8px;\r\n animation: cg-pulse 2s ease-in-out infinite;\r\n}\r\n/* ---- Degraded mode notice ------------------------------------------------ */\r\n\r\n.cg-empty-degraded-notice {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n padding: 10px 14px;\r\n background: color-mix(in srgb, var(--cg-accent) 10%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: var(--cg-radius-sm);\r\n max-width: 400px;\r\n text-align: left;\r\n}\r\n\r\n.cg-degraded-label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-degraded-hint {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n line-height: 1.4;\r\n}\r\n\r\n/* ---- Prereq warning header / title --------------------------------------- */\r\n\r\n.cg-prereq-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-prereq-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n/* ---- Prereq command row -------------------------------------------------- */\r\n\r\n.cg-prereq-cmd-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-prereq-cmd {\r\n flex: 1;\r\n font-family: var(--cg-font-mono, monospace);\r\n font-size: 11px;\r\n padding: 4px 8px;\r\n background: color-mix(in srgb, var(--cg-surface) 80%, transparent);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n color: var(--cg-text);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-prereq-copy-btn {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition);\r\n}\r\n\r\n.cg-prereq-copy-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n}\r\n\r\n/* ---- Prereq install button ----------------------------------------------- */\r\n\r\n.cg-prereq-install-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n margin-top: 6px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 12px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-prereq-install-btn:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-prereq-install-btn:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* ---- Prereq copied hint -------------------------------------------------- */\r\n\r\n.cg-prereq-copied {\r\n font-size: 11px;\r\n color: var(--cg-success);\r\n text-align: center;\r\n}\r\n\r\n/* ---- Batch action bar (cycle-149 多选链路消费面) -------------------------- */\r\n/*\r\n * 悬浮在画布底部、状态栏上方的批量操作条。仅在 `multiSelectedIds.size > 0` 时由\r\n * BatchActionBar 渲染;空选区返回 null,因此这里无需 hidden 态样式。\r\n * 定位锚定 `.cg-panel`(position: absolute + z-index: var(--cg-z-panel)),\r\n * 与 health-score-card 等面板级浮层同层——不遮 ContextMenu(z-context-menu 更高)。\r\n */\r\n\r\n.cg-batch-bar {\r\n position: absolute;\r\n bottom: 44px; /* 状态栏上方(状态栏高度 ≈ 32px + 间距) */\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 10px;\r\n border-radius: var(--cg-radius-sm);\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n box-shadow: var(--cg-shadow-lg);\r\n z-index: var(--cg-z-panel);\r\n max-width: calc(100% - 32px);\r\n}\r\n\r\n.cg-batch-bar-count {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-batch-bar-btn {\r\n padding: 4px 10px;\r\n border-radius: var(--cg-radius-xs);\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n transition: background var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-batch-bar-btn:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-batch-bar-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n/* 清除按钮的破坏性语义:hover 提示「这会丢掉选区」,但不用 error 底色(非错误态)。 */\r\n.cg-batch-bar-btn-clear:hover {\r\n border-color: var(--cg-error);\r\n color: var(--cg-error);\r\n}\r\n","/* ---- Graph container ----------------------------------------------------- */\r\n\r\n.cg-graph-container {\r\n flex: 1;\r\n min-height: 0;\r\n position: relative;\r\n background: var(--cg-bg);\r\n transition: opacity 200ms var(--cg-ease);\r\n}\r\n\r\n.cg-graph-container canvas {\r\n display: block;\r\n}\r\n\r\n.cg-filter-empty-state {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n text-align: center;\r\n padding: 16px 24px;\r\n background: var(--cg-bg-elevated);\r\n border-radius: 8px;\r\n pointer-events: none;\r\n}\r\n/* ---- Sequence diagram container ----------------------------------------- */\r\n\r\n.cg-sequence-diagram-container {\r\n flex: 1;\r\n min-height: 0;\r\n position: relative;\r\n overflow: hidden;\r\n background: var(--cg-bg);\r\n user-select: none;\r\n}\r\n\r\n.cg-sequence-diagram-container svg {\r\n display: block;\r\n}\r\n\r\n.cg-sequence-diagram-container text {\r\n pointer-events: none;\r\n}\r\n\r\n.cg-seq-zoom-controls {\r\n position: absolute;\r\n bottom: 8px;\r\n right: 8px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-seq-zoom-btn {\r\n width: 28px;\r\n height: 28px;\r\n border: 1px solid var(--cg-border-strong);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 14px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-seq-zoom-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-seq-zoom-btn:active {\r\n background: var(--cg-surface-active);\r\n}\r\n\r\n.cg-seq-zoom-btn.cg-seq-reset {\r\n font-size: 10px;\r\n}\r\n\r\n.cg-seq-zoom-indicator {\r\n position: absolute;\r\n bottom: 8px;\r\n left: 8px;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-seq-empty-state {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n}\r\n\r\n.cg-seq-participant-group {\r\n cursor: pointer;\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-seq-participant-group:hover {\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-seq-participant-group:hover .cg-seq-participant-box {\r\n stroke-width: 3;\r\n filter: drop-shadow(0 2px 4px var(--cg-shadow-soft));\r\n}\r\n\r\n.cg-seq-participant-box {\r\n transition: stroke-width var(--cg-transition), filter var(--cg-transition);\r\n}\r\n\r\n.cg-seq-message-group {\r\n cursor: pointer;\r\n}\r\n\r\n.cg-seq-message-group:hover .cg-seq-message-line {\r\n stroke-width: 2.5;\r\n}\r\n\r\n.cg-seq-message-line {\r\n transition: stroke-width var(--cg-transition);\r\n}\r\n\r\n.cg-seq-fragment-group {\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-seq-fragment-group:hover {\r\n opacity: 0.9;\r\n}\r\n/* ---- Mini-map ------------------------------------------------------------ */\r\n\r\n.cg-mini-map {\r\n position: absolute;\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n width: 200px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-canvas-ui);\r\n backdrop-filter: blur(10px);\r\n -webkit-backdrop-filter: blur(10px);\r\n overflow: hidden;\r\n animation: cg-slide-up 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-up {\r\n from { opacity: 0; transform: translateY(8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-mini-map-header {\r\n padding: 7px 12px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n border-bottom: 1px solid var(--cg-border);\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.cg-mini-map-content {\r\n padding: 10px 12px;\r\n}\r\n\r\n.cg-mini-map-thumbnail {\r\n position: relative;\r\n margin-bottom: 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n background: var(--cg-surface);\r\n}\r\n\r\n.cg-mini-map-viewport {\r\n border: 2px solid var(--cg-accent);\r\n background: color-mix(in srgb, var(--cg-accent) 10%, transparent);\r\n pointer-events: none;\r\n transition: background var(--cg-transition-slow), border-color var(--cg-transition-slow), color var(--cg-transition-slow);\r\n}\r\n\r\n.cg-mini-map-stats {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.cg-mini-map-stats div {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-mini-map-stats .cg-dot {\r\n width: 9px;\r\n height: 9px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-mini-map-total {\r\n margin-top: 8px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n/* ---- Tooltip (node hover) ------------------------------------------------ */\r\n\r\n/* 提示框 portal 到 body:位置已是视口坐标,层级需压过宿主外壳 chrome。 */\r\n.cg-tooltip {\r\n position: fixed;\r\n z-index: var(--cg-z-portal-tooltip);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n color: var(--cg-text);\r\n pointer-events: none;\r\n max-width: 320px;\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n animation: cg-tooltip-in 100ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-tooltip-in {\r\n from { opacity: 0; transform: translateY(4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-name {\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-path {\r\n color: var(--cg-text-secondary);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n word-break: break-all;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-type {\r\n display: inline-block;\r\n margin-top: 4px;\r\n padding: 1px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links {\r\n display: flex;\r\n gap: 8px;\r\n margin-top: 4px;\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links-in {\r\n color: var(--cg-edge-import);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-links-out {\r\n color: var(--cg-edge-call);\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-source {\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-arrow {\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.cg-tooltip .cg-tooltip-edge-target {\r\n font-weight: 600;\r\n margin-bottom: 4px;\r\n}\r\n/* ---- Smooth graph transitions --------------------------------------------- */\r\n\r\n\r\n.cg-graph-container.cg-loading {\r\n opacity: 0.4;\r\n}\r\n\r\n/* ---- Canvas controls overlay (GraphCanvasControls) ------------------------- */\r\n/* 浮在画布右下角的交互式控制层:缩放按钮 + 统计信息 + 交互式小地图。\r\n * 容器 pointer-events: none,子元素 pointer-events: auto,\r\n * 不拦截画布的拖拽/滚轮事件。 */\r\n\r\n.cg-canvas-controls-overlay {\r\n position: absolute;\r\n bottom: 8px;\r\n right: 8px;\r\n z-index: var(--cg-z-canvas-ui, 10);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n gap: 8px;\r\n pointer-events: none;\r\n}\r\n\r\n/* ---- 统计信息浮层 ---- */\r\n.cg-canvas-stats {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 4px 10px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n pointer-events: auto;\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow-sm);\r\n white-space: nowrap;\r\n user-select: none;\r\n}\r\n\r\n.cg-canvas-stat-item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 3px;\r\n}\r\n\r\n.cg-canvas-stat-item svg {\r\n opacity: 0.7;\r\n}\r\n\r\n.cg-canvas-stat-sep {\r\n color: var(--cg-text-tertiary);\r\n opacity: 0.5;\r\n}\r\n\r\n.cg-canvas-stat-ratio {\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n/* ---- 缩放按钮组 ---- */\r\n.cg-canvas-zoom-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n padding: 4px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius);\r\n pointer-events: auto;\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow);\r\n}\r\n\r\n.cg-canvas-btn {\r\n width: 30px;\r\n height: 30px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n border-radius: var(--cg-radius-xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background var(--cg-transition, 150ms ease),\r\n color var(--cg-transition, 150ms ease);\r\n padding: 0;\r\n}\r\n\r\n.cg-canvas-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-canvas-btn:active {\r\n background: var(--cg-surface-active);\r\n}\r\n\r\n.cg-canvas-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n/* ---- 交互式小地图 ---- */\r\n.cg-canvas-minimap {\r\n position: relative;\r\n width: 140px;\r\n height: 100px;\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n overflow: hidden;\r\n cursor: crosshair;\r\n pointer-events: auto;\r\n background: var(--cg-bg);\r\n box-shadow: var(--cg-shadow);\r\n transition: border-color var(--cg-transition, 150ms ease);\r\n}\r\n\r\n.cg-canvas-minimap:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-canvas-minimap-img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n display: block;\r\n pointer-events: none;\r\n opacity: 0.85;\r\n}\r\n\r\n.cg-canvas-minimap-viewport {\r\n position: absolute;\r\n border: 2px solid var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n transition: left 100ms linear, top 100ms linear,\r\n width 100ms linear, height 100ms linear;\r\n}\r\n\r\n/* ---- 响应式:小屏隐藏小地图,缩小按钮 ---- */\r\n@media (max-width: 768px) {\r\n .cg-canvas-minimap {\r\n display: none;\r\n }\r\n .cg-canvas-stats {\r\n font-size: 10px;\r\n padding: 3px 6px;\r\n }\r\n .cg-canvas-btn {\r\n width: 26px;\r\n height: 26px;\r\n }\r\n}\r\n\r\n/* ---- 深色主题适配 ---- */\r\n:where([data-theme='dark'], [data-ds-dark-theme]) {\r\n .cg-canvas-minimap-img {\r\n opacity: 0.7;\r\n }\r\n}\r\n","/* ---- Node detail panel --------------------------------------------------- */\r\n\r\n.cg-node-detail-panel {\r\n position: absolute;\r\n left: 12px;\r\n top: 12px;\r\n width: 260px;\r\n max-height: calc(100% - 24px);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n padding: 14px;\r\n z-index: var(--cg-z-panel);\r\n overflow-y: auto;\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n@keyframes cg-slide-right {\r\n from { opacity: 0; transform: translateX(-12px); }\r\n to { opacity: 1; transform: translateX(0); }\r\n}\r\n\r\n.cg-node-detail-panel h3 {\r\n margin: 0 0 10px;\r\n font-size: 14px;\r\n color: var(--cg-text);\r\n font-weight: 600;\r\n word-break: break-word;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-header h3 {\r\n margin: 0;\r\n flex: 1;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-type-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n border: 1.5px solid;\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n font-weight: 700;\r\n font-family: var(--cg-font-mono);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-row {\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding: 5px 0;\r\n font-size: 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-label {\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n font-weight: 500;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-value {\r\n color: var(--cg-text);\r\n text-align: right;\r\n word-break: break-all;\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-close-btn {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n width: 24px;\r\n height: 24px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 14px;\r\n border-radius: var(--cg-radius-xs);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.cg-node-detail-panel .cg-close-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n/* ---- Node detail extra properties ---------------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-extra {\r\n margin-top: 10px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-extra-title {\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 6px;\r\n}\r\n\r\n/* ---- Node detail edge list ------------------------------------------------ */\r\n\r\n.cg-node-detail-panel .cg-detail-edges {\r\n margin-top: 10px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges .cg-detail-section-title {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n gap: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-count {\r\n font-size: 10px;\r\n font-weight: 500;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n text-transform: none;\r\n letter-spacing: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-aggregated {\r\n margin: 4px 0 2px;\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n font-style: italic;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-status {\r\n padding: 6px 0;\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-list {\r\n list-style: none;\r\n margin: 4px 0 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n max-height: 220px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 3px 0;\r\n font-size: 11px;\r\n border-bottom: 1px solid var(--cg-border);\r\n min-width: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir {\r\n flex-shrink: 0;\r\n width: 20px;\r\n text-align: center;\r\n font-size: 9px;\r\n font-weight: 700;\r\n border-radius: var(--cg-radius-xs);\r\n padding: 1px 0;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir--out {\r\n color: var(--cg-node-function);\r\n background: color-mix(in srgb, var(--cg-node-function) 14%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-dir--in {\r\n color: var(--cg-accent);\r\n background: color-mix(in srgb, var(--cg-accent) 14%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-label {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edge-type {\r\n flex-shrink: 0;\r\n font-size: 9px;\r\n color: var(--cg-text-tertiary);\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n/* cycle-126 · T3:AST 增补边徽章——披露「这条继承边来自 AST 推断」。 */\r\n.cg-node-detail-panel .cg-detail-edge-ast-badge {\r\n flex-shrink: 0;\r\n font-size: 8px;\r\n line-height: 1;\r\n padding: 1px 3px;\r\n border-radius: 3px;\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n font-family: var(--cg-font-mono);\r\n cursor: help;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more {\r\n margin-top: 6px;\r\n width: 100%;\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n background: transparent;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-more:disabled {\r\n opacity: 0.5;\r\n cursor: default;\r\n}\r\n\r\n/* 聚合态下的「展开明细边」是唯一出口:聚合页不可分页(hasMore 恒为 false),\r\n 所以这个按钮必须比普通「显示更多」更醒目,否则用户会以为边就这么多。\r\n 见 docs/图谱按需加载.md:64-65 / :106-110「展开后分页拉取明细」。 */\r\n.cg-node-detail-panel .cg-detail-edges-expand-aggregated {\r\n color: var(--cg-on-accent);\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-edges-expand-aggregated:hover:not(:disabled) {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n opacity: 0.88;\r\n}\r\n\r\n/* ---- Expandable node indicators ------------------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-expand-hint {\r\n margin-top: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connections {\r\n margin-top: 8px;\r\n padding-top: 8px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connections-title {\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.06em;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 3px 0;\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-type {\r\n display: inline-block;\r\n padding: 1px 5px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-surface-active);\r\n color: var(--cg-text-tertiary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-connection-name {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* ---- Depth level indicator ------------------------------------------------ */\r\n\r\n.cg-depth-level-indicator {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 3px;\r\n padding: 2px 8px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-depth-level-dot {\r\n width: 6px;\r\n height: 6px;\r\n border-radius: 50%;\r\n background: var(--cg-accent);\r\n}\r\n\r\n.cg-depth-level-dot.cg-active {\r\n background: var(--cg-success);\r\n box-shadow: 0 0 4px var(--cg-success);\r\n}\r\n\r\n/* ---- Expanded node badge in detail panel ---------------------------------- */\r\n\r\n.cg-node-detail-panel .cg-detail-expanded-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: color-mix(in srgb, var(--cg-success) 12%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-success) 30%, transparent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-success);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-exported-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 2px 6px;\r\n background: color-mix(in srgb, var(--cg-accent) 12%, transparent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-signature {\r\n margin: 8px 0;\r\n padding: 8px 10px;\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-section-title {\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text-tertiary);\r\n margin-bottom: 4px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-code {\r\n display: block;\r\n font-family: var(--cg-font-mono);\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n line-height: 1.5;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-docstring {\r\n margin: 8px 0;\r\n padding: 8px 10px;\r\n background: var(--cg-surface);\r\n border-radius: var(--cg-radius-sm);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-doc-text {\r\n font-family: var(--cg-font-sans);\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n line-height: 1.5;\r\n margin: 0;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-actions {\r\n margin-top: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-body-budget {\r\n margin-bottom: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-label {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n display: block;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-bar {\r\n height: 4px;\r\n background: var(--cg-surface);\r\n border-radius: 2px;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-fill {\r\n height: 100%;\r\n background: var(--cg-accent);\r\n border-radius: 2px;\r\n transition: width var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n display: block;\r\n margin-top: 4px;\r\n}\r\n\r\n/* 预算出口按钮(展开更多 / 收起已展开 / 只看调用链 / 展开全部)。\r\n 依据 docs/图谱按需加载.md 第五节「提供入口」与风险 8「UI 必须明确不是数据没有」。 */\r\n.cg-node-detail-panel .cg-detail-budget-actions {\r\n display: flex;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n margin-top: 6px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn--wide {\r\n width: 100%;\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn--danger {\r\n border-color: color-mix(in srgb, var(--cg-warning) 45%, transparent);\r\n background: color-mix(in srgb, var(--cg-warning) 15%, transparent);\r\n color: var(--cg-warning);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-btn:disabled {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-confirm {\r\n margin-top: 6px;\r\n padding: 6px 8px;\r\n border: 1px solid color-mix(in srgb, var(--cg-warning) 40%, transparent);\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-warning) 10%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-budget-warning {\r\n display: block;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-warning);\r\n}\r\n\r\n/* 单符号 AST 折叠披露(超 SYMBOL_AST.MAX_NODES 时服务端只回一页)。\r\n 依据 docs/图谱按需加载.md:155「超限时显示\"该函数过大,已折叠为摘要 / 分段加载\"」。 */\r\n.cg-node-detail-panel .cg-detail-ast-fold {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n flex-wrap: wrap;\r\n margin-top: 6px;\r\n padding: 6px 8px;\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-accent) 8%, transparent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-ast-fold-text {\r\n flex: 1 1 140px;\r\n min-width: 0;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-hint {\r\n margin-top: 8px;\r\n padding: 6px 10px;\r\n background: var(--cg-surface-hover);\r\n border: 1px dashed var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btns {\r\n display: flex;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn {\r\n padding: 4px 10px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: all var(--cg-transition);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-chain-btn {\r\n margin-top: 4px;\r\n width: 100%;\r\n background: color-mix(in srgb, var(--cg-accent) 15%, transparent);\r\n border-color: color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n color: var(--cg-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-chain-btn:hover {\r\n background: color-mix(in srgb, var(--cg-accent) 25%, transparent);\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-cluster-functions {\r\n margin-top: 8px;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 4px;\r\n padding: 2px 4px;\r\n border-radius: var(--cg-radius-xs);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-micro-btns {\r\n display: inline-flex;\r\n gap: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-function-name {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n flex: 1;\r\n}\r\n\r\n.cg-node-detail-panel .cg-detail-micro-btn--small {\r\n padding: 2px 6px;\r\n font-size: 10px;\r\n}\r\n\r\n/* ---- Collapse-all button -------------------------------------------------- */\r\n\r\n.cg-collapse-all-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 3px 8px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-collapse-all-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n border-color: var(--cg-accent);\r\n}","/* ---- Import panel -------------------------------------------------------- */\n\n.cg-import-panel {\n position: absolute;\n inset: var(--cg-toolbar-h) 0 var(--cg-statusbar-h) 0;\n background: var(--cg-bg);\n z-index: var(--cg-z-panel-stack);\n display: flex;\n flex-direction: column;\n animation: cg-slide-down 160ms var(--cg-ease-out);\n}\n\n.cg-import-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-import-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-import-close {\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--cg-text-secondary);\n cursor: pointer;\n border-radius: var(--cg-radius-xs);\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-close:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-import-tabs {\n display: flex;\n gap: 2px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-import-tabs button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--cg-border);\n background: transparent;\n color: var(--cg-text-secondary);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n border-radius: var(--cg-radius-sm);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-tabs button:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-import-tabs button.cg-active {\n background: var(--cg-accent);\n border-color: var(--cg-accent-hover);\n color: var(--cg-on-accent);\n}\n\n.cg-import-body {\n flex: 1;\n padding: 16px 14px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.cg-paste-zone,\n.cg-workspace-zone {\n display: flex;\n flex-direction: column;\n gap: 10px;\n flex: 1;\n}\n\n.cg-workspace-zone {\n padding: 4px 0;\n}\n\n.cg-workspace-path-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.cg-workspace-path-icon {\n color: var(--cg-text-tertiary);\n}\n\n.cg-workspace-path-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n}\n\n.cg-workspace-path-value {\n padding: 8px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n word-break: break-all;\n line-height: 1.5;\n}\n\n.cg-workspace-hint {\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-workspace-path-input {\n padding: 8px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n outline: none;\n transition: border-color var(--cg-transition);\n}\n\n.cg-workspace-path-input:focus {\n border-color: var(--cg-accent);\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\n}\n\n.cg-workspace-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.cg-import-submit.cg-secondary {\n background: var(--cg-surface);\n color: var(--cg-text);\n border: 1px solid var(--cg-border);\n}\n\n.cg-import-submit.cg-secondary:hover:not(:disabled) {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n background: var(--cg-accent-soft);\n}\n\n.cg-watch-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background: transparent;\n color: var(--cg-text-secondary);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n align-self: flex-start;\n}\n\n.cg-watch-toggle:hover {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-watch-toggle.cg-active {\n background: var(--cg-accent-soft);\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-init-feedback {\n padding: 6px 12px;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n}\n\n.cg-init-feedback.cg-ok {\n background: color-mix(in srgb, var(--cg-success) 10%, transparent);\n color: var(--cg-success);\n}\n\n.cg-init-feedback.cg-err {\n background: color-mix(in srgb, var(--cg-error) 10%, transparent);\n color: var(--cg-error);\n}\n\n.cg-prereq-warning {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n margin: 0 14px 8px;\n background: color-mix(in srgb, var(--cg-warning) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--cg-warning) 30%, transparent);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-warning);\n font-size: 12px;\n line-height: 1.4;\n flex-wrap: wrap;\n}\n\n.cg-prereq-install {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding-top: 6px;\n}\n\n.cg-prereq-install code {\n flex: 1;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--cg-warning) 12%, transparent);\n border: 1px dashed color-mix(in srgb, var(--cg-warning) 40%, transparent);\n border-radius: var(--cg-radius-sm);\n font-family: var(--cg-font-mono);\n font-size: 11px;\n color: color-mix(in srgb, var(--cg-warning) 85%, white);\n overflow-x: auto;\n white-space: nowrap;\n}\n\n.cg-prereq-copy {\n flex-shrink: 0;\n padding: 4px 10px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--cg-warning) 40%, transparent);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-warning);\n font-size: 11px;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-prereq-copy:hover {\n background: color-mix(in srgb, var(--cg-warning) 20%, transparent);\n}\n\n.cg-paste-input {\n flex: 1;\n min-height: 160px;\n padding: 10px 12px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-sm);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n resize: vertical;\n outline: none;\n transition: border-color var(--cg-transition);\n}\n\n.cg-paste-input:focus {\n border-color: var(--cg-accent);\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\n}\n\n.cg-import-submit {\n align-self: flex-start;\n padding: 8px 18px;\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n border: none;\n border-radius: var(--cg-radius-sm);\n font-size: 13px;\n font-weight: 500;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-import-submit:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n transform: translateY(-1px);\n}\n\n.cg-import-submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.cg-import-feedback {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n margin: 0 14px 12px;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n}\n\n.cg-import-feedback.cg-ok {\n background: color-mix(in srgb, var(--cg-success) 15%, transparent);\n color: var(--cg-success);\n}\n\n.cg-import-feedback.cg-err {\n background: color-mix(in srgb, var(--cg-error) 15%, transparent);\n color: var(--cg-error);\n}\n\n/* ---- Legend panel -------------------------------------------------------- */\n\n.cg-legend-panel {\n position: absolute;\n left: 12px;\n bottom: calc(var(--cg-statusbar-h) + 12px);\n width: 180px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n overflow: hidden;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-legend-header {\n padding: 7px 12px;\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n border-bottom: 1px solid var(--cg-border);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.cg-legend-close {\n background: transparent;\n border: none;\n color: var(--cg-text-secondary);\n cursor: pointer;\n font-size: 14px;\n padding: 0 4px;\n border-radius: var(--cg-radius-xs);\n line-height: 1;\n}\n\n.cg-legend-close:hover {\n color: var(--cg-text);\n}\n\n.cg-legend-body {\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.cg-legend-section-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 4px;\n}\n\n.cg-legend-row {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: var(--cg-text-secondary);\n padding: 2px 0;\n}\n\n/* cycle-146 T146-4:图例行交互化——button 化 + 隐藏态视觉(半透明 + 删除线语义) */\nbutton.cg-legend-row.cg-legend-toggle {\n background: none;\n border: none;\n cursor: pointer;\n width: 100%;\n text-align: left;\n border-radius: 4px;\n transition: opacity 0.15s ease, background-color 0.15s ease;\n}\n\nbutton.cg-legend-row.cg-legend-toggle:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-legend-row.cg-legend-row-hidden {\n opacity: 0.38;\n}\n\n.cg-legend-row.cg-legend-row-hidden .cg-legend-swatch,\n.cg-legend-row.cg-legend-row-hidden .cg-legend-line {\n filter: grayscale(1);\n}\n\n.cg-legend-swatch {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.cg-legend-line {\n width: 18px;\n height: 0;\n border-top: 2px solid var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* ---- Workspace selector --------------------------------------------------- */\n\n.cg-workspace-selector {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.cg-workspace-trigger {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition);\n max-width: 160px;\n}\n\n.cg-workspace-trigger:hover {\n background: var(--cg-surface-active);\n border-color: var(--cg-border-strong);\n}\n\n.cg-workspace-trigger:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-workspace-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.cg-workspace-chevron {\n opacity: 0.6;\n flex-shrink: 0;\n}\n\n.cg-workspace-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 240px;\n max-width: 320px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-sm);\n box-shadow: var(--cg-shadow-lg);\n z-index: var(--cg-z-dropdown);\n overflow: hidden;\n animation: ws-slide-in 120ms var(--cg-ease-out);\n}\n\n.cg-workspace-dropdown-portal {\n position: fixed;\n z-index: var(--cg-z-modal);\n}\n\n@keyframes ws-slide-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.cg-workspace-dropdown-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 11px;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-workspace-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text-secondary);\n cursor: pointer;\n transition: background var(--cg-transition), color var(--cg-transition);\n}\n\n.cg-workspace-add-btn:hover {\n background: var(--cg-accent-soft);\n color: var(--cg-accent);\n border-color: var(--cg-accent);\n}\n\n.cg-workspace-add-form {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-workspace-add-form input {\n flex: 1;\n padding: 4px 8px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text);\n font-size: 12px;\n font-family: var(--cg-font-mono);\n outline: none;\n}\n\n.cg-workspace-add-form input:focus {\n border-color: var(--cg-accent);\n}\n\n.cg-workspace-add-form button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n background: var(--cg-accent);\n border: none;\n border-radius: var(--cg-radius-xs);\n color: white;\n cursor: pointer;\n transition: background var(--cg-transition);\n}\n\n.cg-workspace-add-form button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.cg-workspace-add-form button:not(:disabled):hover {\n background: var(--cg-accent-hover);\n}\n\n.cg-workspace-list {\n max-height: 260px;\n overflow-y: auto;\n padding: 4px 0;\n}\n\n.cg-workspace-item {\n display: grid;\n grid-template-columns: auto 1fr auto auto;\n align-items: center;\n gap: 6px;\n padding: 7px 10px;\n cursor: pointer;\n transition: background var(--cg-transition);\n position: relative;\n}\n\n.cg-workspace-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-workspace-item.cg-current {\n background: var(--cg-accent-soft);\n}\n\n.cg-workspace-item-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-workspace-item-path {\n grid-column: 2;\n font-size: 10px;\n color: var(--cg-text-tertiary);\n font-family: var(--cg-font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.2;\n}\n\n.cg-workspace-item-time {\n font-size: 10px;\n color: var(--cg-text-tertiary);\n white-space: nowrap;\n}\n\n.cg-workspace-item-badge {\n font-size: 9px;\n padding: 1px 5px;\n background: var(--cg-accent);\n color: white;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n white-space: nowrap;\n}\n\n.cg-workspace-item-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background: transparent;\n border: none;\n border-radius: 3px;\n color: var(--cg-text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--cg-transition), color var(--cg-transition);\n}\n\n.cg-workspace-item:hover .cg-workspace-item-remove {\n opacity: 1;\n}\n\n.cg-workspace-item-remove:hover {\n color: var(--cg-error);\n background: color-mix(in srgb, var(--cg-error) 10%, transparent);\n}\n\n.cg-workspace-empty {\n padding: 16px 10px;\n text-align: center;\n font-size: 12px;\n color: var(--cg-text-tertiary);\n}\n\n/* ---- Keyboard help -------------------------------------------------------- */\n\n.cg-keyboard-help-overlay {\n position: fixed;\n inset: 0;\n background: var(--cg-overlay-bg);\n -webkit-backdrop-filter: blur(2px);\n backdrop-filter: blur(2px);\n z-index: var(--cg-z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n animation: cg-fade-in 120ms var(--cg-ease-out);\n}\n\n.cg-keyboard-help-panel {\n background: var(--cg-surface);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow-lg);\n min-width: 280px;\n max-width: 360px;\n padding: 0;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-keyboard-help-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 14px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-keyboard-help-close {\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: var(--cg-radius-xs);\n color: var(--cg-text-tertiary);\n cursor: pointer;\n font-size: 16px;\n transition: color var(--cg-transition), background var(--cg-transition);\n}\n\n.cg-keyboard-help-close:hover {\n color: var(--cg-text);\n background: var(--cg-surface-hover);\n}\n\n.cg-keyboard-help-list {\n padding: 8px 16px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.cg-keyboard-help-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.cg-keyboard-help-key {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 24px;\n padding: 0 8px;\n background: var(--cg-surface-active);\n border: 1px solid var(--cg-border-strong);\n border-radius: var(--cg-radius-xs);\n font-family: var(--cg-font-mono);\n font-size: 11px;\n color: var(--cg-text);\n box-shadow: 0 1px 0 var(--cg-border-strong);\n}\n\n.cg-keyboard-help-desc {\n font-size: 13px;\n color: var(--cg-text-secondary);\n}\n\n@keyframes cg-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n/* ── 会话跟随徽标(session-follow,见 src/client/runtime/sessionFollow.ts)────\n * 透明化纪律:跟随中 / 已固定状态必须一眼可见(白盒可观测),且两个形态\n * 用色差区分——跟随=信息态(accent 描边),固定=动作态(warning 底色+可点击)。 */\n.cg-workspace-follow-badge {\n margin-left: auto;\n margin-right: 6px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n letter-spacing: 0.02em;\n text-transform: none;\n white-space: nowrap;\n}\n.cg-workspace-follow-badge.cg-following-active {\n color: var(--cg-accent);\n border: 1px solid var(--cg-accent);\n background: transparent;\n cursor: default;\n}\n.cg-workspace-follow-badge.cg-following-pinned {\n color: var(--cg-warning);\n border: 1px solid var(--cg-warning);\n background: color-mix(in srgb, var(--cg-warning) 12%, transparent);\n cursor: pointer;\n}\n.cg-workspace-follow-badge.cg-following-pinned:hover {\n background: color-mix(in srgb, var(--cg-warning) 22%, transparent);\n}\n","/* ---- PathBar (FR-25: Path Finding) ---------------------------------------- */\r\n\r\n.cg-path-bar {\r\n position: absolute;\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n width: 280px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-panel);\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n overflow: hidden;\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-path-bar-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-path-bar-content {\r\n padding: 10px 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.cg-path-input-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n position: relative;\r\n}\r\n\r\n.cg-path-input-group label {\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.04em;\r\n}\r\n\r\n.cg-path-input-group input {\r\n padding: 6px 10px;\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n font-family: var(--cg-font-sans);\r\n outline: none;\r\n transition: border-color var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-path-input-group input:focus {\r\n border-color: var(--cg-accent);\r\n box-shadow: 0 0 0 3px var(--cg-accent-soft);\r\n}\r\n\r\n.cg-path-input-group input::placeholder {\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-path-suggestions {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n margin-top: 2px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-sm);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-dropdown);\r\n max-height: 160px;\r\n overflow-y: auto;\r\n animation: cg-dropdown-in 120ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-path-suggestions button {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n width: 100%;\r\n padding: 6px 10px;\r\n border: none;\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n text-align: left;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-path-suggestions button:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-suggestion-type {\r\n display: inline-block;\r\n padding: 1px 5px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-suggestion-label {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-path-selected {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 3px 8px;\r\n background: var(--cg-accent-soft);\r\n border: 1px solid var(--cg-accent);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n.cg-path-actions {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n\r\n.cg-path-find-btn,\r\n.cg-path-clear-btn {\r\n padding: 6px 14px;\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n font-size: 12px;\r\n font-weight: 500;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n}\r\n\r\n.cg-path-find-btn {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n flex: 1;\r\n}\r\n\r\n.cg-path-find-btn:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.cg-path-find-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-path-clear-btn {\r\n background: var(--cg-surface);\r\n color: var(--cg-text-secondary);\r\n border: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-path-clear-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-path-result {\r\n display: flex;\r\n gap: 12px;\r\n padding: 6px 10px;\r\n background: var(--cg-accent-soft);\r\n border-radius: var(--cg-radius-xs);\r\n font-size: 11px;\r\n color: var(--cg-accent);\r\n font-weight: 500;\r\n}\r\n\r\n/* ---- FocusModeBar (FR-26/28: Focus Mode) ---------------------------------- */\r\n\r\n.cg-focus-mode-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 12px;\r\n background: var(--cg-accent-soft);\r\n border-bottom: 1px solid var(--cg-accent);\r\n font-size: 12px;\r\n color: var(--cg-accent);\r\n flex-shrink: 0;\r\n animation: cg-slide-down 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-focus-label {\r\n font-weight: 600;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 200px;\r\n}\r\n\r\n.cg-focus-depth {\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n padding: 1px 6px;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border-radius: 10px;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-focus-expand-btn,\r\n.cg-focus-contract-btn,\r\n.cg-focus-exit-btn {\r\n width: 24px;\r\n height: 24px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--cg-border);\r\n background: var(--cg-bg);\r\n border-radius: var(--cg-radius-xs);\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\r\n flex-shrink: 0;\r\n margin-left: auto;\r\n}\r\n\r\n.cg-focus-expand-btn:hover,\r\n.cg-focus-contract-btn:hover,\r\n.cg-focus-exit-btn:hover {\r\n background: var(--cg-surface-hover);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-focus-expand-btn:first-of-type {\r\n margin-left: auto;\r\n}\r\n\r\n.cg-focus-contract-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-focus-exit-btn:hover {\r\n border-color: var(--cg-error);\r\n color: var(--cg-error);\r\n}","/* ---- HealthScoreCard (FR-32: Health Score) -------------------------------- */\n\n.cg-health-score-card {\n position: absolute;\n left: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 260px;\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n animation: cg-slide-right 160ms var(--cg-ease-out);\n}\n\n.cg-health-score-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-health-score-empty {\n padding: 20px 12px;\n text-align: center;\n font-size: 12px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-health-score-overall {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 14px 12px 10px;\n}\n\n.cg-health-score-circle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 64px;\n height: 64px;\n border: 3px solid;\n border-radius: 50%;\n font-size: 22px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-health-score-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-health-dimensions {\n padding: 0 12px 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.cg-health-dimension {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.cg-health-dimension-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.cg-health-dimension-name {\n font-size: 11px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n}\n\n.cg-health-dimension-score {\n font-size: 12px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-health-dimension-bar {\n height: 6px;\n background: var(--cg-surface-active);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.cg-health-dimension-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 400ms var(--cg-ease-out);\n}\n\n.cg-health-dimension-desc {\n font-size: 10px;\n color: var(--cg-text-tertiary);\n line-height: 1.3;\n}\n\n","/* ---- RuleConfigPanel (FR-34: Rule Engine) --------------------------------- */\n\n.cg-rule-panel {\n position: absolute;\n left: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 280px;\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: cg-slide-right 160ms var(--cg-ease-out);\n}\n\n.cg-rule-panel-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n flex-shrink: 0;\n}\n\n.cg-rule-panel-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.cg-rule-config-section {\n padding: 10px 12px;\n border-bottom: 1px solid var(--cg-border);\n}\n\n.cg-rule-config-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.cg-rule-config-header span {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-rule-preset-btn {\n padding: 3px 8px;\n background: var(--cg-accent-soft);\n border: 1px solid var(--cg-accent);\n border-radius: var(--cg-radius-xs);\n color: var(--cg-accent);\n font-size: 10px;\n font-weight: 500;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-rule-preset-btn:hover {\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n}\n\n.cg-rule-empty {\n padding: 8px 0;\n text-align: center;\n font-size: 11px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-rule-item {\n padding: 4px 0;\n}\n\n.cg-rule-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.cg-rule-toggle input[type=\"checkbox\"] {\n width: 14px;\n height: 14px;\n accent-color: var(--cg-accent);\n cursor: pointer;\n}\n\n.cg-rule-name {\n flex: 1;\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-rule-severity {\n display: inline-block;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-rule-severity.cg-error {\n background: color-mix(in srgb, var(--cg-error) 100%, transparent);\n color: var(--cg-error);\n}\n\n.cg-rule-severity.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 100%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-rule-check-btn {\n width: 100%;\n margin-top: 8px;\n padding: 6px 14px;\n background: var(--cg-accent);\n color: var(--cg-on-accent);\n border: none;\n border-radius: var(--cg-radius-sm);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background var(--cg-transition), border-color var(--cg-transition), color var(--cg-transition), opacity var(--cg-transition);\n}\n\n.cg-rule-check-btn:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n}\n\n.cg-rule-check-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cg-rule-violations-section {\n padding: 10px 12px;\n}\n\n.cg-rule-violations-header {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n margin-bottom: 6px;\n}\n\n.cg-rule-violations-header span:first-child {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-violation-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n font-family: var(--cg-font-mono);\n}\n\n.cg-violation-badge.cg-error {\n background: color-mix(in srgb, var(--cg-error) 100%, transparent);\n color: var(--cg-error);\n}\n\n.cg-violation-badge.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 100%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-rule-violations-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.cg-violation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 5px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n line-height: 1.4;\n}\n\n.cg-violation-item.cg-error {\n background: color-mix(in srgb, var(--cg-error) 80%, transparent);\n color: var(--cg-error);\n}\n\n.cg-violation-item.cg-warning {\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\n color: var(--cg-warning);\n}\n\n.cg-violation-message {\n flex: 1;\n word-break: break-word;\n}\n\n","/* ---- Analysis panels (FR-33: Hotspot, FR-36: God Module) ------------------ */\n\n.cg-analysis-panel {\n position: absolute;\n right: 12px;\n top: calc(var(--cg-toolbar-h) + 12px);\n width: 240px;\n max-height: calc(100% - var(--cg-toolbar-h) - var(--cg-statusbar-h) - 24px);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius);\n box-shadow: var(--cg-shadow);\n z-index: var(--cg-z-panel);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: cg-slide-up 160ms var(--cg-ease-out);\n}\n\n.cg-analysis-panel-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n border-bottom: 1px solid var(--cg-border);\n flex-shrink: 0;\n}\n\n\n.cg-analysis-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Hotspot items */\n\n.cg-hotspot-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n transition: background var(--cg-transition);\n}\n\n.cg-hotspot-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-hotspot-item.cg-critical {\n background: color-mix(in srgb, var(--cg-error) 80%, transparent);\n}\n\n.cg-hotspot-item.cg-high {\n background: color-mix(in srgb, var(--cg-warning) 80%, transparent);\n}\n\n.cg-hotspot-item.cg-medium {\n background: color-mix(in srgb, var(--cg-info) 60%, transparent);\n}\n\n.cg-hotspot-level-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 40px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-hotspot-item.cg-critical .cg-hotspot-level-badge {\n background: var(--cg-error);\n color: white;\n}\n\n.cg-hotspot-item.cg-high .cg-hotspot-level-badge {\n background: var(--cg-warning);\n color: white;\n}\n\n.cg-hotspot-item.cg-medium .cg-hotspot-level-badge {\n background: var(--cg-info);\n color: white;\n}\n\n.cg-hotspot-item.cg-low .cg-hotspot-level-badge {\n background: var(--cg-text-tertiary);\n color: white;\n}\n\n.cg-hotspot-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n}\n\n.cg-hotspot-indegree {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* God Module items */\n\n.cg-godmodule-item {\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 8px;\n border-radius: var(--cg-radius-xs);\n background: color-mix(in srgb, var(--cg-error) 60%, transparent);\n border: 1px solid color-mix(in srgb, var(--cg-error) 150%, transparent);\n}\n\n.cg-godmodule-path {\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n word-break: break-all;\n line-height: 1.3;\n}\n\n.cg-godmodule-stats {\n font-size: 10px;\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n}\n\n.cg-godmodule-suggestion {\n font-size: 10px;\n color: var(--cg-error);\n line-height: 1.4;\n padding-top: 2px;\n border-top: 1px solid color-mix(in srgb, var(--cg-error) 120%, transparent);\n}\n\n/* ---- cycle-113: God Module 阈值控件与诚实空态 ---- */\n\n.cg-godmodule-empty {\n padding: 10px 8px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-godmodule-wait {\n color: var(--cg-text-tertiary);\n font-style: italic;\n}\n\n.cg-godmodule-threshold {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 6px 8px;\n border-top: 1px solid var(--cg-border);\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-godmodule-threshold label {\n flex: 1;\n}\n\n.cg-godmodule-threshold-input {\n width: 72px;\n padding: 3px 6px;\n font-size: 11px;\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n background: var(--cg-surface);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-godmodule-threshold-input:focus {\n outline: none;\n border-color: var(--cg-accent);\n}\n\n/* Core Function items */\n\n.cg-core-function-item {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 8px;\n padding: 6px 8px;\n border-radius: var(--cg-radius-xs);\n font-size: 11px;\n cursor: pointer;\n transition: background var(--cg-transition);\n}\n\n.cg-core-function-item:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-core-function-item:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: -2px;\n}\n\n.cg-core-function-category-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n color: white;\n flex-shrink: 0;\n}\n\n.cg-core-function-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--cg-text);\n font-weight: 500;\n}\n\n.cg-core-function-score {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 700;\n color: var(--cg-accent);\n flex-shrink: 0;\n}\n\n.cg-core-function-reasons {\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n width: 100%;\n}\n\n.cg-core-function-reason-tag {\n display: inline-block;\n padding: 0 4px;\n border-radius: 2px;\n font-size: 8px;\n font-weight: 600;\n background: color-mix(in srgb, var(--cg-accent) 20%, transparent);\n color: var(--cg-text-secondary);\n}\n\n.cg-core-function-stats {\n display: flex;\n gap: 8px;\n width: 100%;\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-corefunction-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--cg-radius-xs);\n background: transparent;\n color: var(--cg-text-secondary);\n cursor: pointer;\n transition: all var(--cg-transition);\n}\n\n.cg-corefunction-btn:hover {\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n}\n\n.cg-corefunction-btn.cg-active {\n background: color-mix(in srgb, var(--cg-accent) 20%, transparent);\n color: var(--cg-accent);\n}\n\n/* ---- cycle-105: Hotspot churn 状态行与多列布局 ---- */\n\n.cg-hotspot-churn-status {\n padding: 6px 12px;\n font-size: 11px;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border-bottom: 1px solid var(--cg-border);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n}\n\n.cg-hotspot-churn-reason {\n color: var(--cg-text-tertiary);\n font-size: 10px;\n}\n\n.cg-hotspot-churn-truncated {\n color: var(--cg-warning);\n font-size: 10px;\n}\n\n.cg-hotspot-column-header {\n display: grid;\n grid-template-columns: 28px 1fr 48px 48px 48px;\n gap: 4px;\n padding: 4px 12px;\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n border-bottom: 1px solid var(--cg-border);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-hotspot-item {\n display: grid;\n grid-template-columns: 28px 1fr 48px 48px 48px;\n gap: 4px;\n align-items: center;\n}\n\n.cg-hotspot-churn,\n.cg-hotspot-score {\n font-family: var(--cg-font-mono);\n font-size: 10px;\n color: var(--cg-text-tertiary);\n text-align: right;\n}\n\n","/* ---- Impact stats panel (FR-35) ------------------------------------------ */\n\n.cg-impact-panel {\n right: 12px;\n bottom: calc(var(--cg-statusbar-h) + 12px);\n top: auto;\n width: 160px;\n}\n\n.cg-impact-stat-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.cg-impact-stat-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n padding: 1px 6px;\n border-radius: 3px;\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.cg-impact-stat-badge.cg-d1 {\n background: var(--cg-impact-d1);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-badge.cg-d2 {\n background: var(--cg-impact-d2);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-badge.cg-d3 {\n background: var(--cg-impact-d3);\n color: var(--cg-text);\n}\n\n.cg-impact-stat-count {\n font-family: var(--cg-font-mono);\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n","/* ---- Cycle details panel ------------------------------------------------ */\r\n\r\n.cg-cycle-panel {\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n top: auto;\r\n width: 220px;\r\n max-height: 40vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-cycle-count-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--cg-cycle-highlight);\r\n color: var(--cg-on-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-cycle-empty {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n padding: 12px 0;\r\n}\r\n\r\n.cg-cycle-item {\r\n padding: 6px 0;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-cycle-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.cg-cycle-item-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-cycle-index {\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n font-weight: 700;\r\n color: var(--cg-cycle-highlight);\r\n}\r\n\r\n.cg-cycle-length {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n}\r\n\r\n.cg-cycle-nodes {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 2px;\r\n}\r\n\r\n.cg-cycle-node-tag {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 2px;\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n color: var(--cg-text);\r\n background: var(--cg-surface-active);\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n}\r\n\r\n.cg-cycle-arrow {\r\n font-size: 9px;\r\n color: var(--cg-cycle-highlight);\r\n margin: 0 1px;\r\n}\r\n\r\n.cg-filter-panel {\r\n position: absolute;\r\n top: 48px;\r\n right: 8px;\r\n width: 240px;\r\n max-height: 70vh;\r\n overflow-y: auto;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 8px;\r\n box-shadow: 0 4px 16px var(--cg-shadow-strong);\r\n z-index: var(--cg-z-dropdown);\r\n padding: 12px;\r\n}\r\n\r\n.cg-filter-panel-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.cg-filter-panel-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-panel-close {\r\n background: none;\r\n border: none;\r\n color: var(--cg-text-tertiary);\r\n cursor: pointer;\r\n font-size: 16px;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n}\r\n\r\n.cg-filter-panel-close:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-panel-section {\r\n margin-bottom: 14px;\r\n}\r\n\r\n.cg-filter-section-label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n margin-bottom: 6px;\r\n}\r\n\r\n.cg-filter-slider-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-filter-slider-row input[type=\"range\"] {\r\n flex: 1;\r\n accent-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-slider-value {\r\n min-width: 28px;\r\n text-align: center;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-hint {\r\n font-size: 10px;\r\n color: var(--cg-text-tertiary);\r\n margin-top: 4px;\r\n}\r\n\r\n.cg-filter-checkbox-grid {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 4px 8px;\r\n}\r\n\r\n.cg-filter-checkbox-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n font-size: 11px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-filter-checkbox-item input[type=\"checkbox\"] {\r\n accent-color: var(--cg-accent);\r\n}\r\n\r\n.cg-filter-type-badge {\r\n padding: 1px 6px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n font-weight: 500;\r\n}\r\n\r\n.cg-filter-type-badge[data-type=\"function\"] { background: var(--cg-node-function); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"class\"] { background: var(--cg-node-class); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"variable\"] { background: var(--cg-node-variable); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"module\"] { background: var(--cg-node-module); color: var(--cg-on-accent); }\r\n.cg-filter-type-badge[data-type=\"interface\"] { background: var(--cg-node-interface); color: var(--cg-on-accent); }\r\n\r\n.cg-filter-edge-badge {\r\n padding: 1px 6px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-filter-reset-btn {\r\n width: 100%;\r\n padding: 6px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-filter-reset-btn:hover {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-filter-quick-actions {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n\r\n.cg-filter-quick-btn {\r\n flex: 1;\r\n padding: 5px 8px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-filter-quick-btn:hover {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-impact-stat-total {\r\n margin-top: 6px;\r\n padding-top: 6px;\r\n border-top: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n","/* ---- Dead code panel ------------------------------------------------------ */\r\n\r\n.cg-deadcode-panel {\r\n right: 12px;\r\n bottom: calc(var(--cg-statusbar-h) + 12px);\r\n top: auto;\r\n width: 240px;\r\n max-height: 40vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-deadcode-count-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n padding: 1px 6px;\r\n border-radius: 10px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n background: var(--cg-deadcode-highlight);\r\n color: var(--cg-on-accent);\r\n margin-left: 6px;\r\n}\r\n\r\n.cg-deadcode-stats {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.cg-deadcode-stat-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 2px 0;\r\n}\r\n\r\n.cg-deadcode-stat-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 28px;\r\n padding: 1px 6px;\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-deadcode-stat-badge.cg-confirmed {\r\n background: var(--cg-deadcode-confirmed);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-stat-badge.cg-suspected {\r\n background: var(--cg-deadcode-suspected);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-stat-count {\r\n font-family: var(--cg-font-mono);\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-deadcode-filters {\r\n display: flex;\r\n gap: 6px;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.cg-deadcode-filters select {\r\n flex: 1;\r\n padding: 3px 6px;\r\n font-size: 11px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 4px;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n}\r\n\r\n.cg-deadcode-filters select:hover {\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-deadcode-empty {\r\n font-size: 11px;\r\n color: var(--cg-text-tertiary);\r\n text-align: center;\r\n padding: 12px 0;\r\n}\r\n\r\n.cg-deadcode-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 0;\r\n border-bottom: 1px solid var(--cg-border);\r\n cursor: pointer;\r\n}\r\n\r\n.cg-deadcode-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.cg-deadcode-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-deadcode-item.cg-confirmed {\r\n border-left: 2px solid var(--cg-deadcode-confirmed);\r\n padding-left: 4px;\r\n}\r\n\r\n.cg-deadcode-item.cg-suspected {\r\n border-left: 2px solid var(--cg-deadcode-suspected);\r\n padding-left: 4px;\r\n}\r\n\r\n.cg-deadcode-category-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n font-size: 9px;\r\n font-weight: 500;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-unreachable {\r\n background: var(--cg-deadcode-confirmed);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-no-incoming {\r\n background: var(--cg-deadcode-suspected);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-deadcode-category-badge.cg-orphan {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-deadcode-label {\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex: 1;\r\n}\r\n\r\n.cg-deadcode-filepath {\r\n font-size: 9px;\r\n color: var(--cg-text-tertiary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex-shrink: 0;\r\n max-width: 80px;\r\n}","/* ---- cycle-117: 注册矩阵看板面板 ---- */\n\n.cg-registry-empty {\n padding: 10px 8px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px dashed var(--cg-border);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-wait {\n color: var(--cg-text-tertiary);\n font-style: italic;\n}\n\n.cg-registry-faces {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 4px;\n margin-bottom: 8px;\n}\n\n.cg-registry-face {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 6px 4px;\n background: var(--cg-surface-hover);\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-face-count {\n font-family: var(--cg-font-mono);\n font-size: 14px;\n font-weight: 700;\n color: var(--cg-accent);\n}\n\n.cg-registry-face-name {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n}\n\n.cg-registry-broken {\n padding: 6px 8px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n background: var(--cg-surface-hover);\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n margin-bottom: 8px;\n}\n\n.cg-registry-broken-active {\n color: var(--cg-error);\n border-color: color-mix(in srgb, var(--cg-error) 100%, transparent);\n background: color-mix(in srgb, var(--cg-error) 8%, transparent);\n}\n\n.cg-registry-live {\n display: flex;\n gap: 8px;\n padding: 0 2px 6px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-registry-live-live { color: var(--cg-success, var(--cg-text)); }\n.cg-registry-live-idle { color: var(--cg-text-tertiary); }\n.cg-registry-live-unknown { color: var(--cg-text-tertiary); font-style: italic; }\n\n.cg-registry-section-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 4px 2px;\n}\n\n.cg-registry-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n font-size: 10px;\n border-radius: var(--cg-radius-xs);\n}\n\n.cg-registry-row:hover { background: var(--cg-surface-hover); }\n\n.cg-registry-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--cg-text-tertiary);\n}\n\n.cg-registry-dot.cg-registry-live-live { background: var(--cg-success, var(--cg-accent)); }\n.cg-registry-dot.cg-registry-live-idle { background: var(--cg-text-tertiary); opacity: 0.5; }\n\n.cg-registry-id {\n flex: 1;\n font-family: var(--cg-font-mono);\n color: var(--cg-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-registry-lifecycle {\n font-size: 9px;\n color: var(--cg-text-tertiary);\n font-family: var(--cg-font-mono);\n}\n\n.cg-registry-footnote {\n margin-top: 8px;\n padding-top: 6px;\n border-top: 1px solid var(--cg-border);\n font-size: 9px;\n color: var(--cg-text-tertiary);\n line-height: 1.4;\n}\n","/* ---- TourPanel (Guided Tours) --------------------------------------------- */\r\n\r\n.cg-tour-panel {\r\n position: absolute;\r\n left: 12px;\r\n top: calc(var(--cg-toolbar-h) + 12px);\r\n width: 280px;\r\n max-height: calc(100% - var(--cg-toolbar-h) - 24px);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n box-shadow: var(--cg-shadow);\r\n z-index: var(--cg-z-panel);\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n animation: cg-slide-right 160ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-panel-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n}\r\n\r\n.cg-tour-panel-close {\r\n background: none;\r\n border: none;\r\n color: var(--cg-text-secondary);\r\n font-size: 16px;\r\n cursor: pointer;\r\n padding: 0 4px;\r\n line-height: 1;\r\n}\r\n\r\n.cg-tour-panel-close:hover {\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tour-empty {\r\n padding: 24px 12px;\r\n text-align: center;\r\n font-size: 12px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-tour-progress {\r\n padding: 8px 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-progress-text {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n margin-bottom: 4px;\r\n display: block;\r\n}\r\n\r\n.cg-tour-progress-bar {\r\n height: 4px;\r\n background: var(--cg-border);\r\n border-radius: 2px;\r\n overflow: hidden;\r\n}\r\n\r\n.cg-tour-progress-fill {\r\n height: 100%;\r\n background: var(--cg-accent);\r\n transition: width 200ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-step-detail {\r\n padding: 10px 12px;\r\n border-bottom: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-step-layer {\r\n display: inline-block;\r\n font-size: 10px;\r\n font-weight: 600;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n margin-bottom: 6px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-tour-step-layer[data-layer=\"entry\"] { background: var(--cg-tour-layer-entry); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"api\"] { background: var(--cg-tour-layer-api); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"service\"] { background: var(--cg-tour-layer-service); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"data\"] { background: var(--cg-tour-layer-data); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"ui\"] { background: var(--cg-tour-layer-ui); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"utility\"] { background: var(--cg-tour-layer-utility); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer[data-layer=\"other\"] { background: var(--cg-border); color: var(--cg-text); }\r\n\r\n.cg-tour-step-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-description {\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n line-height: 1.4;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-path {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n font-family: monospace;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-tour-step-meta {\r\n display: flex;\r\n gap: 8px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-tour-meta-item {\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-tour-step-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 4px 0;\r\n}\r\n\r\n.cg-tour-step-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n width: 100%;\r\n padding: 4px 12px;\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n text-align: left;\r\n}\r\n\r\n.cg-tour-step-item:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-tour-step-item.cg-active {\r\n background: var(--cg-surface-active);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-tour-step-number {\r\n flex-shrink: 0;\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 10px;\r\n font-weight: 600;\r\n border-radius: 50%;\r\n background: var(--cg-border);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-tour-step-item.cg-active .cg-tour-step-number {\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-tour-step-label {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-tour-step-layer-badge {\r\n flex-shrink: 0;\r\n font-size: 9px;\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n text-transform: uppercase;\r\n}\r\n\r\n.cg-tour-step-layer-badge[data-layer=\"entry\"] { background: var(--cg-tour-layer-entry); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"api\"] { background: var(--cg-tour-layer-api); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"service\"] { background: var(--cg-tour-layer-service); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"data\"] { background: var(--cg-tour-layer-data); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"ui\"] { background: var(--cg-tour-layer-ui); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"utility\"] { background: var(--cg-tour-layer-utility); color: var(--cg-on-accent); }\r\n.cg-tour-step-layer-badge[data-layer=\"other\"] { background: var(--cg-border); color: var(--cg-text); }\r\n\r\n.cg-tour-nav {\r\n display: flex;\r\n gap: 8px;\r\n padding: 8px 12px;\r\n border-top: 1px solid var(--cg-border);\r\n}\r\n\r\n.cg-tour-nav-btn {\r\n flex: 1;\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n transition: background 120ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-tour-nav-btn:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-tour-nav-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}","/* ---- Responsive ---------------------------------------------------------- */\n\n/* Extra-narrow panels (DSH sidebar tab minimal width).\n * Hide the remaining toolbar extras to prioritize graph canvas.\n * The center group is already gone at the 600px tier below. */\n@container graphpanel (max-width: 380px) {\n .cg-tour-btn,\n .cg-minimap-btn,\n .cg-legend-btn {\n display: none;\n }\n\n /* The separators are siblings of the `.cg-toolbar-group` elements, not descendants,\n so the previous `.cg-toolbar-group ... .cg-toolbar-separator` selector never\n matched anything. */\n .cg-toolbar-separator {\n display: none;\n }\n}\n\n/* Small panels (DSH sidebar tab, narrow bottom panel).\n * Container queries respond to the PANEL width, not the viewport — the plugin\n * renders inside DSH panels whose width is unrelated to the window size. */\n@container graphpanel (max-width: 480px) {\n .cg-graph-panel {\n border-radius: var(--cg-radius-sm);\n }\n\n .cg-graph-toolbar {\n padding: 0 8px;\n gap: 4px;\n }\n\n .cg-toolbar-left {\n font-size: 11px;\n }\n\n .cg-toolbar-center {\n gap: 4px;\n }\n\n .cg-toolbar-right {\n gap: 4px;\n }\n\n .cg-layout-btn,\n .cg-graph-type-btn,\n .cg-rank-dir-btn {\n padding: 3px 6px;\n font-size: 10px;\n }\n\n .cg-search-btn,\n .cg-theme-btn,\n .cg-export-btn,\n .cg-collapse-btn,\n .cg-chain-btn,\n .cg-cycle-btn,\n .cg-impact-btn,\n .cg-inheritance-btn,\n .cg-minimap-btn,\n .cg-refresh-btn,\n .cg-undo-btn,\n .cg-redo-btn,\n .cg-import-btn,\n .cg-legend-btn,\n .cg-lang-btn,\n .cg-pathfind-btn,\n .cg-health-btn,\n .cg-rules-btn,\n .cg-hotspot-btn,\n .cg-godmodule-btn,\n .cg-corefunction-btn,\n .cg-analysis-dropdown-btn,\n .cg-quality-dropdown-btn,\n .cg-tour-btn {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n\n .cg-dropdown-content {\n min-width: 140px;\n }\n\n .cg-node-detail-panel {\n width: calc(100% - 24px);\n left: 12px;\n top: 12px;\n }\n\n .cg-legend-panel {\n width: 140px;\n }\n\n .cg-mini-map {\n width: 140px;\n }\n\n .cg-type-badge {\n display: none;\n }\n\n .cg-toolbar-separator {\n display: none;\n }\n\n .cg-graph-type-buttons {\n display: none;\n }\n\n .cg-view-mode-buttons {\n gap: 1px;\n }\n\n .cg-view-mode-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n\n .cg-search-panel,\n .cg-path-panel {\n width: calc(100% - 16px);\n max-width: 320px;\n }\n\n .cg-filter-panel {\n width: calc(100% - 16px);\n }\n\n .cg-heatmap-btn--activate,\n .cg-heatmap-btn--deactivate {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n\n}\n\n/* Medium panels (DSH sidebar medium width) */\n@container graphpanel (max-width: 768px) {\n .cg-graph-toolbar {\n padding: 0 8px;\n gap: 6px;\n }\n\n .cg-toolbar-center {\n gap: 6px;\n }\n\n .cg-toolbar-right {\n gap: 6px;\n }\n\n .cg-layout-btn,\n .cg-graph-type-btn {\n padding: 3px 8px;\n font-size: 11px;\n }\n\n .cg-node-detail-panel {\n width: 220px;\n }\n\n .cg-legend-panel {\n width: 160px;\n }\n\n .cg-mini-map {\n width: 160px;\n }\n\n .cg-filter-select {\n font-size: 11px;\n }\n\n .cg-toolbar-separator {\n margin: 0 2px;\n }\n\n .cg-tour-btn {\n display: none;\n }\n\n}\n\n/* Medium-narrow panels — hide tour and reduce analysis button clutter */\n@container graphpanel (max-width: 600px) {\n .cg-tour-btn,\n .cg-minimap-btn {\n display: none;\n }\n\n .cg-toolbar-left .cg-type-badge {\n display: none;\n }\n\n /* The center group (layout / view-mode / level) is the widest fixed-width block in the\n toolbar: 150px for its three icon-only triggers, measured on the real host. At a 520px\n panel it was being squeezed to 115px, which wrapped the level trigger onto two lines\n and clipped it; at 600px it still has 45px of slack. Hiding it here instead of letting\n it be crushed keeps the workspace chip and every right-hand control (export / more /\n collapse) reachable. Of the three controls, only the layout keeps an alternative entry\n point (Ctrl+L cycles it, see `usePanelKeyboard`); view mode and hierarchy level lose\n their mouse entry below this tier — see the note in `docs/需求分析.md` §28.3. */\n .cg-toolbar-center {\n display: none;\n }\n}\n\n/* Very small panels */\n@container graphpanel (max-width: 320px) {\n .cg-graph-toolbar {\n gap: 2px;\n flex-wrap: wrap;\n padding: 4px 4px;\n }\n\n .cg-toolbar-left,\n .cg-toolbar-center,\n .cg-toolbar-right {\n flex-wrap: wrap;\n gap: 2px;\n }\n\n .cg-layout-buttons,\n .cg-graph-type-buttons {\n padding: 1px;\n }\n\n .cg-layout-btn,\n .cg-graph-type-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n\n .cg-filter-select {\n padding: 3px 20px 3px 6px;\n font-size: 10px;\n }\n\n .cg-node-count {\n font-size: 10px;\n }\n\n .cg-legend-panel,\n .cg-mini-map {\n width: 120px;\n }\n\n /* 下拉内容已 portal 到 document.body,不再是本容器的后代,此处的\n * `@container` 抽屉规则永远匹配不到;抽屉形态改由 Dropdown 组件测量面板\n * 宽度后加 `.cg-portal-drawer`(见 layout.css)实现。 */\n\n .cg-search-panel,\n .cg-path-panel,\n .cg-filter-panel {\n width: calc(100% - 8px);\n left: 4px;\n right: 4px;\n }\n\n .cg-view-mode-buttons {\n flex-wrap: wrap;\n }\n}\n\n/* Large screens — allow fixed floating panel */\n@media (min-width: 1200px) {\n .cg-graph-panel.cg-floating {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 640px;\n height: 520px;\n }\n}\n\n/* ---- Sidebar tab mode (short height) -------------------------------------- */\n/* When the plugin renders inside a DSH sidebar tab, the panel height can be\n * very limited. Adapt the layout to prioritize the graph canvas. */\n@container graphpanel (max-height: 400px) {\n .cg-graph-toolbar {\n padding: 0 4px;\n gap: 2px;\n }\n\n .cg-toolbar-left .cg-node-count {\n font-size: 10px;\n }\n\n .cg-type-badge {\n display: none;\n }\n\n .cg-toolbar-separator {\n display: none;\n }\n\n .cg-graph-type-buttons {\n display: none;\n }\n\n .cg-view-mode-buttons {\n gap: 1px;\n }\n\n .cg-view-mode-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n\n .cg-node-detail-panel {\n max-height: calc(100% - 60px);\n overflow-y: auto;\n }\n\n .cg-legend-panel {\n max-height: 120px;\n overflow-y: auto;\n }\n\n .cg-mini-map {\n max-height: 100px;\n }\n\n .cg-search-panel,\n .cg-path-panel,\n .cg-filter-panel {\n max-height: calc(100% - 60px);\n overflow-y: auto;\n }\n}\n\n@container graphpanel (max-height: 240px) {\n .cg-graph-toolbar {\n flex-wrap: wrap;\n padding: 2px;\n }\n\n .cg-toolbar-left,\n .cg-toolbar-center,\n .cg-toolbar-right {\n flex-wrap: wrap;\n gap: 2px;\n }\n\n .cg-layout-buttons {\n display: none;\n }\n\n .cg-rank-dir-buttons {\n display: none;\n }\n\n .cg-cluster-depth-buttons {\n display: none;\n }\n\n .cg-node-detail-panel {\n width: calc(100% - 8px);\n left: 4px;\n top: 4px;\n max-height: calc(100% - 40px);\n }\n}\n\n/* ---- Reduced motion ------------------------------------------------------ */\n\n@media (prefers-reduced-motion: reduce) {\n .cg-graph-panel *,\n .cg-graph-panel *::before,\n .cg-graph-panel *::after,\n .cg-floating-panel *,\n .cg-floating-panel *::before,\n .cg-floating-panel *::after,\n .cg-floating-container *,\n .cg-floating-container *::before,\n .cg-floating-container *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* ---- Touch device adaptation --------------------------------------------- */\n\n@media (pointer: coarse) {\n .cg-layout-btn,\n .cg-graph-type-btn,\n .cg-search-btn,\n .cg-theme-btn,\n .cg-export-btn,\n .cg-collapse-btn,\n .cg-chain-btn,\n .cg-cycle-btn,\n .cg-impact-btn,\n .cg-inheritance-btn,\n .cg-minimap-btn,\n .cg-refresh-btn,\n .cg-undo-btn,\n .cg-redo-btn,\n .cg-import-btn,\n .cg-legend-btn,\n .cg-lang-btn,\n .cg-pathfind-btn,\n .cg-health-btn,\n .cg-rules-btn,\n .cg-hotspot-btn,\n .cg-godmodule-btn,\n .cg-corefunction-btn,\n .cg-analysis-dropdown-btn,\n .cg-quality-dropdown-btn,\n .cg-tour-btn {\n min-width: 44px;\n min-height: 44px;\n }\n\n .cg-node-detail-panel .cg-close-btn,\n .cg-legend-close,\n .cg-import-close,\n .cg-close-btn {\n min-width: 44px;\n min-height: 44px;\n }\n}\n/* ---- Responsive for new components ---------------------------------------- */\n\n@container graphpanel (max-width: 480px) {\n .cg-path-bar,\n .cg-health-score-card,\n .cg-rule-panel {\n width: calc(100% - 24px);\n }\n\n .cg-analysis-panel {\n width: calc(100% - 24px);\n }\n\n .cg-focus-label {\n max-width: 120px;\n }\n}\n\n@container graphpanel (max-width: 768px) {\n .cg-path-bar {\n width: 240px;\n }\n\n .cg-health-score-card {\n width: 220px;\n }\n\n .cg-rule-panel {\n width: 240px;\n }\n\n .cg-analysis-panel {\n width: 200px;\n }\n}\n/* ---- Container Queries fallback ------------------------------------------- */\n@supports not (container-type: inline-size) {\n @media (max-width: 380px) {\n .cg-tour-btn,\n .cg-minimap-btn,\n .cg-legend-btn {\n display: none;\n }\n }\n\n @media (max-width: 480px) {\n .cg-graph-panel {\n border-radius: var(--cg-radius-sm);\n }\n .cg-graph-toolbar {\n padding: 0 8px;\n gap: 4px;\n }\n .cg-toolbar-left {\n font-size: 11px;\n }\n .cg-toolbar-center {\n gap: 4px;\n }\n .cg-toolbar-right {\n gap: 4px;\n }\n .cg-layout-btn,\n .cg-graph-type-btn,\n .cg-rank-dir-btn {\n padding: 3px 6px;\n font-size: 10px;\n }\n .cg-search-btn,\n .cg-theme-btn,\n .cg-export-btn,\n .cg-collapse-btn,\n .cg-chain-btn,\n .cg-cycle-btn,\n .cg-impact-btn,\n .cg-inheritance-btn,\n .cg-minimap-btn,\n .cg-refresh-btn,\n\n .cg-undo-btn,\n .cg-redo-btn,\n .cg-import-btn,\n .cg-legend-btn,\n .cg-lang-btn,\n .cg-pathfind-btn,\n .cg-health-btn,\n .cg-rules-btn,\n .cg-hotspot-btn,\n .cg-godmodule-btn,\n .cg-corefunction-btn,\n .cg-analysis-dropdown-btn,\n .cg-quality-dropdown-btn,\n .cg-tour-btn {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n .cg-node-detail-panel {\n width: calc(100% - 24px);\n left: 12px;\n top: 12px;\n }\n .cg-legend-panel {\n width: 140px;\n }\n .cg-mini-map {\n width: 140px;\n }\n .cg-type-badge {\n display: none;\n }\n .cg-toolbar-separator {\n display: none;\n }\n .cg-graph-type-buttons {\n display: none;\n }\n .cg-dropdown-content {\n min-width: 140px;\n }\n .cg-view-mode-buttons {\n gap: 1px;\n }\n .cg-view-mode-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n .cg-search-panel,\n .cg-path-panel {\n width: calc(100% - 16px);\n max-width: 320px;\n }\n .cg-filter-panel {\n width: calc(100% - 16px);\n }\n .cg-heatmap-btn--activate,\n .cg-heatmap-btn--deactivate {\n width: 26px;\n height: 26px;\n font-size: 12px;\n }\n .cg-path-bar,\n .cg-health-score-card,\n .cg-rule-panel {\n width: calc(100% - 24px);\n }\n .cg-analysis-panel {\n width: calc(100% - 24px);\n }\n .cg-focus-label {\n max-width: 120px;\n }\n }\n\n @media (max-width: 768px) {\n .cg-graph-toolbar {\n padding: 0 8px;\n gap: 6px;\n }\n .cg-toolbar-center {\n gap: 6px;\n }\n .cg-toolbar-right {\n gap: 6px;\n }\n .cg-layout-btn,\n .cg-graph-type-btn {\n padding: 3px 8px;\n font-size: 11px;\n }\n .cg-node-detail-panel {\n width: 220px;\n }\n .cg-legend-panel {\n width: 160px;\n }\n .cg-mini-map {\n width: 160px;\n }\n .cg-filter-select {\n font-size: 11px;\n }\n .cg-toolbar-separator {\n margin: 0 2px;\n }\n .cg-tour-btn {\n display: none;\n }\n .cg-path-bar {\n width: 240px;\n }\n .cg-health-score-card {\n width: 220px;\n }\n .cg-rule-panel {\n width: 240px;\n }\n .cg-analysis-panel {\n width: 200px;\n }\n }\n\n @media (max-width: 600px) {\n .cg-tour-btn,\n .cg-minimap-btn {\n display: none;\n }\n .cg-toolbar-left .cg-type-badge {\n display: none;\n }\n /* Mirrors the 600px container tier: the center group needs 150px for its three\n icon-only triggers and gets crushed below that. */\n .cg-toolbar-center {\n display: none;\n }\n }\n\n @media (max-width: 320px) {\n .cg-graph-toolbar {\n gap: 2px;\n flex-wrap: wrap;\n padding: 4px 4px;\n }\n .cg-toolbar-left,\n .cg-toolbar-center,\n .cg-toolbar-right {\n flex-wrap: wrap;\n gap: 2px;\n }\n .cg-layout-buttons,\n .cg-graph-type-buttons {\n padding: 1px;\n }\n .cg-layout-btn,\n .cg-graph-type-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n .cg-filter-select {\n padding: 3px 20px 3px 6px;\n font-size: 10px;\n }\n .cg-node-count {\n font-size: 10px;\n }\n .cg-legend-panel,\n .cg-mini-map {\n width: 120px;\n }\n /* 同上:portal 到 body 后这里也匹配不到,抽屉由 `.cg-portal-drawer` 接管。 */\n .cg-search-panel,\n .cg-path-panel,\n .cg-filter-panel {\n width: calc(100% - 8px);\n left: 4px;\n right: 4px;\n }\n .cg-view-mode-buttons {\n flex-wrap: wrap;\n }\n }\n\n @media (max-height: 400px) {\n .cg-graph-toolbar {\n padding: 0 4px;\n gap: 2px;\n }\n .cg-toolbar-left .cg-node-count {\n font-size: 10px;\n }\n .cg-type-badge {\n display: none;\n }\n .cg-toolbar-separator {\n display: none;\n }\n .cg-graph-type-buttons {\n display: none;\n }\n .cg-view-mode-buttons {\n gap: 1px;\n }\n .cg-view-mode-btn {\n padding: 2px 4px;\n font-size: 9px;\n }\n .cg-node-detail-panel {\n max-height: calc(100% - 60px);\n overflow-y: auto;\n }\n .cg-legend-panel {\n max-height: 120px;\n overflow-y: auto;\n }\n .cg-mini-map {\n max-height: 100px;\n }\n .cg-search-panel,\n .cg-path-panel,\n .cg-filter-panel {\n max-height: calc(100% - 60px);\n overflow-y: auto;\n }\n }\n\n @media (max-height: 240px) {\n .cg-graph-toolbar {\n flex-wrap: wrap;\n padding: 2px;\n }\n .cg-toolbar-left,\n .cg-toolbar-center,\n .cg-toolbar-right {\n flex-wrap: wrap;\n gap: 2px;\n }\n .cg-layout-buttons {\n display: none;\n }\n .cg-rank-dir-buttons {\n display: none;\n }\n .cg-cluster-depth-buttons {\n display: none;\n }\n .cg-node-detail-panel {\n width: calc(100% - 8px);\n left: 4px;\n top: 4px;\n max-height: calc(100% - 40px);\n }\n }\n}\n/* ---- Conversation View Integration Mode ----------------------------------- */\n\n/* When integrated into DSH's conversation.view slot, the panel fills the\n * conversation area. Toolbar is always visible; graph canvas fills remaining\n * space. The panel must not collapse or float — it's the primary view. */\n[data-cg-integration=\"conversation-view\"] {\n width: 100%;\n height: 100%;\n min-height: 200px;\n display: flex;\n flex-direction: column;\n}\n\n[data-cg-integration=\"conversation-view\"] .cg-graph-toolbar {\n display: flex;\n flex-shrink: 0;\n}\n\n[data-cg-integration=\"conversation-view\"] .cg-graph-container {\n flex: 1;\n min-height: 0;\n}\n\n[data-cg-integration=\"conversation-view\"] .cg-collapse-fab {\n display: none;\n}\n\n[data-cg-integration=\"conversation-view\"] .cg-status-bar {\n flex-shrink: 0;\n}\n\n/* Conversation view integration (conversation.view slot) */\n.cg-conversation-view-wrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n\n.cg-conversation-view-wrapper[data-cg-visible=\"false\"] {\n display: none;\n}\n\n/* Generic host container for host-managed embedded panels\n * (conversation.view / sidebar-right / better-sidebar). */\n.cg-integration-host {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n\n.cg-integration-host[data-cg-visible=\"false\"] {\n display: none;\n}\n\n\n/* In conversation-view mode, the panel should not have its own border/radius\n * since it's embedded in the DSH conversation area */\n[data-cg-integration=\"conversation-view\"].cg-graph-panel:not(.cg-collapsed) {\n border: none;\n border-radius: 0;\n}\n/* ---- Sidebar Right Tab Integration Mode ----------------------------------- */\n\n/* When integrated into DSH's sidebar.right.pane.tab, the panel is in a\n * right sidebar tab. Width is typically 300-500px, height is full window. */\n[data-cg-integration=\"sidebar-right\"] {\n width: 100%;\n height: 100%;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n}\n\n[data-cg-integration=\"sidebar-right\"] .cg-graph-toolbar {\n display: flex;\n flex-shrink: 0;\n}\n\n[data-cg-integration=\"sidebar-right\"] .cg-graph-container {\n flex: 1;\n min-height: 0;\n}\n\n[data-cg-integration=\"sidebar-right\"] .cg-collapse-fab {\n display: none;\n}\n\n[data-cg-integration=\"sidebar-right\"].cg-graph-panel:not(.cg-collapsed) {\n border: none;\n border-radius: 0;\n}\n\n/* ---- Better Sidebar Integration Mode -------------------------------------- */\n\n/* When integrated via betterSidebar API, the panel is in a sidebar tab.\n * Similar to sidebar-right but may have different container constraints. */\n[data-cg-integration=\"better-sidebar\"] {\n width: 100%;\n height: 100%;\n min-height: 200px;\n display: flex;\n flex-direction: column;\n}\n\n[data-cg-integration=\"better-sidebar\"] .cg-graph-toolbar {\n display: flex;\n flex-shrink: 0;\n}\n\n[data-cg-integration=\"better-sidebar\"] .cg-graph-container {\n flex: 1;\n min-height: 0;\n}\n\n[data-cg-integration=\"better-sidebar\"] .cg-collapse-fab {\n display: none;\n}\n\n[data-cg-integration=\"better-sidebar\"].cg-graph-panel:not(.cg-collapsed) {\n border: none;\n border-radius: 0;\n}\n\n/* ---- Remote narrow-screen carrier adaptation ------------------------------- */\n\n/* `@linxin666/dsh-remote-web-ui` is a real, widely-installed plugin, but it\n * exposes no panel/tab API at all — its client half only occupies the\n * `sidebar.footer.action` seat and writes DOM adaptation marks\n * (`lib/client.js:4155 ACTIVE_CLASS = \"dsh-remote-portrait\"`, added to\n * `document.body` at `:4368`). So the honest relationship is \"detect it and let\n * the layout adapt\", not \"call its API\". The former `remote-web-ui`\n * integration mode was a phantom (`ctx.get('remoteWebUI')` exists in no DSH\n * generation) and has been removed; these rules replace it.\n *\n * The toolbar must stay reachable on a phone-width carrier, so it is allowed to\n * wrap instead of overflowing. */\nbody.dsh-remote-portrait .cg-graph-toolbar {\n flex-wrap: wrap;\n row-gap: 4px;\n}\n\nbody.dsh-remote-portrait .cg-graph-panel:not(.cg-collapsed) {\n border: none;\n border-radius: 0;\n}\n\n/* Below 480px the toolbar's own compact breakpoint (see Toolbar.tsx) already\n * collapses secondary controls; the graph area just needs the remaining\n * height. */\nbody.dsh-remote-portrait .cg-graph-container {\n flex: 1;\n min-height: 0;\n}\n\n/* ---- Toolbar always visible in non-floating modes -------------------------- */\n/* In all sidebar/slot integration modes, the toolbar must remain visible\n * even when there's no graph data. The toolbar is the primary interaction\n * surface and should not disappear.\n * Expressed as one rule over `[data-cg-integration]` (the attribute lives on\n * `.cg-graph-panel` itself, see GraphPanel.tsx) so every current and future\n * integration mode is covered. The `:not(.cg-collapsed)` guard is load-bearing:\n * without it this `!important` declaration outranks\n * `.cg-graph-panel.cg-collapsed .cg-graph-toolbar { display: none }` and the\n * toolbar keeps painting inside the 52px collapsed FAB. */\n.cg-graph-panel[data-cg-integration]:not(.cg-collapsed) .cg-graph-toolbar {\n display: flex !important;\n}\n\n/* ---- Desktop vs Web distinction ------------------------------------------- */\n/* On desktop platforms, the panel may have more space. On web, it's\n * constrained by the browser window. */\n@media (min-width: 1024px) {\n [data-cg-integration=\"conversation-view\"] .cg-graph-toolbar {\n padding: 0 12px;\n gap: 8px;\n }\n}\n\n/* ---- Narrow-tier sheets (cycle-110 / T3) ---------------------------------- */\n/*\n * 窄面板(≤480px)下的两处版式修正:\n * 1. 节点详情面板改为**底部抽屉**(贴边、限高),不再 `max-height: calc(100% - 24px)`\n * 从上往下盖住整个画布;\n * 2. 抽屉打开时小地图与图例**临时让位**,关闭后回归。\n *\n * 为什么两条都要:三者都是 `position: absolute` + `z-index: var(--cg-z-panel)` 的绝对定位\n * 元素,窄档下面板几乎占满高度,小地图(右下 200px)与图例(左下 180px)会被盖住一半,\n * 面板底部的按钮也会与图例重叠 —— 点击落在错误元素上,而所有 DOM 断言照旧通过。\n *\n * 两套机制**声明必须一致**:\n * - `@container graphpanel (max-width: 480px)`:主机制,按面板宽度响应(与视口无关);\n * - `[data-cg-tier=\"narrow\"]`:宿主不支持容器查询、或容器查询尺寸不可读时的兜底,\n * 由 `hooks/usePanelTier.ts` 实测宽度后写在根元素上。\n * `tests/unit/panelTierContract.test.ts` 会逐条比对这两处的声明,任一侧改动都会变红。\n */\n@container graphpanel (max-width: 480px) {\n .cg-node-detail-panel {\n top: auto;\n bottom: calc(var(--cg-statusbar-h) + 8px);\n left: 8px;\n right: 8px;\n width: auto;\n max-height: 52%;\n }\n\n /* 抽屉打开 ⇒ 两个角落的叠加层让位(关闭后自动回归,不需要 JS 复位) */\n .cg-graph-panel[data-cg-sheet=\"open\"] .cg-mini-map,\n .cg-graph-panel[data-cg-sheet=\"open\"] .cg-legend-panel {\n display: none;\n }\n}\n\n/* 兜底机制(JS 实测档位):与上面的容器查询分支**逐条等价** */\n.cg-graph-panel[data-cg-tier=\"narrow\"] .cg-node-detail-panel {\n top: auto;\n bottom: calc(var(--cg-statusbar-h) + 8px);\n left: 8px;\n right: 8px;\n width: auto;\n max-height: 52%;\n}\n\n.cg-graph-panel[data-cg-tier=\"narrow\"][data-cg-sheet=\"open\"] .cg-mini-map,\n.cg-graph-panel[data-cg-tier=\"narrow\"][data-cg-sheet=\"open\"] .cg-legend-panel {\n display: none;\n}\n\n/* ---- FBX-05: panel stack responsive tiers --------------------------------- */\n/*\n * 面板堆栈与栈内面板在窄容器下的收窄:只**新增**规则、不改任何现有行;面板根\n * 自身的固定 px 宽(160-300px)不在此重写,统一用 `max-width: calc(100% - 16px)`\n * 封顶(保留左右 8px 呼吸边)。两档阈值必须与 hooks/usePanelTier.ts 的\n * PANEL_TIER_* 常量同源——tests/unit/panelStackResponsiveContract.test.ts\n * 逐条比对,任一侧漂移即红。\n */\n@container graphpanel (max-width: 768px) {\n .cg-panel-stack-left .cg-search-bar,\n .cg-panel-stack-left .cg-path-bar,\n .cg-panel-stack-left .cg-health-score-card,\n .cg-panel-stack-left .cg-rule-panel,\n .cg-panel-stack-left .cg-node-detail-panel,\n .cg-panel-stack-left .cg-legend-panel,\n .cg-panel-stack-left .cg-import-panel {\n max-width: calc(100% - 16px);\n }\n\n .cg-panel-stack-left .cg-impact-panel,\n .cg-panel-stack-left .cg-cycle-panel,\n .cg-panel-stack-right .cg-analysis-panel,\n .cg-panel-stack-right .cg-cycle-panel,\n .cg-panel-stack-right .cg-filter-panel,\n .cg-panel-stack-right .cg-deadcode-panel {\n max-width: calc(100% - 16px);\n }\n}\n\n@container graphpanel (max-width: 480px) {\n .cg-panel-stack-left,\n .cg-panel-stack-right {\n left: 8px;\n right: 8px;\n max-width: calc(100% - 16px);\n }\n\n .cg-panel-stack-left .cg-search-bar,\n .cg-panel-stack-left .cg-path-bar,\n .cg-panel-stack-left .cg-health-score-card,\n .cg-panel-stack-left .cg-rule-panel,\n .cg-panel-stack-left .cg-node-detail-panel,\n .cg-panel-stack-left .cg-legend-panel,\n .cg-panel-stack-left .cg-import-panel {\n max-width: calc(100% - 16px);\n }\n\n .cg-panel-stack-left .cg-impact-panel,\n .cg-panel-stack-left .cg-cycle-panel,\n .cg-panel-stack-right .cg-analysis-panel,\n .cg-panel-stack-right .cg-cycle-panel,\n .cg-panel-stack-right .cg-filter-panel,\n .cg-panel-stack-right .cg-deadcode-panel {\n max-width: calc(100% - 16px);\n }\n}\n","/* Visually hidden — for screen reader only content */\r\n.cg-visually-hidden {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* Panel close button — shared across hotspot, god-module, path-bar, rule-config, health panels */\r\n.cg-close-btn {\r\n background: transparent;\r\n border: none;\r\n color: inherit;\r\n cursor: pointer;\r\n margin-left: auto;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.cg-close-btn:hover {\r\n opacity: 0.7;\r\n}\r\n\r\n.cg-close-btn--compact {\r\n padding: 0 4px;\r\n}\r\n\r\n/* Node detail expand hint — collapsed state */\r\n.cg-detail-expand-hint--expanded {\r\n background: color-mix(in srgb, var(--cg-success) 80%, transparent);\r\n border-color: color-mix(in srgb, var(--cg-success) 30%, transparent);\r\n color: var(--cg-success);\r\n}\r\n\r\n.cg-detail-collapse-btn {\r\n margin-left: auto;\r\n background: transparent;\r\n border: none;\r\n color: var(--cg-success);\r\n cursor: pointer;\r\n font-size: 11px;\r\n text-decoration: underline;\r\n}\r\n\r\n.cg-export-dropdown button:focus-visible,\r\n.cg-search-bar button:focus-visible,\r\n.cg-import-close:focus-visible,\r\n.cg-legend-close:focus-visible,\r\n.cg-close-btn:focus-visible,\r\n.cg-collapse-fab:focus-visible,\r\n.cg-path-find-btn:focus-visible,\r\n.cg-path-clear-btn:focus-visible,\r\n.cg-focus-expand-btn:focus-visible,\r\n.cg-focus-contract-btn:focus-visible,\r\n.cg-focus-exit-btn:focus-visible,\r\n.cg-empty-import-btn:focus-visible,\r\n.cg-empty-scan-btn:focus-visible,\r\n.cg-import-submit:focus-visible,\r\n.cg-rule-check-btn:focus-visible,\r\n.cg-rule-preset-btn:focus-visible,\r\n.cg-watch-toggle:focus-visible,\r\n.cg-collapse-all-btn:focus-visible,\r\n.cg-workspace-add-btn:focus-visible,\r\n.cg-workspace-item-remove:focus-visible,\r\n.cg-keyboard-help-close:focus-visible,\r\n.cg-path-suggestions button:focus-visible,\r\n.cg-hotspot-item:focus-visible,\r\n.cg-prereq-copy:focus-visible,\r\n.cg-layout-btn:focus-visible,\r\n.cg-graph-type-btn:focus-visible,\r\n.cg-view-mode-btn:focus-visible,\r\n.cg-layer-btn:focus-visible,\r\n.cg-hierarchy-btn:focus-visible,\r\n.cg-corefunction-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* ---- Micro view empty prompt & function bar -------------------------------- */\r\n\r\n.cg-micro-empty-prompt {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n text-align: center;\r\n color: var(--cg-text-secondary);\r\n font-size: 14px;\r\n max-width: 320px;\r\n line-height: 1.6;\r\n animation: cg-fade-in 200ms var(--cg-ease-out);\r\n}\r\n\r\n.cg-micro-empty-icon {\r\n font-size: 28px;\r\n font-weight: 700;\r\n margin-bottom: 12px;\r\n opacity: 0.35;\r\n letter-spacing: 2px;\r\n}\r\n\r\n.cg-micro-empty-text {\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cg-micro-empty-back-btn {\r\n margin-top: 12px;\r\n padding: 6px 16px;\r\n background: var(--cg-surface-hover);\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-sm);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n cursor: pointer;\r\n transition: background var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-micro-empty-back-btn:hover {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n}\r\n\r\n.cg-micro-function-bar {\r\n position: absolute;\r\n top: 8px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 4px 12px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n color: var(--cg-text);\r\n font-size: 12px;\r\n z-index: var(--cg-z-canvas-ui);\r\n -webkit-backdrop-filter: blur(8px);\r\n backdrop-filter: blur(8px);\r\n box-shadow: var(--cg-shadow-sm);\r\n}\r\n\r\n.cg-micro-function-close {\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n padding: 0 4px;\r\n border-radius: var(--cg-radius-xs);\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-micro-function-close:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-micro-function-mode {\r\n font-weight: 600;\r\n color: var(--cg-accent);\r\n padding: 1px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n font-size: 10px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.cg-micro-function-name {\r\n font-weight: 500;\r\n color: var(--cg-text);\r\n max-width: 200px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-micro-function-path {\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n opacity: 0.7;\r\n max-width: 160px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n/* ============================================================================\r\n * Sidebar Navigation Button & Floating Graph Panel\r\n * ============================================================================ */\r\n\r\n.cg-sidebar-nav-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n border-radius: var(--cg-radius-sm);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-sidebar-nav-btn:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-sidebar-nav-btn-active {\r\n color: var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n}\r\n\r\n.cg-floating-container {\r\n position: fixed;\r\n inset: 0;\r\n z-index: var(--cg-z-modal);\r\n pointer-events: none;\r\n visibility: hidden;\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] {\r\n pointer-events: auto;\r\n visibility: visible;\r\n}\r\n\r\n.cg-floating-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: var(--cg-overlay-bg);\r\n -webkit-backdrop-filter: blur(2px);\r\n backdrop-filter: blur(2px);\r\n opacity: 0;\r\n transition: opacity var(--cg-transition);\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] .cg-floating-overlay {\r\n opacity: 1;\r\n}\r\n\r\n.cg-floating-panel {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(0.95);\r\n width: min(90vw, 1200px);\r\n height: min(85vh, 800px);\r\n background: var(--cg-bg);\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-lg);\r\n box-shadow: var(--cg-shadow-lg);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n opacity: 0;\r\n transition: opacity var(--cg-transition), transform var(--cg-transition);\r\n}\r\n\r\n.cg-floating-container[data-visible=\"true\"] .cg-floating-panel {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(1);\r\n}\r\n\r\n.cg-floating-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 16px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-floating-header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.cg-floating-header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.cg-floating-mode-badge {\r\n font-size: 10px;\r\n font-weight: 500;\r\n padding: 2px 6px;\r\n border-radius: var(--cg-radius-xs);\r\n background: color-mix(in srgb, var(--cg-accent) 15%, transparent);\r\n color: var(--cg-accent);\r\n border: 1px solid color-mix(in srgb, var(--cg-accent) 30%, transparent);\r\n}\r\n\r\n.cg-floating-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-floating-minimize {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 16px;\r\n line-height: 1;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-floating-minimize:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-floating-minimized-btn {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n background: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n border: none;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n box-shadow: 0 4px 12px color-mix(in srgb, var(--cg-accent) 40%, transparent);\r\n z-index: var(--cg-z-modal-action);\r\n transition: transform var(--cg-transition), box-shadow var(--cg-transition);\r\n}\r\n\r\n.cg-floating-minimized-btn:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 6px 16px color-mix(in srgb, var(--cg-accent) 50%, transparent);\r\n}\r\n\r\n.cg-floating-close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border: none;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 18px;\r\n line-height: 1;\r\n transition: color var(--cg-transition), background var(--cg-transition);\r\n}\r\n\r\n.cg-floating-close:hover {\r\n color: var(--cg-text);\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-floating-content {\r\n flex: 1;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n/* Context menu — right-click node menu */\r\n.cg-context-menu {\r\n min-width: 180px;\r\n background: var(--cg-surface);\r\n border: 1px solid var(--cg-border);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px var(--cg-shadow-soft);\r\n padding: 4px 0;\r\n font-size: 13px;\r\n z-index: var(--cg-z-context-menu);\r\n}\r\n\r\n.cg-context-menu-item {\r\n display: block;\r\n width: 100%;\r\n padding: 6px 14px;\r\n background: transparent;\r\n border: none;\r\n color: var(--cg-text);\r\n cursor: pointer;\r\n text-align: left;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n transition: background var(--cg-transition);\r\n}\r\n\r\n.cg-context-menu-item:hover:not(:disabled) {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n.cg-context-menu-item:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.cg-context-menu-separator {\r\n height: 1px;\r\n margin: 2px 0;\r\n background: var(--cg-border);\r\n}\r\n\r\n/* Visual overlay bar (heatmap + TODO/FIXME combined) */\r\n.cg-overlay-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\r\n.cg-overlay-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.cg-overlay-section--collapsed {\r\n padding: 0;\r\n}\r\n\r\n.cg-overlay-label {\r\n color: var(--cg-text-secondary);\r\n font-weight: 500;\r\n margin-right: 2px;\r\n}\r\n\r\n.cg-overlay-btn {\r\n padding: 2px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text-secondary);\r\n cursor: pointer;\r\n font-size: 11px;\r\n transition: background var(--cg-transition), color var(--cg-transition), border-color var(--cg-transition);\r\n}\r\n\r\n.cg-overlay-btn:hover {\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-overlay-btn.cg-active {\r\n background: var(--cg-accent-soft);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-overlay-btn:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-overlay-btn--activate {\r\n font-weight: 500;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-overlay-divider {\r\n width: 1px;\r\n height: 14px;\r\n background: var(--cg-border);\r\n margin: 0 2px;\r\n flex-shrink: 0;\r\n}\r\n.cg-function-body-budget {\r\n display: flex;\r\n align-items: center;\r\n padding: 2px 8px;\r\n background: var(--cg-surface);\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 11px;\r\n color: var(--cg-text-secondary);\r\n z-index: var(--cg-z-canvas-ui);\r\n}\r\n\n/* ── 璇玑图增量引擎健康信号(cycle-122,XJ-11 消费端收口)──────────────\n * 白盒透明化:增量命中量化(+N 路径)常显;规则降级染警示色。\n * 信号只在引擎真实跑过时出现(skipped/全量重建不显示——不伪造观测)。 */\n.cg-status-xuanji {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 11px;\n color: var(--cg-accent);\n cursor: help;\n}\n.cg-status-xuanji.cg-xuanji-degraded {\n color: var(--cg-warning);\n}\n","/* ---- Runtime layer panel (cycle-88, P2-1 three-layer independent panels) --- */\n/*\n * 运行时层是 `docs/图谱按需加载.md:196-200` 的第三层(Trace / 日志 / 性能排查),\n * 与结构层/行为层平级且各自独立预算。面板外壳复用 `.cg-analysis-panel`\n * (`src/client/styles/hotspot-godmodule-panel.css:3`),这里只定义本层特有的\n * 内容样式:时间窗口条、日志行、指标行。\n *\n * 刻意**不使用 `color-mix()`**:仓库约定每一个 `color-mix()` 用法都必须在\n * `color-mix-fallback.css` 里配一条 rgba 回退,而这里的着色需求用既有 token\n * (`--cg-success` / `--cg-warning` / `--cg-error` / `--cg-info` /\n * `--cg-accent-soft`)就能表达,少一处需要同步维护的成对文件。\n */\n\n.cg-runtime-panel {\n width: 280px;\n}\n\n.cg-runtime-count-badge {\n margin-left: auto;\n padding: 0 6px;\n border-radius: 8px;\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n}\n\n/* 时间窗口条:让「单次时间窗口 ≤ 5 分钟」这条预算在 UI 上可见 */\n.cg-runtime-window {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 4px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface-hover);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n.cg-runtime-window-label {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-window-value {\n font-family: var(--cg-font-mono);\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-runtime-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: 6px;\n padding-bottom: 2px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-runtime-section-title {\n flex-shrink: 0;\n}\n\n.cg-runtime-section-meta,\n.cg-runtime-level-counts {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n font-weight: 500;\n color: var(--cg-text-secondary);\n text-transform: none;\n letter-spacing: 0;\n}\n\n.cg-runtime-level-counts {\n display: inline-flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n\n/* 级别着色:与 Logger 的四个级别一一对应 */\n.cg-runtime-level-count.cg-debug { color: var(--cg-text-secondary); }\n.cg-runtime-level-count.cg-info { color: var(--cg-info); }\n.cg-runtime-level-count.cg-warn { color: var(--cg-warning); }\n.cg-runtime-level-count.cg-error { color: var(--cg-error); }\n\n.cg-runtime-level-filter {\n width: 100%;\n padding: 3px 6px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 10px;\n flex-shrink: 0;\n}\n\n/* 「共 N 条,已折叠为最近 M 条」——风险 8 要求 UI 明说数据被预算裁过 */\n.cg-runtime-truncated {\n padding: 3px 6px;\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-size: 10px;\n line-height: 1.5;\n}\n\n.cg-runtime-empty {\n padding: 12px 4px;\n text-align: center;\n}\n\n.cg-runtime-empty-title {\n font-size: 11px;\n color: var(--cg-text);\n}\n\n.cg-runtime-empty-hint {\n margin-top: 4px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-empty-line {\n padding: 6px 2px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-log-list,\n.cg-runtime-metric-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cg-runtime-log-row {\n display: grid;\n grid-template-columns: auto auto auto 1fr;\n align-items: baseline;\n gap: 6px;\n padding: 3px 4px;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n line-height: 1.45;\n}\n\n.cg-runtime-log-row:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-runtime-log-time {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n.cg-runtime-log-level {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.cg-runtime-log-level.cg-debug { color: var(--cg-text-secondary); }\n.cg-runtime-log-level.cg-info { color: var(--cg-info); }\n.cg-runtime-log-level.cg-warn { color: var(--cg-warning); }\n.cg-runtime-log-level.cg-error { color: var(--cg-error); }\n\n.cg-runtime-log-scope {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-accent);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-runtime-log-message {\n color: var(--cg-text);\n word-break: break-word;\n}\n\n.cg-runtime-log-row.cg-warn .cg-runtime-log-message { color: var(--cg-warning); }\n.cg-runtime-log-row.cg-error .cg-runtime-log-message { color: var(--cg-error); }\n\n.cg-runtime-metric-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n}\n\n.cg-runtime-metric-row:hover {\n background: var(--cg-surface-hover);\n}\n\n.cg-runtime-metric-name {\n font-family: var(--cg-font-mono);\n font-weight: 600;\n color: var(--cg-text);\n flex-shrink: 0;\n}\n\n.cg-runtime-metric-degraded {\n padding: 0 4px;\n border-radius: 6px;\n background: var(--cg-error);\n /* 前景色必须走既有 token:`tokensContract.test.ts:296-307` 禁止样式表里出现裸色值 */\n color: var(--cg-on-accent);\n font-size: 9px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n.cg-runtime-metric-values {\n display: inline-flex;\n gap: 6px;\n margin-left: auto;\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-metric-count {\n font-family: var(--cg-font-mono);\n font-size: 9px;\n color: var(--cg-text-secondary);\n flex-shrink: 0;\n}\n\n/* 诚实声明:本层未接入 Trace ID / 请求 ID 维度 */\n.cg-runtime-footnote {\n margin-top: 6px;\n padding-top: 6px;\n border-top: 1px solid var(--cg-border);\n font-size: 9px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n/* cycle-141 白盒可观测性计数区 */\n.cg-runtime-obs-section {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--cg-border);\n}\n\n.cg-runtime-obs-group {\n margin-bottom: 6px;\n}\n\n.cg-runtime-obs-group-label {\n font-size: 9px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-runtime-obs-items {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 2px;\n}\n\n.cg-runtime-obs-item {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n font-size: 9px;\n}\n\n.cg-runtime-obs-key {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-obs-value {\n color: var(--cg-accent);\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n/* ── cycle-142 可观测性流动可视化 ─────────────────────────────── */\n\n/* 分段色带容器:段绝对定位,宽度 = 占比 */\n.cg-runtime-flow-band {\n position: relative;\n height: 10px;\n margin-top: 4px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n overflow: hidden;\n}\n\n.cg-runtime-flow-seg {\n position: absolute;\n top: 0;\n height: 100%;\n min-width: 1px;\n}\n\n/* ETag 色带略高,三段对比更醒目 */\n.cg-runtime-flow-band-etag {\n height: 8px;\n}\n\n/* 管线阶段配色:只用 tokens.css 已定义的语义 token(裸色值与内联回退被\n tokensContract 守卫禁止)。数据流方向按 token 语义渐进:信息→强调→成功,\n 降级段用警示色;同色阶段以透明度区分先后。 */\n.cg-flow-stage-scan { background: var(--cg-info); }\n.cg-flow-stage-init { background: var(--cg-info); opacity: 0.8; }\n.cg-flow-stage-import { background: var(--cg-accent); opacity: 0.9; }\n.cg-flow-stage-dbread { background: var(--cg-accent); }\n.cg-flow-stage-merge { background: var(--cg-success); opacity: 0.9; }\n.cg-flow-stage-xuanjidelta { background: var(--cg-success); }\n.cg-flow-stage-xuanjidegraded { background: var(--cg-warning); }\n\n/* ETag 决策配色:200 正常 / 304 节省 / rejected 警示(token 语义对位) */\n.cg-flow-etag-200 { background: var(--cg-info); }\n.cg-flow-etag-304 { background: var(--cg-success); }\n.cg-flow-etag-rejected { background: var(--cg-error); }\n\n/* 无数据段(pct=null 的兜底渲染)淡化 */\n.cg-flow-seg-nodata { opacity: 0.25; }\n\n/* 管线图例 */\n.cg-runtime-flow-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 3px;\n font-size: 9px;\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-flow-legend-item {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n}\n\n.cg-flow-swatch {\n display: inline-block;\n width: 7px;\n height: 7px;\n border-radius: 2px;\n}\n\n/* 缓存命中率行 */\n.cg-runtime-flow-cache-list {\n display: flex;\n flex-direction: column;\n gap: 3px;\n margin-top: 4px;\n}\n\n.cg-runtime-flow-cache-row {\n display: grid;\n grid-template-columns: 58px 1fr 34px;\n align-items: center;\n gap: 6px;\n font-size: 9px;\n}\n\n.cg-runtime-flow-cache-name {\n color: var(--cg-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-runtime-flow-cache-bar {\n position: relative;\n height: 6px;\n border-radius: 3px;\n background: var(--cg-bg-elevated);\n overflow: hidden;\n}\n\n.cg-runtime-flow-cache-fill {\n position: absolute;\n inset: 0 auto 0 0;\n border-radius: 3px;\n background: var(--cg-success);\n}\n\n.cg-runtime-flow-cache-value {\n color: var(--cg-text-secondary);\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n/* AST 预算用量 */\n.cg-runtime-flow-ast {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n font-size: 9px;\n}\n\n.cg-runtime-flow-ast-bar {\n flex: 0 0 72px;\n}\n\n.cg-runtime-flow-ast-text {\n color: var(--cg-text-secondary);\n}\n\n.cg-runtime-flow-ast-extra {\n color: var(--cg-warning);\n}\n","/* ---- Version diff panel (cycle-104, research report §6 #13) ---------------- */\r\n/*\r\n * 版本对比面板:把 `/diff` 的「新增/修改/删除」三类变更标到画布上,并显示计数。\r\n * 外壳复用 `.cg-analysis-panel`(见 hotspot-godmodule-panel.css:3),这里只定义\r\n * 本面板特有的内容样式。\r\n *\r\n * 与 `runtime-panel.css` 同一条约定:**不使用 `color-mix()`**。仓库要求每个\r\n * `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退,而这里的三色\r\n * 语义用既有 token(--cg-success / --cg-warning / --cg-error / --cg-accent-soft)\r\n * 就能表达,少一处需要成对维护的文件。\r\n */\r\n\r\n.cg-diff-panel {\r\n width: 260px;\r\n}\r\n\r\n/* 输入表单:两个字段上下排(260px 宽度下并排会让 \"HEAD~1\" 这类引用被截断) */\r\n.cg-diff-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.cg-diff-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n\r\n.cg-diff-field-label {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-diff-input {\r\n width: 100%;\r\n padding: 3px 6px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.cg-diff-input:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-diff-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 2px;\r\n}\r\n\r\n.cg-diff-run-btn,\r\n.cg-diff-clear-btn {\r\n padding: 3px 10px;\r\n border: 1px solid var(--cg-border-strong);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-diff-run-btn {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-diff-run-btn:disabled {\r\n opacity: 0.6;\r\n cursor: progress;\r\n}\r\n\r\n.cg-diff-clear-btn:hover,\r\n.cg-diff-run-btn:not(:disabled):hover {\r\n filter: brightness(1.08);\r\n}\r\n\r\n/* 失败提示:与「0 处变更」必须视觉可分,因此用 error token 独立成块 */\r\n.cg-diff-error {\r\n margin-top: 6px;\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-error);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-error);\r\n font-size: 11px;\r\n line-height: 1.4;\r\n}\r\n\r\n.cg-diff-empty {\r\n margin-top: 8px;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-range {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n margin-top: 8px;\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n font-family: var(--cg-font-mono);\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-range-from,\r\n.cg-diff-range-to {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-diff-range-arrow {\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-diff-counts {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n margin-top: 6px;\r\n}\r\n\r\n.cg-diff-count-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 2px 0;\r\n font-size: 11px;\r\n}\r\n\r\n.cg-diff-badge {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-diff-badge-added { background: var(--cg-success); }\r\n.cg-diff-badge-modified { background: var(--cg-warning); }\r\n.cg-diff-badge-removed { background: var(--cg-error); }\r\n\r\n.cg-diff-count-label {\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-diff-count-value {\r\n margin-left: auto;\r\n font-family: var(--cg-font-mono);\r\n font-weight: 600;\r\n color: var(--cg-text);\r\n}\r\n\r\n/* 「已标记 / 未渲染」披露:这是本面板的诚实性条款,不隐藏、不折叠 */\r\n.cg-diff-marked {\r\n margin-top: 6px;\r\n padding: 4px 8px;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n}\r\n\r\n.cg-diff-nochange {\r\n margin-top: 6px;\r\n color: var(--cg-text-secondary);\r\n font-size: 11px;\r\n font-style: italic;\r\n}\r\n\r\n/*\r\n 粒度披露(cycle-105 P0-D)。\r\n 这份 diff 是文件级的,必须常驻可见——它解释「为什么只亮了几个文件节点」。\r\n 刻意用最轻的视觉重量(次要色、无背景):它是一条事实说明,不是警告。\r\n*/\r\n.cg-diff-granularity {\r\n margin-top: 6px;\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n opacity: 0.85;\r\n}\r\n\r\n/*\r\n 截断披露。\r\n 只在真的截断时渲染(JSX 侧已门控),因此这里可以用警告色:出现即意味着\r\n 「你看到的清单不是全部」,这需要用户主动注意,不能和粒度说明混在一起。\r\n\r\n 刻意**不用背景色**:本仓库的设计令牌里没有 `--cg-warning-soft`,而写一个\r\n 颜色字面色会同时违反 `tokensContract.test.ts`(禁止在非令牌文件里出现颜色字面量)\r\n 与主题切换(深色主题下该字面色不会跟着变)。左侧 2px 竖线 + 文字本身已经足够\r\n 把这个提示从周围内容里区分出来。\r\n*/\r\n.cg-diff-truncated {\r\n margin-top: 6px;\r\n padding: 4px 0 4px 8px;\r\n border-left: 2px solid var(--cg-warning);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n line-height: 1.4;\r\n}\r\n","/* ---- 关键词图检索面板(cycle-111 / N-5)--------------------------------- */\r\n/*\r\n * 面板外壳复用 `.cg-analysis-panel`(`src/client/components/AnalysisPanelShell.tsx`),\r\n * 这里只定义本面板特有的内容样式:检索表单、种子列表、子图概要、截断提示、四态块。\r\n *\r\n * 与 `runtime-panel.css` / `diff-panel.css` 同一条约定:**不使用 `color-mix()`**。\r\n * 仓库要求每个 `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退,\r\n * 而这里的着色需求用既有 token(`--cg-accent-soft` / `--cg-success` / `--cg-warning` /\r\n * `--cg-error` / `--cg-text-secondary`)就能表达,少一处需要同步维护的成对文件。\r\n *\r\n * 窄档(`data-cg-narrow` / `@container graphpanel`)下**不把输入框收成 icon-only**:\r\n * 搜索是本面板的唯一核心操作(`docs/agents/01` 的常驻原则),把它藏进图标后面等于\r\n * 让用户在窄面板上找不到这个功能。收窄的是按钮文案与种子行的次要列。\r\n */\r\n\r\n.cg-keywordquery-panel {\r\n width: 300px;\r\n}\r\n\r\n.cg-keywordquery-count-badge {\r\n margin-left: auto;\r\n padding: 0 6px;\r\n border-radius: 8px;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n font-weight: 600;\r\n}\r\n\r\n.cg-keywordquery-body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n min-width: 0;\r\n}\r\n\r\n/* ---- 检索表单 ---- */\r\n\r\n.cg-keywordquery-form {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n flex-wrap: wrap;\r\n flex-shrink: 0;\r\n margin: 0;\r\n}\r\n\r\n.cg-keywordquery-input {\r\n flex: 1 1 120px;\r\n min-width: 0;\r\n padding: 4px 6px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 11px;\r\n font-family: var(--cg-font-sans);\r\n}\r\n\r\n.cg-keywordquery-input:focus {\r\n outline: none;\r\n border-color: var(--cg-accent);\r\n}\r\n\r\n.cg-keywordquery-input::placeholder {\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-submit,\r\n.cg-keywordquery-clear,\r\n.cg-keywordquery-retry {\r\n padding: 4px 8px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface-hover);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n cursor: pointer;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-submit {\r\n background: var(--cg-accent);\r\n border-color: var(--cg-accent);\r\n color: var(--cg-on-accent);\r\n font-weight: 600;\r\n}\r\n\r\n.cg-keywordquery-submit:hover:not(:disabled) {\r\n background: var(--cg-accent-hover);\r\n}\r\n\r\n.cg-keywordquery-submit:disabled,\r\n.cg-keywordquery-clear:disabled,\r\n.cg-keywordquery-retry:disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* ---- 阈值控件(cycle-120):深度 / token 预算的紧凑行内调节 ----\r\n 提交按钮之后、播报区之前,占据 form 的第二行(form 是纵向 flex)。\r\n 颜色/边框全部走既有 token,与面板其余部分同源;窄屏(面板 ≤300px)下\r\n 两项各占一半宽度自动换行是容器 flex-wrap 的自然行为,不需要断点。 */\r\n\r\n.cg-keywordquery-tuning {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 6px;\r\n align-items: center;\r\n}\r\n\r\n.cg-keywordquery-tune-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n flex: 1 1 0;\r\n min-width: 96px;\r\n}\r\n\r\n.cg-keywordquery-tune-name {\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n white-space: nowrap;\r\n}\r\n\r\n.cg-keywordquery-tune-input {\r\n width: 56px;\r\n padding: 2px 4px;\r\n border: 1px solid var(--cg-border);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-mono);\r\n}\r\n\r\n.cg-keywordquery-tune-input:focus-visible {\r\n outline: 1px solid var(--cg-accent);\r\n outline-offset: 0;\r\n}\r\n\r\n.cg-keywordquery-tune-input:disabled {\r\n opacity: 0.55;\r\n}\r\n\r\n/* ---- 屏幕阅读器播报区:视觉隐藏但保留在可访问树里 ---- */\r\n\r\n.cg-keywordquery-live {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n margin: -1px;\r\n padding: 0;\r\n overflow: hidden;\r\n clip: rect(0 0 0 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* ---- 四态 ---- */\r\n\r\n.cg-keywordquery-idle,\r\n.cg-keywordquery-empty {\r\n padding: 12px 4px;\r\n text-align: center;\r\n}\r\n\r\n.cg-keywordquery-idle-title,\r\n.cg-keywordquery-empty-title {\r\n font-size: 11px;\r\n color: var(--cg-text);\r\n}\r\n\r\n.cg-keywordquery-idle-hint,\r\n.cg-keywordquery-empty-hint {\r\n margin-top: 4px;\r\n font-size: 10px;\r\n line-height: 1.5;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-loading {\r\n padding: 8px 4px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n text-align: center;\r\n}\r\n\r\n.cg-keywordquery-error,\r\n.cg-keywordquery-timeout {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 8px;\r\n border: 1px solid var(--cg-error);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n font-size: 10px;\r\n color: var(--cg-text);\r\n flex-shrink: 0;\r\n}\r\n\r\n/* 超时用 warning 而不是 error:它是\"这次太慢了\",不是\"这条路走不通\"。 */\r\n.cg-keywordquery-timeout {\r\n border-color: var(--cg-warning);\r\n}\r\n\r\n.cg-keywordquery-error-title,\r\n.cg-keywordquery-timeout-title {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n/* ---- 截断提示:graphify 原则「截断必须显式」 ---- */\r\n\r\n.cg-keywordquery-truncated {\r\n padding: 4px 6px;\r\n border-left: 3px solid var(--cg-warning);\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-text-secondary);\r\n font-size: 10px;\r\n line-height: 1.5;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* ---- 分区 ---- */\r\n\r\n.cg-keywordquery-section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 3px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-section-header {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding-bottom: 2px;\r\n border-bottom: 1px solid var(--cg-border);\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: var(--cg-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.04em;\r\n}\r\n\r\n.cg-keywordquery-section-title {\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-section-meta {\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n font-weight: 500;\r\n color: var(--cg-text-secondary);\r\n text-transform: none;\r\n letter-spacing: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* ---- 种子列表 ---- */\r\n\r\n.cg-keywordquery-seed-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n max-height: 190px;\r\n overflow-y: auto;\r\n}\r\n\r\n.cg-keywordquery-seed {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 6px;\r\n width: 100%;\r\n padding: 3px 4px;\r\n border: 1px solid transparent;\r\n border-radius: var(--cg-radius-xs);\r\n background: transparent;\r\n color: var(--cg-text);\r\n font-size: 10px;\r\n font-family: var(--cg-font-sans);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.cg-keywordquery-seed:hover {\r\n background: var(--cg-surface-hover);\r\n}\r\n\r\n/* 2.4.7 / 2.4.11:键盘焦点必须可见(鼠标 hover 之外的第二条通道) */\r\n.cg-keywordquery-seed:focus-visible {\r\n outline: 2px solid var(--cg-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.cg-keywordquery-seed.cg-active {\r\n border-color: var(--cg-accent);\r\n background: var(--cg-accent-soft);\r\n}\r\n\r\n.cg-keywordquery-seed-label {\r\n font-family: var(--cg-font-mono);\r\n font-weight: 600;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n min-width: 0;\r\n flex: 1 1 auto;\r\n}\r\n\r\n.cg-keywordquery-seed-score {\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-seed-terms {\r\n display: inline-flex;\r\n gap: 3px;\r\n flex-wrap: wrap;\r\n flex-shrink: 0;\r\n max-width: 45%;\r\n justify-content: flex-end;\r\n}\r\n\r\n/* 命中词:用 `<mark>` 的语义(用户可以在浏览器里高亮/朗读到),配色走 token。 */\r\n.cg-keywordquery-term {\r\n padding: 0 3px;\r\n border-radius: 3px;\r\n background: var(--cg-accent-soft);\r\n color: var(--cg-accent);\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n}\r\n\r\n.cg-keywordquery-seeds-empty {\r\n padding: 6px 2px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n/* ---- 子图概要 ---- */\r\n\r\n.cg-keywordquery-summary {\r\n font-family: var(--cg-font-mono);\r\n font-size: 10px;\r\n color: var(--cg-text);\r\n word-break: break-word;\r\n}\r\n\r\n.cg-keywordquery-summary-reason {\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n}\r\n\r\n.cg-keywordquery-reason.cg-truncated {\r\n color: var(--cg-warning);\r\n font-weight: 600;\r\n}\r\n\r\n/* ---- 原始文本 ---- */\r\n\r\n.cg-keywordquery-raw {\r\n border-top: 1px solid var(--cg-border);\r\n padding-top: 4px;\r\n font-size: 10px;\r\n color: var(--cg-text-secondary);\r\n flex-shrink: 0;\r\n}\r\n\r\n.cg-keywordquery-raw > summary {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.cg-keywordquery-raw-text {\r\n margin: 4px 0 0;\r\n padding: 4px 6px;\r\n max-height: 160px;\r\n overflow: auto;\r\n border-radius: var(--cg-radius-xs);\r\n background: var(--cg-surface);\r\n color: var(--cg-text);\r\n font-family: var(--cg-font-mono);\r\n font-size: 9px;\r\n line-height: 1.45;\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n/* ---- 窄档:只收缩次要列,输入框与提交按钮始终可用 ---- */\r\n\r\n.cg-keywordquery-panel[data-cg-narrow] .cg-keywordquery-seed-terms,\r\n:where(.cg-graph-panel[data-cg-narrow]) .cg-keywordquery-seed-terms {\r\n display: none;\r\n}\r\n\r\n.cg-keywordquery-panel[data-cg-narrow] .cg-keywordquery-form,\r\n:where(.cg-graph-panel[data-cg-narrow]) .cg-keywordquery-form {\r\n gap: 3px;\r\n}\r\n\r\n/* 窄档下\"清空\"退成图标级宽度语义靠文字长度自然完成(不改为 icon-only,\r\n 理由见文件头:搜索是核心操作,不允许从界面上消失)。 */\r\n","/* ---- 璇玑图 ρ 路径模式面板(cycle-135)------------------------------------- */\n/*\n * 面板外壳复用 `.cg-analysis-panel`(`src/client/components/AnalysisPanelShell.tsx`),\n * 这里只定义本面板特有的内容样式:ρ 输入表单、路径列表、五态块、截断提示、翻页按钮。\n *\n * 与 `keyword-query-panel.css` 同一条约定:**不使用 `color-mix()`**。\n * 仓库要求每个 `color-mix()` 用法都在 `color-mix-fallback.css` 里配一条 rgba 回退;\n * 这里的着色需求用既有 token(`--cg-accent-soft` / `--cg-success` / `--cg-warning` /\n * `--cg-error` / `--cg-text-secondary`)就能表达,少一处需要同步维护的成对文件。\n *\n * 窄档(`data-cg-narrow` / `@container graphpanel`)下**不把输入框收成 icon-only**:\n * ρ 是本面板的唯一核心操作,把它藏进图标后面等于让用户在窄面板上找不到这个功能。\n * 收窄的是按钮文案与路径行的次要列。\n */\n\n.cg-pathpattern-panel {\n width: 300px;\n}\n\n.cg-pathpattern-count-badge {\n margin-left: auto;\n padding: 0 6px;\n border-radius: 8px;\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 10px;\n font-weight: 600;\n}\n\n.cg-pathpattern-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n/* ---- 输入表单 ---- */\n\n.cg-pathpattern-form {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n flex-shrink: 0;\n margin: 0;\n}\n\n.cg-pathpattern-input {\n flex: 1 1 120px;\n min-width: 0;\n padding: 4px 6px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 11px;\n font-family: var(--cg-font-mono);\n}\n\n.cg-pathpattern-input:focus {\n outline: none;\n border-color: var(--cg-accent);\n}\n\n.cg-pathpattern-input::placeholder {\n color: var(--cg-text-secondary);\n}\n\n.cg-pathpattern-submit,\n.cg-pathpattern-clear,\n.cg-pathpattern-retry,\n.cg-pathpattern-more {\n padding: 4px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface-hover);\n color: var(--cg-text);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-submit {\n background: var(--cg-accent);\n border-color: var(--cg-accent);\n color: var(--cg-on-accent);\n font-weight: 600;\n}\n\n.cg-pathpattern-submit:hover:not(:disabled) {\n background: var(--cg-accent-hover);\n}\n\n.cg-pathpattern-submit:disabled,\n.cg-pathpattern-clear:disabled,\n.cg-pathpattern-retry:disabled,\n.cg-pathpattern-more:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n/* ---- 控件行(起点/终点/跳数/上限)-----------------------------------------\n 提交按钮之后、播报区之前,占据 form 的第二行(form 是纵向 flex)。\n 颜色/边框全部走既有 token,与面板其余部分同源;窄屏下各占一半宽度自动换行\n 是容器 flex-wrap 的自然行为,不需要断点。 */\n\n.cg-pathpattern-tuning {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n width: 100%;\n}\n\n.cg-pathpattern-tune-item {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1 1 0;\n min-width: 88px;\n}\n\n.cg-pathpattern-tune-name {\n color: var(--cg-text-secondary);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n white-space: nowrap;\n}\n\n.cg-pathpattern-tune-input {\n width: 100%;\n min-width: 0;\n padding: 2px 4px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-size: 10px;\n font-family: var(--cg-font-mono);\n}\n\n.cg-pathpattern-tune-input:focus-visible {\n outline: 1px solid var(--cg-accent);\n outline-offset: 0;\n}\n\n.cg-pathpattern-tune-input:disabled {\n opacity: 0.55;\n}\n\n/* ---- 屏幕阅读器播报区:视觉隐藏但保留在可访问树里 ---- */\n\n.cg-pathpattern-live {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* ---- 五态(外加 idle) ---- */\n\n.cg-pathpattern-idle,\n.cg-pathpattern-empty {\n padding: 12px 4px;\n text-align: center;\n}\n\n.cg-pathpattern-idle-title,\n.cg-pathpattern-empty-title {\n font-size: 11px;\n color: var(--cg-text);\n}\n\n.cg-pathpattern-idle-hint,\n.cg-pathpattern-empty-hint {\n margin-top: 4px;\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n.cg-pathpattern-loading {\n padding: 8px 4px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n text-align: center;\n}\n\n/*\n * 拼错类型名(`unknown-types`)与语法错误(`invalid`)用**不同的边框色**:\n * 前者是「改拼写」,后者是「改语法」。两者在画面上都可能是一行红字,\n * 只靠文案区分会让色盲用户与扫读用户都读不出来。\n */\n.cg-pathpattern-unknown,\n.cg-pathpattern-invalid,\n.cg-pathpattern-notfound,\n.cg-pathpattern-error,\n.cg-pathpattern-timeout,\n.cg-pathpattern-syntax-error {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n padding: 6px 8px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n font-size: 10px;\n color: var(--cg-text);\n flex-shrink: 0;\n}\n\n.cg-pathpattern-unknown {\n border-color: var(--cg-warning);\n}\n\n.cg-pathpattern-invalid {\n border-color: var(--cg-error);\n}\n\n/*\n * 逐键语法预检的诊断(cycle-136)。与 `invalid` 终态的诊断共用 `.cg-pathpattern-diagnostic`,\n * 但它是一个**输入框下的即时提示**而不是一块终态,所以这里只给它边框色,布局由基类承担。\n */\n.cg-pathpattern-syntax-error {\n border-color: var(--cg-error);\n}\n\n/*\n * Σ 提示条(cycle-136):动态取自宿主的类型名 chips。\n *\n * 用次级文字色而不是正文色:它是**可选参考**(用户能从宿主拿到完整 Σ),\n * 不是必须阅读的正文。chips 用 mono 字体与输入框里的类型名对齐,\n * 让用户「看到 chip」就能直接照着打。\n */\n.cg-pathpattern-sigma {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n padding: 4px 0 0;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-sigma-label {\n color: var(--cg-text-secondary);\n font-size: 9px;\n font-weight: 600;\n}\n\n/*\n * cycle-139:chip 从 span 变成 button(点击插入)。\n * 按钮默认样式全部复位(border/background/font 继承既有 chip 观感),\n * hover/active/focus-visible 给出可点击反馈;disabled(枚举进行中)降透明度。\n */\n.cg-pathpattern-sigma-chip {\n padding: 1px 5px;\n border: 1px solid var(--cg-border);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n cursor: pointer;\n line-height: 1.4;\n}\n\n.cg-pathpattern-sigma-chip:hover:not(:disabled) {\n border-color: var(--cg-accent);\n color: var(--cg-accent);\n}\n\n.cg-pathpattern-sigma-chip:active:not(:disabled) {\n background: var(--cg-surface-hover, var(--cg-surface));\n}\n\n.cg-pathpattern-sigma-chip:focus-visible {\n outline: 1px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-pathpattern-sigma-chip:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.cg-pathpattern-notfound {\n border-color: var(--cg-info);\n}\n\n.cg-pathpattern-error {\n border-color: var(--cg-error);\n}\n\n/* 超时用 warning 而不是 error:它是\"这次太慢了\",不是\"这条路走不通\"。 */\n.cg-pathpattern-timeout {\n border-color: var(--cg-warning);\n}\n\n.cg-pathpattern-unknown-title,\n.cg-pathpattern-invalid-title,\n.cg-pathpattern-notfound-title,\n.cg-pathpattern-error-title,\n.cg-pathpattern-timeout-title {\n font-weight: 600;\n}\n\n.cg-pathpattern-unknown-hint,\n.cg-pathpattern-notfound-hint {\n font-size: 10px;\n line-height: 1.5;\n color: var(--cg-text-secondary);\n}\n\n/*\n * 语法诊断用等宽 `<pre>` 原样渲染(含宿主给的 `^` 指位)。它的字号比正文更小,\n * 让用户先读\"错在哪\"再看整段 ρ。\n */\n.cg-pathpattern-diagnostic {\n margin: 0;\n padding: 4px 6px;\n max-height: 120px;\n overflow: auto;\n border-radius: var(--cg-radius-xs);\n background: var(--cg-surface);\n color: var(--cg-text);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-all;\n width: 100%;\n}\n\n/* ---- 截断提示:graphify 原则「截断必须显式」 ---- */\n\n.cg-pathpattern-truncated {\n padding: 4px 6px;\n border-left: 3px solid var(--cg-warning);\n border-radius: var(--cg-radius-xs);\n background: var(--cg-accent-soft);\n color: var(--cg-text-secondary);\n font-size: 10px;\n line-height: 1.5;\n flex-shrink: 0;\n}\n\n/* ---- 结果区 ---- */\n\n.cg-pathpattern-section {\n display: flex;\n flex-direction: column;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.cg-pathpattern-section-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n padding-bottom: 2px;\n border-bottom: 1px solid var(--cg-border);\n font-size: 10px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.cg-pathpattern-section-title {\n flex-shrink: 0;\n}\n\n.cg-pathpattern-no-paths {\n padding: 6px 2px;\n font-size: 10px;\n color: var(--cg-text-secondary);\n}\n\n/* ---- 路径列表 ---- */\n\n.cg-pathpattern-path-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: 0;\n padding: 0;\n list-style: none;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cg-pathpattern-path-list li {\n display: flex;\n align-items: baseline;\n gap: 6px;\n padding: 2px 4px;\n border: 1px solid transparent;\n border-radius: var(--cg-radius-xs);\n font-size: 10px;\n font-family: var(--cg-font-sans);\n}\n\n.cg-pathpattern-path-list li:hover {\n background: var(--cg-surface-hover);\n}\n\n/* 2.4.7 / 2.4.11:键盘焦点必须可见(鼠标 hover 之外的第二条通道) */\n.cg-pathpattern-path-list li:focus-visible {\n outline: 2px solid var(--cg-accent);\n outline-offset: 1px;\n}\n\n.cg-pathpattern-path-labels {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cg-pathpattern-path-hops {\n flex-shrink: 0;\n color: var(--cg-text-secondary);\n font-family: var(--cg-font-mono);\n font-size: 9px;\n}\n\n.cg-pathpattern-more {\n align-self: flex-start;\n margin-top: 2px;\n}\n\n/* ---- 窄档:只收缩次要列,输入框与提交按钮始终可用 ---- */\n\n.cg-pathpattern-panel[data-cg-narrow] .cg-pathpattern-form,\n:where(.cg-graph-panel[data-cg-narrow]) .cg-pathpattern-form {\n gap: 3px;\n}\n\n.cg-pathpattern-panel[data-cg-narrow] .cg-pathpattern-tune-item,\n:where(.cg-graph-panel[data-cg-narrow]) .cg-pathpattern-tune-item {\n min-width: 80px;\n}\n\n/* 窄档下\"清空\"退成图标级宽度语义靠文字长度自然完成(不改为 icon-only,\n 理由见文件头:ρ 是核心操作,不允许从界面上消失)。 */\n","/**\n * GraphManagePanel 样式(cycle-141)。\n *\n * 只使用 tokens.css 中已定义的 token(`--cg-bg` / `--cg-bg-elevated` /\n * `--cg-text` / `--cg-text-secondary` / `--cg-accent` / `--cg-border` /\n * `--cg-border-strong` / `--cg-success` / `--cg-warning` / `--cg-error`)。\n * 不引入颜色 fallback(tokensContract 禁止 stylesheets 中出现带颜色字面量的 var() 调用)。\n */\n\n/* ── 面板容器 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: var(--cg-bg-elevated);\n color: var(--cg-text);\n font-size: 13px;\n line-height: 1.5;\n}\n\n/* ── 头部 ────────────────────────────────────────────────────────────────── */\n\n.cg-manage-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.cg-manage-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n}\n\n.cg-manage-header .cg-close-btn {\n background: none;\n border: none;\n color: var(--cg-text-secondary);\n font-size: 18px;\n cursor: pointer;\n padding: 0 4px;\n line-height: 1;\n}\n\n.cg-manage-header .cg-close-btn:hover {\n color: var(--cg-text);\n}\n\n/* ── 工作区信息 ──────────────────────────────────────────────────────────── */\n\n.cg-manage-workspace {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-label {\n font-size: 11px;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-path {\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--cg-accent);\n word-break: break-all;\n}\n\n/* ── 操作按钮 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.cg-manage-actions .cg-btn {\n padding: 6px 14px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.cg-manage-actions .cg-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.cg-manage-actions .cg-btn-primary {\n background: var(--cg-accent);\n color: var(--cg-bg);\n border-color: var(--cg-accent);\n}\n\n.cg-manage-actions .cg-btn-primary:hover:not(:disabled) {\n filter: brightness(1.15);\n}\n\n.cg-manage-actions .cg-btn-secondary {\n background: var(--cg-bg);\n color: var(--cg-text);\n border-color: var(--cg-border);\n}\n\n.cg-manage-actions .cg-btn-secondary:hover:not(:disabled) {\n border-color: var(--cg-accent);\n}\n\n.cg-manage-actions .cg-btn-danger {\n background: transparent;\n color: var(--cg-error);\n border-color: var(--cg-error);\n}\n\n.cg-manage-actions .cg-btn-danger:hover:not(:disabled) {\n background: var(--cg-bg);\n}\n\n.cg-manage-actions .cg-btn-ghost {\n background: transparent;\n color: var(--cg-text-secondary);\n border: 1px dashed var(--cg-border);\n}\n\n.cg-manage-actions .cg-btn-ghost:hover:not(:disabled) {\n color: var(--cg-text);\n border-color: var(--cg-text-secondary);\n}\n\n/* ── 状态卡片 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-status {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-status-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.cg-manage-status-value {\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-manage-status-value.cg-status-ready { color: var(--cg-success); }\n.cg-manage-status-value.cg-status-building { color: var(--cg-warning); }\n.cg-manage-status-value.cg-status-error { color: var(--cg-error); }\n.cg-manage-status-value.cg-status-idle { color: var(--cg-text-secondary); }\n\n/* ── 指标卡片 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-metrics {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-metrics-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--cg-text);\n}\n\n.cg-manage-metric-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n}\n\n.cg-manage-metric {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 6px 8px;\n background: var(--cg-bg-elevated);\n border: 1px solid var(--cg-border);\n border-radius: 3px;\n}\n\n.cg-manage-metric-label {\n font-size: 10px;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-metric-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--cg-accent);\n}\n\n/* ── Top 列表 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-top-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.cg-manage-top-title {\n margin: 0;\n font-size: 11px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-top-items {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 150px;\n overflow-y: auto;\n}\n\n.cg-manage-top-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 6px;\n border-radius: 3px;\n font-size: 11px;\n}\n\n.cg-manage-top-item:hover {\n background: var(--cg-bg-elevated);\n}\n\n.cg-manage-top-rank {\n color: var(--cg-text-secondary);\n min-width: 24px;\n}\n\n.cg-manage-top-id {\n flex: 1;\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n color: var(--cg-text);\n word-break: break-all;\n}\n\n.cg-manage-top-value {\n color: var(--cg-accent);\n font-weight: 600;\n min-width: 50px;\n text-align: right;\n}\n\n/* ── Loading & Warning ────────────────────────────────────────────────────── */\n\n.cg-manage-loading {\n padding: 8px;\n color: var(--cg-text-secondary);\n font-size: 12px;\n text-align: center;\n}\n\n.cg-manage-warning {\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-warning);\n border-radius: 4px;\n color: var(--cg-warning);\n font-size: 12px;\n}\n\n/* ── 删除确认(内联两步确认) ────────────────────────────────────────────── */\n\n.cg-manage-confirm {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 8px 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-error);\n border-radius: 4px;\n}\n\n.cg-manage-confirm-text {\n flex: 1;\n min-width: 200px;\n color: var(--cg-error);\n font-size: 12px;\n}\n\n/* ── 白盒信息 ────────────────────────────────────────────────────────────── */\n\n.cg-manage-whitebox {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px;\n background: var(--cg-bg);\n border: 1px solid var(--cg-border);\n border-radius: 4px;\n}\n\n.cg-manage-whitebox-title {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--cg-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.cg-manage-whitebox-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n\n.cg-manage-whitebox-value {\n font-family: 'Cascadia Code', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--cg-text);\n word-break: break-all;\n text-align: right;\n}\n\n.cg-manage-truncation {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-top: 6px;\n border-top: 1px dashed var(--cg-border);\n}\n\n.cg-manage-truncation-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 4px 12px;\n}\n\n.cg-manage-metric-grid--extra {\n margin-top: 8px;\n}\n\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/oBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACryBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxQA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACjHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AClOA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrWA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvKA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7OA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AC9aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;ACtcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA"}