@wu529778790/open-im 1.11.10-beta.1 → 1.11.10-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/registry.js +27 -2
- package/dist/commands/handler.d.ts +1 -0
- package/dist/commands/handler.js +47 -3
- package/dist/platform/handle-ai-request.js +12 -2
- package/package.json +1 -1
- package/web/dist/assets/{index-ByFnYJaR.css → index-DKQMHruB.css} +1 -1
- package/web/dist/index.html +2 -2
- /package/web/dist/assets/{index-DMoM2juo.js → index-DmvOPUfa.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getConfiguredAiCommands } from '../config.js';
|
|
1
|
+
import { getConfiguredAiCommands, loadConfig } from '../config.js';
|
|
2
2
|
import { ClaudeSDKAdapter } from './claude-sdk-adapter.js';
|
|
3
3
|
import { CodexAdapter } from './codex-adapter.js';
|
|
4
4
|
import { CodeBuddyAdapter } from './codebuddy-adapter.js';
|
|
@@ -37,7 +37,32 @@ export function initAdapters(config) {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
export function getAdapter(aiCommand) {
|
|
40
|
-
|
|
40
|
+
const existing = adapters.get(aiCommand);
|
|
41
|
+
if (existing)
|
|
42
|
+
return existing;
|
|
43
|
+
// 懒加载:启动时未初始化的工具(例如启动用 claude,运行中切到 opencode)
|
|
44
|
+
// 按需创建并缓存,避免返回 undefined 导致消息处理失败。
|
|
45
|
+
const factory = ADAPTER_FACTORIES[aiCommand];
|
|
46
|
+
if (!factory)
|
|
47
|
+
return undefined;
|
|
48
|
+
let config;
|
|
49
|
+
try {
|
|
50
|
+
config = loadConfig();
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
log.error(`Lazy-create adapter "${aiCommand}" failed to load config:`, err);
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const adapter = factory(config);
|
|
57
|
+
adapters.set(aiCommand, adapter);
|
|
58
|
+
log.info(`${aiCommand} adapter lazy-created (was not enabled at startup)`);
|
|
59
|
+
// SDK 工具需要懒启动 server,与 initAdapters 行为一致
|
|
60
|
+
if (aiCommand === 'opencode' && !isOpencodeRunning()) {
|
|
61
|
+
startOpencode().catch((err) => {
|
|
62
|
+
log.warn(`OpenCode SDK server lazy-start failed (will retry on first use): ${err}`);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return adapter;
|
|
41
66
|
}
|
|
42
67
|
export function cleanupAdapters() {
|
|
43
68
|
ClaudeSDKAdapter.destroy();
|
package/dist/commands/handler.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { resolvePlatformAiCommand } from '../config.js';
|
|
1
|
+
import { resolvePlatformAiCommand, loadConfig, loadFileConfig, saveFileConfig, } from '../config.js';
|
|
2
2
|
import { escapePathForMarkdown } from '../shared/utils.js';
|
|
3
3
|
import { getAutopilotPendingStatus } from '../shared/ai-task.js';
|
|
4
4
|
import { TERMINAL_ONLY_COMMANDS } from '../constants.js';
|
|
5
5
|
import { createLogger } from '../logger.js';
|
|
6
6
|
import { ClaudeSDKAdapter } from '../adapters/claude-sdk-adapter.js';
|
|
7
|
-
import { AI_TOOL_BY_ID } from '../adapters/tool-registry.js';
|
|
7
|
+
import { AI_TOOL_BY_ID, AI_TOOLS, isAiCommand } from '../adapters/tool-registry.js';
|
|
8
8
|
const log = createLogger('Commands');
|
|
9
9
|
function formatRelativeTime(ts) {
|
|
10
10
|
const sec = Math.floor((Date.now() - ts) / 1000);
|
|
@@ -104,6 +104,8 @@ export class CommandHandler {
|
|
|
104
104
|
return this.handlePwd(chatId, userId);
|
|
105
105
|
if (t === '/status')
|
|
106
106
|
return this.handleStatus(chatId, userId, platform);
|
|
107
|
+
if (t === '/a' || t.startsWith('/a '))
|
|
108
|
+
return this.handleSwitchAi(chatId, t.slice(2).trim(), platform);
|
|
107
109
|
if (t === '/autopilot')
|
|
108
110
|
return this.handleAutopilotStatus(chatId, userId);
|
|
109
111
|
// 快捷命令 — 直接发送预设 prompt 给 AI
|
|
@@ -182,6 +184,7 @@ export class CommandHandler {
|
|
|
182
184
|
'/plugins - 查看已安装插件',
|
|
183
185
|
'/context - 查看上下文窗口占用',
|
|
184
186
|
'/status - 显示状态',
|
|
187
|
+
'/a [工具名] - 查看或切换 AI 工具(claude/codex/codebuddy/opencode)',
|
|
185
188
|
'/cd <路径> - 切换工作目录',
|
|
186
189
|
'/pwd - 当前工作目录',
|
|
187
190
|
'/autopilot - 查看限流自动恢复状态',
|
|
@@ -289,7 +292,9 @@ export class CommandHandler {
|
|
|
289
292
|
return true;
|
|
290
293
|
}
|
|
291
294
|
async handleStatus(chatId, userId, platform) {
|
|
292
|
-
|
|
295
|
+
// 重新读取配置,使 /a 切换后立即反映新工具(与 AI 请求路径一致)
|
|
296
|
+
const config = loadConfig();
|
|
297
|
+
const aiCommand = resolvePlatformAiCommand(config, platform);
|
|
293
298
|
const version = await this.getAiVersion(aiCommand);
|
|
294
299
|
const workDir = this.deps.sessionManager.getWorkDir(userId);
|
|
295
300
|
const convId = this.deps.sessionManager.getConvId(userId);
|
|
@@ -319,6 +324,45 @@ export class CommandHandler {
|
|
|
319
324
|
await this.replySender().sendTextReply(chatId, lines.join('\n'));
|
|
320
325
|
return true;
|
|
321
326
|
}
|
|
327
|
+
async handleSwitchAi(chatId, arg, platform) {
|
|
328
|
+
// 无参数:显示当前工具 + 可选列表
|
|
329
|
+
if (!arg) {
|
|
330
|
+
const current = resolvePlatformAiCommand(loadConfig(), platform);
|
|
331
|
+
const lines = ['🔄 切换 AI 工具:', '', `当前 (${platform}): ${current}`, '', '可选:'];
|
|
332
|
+
for (const tool of AI_TOOLS) {
|
|
333
|
+
const mark = tool.id === current ? ' (当前)' : '';
|
|
334
|
+
lines.push(` /a ${tool.id} - ${tool.label}${mark}`);
|
|
335
|
+
}
|
|
336
|
+
lines.push('', '用法: /a <工具名>');
|
|
337
|
+
await this.replySender().sendTextReply(chatId, lines.join('\n'));
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
// 校验工具名
|
|
341
|
+
if (!isAiCommand(arg)) {
|
|
342
|
+
const valid = AI_TOOLS.map((t) => t.id).join(', ');
|
|
343
|
+
await this.replySender().sendTextReply(chatId, `❌ 未知工具: ${arg}\n\n可选: ${valid}`);
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
// 持久化到 config.json(load→mutate→save 模式,与 saveKeepaliveConfig 一致)
|
|
347
|
+
try {
|
|
348
|
+
const file = loadFileConfig();
|
|
349
|
+
if (!file.platforms)
|
|
350
|
+
file.platforms = {};
|
|
351
|
+
// 所有平台配置都含 aiCommand?: AiCommand,按此最小契约写入即可
|
|
352
|
+
const platforms = file.platforms;
|
|
353
|
+
const platCfg = platforms[platform] ?? {};
|
|
354
|
+
platCfg.aiCommand = arg;
|
|
355
|
+
platforms[platform] = platCfg;
|
|
356
|
+
saveFileConfig(file);
|
|
357
|
+
const label = AI_TOOL_BY_ID[arg]?.label ?? arg;
|
|
358
|
+
await this.replySender().sendTextReply(chatId, `✅ 已将 ${platform} 的 AI 工具切换为 ${label} (${arg})\n下一条消息生效,无需重启。`);
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
log.error('Failed to switch aiCommand:', err);
|
|
362
|
+
await this.replySender().sendTextReply(chatId, '❌ 切换失败,请查看日志。');
|
|
363
|
+
}
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
322
366
|
async handleCd(chatId, userId, dir, _platform) {
|
|
323
367
|
// 如果 dir 为空,显示目录选择界面
|
|
324
368
|
if (!dir) {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 4. Start typing indicator
|
|
12
12
|
* 5. Run AI task via runAITask with platform-specific callbacks
|
|
13
13
|
*/
|
|
14
|
-
import { resolvePlatformAiCommand } from '../config.js';
|
|
14
|
+
import { resolvePlatformAiCommand, loadConfig } from '../config.js';
|
|
15
15
|
import { getAdapter } from '../adapters/registry.js';
|
|
16
16
|
import { runAITask } from '../shared/ai-task.js';
|
|
17
17
|
import { createLogger } from '../logger.js';
|
|
@@ -27,10 +27,20 @@ const log = createLogger('PlatformAI');
|
|
|
27
27
|
* 5. run AI task with platform callbacks
|
|
28
28
|
*/
|
|
29
29
|
export function createPlatformAIRequestHandler(deps) {
|
|
30
|
-
const { platform, config, sessionManager, sender, throttleMs, runningTasks, minContentDeltaChars, taskKeyBuilder, onThinkingToText, extraInit, taskCallbacks, taskCallbacksFactory, } = deps;
|
|
30
|
+
const { platform, config: initialConfig, sessionManager, sender, throttleMs, runningTasks, minContentDeltaChars, taskKeyBuilder, onThinkingToText, extraInit, taskCallbacks, taskCallbacksFactory, } = deps;
|
|
31
31
|
async function handleAIRequest(params) {
|
|
32
32
|
const { userId, chatId, prompt, workDir, convId, replyToMessageId, signal } = params;
|
|
33
33
|
log.info(`[${platform}] AI request: userId=${userId}, chatId=${chatId}, promptLength=${prompt.length}`);
|
|
34
|
+
// 每条消息重新读取配置,使平台 aiCommand 的修改无需重启即可生效。
|
|
35
|
+
// loadFileConfig 有 mtime 缓存,文件未变时几乎零开销;变更后自动返回新值。
|
|
36
|
+
let config;
|
|
37
|
+
try {
|
|
38
|
+
config = loadConfig();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
log.warn(`[${platform}] Failed to reload config, using startup snapshot:`, err);
|
|
42
|
+
config = initialConfig;
|
|
43
|
+
}
|
|
34
44
|
// 1. Resolve AI command and adapter
|
|
35
45
|
const aiCommand = resolvePlatformAiCommand(config, platform);
|
|
36
46
|
const toolAdapter = getAdapter(aiCommand);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wu529778790/open-im",
|
|
3
|
-
"version": "1.11.10-beta.
|
|
3
|
+
"version": "1.11.10-beta.3",
|
|
4
4
|
"description": "Your AI coding assistant, in every chat app. Multi-platform IM bridge for Claude Code, Codex, and CodeBuddy.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";:root{--c-bg: #fafafa;--c-surface: #ffffff;--c-surface-alt: #f5f5f5;--c-border: #e5e5e5;--c-border-foc: #a3a3a3;--c-text: #1a1a2e;--c-text-2: #525252;--c-text-3: #a3a3a3;--c-accent: #6366f1;--c-accent-h: #4f46e5;--c-accent-bg: #eef2ff;--c-accent-bdr: #c7d2fe;--c-ok: #10b981;--c-ok-bg: #ecfdf5;--c-ok-bdr: #a7f3d0;--c-warn: #f59e0b;--c-warn-bg: #fffbeb;--c-warn-bdr: #fde68a;--c-err: #ef4444;--c-err-bg: #fef2f2;--c-err-bdr: #fecaca;--shadow-xs: 0 1px 2px rgba(0,0,0,.05);--shadow-s: 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -2px rgba(0,0,0,.1);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--shadow-glow: 0 0 20px rgba(99,102,241,.15);--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-xl: 16px;--font-display: "Space Grotesk", -apple-system, sans-serif;--font-body: "Inter", -apple-system, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", monospace;--fast: .12s ease;--norm: .2s ease;--slow: .3s ease}:root.dark{--c-bg: #0a0a0f;--c-surface: #141418;--c-surface-alt: #1e1e24;--c-border: #2a2a32;--c-border-foc: #52525e;--c-text: #f0f0f5;--c-text-2: #a0a0ae;--c-text-3: #5a5a68;--c-accent: #818cf8;--c-accent-h: #6366f1;--c-accent-bg: rgba(99,102,241,.12);--c-accent-bdr: rgba(99,102,241,.3);--c-ok-bg: rgba(16,185,129,.12);--c-ok-bdr: rgba(16,185,129,.3);--c-warn-bg: rgba(245,158,11,.12);--c-warn-bdr: rgba(245,158,11,.3);--c-err-bg: rgba(239,68,68,.12);--c-err-bdr: rgba(239,68,68,.3);--shadow-xs: 0 1px 2px rgba(0,0,0,.3);--shadow-s: 0 1px 3px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.3);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -2px rgba(0,0,0,.3);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.3);--shadow-glow: 0 0 20px rgba(129,140,248,.2)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-body);font-size:14px;line-height:1.5;color:var(--c-text);background:var(--c-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--c-accent);outline-offset:2px}.content{padding:32px 40px 64px;max-width:800px;width:100%;margin:0 auto}.config-editor-wrap{max-width:none}.app-header{position:sticky;top:0;z-index:15;background:var(--c-surface);border-bottom:1px solid var(--c-border)}.app-header-main,.app-header-context{padding:0 40px;display:flex;align-items:center;justify-content:space-between;gap:16px}.app-header-main{min-height:56px;border-bottom:1px solid var(--c-border)}.app-header-context{min-height:64px;padding-top:12px;padding-bottom:12px}.app-header-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.app-header-logo{width:32px;height:32px;border-radius:var(--r-m);border:1px solid var(--c-border);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;color:var(--c-accent)}.app-header-logo svg{width:16px;height:16px}.app-header-brand-text{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.app-nav{display:flex;align-items:center;gap:6px;min-width:0}.app-nav-item{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:0 12px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--c-text-2);cursor:pointer;font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--fast)}.app-nav-item svg{width:14px;height:14px}.app-nav-item:hover{background:var(--c-surface-alt);color:var(--c-text)}.app-nav-item.active{background:var(--c-accent-bg);border-color:var(--c-accent-bdr);color:var(--c-accent)}.app-header-spacer{flex:1}.app-header-status{font-size:12px;font-weight:500;display:inline-flex;align-items:center;gap:8px;padding:0 10px;min-height:32px;border-radius:999px;border:1px solid var(--c-border);background:var(--c-surface-alt);color:var(--c-text-2);white-space:nowrap}.app-header-status.running{border-color:var(--c-ok-bdr);background:var(--c-ok-bg);color:var(--c-ok)}.app-header-status.idle{color:var(--c-text-2)}.app-header-status .dot{width:8px;height:8px;border-radius:50%;display:inline-block}.app-header-status .dot.running{background:var(--c-ok);box-shadow:0 0 12px var(--c-ok);animation:pulse 2s infinite}.app-header-status .dot.idle{background:var(--c-text-3)}.app-header-status-meta{color:inherit;opacity:.8}.app-header-tools{display:flex;align-items:center;gap:8px;flex-shrink:0}.app-context-copy{min-width:0}.app-context-title{font-family:var(--font-display);font-size:20px;font-weight:600;color:var(--c-text);letter-spacing:-.02em}.app-context-hint{margin-top:4px;font-size:13px;color:var(--c-text-3);line-height:1.5;max-width:72ch}.app-context-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px}.stat-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;transition:all var(--norm)}.stat-card:hover{box-shadow:var(--shadow-m);transform:translateY(-2px)}.stat-label{font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}.stat-value{font-family:var(--font-display);font-size:32px;font-weight:700;color:var(--c-text);line-height:1;letter-spacing:-.02em}.stat-meta{font-size:12px;color:var(--c-text-3);margin-top:6px}.section{margin-bottom:40px}.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:8px}.section-title{font-family:var(--font-display);font-size:18px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.section-desc{font-size:13px;color:var(--c-text-3)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:all var(--norm)}.card:hover{box-shadow:var(--shadow-s)}.card-head{padding:16px 20px;border-bottom:1px solid var(--c-border);display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.card-head:hover{background:var(--c-surface-alt)}.card-title{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.card-body{padding:20px}.platform-grid{display:grid;grid-template-columns:1fr;gap:16px}.platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:visible;transition:all var(--norm)}.platform-card:hover{box-shadow:var(--shadow-m);border-color:var(--c-border-foc)}.platform-card.disabled{opacity:.85}.platform-card.enabled{border-color:var(--c-accent-bdr);box-shadow:0 0 0 1px var(--c-accent-bdr)}.platform-card-head{padding:16px 20px;display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;border-radius:var(--r-l) var(--r-l) 0 0}.platform-card-head:hover{background:var(--c-surface-alt)}.platform-card-meta{display:flex;align-items:center;gap:12px;min-width:0}.platform-card-icon{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:22px;line-height:1;flex-shrink:0}.platform-card-title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-card-name{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.platform-card-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.platform-card-right{display:grid;grid-template-columns:minmax(104px,116px) minmax(72px,84px) 40px minmax(72px,84px);align-items:center;gap:10px;flex-shrink:0}.platform-card-control{display:flex;align-items:center;justify-content:center;min-width:0}.platform-card-control-menu{width:40px}.platform-status-badge{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;text-align:center;font-size:11px;font-weight:500;padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.platform-status-badge.on{background:var(--c-ok-bg);color:var(--c-ok);border-color:var(--c-ok-bdr)}.platform-status-badge.off{color:var(--c-text-3)}.platform-card-chevron{font-size:12px;color:var(--c-text-3);transition:transform var(--fast)}.platform-card-body{padding:16px 20px 20px;border-top:1px solid var(--c-border);border-radius:0 0 var(--r-l) var(--r-l)}.ai-command-picker{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m);padding:12px 14px;display:flex;flex-direction:column;gap:6px;margin-bottom:16px}.ai-command-picker-title{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--c-text)}.ai-command-picker-hint{font-size:12px;color:var(--c-text-2)}.ai-command-picker .form-select{margin-top:2px}.platform-card-divider{border:0;border-top:1px solid var(--c-border);margin:0 0 16px}.platform-card-hint{font-size:12px;color:var(--c-text-3);line-height:1.5;margin-bottom:16px}.platform-card-help{margin-top:16px;padding:10px 14px;background:var(--c-surface-alt);border-radius:var(--r-m);font-size:12px;color:var(--c-text-2);line-height:1.6}.platform-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}.platform-card-ai-tag{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;font-size:11px;font-weight:500;padding:3px 10px;border-radius:999px;background:var(--c-surface-alt);color:var(--c-text-2);border:1px solid var(--c-border);cursor:pointer;white-space:nowrap;transition:all var(--fast)}.platform-card-ai-tag:hover{border-color:var(--c-accent-bdr);color:var(--c-text)}.platform-card-ai-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-ai-option{display:block;width:100%;text-align:left;background:transparent;border:0;padding:6px 10px;font-size:12px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-ai-option:hover{background:var(--c-surface-alt)}.platform-card-ai-option.active{color:var(--c-accent);font-weight:600}.platform-card-menu{position:relative;flex-shrink:0}.platform-card-menu-btn{width:32px;height:32px;background:transparent;border:0;padding:0;font-size:18px;line-height:1;color:var(--c-text-3);cursor:pointer;border-radius:var(--r-s, 4px);transition:all var(--fast)}.platform-card-menu-btn:hover{background:var(--c-surface-alt);color:var(--c-text)}.platform-card-menu-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:160px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;padding:8px 12px;font-size:13px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-menu-item:hover{background:var(--c-surface-alt)}.platform-card-menu-item.danger{color:var(--c-err, #d33)}.platform-card-menu-item.danger:hover{background:#dc353514}.platform-card-menu-item:disabled{opacity:.4;cursor:not-allowed}.platform-card-config-btn{min-width:72px}.platform-card-right .toggle{justify-content:center;width:100%}.qr-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:16px}.qr-modal{position:relative;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);box-shadow:var(--shadow-l, 0 12px 40px rgba(0, 0, 0, .2));padding:28px 28px 24px;width:100%;max-width:360px;text-align:center}.qr-modal-close{position:absolute;top:8px;right:12px;background:transparent;border:0;font-size:22px;line-height:1;color:var(--c-text-3);cursor:pointer;padding:4px 8px;border-radius:var(--r-m)}.qr-modal-close:hover{background:var(--c-surface-alt);color:var(--c-text)}.qr-modal-title{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--c-text);margin-bottom:16px}.qr-modal-img-wrap{display:flex;align-items:center;justify-content:center;margin-bottom:14px}.qr-modal-img{width:220px;height:220px;border:1px solid var(--c-border);border-radius:var(--r-m)}.qr-modal-hint{font-size:13px;color:var(--c-text-2);line-height:1.5;margin-bottom:8px}.qr-modal-status{font-size:13px;color:var(--c-text-2);line-height:1.5}.qr-modal-status.muted{color:var(--c-text-3)}.qr-modal-status.ok{color:var(--c-ok);font-weight:600}.qr-modal-status.err{color:var(--c-err, var(--c-text));font-weight:500;word-break:break-word}.qr-modal-actions{display:flex;gap:8px;justify-content:center;margin-top:16px}.form-group{margin-bottom:14px}.form-group:last-child{margin-bottom:0}.form-label{display:block;font-size:12px;font-weight:500;color:var(--c-text-2);margin-bottom:5px}.form-input,.form-select,.form-textarea{width:100%;padding:8px 10px;font-family:inherit;font-size:13px;color:var(--c-text);background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-s);transition:border-color var(--fast),box-shadow var(--fast);outline:none}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.form-input.mono,.form-textarea.mono{font-family:var(--font-mono);font-size:12px}.form-textarea{min-height:80px;resize:vertical}.form-hint{font-size:11px;color:var(--c-text-3);margin-top:4px;line-height:1.4}.form-hint a{color:var(--c-accent)}.form-hint code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 14px;font-family:var(--font-body);font-size:13px;font-weight:500;border-radius:var(--r-s);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:all var(--fast);white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-p{background:var(--c-accent);color:#fff}.btn-p:hover:not(:disabled){background:var(--c-accent-h);box-shadow:var(--shadow-glow)}.btn-s{background:var(--c-surface);color:var(--c-text);border-color:var(--c-border)}.btn-s:hover:not(:disabled){background:var(--c-surface-alt);border-color:var(--c-border-foc)}.btn-g{background:transparent;color:var(--c-text-2)}.btn-g:hover:not(:disabled){background:var(--c-surface-alt);color:var(--c-text)}.btn-d{background:var(--c-err-bg);color:var(--c-err);border-color:var(--c-err-bdr)}.btn-d:hover:not(:disabled){background:var(--c-err);color:#fff}.btn-w{background:var(--c-warn-bg);color:var(--c-warn);border-color:var(--c-warn-bdr)}.btn-w:hover:not(:disabled){background:var(--c-warn);color:#fff}.btn-sm{padding:5px 10px;font-size:12px}.btn-lg{padding:10px 20px;font-size:14px}.toggle{display:inline-flex;align-items:center;gap:8px;cursor:pointer;flex-shrink:0}.toggle-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toggle-track{position:relative;width:36px;height:20px;background:var(--c-border-foc);border-radius:999px;transition:background var(--fast);flex-shrink:0}.toggle-track:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--fast);box-shadow:var(--shadow-xs)}.toggle-input:checked+.toggle-track{background:var(--c-accent);box-shadow:0 0 10px var(--c-accent)}.toggle-input:checked+.toggle-track:after{transform:translate(16px)}.tabs{display:inline-flex;gap:2px;padding:3px;background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m)}.tab{padding:6px 12px;font-size:12px;font-weight:500;color:var(--c-text-2);background:transparent;border:none;border-radius:var(--r-s);cursor:pointer;transition:all var(--fast)}.tab:hover{color:var(--c-text)}.tab.active{background:var(--c-surface);color:var(--c-text);box-shadow:var(--shadow-xs)}.msg{padding:10px 14px;border-radius:var(--r-m);font-size:13px;line-height:1.5}.msg-ok{background:var(--c-ok-bg);color:var(--c-ok)}.msg-err{background:var(--c-err-bg);color:var(--c-err)}.msg-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:11px;font-weight:500;border-radius:999px}.badge-ok{background:var(--c-ok-bg);color:var(--c-ok)}.badge-err{background:var(--c-err-bg);color:var(--c-err)}.badge-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge-info{background:var(--c-accent-bg);color:var(--c-accent)}.field-tip{font-size:11px;color:var(--c-text-3);line-height:1.45;margin-top:5px}.field-tip a{color:var(--c-accent)}.field-tip code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.gap-2{gap:8px}.gap-3{gap:12px}.text-center{text-align:center}.mono{font-family:var(--font-mono)}.hidden{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toast-stack{position:fixed;top:92px;right:24px;z-index:40;display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast-msg{display:flex;align-items:flex-start;gap:12px;min-width:280px;max-width:min(420px,calc(100vw - 32px));border:1px solid transparent;box-shadow:var(--shadow-l);pointer-events:auto}.toast-msg.msg-ok{border-color:var(--c-ok-bdr)}.toast-msg.msg-err{border-color:var(--c-err-bdr)}.toast-msg-body{flex:1;min-width:0;word-break:break-word}.toast-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-top:-1px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;opacity:.7;transition:background var(--fast),opacity var(--fast)}.toast-close:hover{background:#0000000f;opacity:1}.dark-btn{padding:4px 8px;border-radius:var(--r-s);border:1px solid var(--c-border);background:var(--c-surface);color:var(--c-text-2);cursor:pointer;font-size:14px;line-height:1;transition:all var(--fast);display:inline-flex;align-items:center;justify-content:center}.dark-btn:hover{border-color:var(--c-border-foc);color:var(--c-text)}.config-stack{display:flex;flex-direction:column;gap:16px}.config-card .card-title{font-family:var(--font-mono);font-size:13px}.config-card textarea{width:100%}.config-editor{display:flex;gap:0;min-height:400px;border:1px solid var(--c-border);border-radius:8px;overflow:hidden}.config-editor-sidebar{width:280px;flex-shrink:0;border-right:1px solid var(--c-border);background:var(--c-surface-alt);overflow-y:auto;padding:8px 0}.config-editor-sidebar .file-item{display:flex;align-items:center;gap:6px;padding:8px 16px;cursor:pointer;font-size:13px;color:var(--c-text-2);transition:background .15s}.config-editor-sidebar .file-item:hover{background:var(--c-hover)}.config-editor-sidebar .file-item.active{background:var(--c-active);color:var(--c-text);font-weight:600}.config-editor-sidebar .file-item .icon{width:16px;text-align:center;font-size:14px;flex-shrink:0}.config-editor-sidebar .file-item .label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.config-editor-sidebar .file-item.sub{padding-left:36px;font-size:12px}.config-editor-sidebar .file-group-label{padding:12px 16px 4px;font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.5px}.config-editor-body{flex:1;display:flex;flex-direction:column;padding:16px;overflow:auto}.config-editor-body .file-hint{font-size:12px;color:var(--c-text-3);margin:0 0 12px}.config-editor-body .file-path{font-family:var(--font-mono);font-size:11px;color:var(--c-text-3);margin-bottom:12px;word-break:break-all}.config-editor-body textarea{width:100%;min-height:300px;resize:vertical;font-family:var(--font-mono);font-size:13px;line-height:1.5;padding:12px;border:1px solid var(--c-border);border-radius:6px;background:var(--c-bg);color:var(--c-text);-moz-tab-size:2;tab-size:2}.config-editor-body textarea:focus{outline:none;border-color:var(--c-primary)}.wizard-wrap{display:flex;justify-content:center;padding-top:16px}.wizard{width:100%;max-width:580px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);overflow:hidden}.wizard-bar{height:3px;background:var(--c-border)}.wizard-bar-fill{height:100%;background:var(--c-accent);transition:width .4s cubic-bezier(.4,0,.2,1)}.wizard-steps{display:flex;padding:20px 24px 0;gap:0}.wizard-step-ind{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;position:relative}.wizard-step-ind+.wizard-step-ind:before{content:"";position:absolute;top:12px;right:calc(50% + 16px);width:calc(100% - 32px);height:1px;background:var(--c-border)}.wizard-step-ind.done+.wizard-step-ind:before{background:var(--c-accent)}.wizard-step-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;background:var(--c-surface-alt);color:var(--c-text-3);border:2px solid var(--c-border);position:relative;z-index:1;transition:all var(--norm)}.wizard-step-ind.active .wizard-step-dot{background:var(--c-accent);color:#fff;border-color:var(--c-accent);box-shadow:0 0 12px var(--c-accent)}.wizard-step-ind.done .wizard-step-dot{background:var(--c-ok);color:#fff;border-color:var(--c-ok)}.wizard-step-label{font-size:11px;font-weight:500;color:var(--c-text-3);white-space:nowrap}.wizard-step-ind.active .wizard-step-label{color:var(--c-accent);font-weight:600}.wizard-step-ind.done .wizard-step-label{color:var(--c-ok)}.wizard-body{padding:28px 32px;min-height:260px}.wizard-icon{font-size:36px;margin-bottom:12px}.wizard-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.wizard-desc{font-size:13px;color:var(--c-text-2);line-height:1.6;margin-bottom:24px}.wizard-checklist{display:flex;flex-direction:column;gap:10px}.wizard-check{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--c-text)}.wizard-check-num{width:24px;height:24px;border-radius:50%;background:var(--c-accent-bg);color:var(--c-accent);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.wizard-platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:border-color var(--fast)}.wizard-platform-card.on{border-color:var(--c-accent)}.wizard-platform-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;cursor:pointer;gap:8px}.wizard-platform-head:hover{background:var(--c-surface-alt)}.wizard-platform-meta{display:flex;align-items:center;gap:10px;min-width:0}.wizard-platform-icon{width:36px;height:36px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:20px;line-height:1;flex-shrink:0}.wizard-platform-title-block{display:flex;flex-direction:column;gap:1px;min-width:0}.wizard-platform-name{font-family:var(--font-display);font-size:14px;font-weight:600}.wizard-platform-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wizard-platform-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.wizard-platform-chevron{font-size:12px;color:var(--c-text-3)}.wizard-platform-body{padding:0 16px 16px;border-top:1px solid var(--c-border)}.wizard-cred{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;margin-bottom:14px}.wizard-cred:last-child{margin-bottom:0}.wizard-cred-name{font-family:var(--font-display);font-size:14px;font-weight:600;margin-bottom:14px;color:var(--c-text)}.wizard-radio-group{display:flex;flex-direction:column;gap:8px}.wizard-radio{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:2px solid var(--c-border);border-radius:var(--r-m);cursor:pointer;transition:all var(--fast)}.wizard-radio:hover{border-color:var(--c-accent-bdr)}.wizard-radio.on{border-color:var(--c-accent);background:var(--c-accent-bg)}.wizard-radio input[type=radio]{margin-top:2px;accent-color:var(--c-accent)}.wizard-radio-body{display:flex;flex-direction:column;gap:2px}.wizard-radio-label{font-size:13px;font-weight:600;color:var(--c-text)}.wizard-radio-desc{font-size:12px;color:var(--c-text-3)}.wizard-review-block{margin-bottom:20px}.wizard-review-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c-text-3);margin-bottom:10px}.wizard-kv{display:flex;justify-content:space-between;align-items:center;padding:7px 0;border-bottom:1px solid var(--c-border);font-size:12px}.wizard-kv span{color:var(--c-text-2)}.wizard-kv code{font-family:var(--font-mono);font-size:11px;color:var(--c-text);background:var(--c-surface-alt);padding:2px 6px;border-radius:4px}.wizard-platforms{display:flex;flex-wrap:wrap;gap:6px}.wizard-platform-pill{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--c-surface-alt);border-radius:999px;font-size:12px;font-weight:500}.wizard-platform-pill .cmd{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--c-accent-bg);color:var(--c-accent);font-weight:500}.wizard-done{text-align:center;padding:20px 0}.wizard-nav{display:flex;align-items:center;padding:16px 32px 24px;gap:10px}.wizard-nav-spacer{flex:1}.wizard-pulse{animation:wiz-pulse 1.2s ease-in-out infinite}@keyframes wiz-pulse{0%,to{opacity:1}50%{opacity:.4}}.conn{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px}.conn-card{width:100%;max-width:420px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);padding:32px}.conn-logo{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-accent);display:flex;align-items:center;justify-content:center;margin-bottom:20px}.conn-logo svg{width:22px;height:22px;color:#fff}.conn-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.conn-desc{font-size:13px;color:var(--c-text-2);margin-bottom:24px;line-height:1.5}.conn-row{display:flex;gap:8px}.conn-input{flex:1;padding:8px 10px;font-family:var(--font-mono);font-size:13px;color:var(--c-text);background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-s);outline:none;transition:border-color var(--fast)}.conn-input:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.conn-status{font-size:12px;margin-top:10px;color:var(--c-text-3)}.conn-status.ok{color:var(--c-ok)}.conn-status.err{color:var(--c-err)}@media(max-width:1024px){.stats-grid{grid-template-columns:1fr}}@media(max-width:768px){.content{padding:20px 16px 40px}.toast-stack{top:140px;right:16px;left:16px}.toast-msg{min-width:0;max-width:none}.app-header-main,.app-header-context{padding-left:16px;padding-right:16px}.app-header-main{min-height:auto;padding-top:12px;padding-bottom:12px;flex-wrap:wrap;align-items:flex-start}.app-nav{order:3;width:100%;overflow-x:auto;padding-bottom:2px}.app-header-spacer{display:none}.app-header-context{min-height:auto;align-items:flex-start;flex-direction:column}.app-context-actions{width:100%;justify-content:flex-start}.platform-grid{grid-template-columns:1fr}.platform-card-head{align-items:flex-start;flex-direction:column}.platform-card-right{width:100%;grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card-control-menu,.platform-card-menu-btn{width:100%}.wizard-chips{grid-template-columns:1fr}}
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";:root{--c-bg: #fafafa;--c-surface: #ffffff;--c-surface-alt: #f5f5f5;--c-border: #e5e5e5;--c-border-foc: #a3a3a3;--c-text: #1a1a2e;--c-text-2: #525252;--c-text-3: #a3a3a3;--c-accent: #6366f1;--c-accent-h: #4f46e5;--c-accent-bg: #eef2ff;--c-accent-bdr: #c7d2fe;--c-ok: #10b981;--c-ok-bg: #ecfdf5;--c-ok-bdr: #a7f3d0;--c-warn: #f59e0b;--c-warn-bg: #fffbeb;--c-warn-bdr: #fde68a;--c-err: #ef4444;--c-err-bg: #fef2f2;--c-err-bdr: #fecaca;--shadow-xs: 0 1px 2px rgba(0,0,0,.05);--shadow-s: 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -2px rgba(0,0,0,.1);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--shadow-glow: 0 0 20px rgba(99,102,241,.15);--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-xl: 16px;--font-display: "Space Grotesk", -apple-system, sans-serif;--font-body: "Inter", -apple-system, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", monospace;--fast: .12s ease;--norm: .2s ease;--slow: .3s ease}:root.dark{--c-bg: #0a0a0f;--c-surface: #141418;--c-surface-alt: #1e1e24;--c-border: #2a2a32;--c-border-foc: #52525e;--c-text: #f0f0f5;--c-text-2: #a0a0ae;--c-text-3: #5a5a68;--c-accent: #818cf8;--c-accent-h: #6366f1;--c-accent-bg: rgba(99,102,241,.12);--c-accent-bdr: rgba(99,102,241,.3);--c-ok-bg: rgba(16,185,129,.12);--c-ok-bdr: rgba(16,185,129,.3);--c-warn-bg: rgba(245,158,11,.12);--c-warn-bdr: rgba(245,158,11,.3);--c-err-bg: rgba(239,68,68,.12);--c-err-bdr: rgba(239,68,68,.3);--shadow-xs: 0 1px 2px rgba(0,0,0,.3);--shadow-s: 0 1px 3px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.3);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -2px rgba(0,0,0,.3);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.3);--shadow-glow: 0 0 20px rgba(129,140,248,.2)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-body);font-size:14px;line-height:1.5;color:var(--c-text);background:var(--c-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--c-accent);outline-offset:2px}.content{padding:32px 40px 64px;max-width:800px;width:100%;margin:0 auto}.config-editor-wrap{max-width:none}.app-header{position:sticky;top:0;z-index:15;background:var(--c-surface);border-bottom:1px solid var(--c-border)}.app-header-main,.app-header-context{padding:0 40px;display:flex;align-items:center;justify-content:space-between;gap:16px}.app-header-main{min-height:56px;border-bottom:1px solid var(--c-border)}.app-header-context{min-height:64px;padding-top:12px;padding-bottom:12px}.app-header-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.app-header-logo{width:32px;height:32px;border-radius:var(--r-m);border:1px solid var(--c-border);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;color:var(--c-accent)}.app-header-logo svg{width:16px;height:16px}.app-header-brand-text{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.app-nav{display:flex;align-items:center;gap:6px;min-width:0}.app-nav-item{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:0 12px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--c-text-2);cursor:pointer;font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--fast)}.app-nav-item svg{width:14px;height:14px}.app-nav-item:hover{background:var(--c-surface-alt);color:var(--c-text)}.app-nav-item.active{background:var(--c-accent-bg);border-color:var(--c-accent-bdr);color:var(--c-accent)}.app-header-spacer{flex:1}.app-header-status{font-size:12px;font-weight:500;display:inline-flex;align-items:center;gap:8px;padding:0 10px;min-height:32px;border-radius:999px;border:1px solid var(--c-border);background:var(--c-surface-alt);color:var(--c-text-2);white-space:nowrap}.app-header-status.running{border-color:var(--c-ok-bdr);background:var(--c-ok-bg);color:var(--c-ok)}.app-header-status.idle{color:var(--c-text-2)}.app-header-status .dot{width:8px;height:8px;border-radius:50%;display:inline-block}.app-header-status .dot.running{background:var(--c-ok);box-shadow:0 0 12px var(--c-ok);animation:pulse 2s infinite}.app-header-status .dot.idle{background:var(--c-text-3)}.app-header-status-meta{color:inherit;opacity:.8}.app-header-tools{display:flex;align-items:center;gap:8px;flex-shrink:0}.app-context-copy{min-width:0}.app-context-title{font-family:var(--font-display);font-size:20px;font-weight:600;color:var(--c-text);letter-spacing:-.02em}.app-context-hint{margin-top:4px;font-size:13px;color:var(--c-text-3);line-height:1.5;max-width:72ch}.app-context-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px}.stat-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;transition:all var(--norm)}.stat-card:hover{box-shadow:var(--shadow-m);transform:translateY(-2px)}.stat-label{font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}.stat-value{font-family:var(--font-display);font-size:32px;font-weight:700;color:var(--c-text);line-height:1;letter-spacing:-.02em}.stat-meta{font-size:12px;color:var(--c-text-3);margin-top:6px}.section{margin-bottom:40px}.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:8px}.section-title{font-family:var(--font-display);font-size:18px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.section-desc{font-size:13px;color:var(--c-text-3)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:all var(--norm)}.card:hover{box-shadow:var(--shadow-s)}.card-head{padding:16px 20px;border-bottom:1px solid var(--c-border);display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.card-head:hover{background:var(--c-surface-alt)}.card-title{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.card-body{padding:20px}.platform-grid{display:grid;grid-template-columns:1fr;gap:16px}.platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:visible;transition:all var(--norm)}.platform-card:hover{box-shadow:var(--shadow-m);border-color:var(--c-border-foc)}.platform-card.disabled{opacity:.85}.platform-card.enabled{border-color:var(--c-accent-bdr);box-shadow:0 0 0 1px var(--c-accent-bdr)}.platform-card-head{padding:16px 20px;display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;border-radius:var(--r-l) var(--r-l) 0 0}.platform-card-head:hover{background:var(--c-surface-alt)}.platform-card-meta{display:flex;align-items:center;gap:12px;min-width:0}.platform-card-icon{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:22px;line-height:1;flex-shrink:0}.platform-card-title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-card-name{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.platform-card-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.platform-card-right{display:grid;grid-template-columns:minmax(104px,116px) minmax(72px,84px) 40px minmax(72px,84px);align-items:center;gap:10px;flex-shrink:0}.platform-card-control{display:flex;align-items:center;justify-content:center;min-width:0}.platform-card-control-menu{width:40px}.platform-status-badge{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;text-align:center;font-size:11px;font-weight:500;padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.platform-status-badge.on{background:var(--c-ok-bg);color:var(--c-ok);border-color:var(--c-ok-bdr)}.platform-status-badge.off{color:var(--c-text-3)}.platform-card-chevron{font-size:12px;color:var(--c-text-3);transition:transform var(--fast)}.platform-card-body{padding:16px 20px 20px;border-top:1px solid var(--c-border);border-radius:0 0 var(--r-l) var(--r-l)}.ai-command-picker{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m);padding:12px 14px;display:flex;flex-direction:column;gap:6px;margin-bottom:16px}.ai-command-picker-title{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--c-text)}.ai-command-picker-hint{font-size:12px;color:var(--c-text-2)}.ai-command-picker .form-select{margin-top:2px}.platform-card-divider{border:0;border-top:1px solid var(--c-border);margin:0 0 16px}.platform-card-hint{font-size:12px;color:var(--c-text-3);line-height:1.5;margin-bottom:16px}.platform-card-help{margin-top:16px;padding:10px 14px;background:var(--c-surface-alt);border-radius:var(--r-m);font-size:12px;color:var(--c-text-2);line-height:1.6}.platform-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}.platform-card-ai-tag{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;font-size:11px;font-weight:500;padding:3px 10px;border-radius:999px;background:var(--c-surface-alt);color:var(--c-text-2);border:1px solid var(--c-border);cursor:pointer;white-space:nowrap;transition:all var(--fast)}.platform-card-ai-tag:hover{border-color:var(--c-accent-bdr);color:var(--c-text)}.platform-card-ai-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-ai-option{display:block;width:100%;text-align:left;background:transparent;border:0;padding:6px 10px;font-size:12px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-ai-option:hover{background:var(--c-surface-alt)}.platform-card-ai-option.active{color:var(--c-accent);font-weight:600}.platform-card-menu{position:relative;flex-shrink:0}.platform-card-menu-btn{width:32px;height:32px;background:transparent;border:0;padding:0;font-size:18px;line-height:1;color:var(--c-text-3);cursor:pointer;border-radius:var(--r-s, 4px);transition:all var(--fast)}.platform-card-menu-btn:hover{background:var(--c-surface-alt);color:var(--c-text)}.platform-card-menu-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:160px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;padding:8px 12px;font-size:13px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-menu-item:hover{background:var(--c-surface-alt)}.platform-card-menu-item.danger{color:var(--c-err, #d33)}.platform-card-menu-item.danger:hover{background:#dc353514}.platform-card-menu-item:disabled{opacity:.4;cursor:not-allowed}.platform-card-config-btn{min-width:72px}.platform-card-right .toggle{justify-content:center;width:100%}.qr-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:16px}.qr-modal{position:relative;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);box-shadow:var(--shadow-l, 0 12px 40px rgba(0, 0, 0, .2));padding:28px 28px 24px;width:100%;max-width:360px;text-align:center}.qr-modal-close{position:absolute;top:8px;right:12px;background:transparent;border:0;font-size:22px;line-height:1;color:var(--c-text-3);cursor:pointer;padding:4px 8px;border-radius:var(--r-m)}.qr-modal-close:hover{background:var(--c-surface-alt);color:var(--c-text)}.qr-modal-title{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--c-text);margin-bottom:16px}.qr-modal-img-wrap{display:flex;align-items:center;justify-content:center;margin-bottom:14px}.qr-modal-img{width:220px;height:220px;border:1px solid var(--c-border);border-radius:var(--r-m)}.qr-modal-hint{font-size:13px;color:var(--c-text-2);line-height:1.5;margin-bottom:8px}.qr-modal-status{font-size:13px;color:var(--c-text-2);line-height:1.5}.qr-modal-status.muted{color:var(--c-text-3)}.qr-modal-status.ok{color:var(--c-ok);font-weight:600}.qr-modal-status.err{color:var(--c-err, var(--c-text));font-weight:500;word-break:break-word}.qr-modal-actions{display:flex;gap:8px;justify-content:center;margin-top:16px}.form-group{margin-bottom:14px}.form-group:last-child{margin-bottom:0}.form-label{display:block;font-size:12px;font-weight:500;color:var(--c-text-2);margin-bottom:5px}.form-input,.form-select,.form-textarea{width:100%;padding:8px 10px;font-family:inherit;font-size:13px;color:var(--c-text);background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-s);transition:border-color var(--fast),box-shadow var(--fast);outline:none}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.form-input.mono,.form-textarea.mono{font-family:var(--font-mono);font-size:12px}.form-textarea{min-height:80px;resize:vertical}.form-hint{font-size:11px;color:var(--c-text-3);margin-top:4px;line-height:1.4}.form-hint a{color:var(--c-accent)}.form-hint code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 14px;font-family:var(--font-body);font-size:13px;font-weight:500;border-radius:var(--r-s);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:all var(--fast);white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-p{background:var(--c-accent);color:#fff}.btn-p:hover:not(:disabled){background:var(--c-accent-h);box-shadow:var(--shadow-glow)}.btn-s{background:var(--c-surface);color:var(--c-text);border-color:var(--c-border)}.btn-s:hover:not(:disabled){background:var(--c-surface-alt);border-color:var(--c-border-foc)}.btn-g{background:transparent;color:var(--c-text-2)}.btn-g:hover:not(:disabled){background:var(--c-surface-alt);color:var(--c-text)}.btn-d{background:var(--c-err-bg);color:var(--c-err);border-color:var(--c-err-bdr)}.btn-d:hover:not(:disabled){background:var(--c-err);color:#fff}.btn-w{background:var(--c-warn-bg);color:var(--c-warn);border-color:var(--c-warn-bdr)}.btn-w:hover:not(:disabled){background:var(--c-warn);color:#fff}.btn-sm{padding:5px 10px;font-size:12px}.btn-lg{padding:10px 20px;font-size:14px}.toggle{display:inline-flex;align-items:center;gap:8px;cursor:pointer;flex-shrink:0}.toggle-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toggle-track{position:relative;width:36px;height:20px;background:var(--c-border-foc);border-radius:999px;transition:background var(--fast);flex-shrink:0}.toggle-track:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--fast);box-shadow:var(--shadow-xs)}.toggle-input:checked+.toggle-track{background:var(--c-accent);box-shadow:0 0 10px var(--c-accent)}.toggle-input:checked+.toggle-track:after{transform:translate(16px)}.tabs{display:inline-flex;gap:2px;padding:3px;background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m)}.tab{padding:6px 12px;font-size:12px;font-weight:500;color:var(--c-text-2);background:transparent;border:none;border-radius:var(--r-s);cursor:pointer;transition:all var(--fast)}.tab:hover{color:var(--c-text)}.tab.active{background:var(--c-surface);color:var(--c-text);box-shadow:var(--shadow-xs)}.msg{padding:10px 14px;border-radius:var(--r-m);font-size:13px;line-height:1.5}.msg-ok{background:var(--c-ok-bg);color:var(--c-ok)}.msg-err{background:var(--c-err-bg);color:var(--c-err)}.msg-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:11px;font-weight:500;border-radius:999px}.badge-ok{background:var(--c-ok-bg);color:var(--c-ok)}.badge-err{background:var(--c-err-bg);color:var(--c-err)}.badge-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge-info{background:var(--c-accent-bg);color:var(--c-accent)}.field-tip{font-size:11px;color:var(--c-text-3);line-height:1.45;margin-top:5px}.field-tip a{color:var(--c-accent)}.field-tip code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.gap-2{gap:8px}.gap-3{gap:12px}.text-center{text-align:center}.mono{font-family:var(--font-mono)}.hidden{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toast-stack{position:fixed;top:92px;right:24px;z-index:40;display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast-msg{display:flex;align-items:flex-start;gap:12px;min-width:280px;max-width:min(420px,calc(100vw - 32px));border:1px solid transparent;box-shadow:var(--shadow-l);pointer-events:auto}.toast-msg.msg-ok{border-color:var(--c-ok-bdr)}.toast-msg.msg-err{border-color:var(--c-err-bdr)}.toast-msg-body{flex:1;min-width:0;word-break:break-word}.toast-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-top:-1px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;opacity:.7;transition:background var(--fast),opacity var(--fast)}.toast-close:hover{background:#0000000f;opacity:1}.dark-btn{padding:4px 8px;border-radius:var(--r-s);border:1px solid var(--c-border);background:var(--c-surface);color:var(--c-text-2);cursor:pointer;font-size:14px;line-height:1;transition:all var(--fast);display:inline-flex;align-items:center;justify-content:center}.dark-btn:hover{border-color:var(--c-border-foc);color:var(--c-text)}.config-stack{display:flex;flex-direction:column;gap:16px}.config-card .card-title{font-family:var(--font-mono);font-size:13px}.config-card textarea{width:100%}.config-editor{display:flex;gap:0;height:calc(100vh - 220px);min-height:420px;border:1px solid var(--c-border);border-radius:8px;overflow:hidden}.config-editor-sidebar{width:280px;flex-shrink:0;border-right:1px solid var(--c-border);background:var(--c-surface-alt);overflow-y:auto;padding:8px 0}.config-editor-sidebar .file-item{display:flex;align-items:center;gap:6px;padding:8px 16px;cursor:pointer;font-size:13px;color:var(--c-text-2);transition:background .15s}.config-editor-sidebar .file-item:hover{background:var(--c-hover)}.config-editor-sidebar .file-item.active{background:var(--c-active);color:var(--c-text);font-weight:600}.config-editor-sidebar .file-item .icon{width:16px;text-align:center;font-size:14px;flex-shrink:0}.config-editor-sidebar .file-item .label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.config-editor-sidebar .file-item.sub{padding-left:36px;font-size:12px}.config-editor-sidebar .file-group-label{padding:12px 16px 4px;font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.5px}.config-editor-body{flex:1;display:flex;flex-direction:column;padding:16px;overflow:hidden;min-height:0}.config-editor-body .file-hint{font-size:12px;color:var(--c-text-3);margin:0 0 12px}.config-editor-body .file-path{font-family:var(--font-mono);font-size:11px;color:var(--c-text-3);margin-bottom:12px;word-break:break-all}.config-editor-body textarea{width:100%;flex:1;min-height:0;resize:vertical;font-family:var(--font-mono);font-size:13px;line-height:1.5;padding:12px;border:1px solid var(--c-border);border-radius:6px;background:var(--c-bg);color:var(--c-text);-moz-tab-size:2;tab-size:2}.config-editor-body textarea:focus{outline:none;border-color:var(--c-primary)}.wizard-wrap{display:flex;justify-content:center;padding-top:16px}.wizard{width:100%;max-width:580px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);overflow:hidden}.wizard-bar{height:3px;background:var(--c-border)}.wizard-bar-fill{height:100%;background:var(--c-accent);transition:width .4s cubic-bezier(.4,0,.2,1)}.wizard-steps{display:flex;padding:20px 24px 0;gap:0}.wizard-step-ind{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;position:relative}.wizard-step-ind+.wizard-step-ind:before{content:"";position:absolute;top:12px;right:calc(50% + 16px);width:calc(100% - 32px);height:1px;background:var(--c-border)}.wizard-step-ind.done+.wizard-step-ind:before{background:var(--c-accent)}.wizard-step-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;background:var(--c-surface-alt);color:var(--c-text-3);border:2px solid var(--c-border);position:relative;z-index:1;transition:all var(--norm)}.wizard-step-ind.active .wizard-step-dot{background:var(--c-accent);color:#fff;border-color:var(--c-accent);box-shadow:0 0 12px var(--c-accent)}.wizard-step-ind.done .wizard-step-dot{background:var(--c-ok);color:#fff;border-color:var(--c-ok)}.wizard-step-label{font-size:11px;font-weight:500;color:var(--c-text-3);white-space:nowrap}.wizard-step-ind.active .wizard-step-label{color:var(--c-accent);font-weight:600}.wizard-step-ind.done .wizard-step-label{color:var(--c-ok)}.wizard-body{padding:28px 32px;min-height:260px}.wizard-icon{font-size:36px;margin-bottom:12px}.wizard-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.wizard-desc{font-size:13px;color:var(--c-text-2);line-height:1.6;margin-bottom:24px}.wizard-checklist{display:flex;flex-direction:column;gap:10px}.wizard-check{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--c-text)}.wizard-check-num{width:24px;height:24px;border-radius:50%;background:var(--c-accent-bg);color:var(--c-accent);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.wizard-platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:border-color var(--fast)}.wizard-platform-card.on{border-color:var(--c-accent)}.wizard-platform-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;cursor:pointer;gap:8px}.wizard-platform-head:hover{background:var(--c-surface-alt)}.wizard-platform-meta{display:flex;align-items:center;gap:10px;min-width:0}.wizard-platform-icon{width:36px;height:36px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:20px;line-height:1;flex-shrink:0}.wizard-platform-title-block{display:flex;flex-direction:column;gap:1px;min-width:0}.wizard-platform-name{font-family:var(--font-display);font-size:14px;font-weight:600}.wizard-platform-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wizard-platform-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.wizard-platform-chevron{font-size:12px;color:var(--c-text-3)}.wizard-platform-body{padding:0 16px 16px;border-top:1px solid var(--c-border)}.wizard-cred{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;margin-bottom:14px}.wizard-cred:last-child{margin-bottom:0}.wizard-cred-name{font-family:var(--font-display);font-size:14px;font-weight:600;margin-bottom:14px;color:var(--c-text)}.wizard-radio-group{display:flex;flex-direction:column;gap:8px}.wizard-radio{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:2px solid var(--c-border);border-radius:var(--r-m);cursor:pointer;transition:all var(--fast)}.wizard-radio:hover{border-color:var(--c-accent-bdr)}.wizard-radio.on{border-color:var(--c-accent);background:var(--c-accent-bg)}.wizard-radio input[type=radio]{margin-top:2px;accent-color:var(--c-accent)}.wizard-radio-body{display:flex;flex-direction:column;gap:2px}.wizard-radio-label{font-size:13px;font-weight:600;color:var(--c-text)}.wizard-radio-desc{font-size:12px;color:var(--c-text-3)}.wizard-review-block{margin-bottom:20px}.wizard-review-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c-text-3);margin-bottom:10px}.wizard-kv{display:flex;justify-content:space-between;align-items:center;padding:7px 0;border-bottom:1px solid var(--c-border);font-size:12px}.wizard-kv span{color:var(--c-text-2)}.wizard-kv code{font-family:var(--font-mono);font-size:11px;color:var(--c-text);background:var(--c-surface-alt);padding:2px 6px;border-radius:4px}.wizard-platforms{display:flex;flex-wrap:wrap;gap:6px}.wizard-platform-pill{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--c-surface-alt);border-radius:999px;font-size:12px;font-weight:500}.wizard-platform-pill .cmd{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--c-accent-bg);color:var(--c-accent);font-weight:500}.wizard-done{text-align:center;padding:20px 0}.wizard-nav{display:flex;align-items:center;padding:16px 32px 24px;gap:10px}.wizard-nav-spacer{flex:1}.wizard-pulse{animation:wiz-pulse 1.2s ease-in-out infinite}@keyframes wiz-pulse{0%,to{opacity:1}50%{opacity:.4}}.conn{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px}.conn-card{width:100%;max-width:420px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);padding:32px}.conn-logo{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-accent);display:flex;align-items:center;justify-content:center;margin-bottom:20px}.conn-logo svg{width:22px;height:22px;color:#fff}.conn-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.conn-desc{font-size:13px;color:var(--c-text-2);margin-bottom:24px;line-height:1.5}.conn-row{display:flex;gap:8px}.conn-input{flex:1;padding:8px 10px;font-family:var(--font-mono);font-size:13px;color:var(--c-text);background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-s);outline:none;transition:border-color var(--fast)}.conn-input:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.conn-status{font-size:12px;margin-top:10px;color:var(--c-text-3)}.conn-status.ok{color:var(--c-ok)}.conn-status.err{color:var(--c-err)}@media(max-width:1024px){.stats-grid{grid-template-columns:1fr}}@media(max-width:768px){.content{padding:20px 16px 40px}.toast-stack{top:140px;right:16px;left:16px}.toast-msg{min-width:0;max-width:none}.app-header-main,.app-header-context{padding-left:16px;padding-right:16px}.app-header-main{min-height:auto;padding-top:12px;padding-bottom:12px;flex-wrap:wrap;align-items:flex-start}.app-nav{order:3;width:100%;overflow-x:auto;padding-bottom:2px}.app-header-spacer{display:none}.app-header-context{min-height:auto;align-items:flex-start;flex-direction:column}.app-context-actions{width:100%;justify-content:flex-start}.platform-grid{grid-template-columns:1fr}.platform-card-head{align-items:flex-start;flex-direction:column}.platform-card-right{width:100%;grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card-control-menu,.platform-card-menu-btn{width:100%}.wizard-chips{grid-template-columns:1fr}}
|
package/web/dist/index.html
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
9
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
|
10
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
10
|
+
<script type="module" crossorigin src="./assets/index-DmvOPUfa.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DKQMHruB.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="root"></div>
|
|
File without changes
|