adhdev 0.1.54 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/cli-entrypoint.js +12020 -0
  2. package/dist/cli-entrypoint.js.map +1 -0
  3. package/dist/index.js +9721 -10847
  4. package/dist/index.js.map +1 -0
  5. package/package.json +19 -16
  6. package/providers/_builtin/acp/agentpool/provider.json +47 -0
  7. package/providers/_builtin/acp/amp/provider.json +45 -0
  8. package/providers/_builtin/acp/auggie/provider.json +50 -0
  9. package/providers/_builtin/acp/autodev/provider.json +47 -0
  10. package/providers/_builtin/acp/autohand/provider.json +45 -0
  11. package/providers/_builtin/acp/blackbox-ai/provider.json +47 -0
  12. package/providers/_builtin/acp/claude-agent/provider.json +50 -0
  13. package/providers/_builtin/acp/cline-acp/provider.json +47 -0
  14. package/providers/_builtin/acp/code-assistant/provider.json +47 -0
  15. package/providers/_builtin/acp/codebuddy/provider.json +47 -0
  16. package/providers/_builtin/acp/codex-cli/provider.json +50 -0
  17. package/providers/_builtin/acp/corust-agent/provider.json +45 -0
  18. package/providers/_builtin/acp/crow-cli/provider.json +47 -0
  19. package/providers/_builtin/acp/cursor-acp/provider.json +47 -0
  20. package/providers/_builtin/acp/deepagents/provider.json +45 -0
  21. package/providers/_builtin/acp/dimcode/provider.json +47 -0
  22. package/providers/_builtin/acp/docker-cagent/provider.json +50 -0
  23. package/providers/_builtin/acp/factory-droid/provider.json +53 -0
  24. package/providers/_builtin/acp/fast-agent/provider.json +45 -0
  25. package/providers/_builtin/acp/fount/provider.json +47 -0
  26. package/providers/_builtin/acp/gemini-cli/provider.json +107 -0
  27. package/providers/_builtin/acp/github-copilot/provider.json +47 -0
  28. package/providers/_builtin/acp/goose/provider.json +50 -0
  29. package/providers/_builtin/acp/junie/provider.json +45 -0
  30. package/providers/_builtin/acp/kilo/provider.json +45 -0
  31. package/providers/_builtin/acp/kimi-cli/provider.json +50 -0
  32. package/providers/_builtin/acp/kiro-cli/provider.json +47 -0
  33. package/providers/_builtin/acp/minion-code/provider.json +45 -0
  34. package/providers/_builtin/acp/mistral-vibe/provider.json +50 -0
  35. package/providers/_builtin/acp/nova/provider.json +47 -0
  36. package/providers/_builtin/acp/openclaw/provider.json +47 -0
  37. package/providers/_builtin/acp/opencode/provider.json +45 -0
  38. package/providers/_builtin/acp/openhands/provider.json +47 -0
  39. package/providers/_builtin/acp/pi-acp/provider.json +45 -0
  40. package/providers/_builtin/acp/qoder/provider.json +47 -0
  41. package/providers/_builtin/acp/qwen-code/provider.json +53 -0
  42. package/providers/_builtin/acp/stakpak/provider.json +47 -0
  43. package/providers/_builtin/acp/vtcode/provider.json +47 -0
  44. package/providers/_builtin/cli/claude-cli/provider.json +78 -0
  45. package/providers/_builtin/cli/codex-cli/provider.json +60 -0
  46. package/providers/_builtin/cli/gemini-cli/provider.json +64 -0
  47. package/providers/_builtin/extension/cline/provider.json +11 -0
  48. package/providers/_builtin/extension/cline/scripts/open_panel.js +1 -1
  49. package/providers/_builtin/extension/cline/{provider.js → scripts.js} +29 -55
  50. package/providers/_builtin/extension/roo-code/provider.json +11 -0
  51. package/providers/_builtin/extension/roo-code/{provider.js → scripts.js} +27 -97
  52. package/providers/_builtin/ide/antigravity/provider.json +32 -0
  53. package/providers/_builtin/ide/antigravity/scripts.js +73 -0
  54. package/providers/_builtin/ide/cursor/provider.json +35 -0
  55. package/providers/_builtin/ide/cursor/{provider.js → scripts.js} +31 -69
  56. package/providers/_builtin/ide/kiro/provider.json +36 -0
  57. package/providers/_builtin/ide/kiro/scripts.js +62 -0
  58. package/providers/_builtin/ide/pearai/provider.json +36 -0
  59. package/providers/_builtin/ide/pearai/scripts.js +74 -0
  60. package/providers/_builtin/ide/trae/provider.json +35 -0
  61. package/providers/_builtin/ide/trae/scripts.js +57 -0
  62. package/providers/_builtin/ide/vscode/provider.json +33 -0
  63. package/providers/_builtin/ide/vscode-insiders/provider.json +31 -0
  64. package/providers/_builtin/ide/vscodium/provider.json +32 -0
  65. package/providers/_builtin/ide/windsurf/provider.json +22 -0
  66. package/providers/_builtin/ide/windsurf/scripts.js +57 -0
  67. package/README.md +0 -43
  68. package/dist/dev-console-monaco.js +0 -176
  69. package/dist/dev-console.css +0 -326
  70. package/dist/dev-console.html +0 -148
  71. package/dist/dev-console.js +0 -1165
  72. package/dist/index.d.ts +0 -2
  73. package/providers/_builtin/acp/agentpool/provider.js +0 -59
  74. package/providers/_builtin/acp/amp/provider.js +0 -61
  75. package/providers/_builtin/acp/auggie/provider.js +0 -60
  76. package/providers/_builtin/acp/autodev/provider.js +0 -59
  77. package/providers/_builtin/acp/autohand/provider.js +0 -59
  78. package/providers/_builtin/acp/blackbox-ai/provider.js +0 -59
  79. package/providers/_builtin/acp/claude-agent/provider.js +0 -61
  80. package/providers/_builtin/acp/cline-acp/provider.js +0 -62
  81. package/providers/_builtin/acp/code-assistant/provider.js +0 -59
  82. package/providers/_builtin/acp/codebuddy/provider.js +0 -59
  83. package/providers/_builtin/acp/codex-cli/provider.js +0 -64
  84. package/providers/_builtin/acp/corust-agent/provider.js +0 -59
  85. package/providers/_builtin/acp/crow-cli/provider.js +0 -59
  86. package/providers/_builtin/acp/cursor-acp/provider.js +0 -59
  87. package/providers/_builtin/acp/deepagents/provider.js +0 -59
  88. package/providers/_builtin/acp/dimcode/provider.js +0 -58
  89. package/providers/_builtin/acp/docker-cagent/provider.js +0 -59
  90. package/providers/_builtin/acp/factory-droid/provider.js +0 -59
  91. package/providers/_builtin/acp/fast-agent/provider.js +0 -59
  92. package/providers/_builtin/acp/fount/provider.js +0 -59
  93. package/providers/_builtin/acp/gemini-cli/provider.js +0 -104
  94. package/providers/_builtin/acp/github-copilot/provider.js +0 -60
  95. package/providers/_builtin/acp/goose/provider.js +0 -64
  96. package/providers/_builtin/acp/junie/provider.js +0 -62
  97. package/providers/_builtin/acp/kilo/provider.js +0 -59
  98. package/providers/_builtin/acp/kimi-cli/provider.js +0 -63
  99. package/providers/_builtin/acp/kiro-cli/provider.js +0 -59
  100. package/providers/_builtin/acp/minion-code/provider.js +0 -59
  101. package/providers/_builtin/acp/mistral-vibe/provider.js +0 -63
  102. package/providers/_builtin/acp/nova/provider.js +0 -59
  103. package/providers/_builtin/acp/openclaw/provider.js +0 -59
  104. package/providers/_builtin/acp/opencode/provider.js +0 -60
  105. package/providers/_builtin/acp/openhands/provider.js +0 -59
  106. package/providers/_builtin/acp/pi-acp/provider.js +0 -59
  107. package/providers/_builtin/acp/qoder/provider.js +0 -58
  108. package/providers/_builtin/acp/qwen-code/provider.js +0 -61
  109. package/providers/_builtin/acp/stakpak/provider.js +0 -59
  110. package/providers/_builtin/acp/vtcode/provider.js +0 -59
  111. package/providers/_builtin/cli/claude-cli/provider.js +0 -128
  112. package/providers/_builtin/cli/codex-cli/provider.js +0 -80
  113. package/providers/_builtin/cli/gemini-cli/provider.js +0 -124
  114. package/providers/_builtin/ide/antigravity/provider.js +0 -114
  115. package/providers/_builtin/ide/kiro/provider.js +0 -90
  116. package/providers/_builtin/ide/pearai/provider.js +0 -100
  117. package/providers/_builtin/ide/trae/provider.js +0 -83
  118. package/providers/_builtin/ide/vscode/provider.js +0 -36
  119. package/providers/_builtin/ide/vscode-insiders/provider.js +0 -27
  120. package/providers/_builtin/ide/vscodium/provider.js +0 -27
  121. package/providers/_builtin/ide/windsurf/provider.js +0 -76
  122. package/providers/_helpers/index.js +0 -188
@@ -0,0 +1,57 @@
1
+ /**
2
+ * CDP Scripts for Windsurf
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const SCRIPTS_DIR = path.join(__dirname, 'scripts');
8
+ function loadScript(name) {
9
+ try { return fs.readFileSync(path.join(SCRIPTS_DIR, name), 'utf8'); }
10
+ catch { return null; }
11
+ }
12
+
13
+
14
+ module.exports.readChat = function readChat() { return loadScript('read_chat.js'); };
15
+
16
+ module.exports.sendMessage = function sendMessage(text) {
17
+ const s = loadScript('send_message.js');
18
+ return s ? s.replace(/\$\{\s*MESSAGE\s*\}/g, JSON.stringify(text)) : null;
19
+ };
20
+
21
+ module.exports.listSessions = function listSessions() { return loadScript('list_chats.js'); };
22
+
23
+ module.exports.switchSession = function switchSession(sessionId) {
24
+ const s = loadScript('switch_session.js');
25
+ return s ? s.replace(/\$\{\s*SESSION_ID\s*\}/g, JSON.stringify(sessionId)) : null;
26
+ };
27
+
28
+ module.exports.newSession = function newSession() { return loadScript('new_session.js'); };
29
+
30
+ module.exports.resolveAction = function resolveAction(params) {
31
+ const action = typeof params === 'string' ? params : params?.action || 'approve';
32
+ const buttonText = params?.button || params?.buttonText
33
+ || (action === 'approve' ? 'Accept' : action === 'reject' ? 'Reject' : action);
34
+ const s = loadScript('resolve_action.js');
35
+ return s ? s.replace(/\$\{\s*BUTTON_TEXT\s*\}/g, JSON.stringify(buttonText)) : null;
36
+ };
37
+
38
+ module.exports.focusEditor = function focusEditor() { return loadScript('focus_editor.js'); };
39
+
40
+ module.exports.listModels = function listModels() { return loadScript('list_models.js'); };
41
+
42
+ module.exports.setModel = function setModel(params) {
43
+ const model = typeof params === 'string' ? params : params?.model;
44
+ const s = loadScript('set_model.js');
45
+ return s ? s.replace(/\$\{\s*MODEL\s*\}/g, JSON.stringify(model)) : null;
46
+ };
47
+
48
+ module.exports.listModes = function listModes() { return loadScript('list_modes.js'); };
49
+
50
+ module.exports.setMode = function setMode(params) {
51
+ const mode = typeof params === 'string' ? params : params?.mode;
52
+ const s = loadScript('set_mode.js');
53
+ return s ? s.replace(/\$\{\s*MODE\s*\}/g, JSON.stringify(mode)) : null;
54
+ };
55
+
56
+ module.exports.openPanel = function openPanel() { return loadScript('open_panel.js'); };
57
+
package/README.md DELETED
@@ -1,43 +0,0 @@
1
- # adhdev
2
-
3
- **ADHDev CLI** — Setup wizard for the ADHDev platform. Detect, install, and configure IDE + AI agent extensions.
4
-
5
- ## Quick Start
6
-
7
- ```bash
8
- npx adhdev
9
- ```
10
-
11
- Or install globally:
12
-
13
- ```bash
14
- npm install -g adhdev
15
- adhdev setup
16
- ```
17
-
18
- ## Commands
19
-
20
- | Command | Description |
21
- |---------|-------------|
22
- | `adhdev setup` | Interactive setup wizard |
23
- | `adhdev status` | Show current configuration |
24
- | `adhdev detect` | Detect installed IDEs |
25
- | `adhdev reset` | Reset all configuration |
26
-
27
- ## Supported IDEs
28
-
29
- - ✅ VS Code
30
- - ✅ Cursor
31
- - ✅ Antigravity
32
- - 🔜 JetBrains (coming soon)
33
-
34
- ## What it does
35
-
36
- 1. **Detects** installed IDEs on your system
37
- 2. **Installs** the ADHDev Bridge extension
38
- 3. **Configures** connection to your ADHDev dashboard
39
- 4. **Verifies** the setup is working
40
-
41
- ## License
42
-
43
- Proprietary — All rights reserved.
@@ -1,176 +0,0 @@
1
- require.config({ paths: { vs: 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2/min/vs' } });
2
-
3
- require(['vs/editor/editor.main'], function() {
4
- // ─── Custom Dark Theme ───
5
- monaco.editor.defineTheme('adhdev-dark', {
6
- base: 'vs-dark',
7
- inherit: true,
8
- rules: [
9
- { token: 'comment', foreground: '6a9955', fontStyle: 'italic' },
10
- { token: 'keyword', foreground: 'c586c0' },
11
- { token: 'string', foreground: 'ce9178' },
12
- { token: 'number', foreground: 'b5cea8' },
13
- { token: 'type', foreground: '4ec9b0' },
14
- { token: 'identifier', foreground: '9cdcfe' },
15
- { token: 'delimiter', foreground: 'd4d4d4' },
16
- ],
17
- colors: {
18
- 'editor.background': '#0d1117',
19
- 'editor.foreground': '#c9d1d9',
20
- 'editor.lineHighlightBackground': '#161b2280',
21
- 'editorLineNumber.foreground': '#484f58',
22
- 'editorLineNumber.activeForeground': '#8b949e',
23
- 'editor.selectionBackground': '#264f7840',
24
- 'editorCursor.foreground': '#58a6ff',
25
- 'editor.inactiveSelectionBackground': '#264f7820',
26
- 'editorGutter.background': '#0d1117',
27
- 'minimap.background': '#0d1117',
28
- 'editorWidget.background': '#161b22',
29
- 'editorSuggestWidget.background': '#161b22',
30
- 'editorSuggestWidget.border': '#30363d',
31
- 'editorSuggestWidget.selectedBackground': '#1f6feb40',
32
- },
33
- });
34
-
35
- // ─── Helper Function Typedefs (autocomplete) ───
36
- const helperDefs = `
37
- /** Log a message to DevConsole output */
38
- declare function log(message: any, ...args: any[]): void;
39
- /** Probe an element — returns bounds, styles, attributes */
40
- declare function probe(el: Element, opts?: { bounds?: boolean, styles?: string[], attributes?: boolean }): { tag: string, id: string, classes: string[], bounds?: DOMRect, styles?: Record<string, string>, attributes?: Record<string, string> };
41
- /** Query all elements matching selector, returns summary array */
42
- declare function queryAll(selector: string, limit?: number): Array<{ index: number, tag: string, text: string, visible: boolean, bounds: DOMRect }>;
43
- /** Click an element by selector */
44
- declare function click(selector: string): boolean;
45
- /** Wait for an element to appear (polls) */
46
- declare function waitFor(selector: string, timeoutMs?: number): Promise<Element | null>;
47
- /** Get computed style value */
48
- declare function getStyle(el: Element, prop: string): string;
49
- /** Sleep for ms */
50
- declare function sleep(ms: number): Promise<void>;
51
- `;
52
- monaco.languages.typescript.javascriptDefaults.addExtraLib(helperDefs, 'helpers.d.ts');
53
- monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
54
- noSemanticValidation: true,
55
- noSyntaxValidation: false,
56
- });
57
- monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
58
- target: monaco.languages.typescript.ScriptTarget.ES2020,
59
- allowNonTsExtensions: true,
60
- allowJs: true,
61
- });
62
-
63
- const defaultCode = `// Write JS to evaluate via CDP — Ctrl+Enter to run
64
- // Helpers: log(), probe(), queryAll(), click(), waitFor()
65
-
66
- (() => {
67
- const title = document.title;
68
- log('Page title:', title);
69
- return title;
70
- })()`;
71
-
72
- const container = document.getElementById('editor-container');
73
- const monacoEditor = monaco.editor.create(container, {
74
- value: defaultCode,
75
- language: 'javascript',
76
- theme: 'adhdev-dark',
77
- fontFamily: "'JetBrains Mono', monospace",
78
- fontSize: 13,
79
- lineHeight: 22,
80
- minimap: { enabled: true, scale: 1, showSlider: 'mouseover' },
81
- scrollBeyondLastLine: false,
82
- renderLineHighlight: 'all',
83
- cursorBlinking: 'smooth',
84
- cursorSmoothCaretAnimation: 'on',
85
- smoothScrolling: true,
86
- bracketPairColorization: { enabled: true },
87
- autoIndent: 'full',
88
- formatOnPaste: true,
89
- tabSize: 2,
90
- wordWrap: 'on',
91
- padding: { top: 8 },
92
- suggest: {
93
- showKeywords: true,
94
- showSnippets: true,
95
- showFunctions: true,
96
- },
97
- quickSuggestions: true,
98
- parameterHints: { enabled: true },
99
- automaticLayout: true,
100
- });
101
-
102
- // Ctrl+Enter → Run
103
- monacoEditor.addAction({
104
- id: 'run-script',
105
- label: 'Run Script',
106
- keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],
107
- run: () => window.runEditor?.(),
108
- });
109
-
110
- // ─── Proxy textarea.value → Monaco ───
111
- const ta = document.getElementById('editor');
112
- Object.defineProperty(ta, 'value', {
113
- get() { return monacoEditor.getValue(); },
114
- set(v) { monacoEditor.setValue(v); },
115
- });
116
- ta.focus = () => monacoEditor.focus();
117
-
118
- window.monacoEditor = monacoEditor;
119
-
120
- // ─── Snippets ───
121
- monaco.languages.registerCompletionItemProvider('javascript', {
122
- provideCompletionItems: (model, position) => {
123
- const word = model.getWordUntilPosition(position);
124
- const range = {
125
- startLineNumber: position.lineNumber,
126
- endLineNumber: position.lineNumber,
127
- startColumn: word.startColumn,
128
- endColumn: word.endColumn,
129
- };
130
- return {
131
- suggestions: [
132
- {
133
- label: 'iife',
134
- kind: monaco.languages.CompletionItemKind.Snippet,
135
- insertText: '(() => {\n ${1:// code}\n return ${2:result};\n})()',
136
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
137
- documentation: 'Immediately Invoked Function Expression (CDP pattern)',
138
- range,
139
- },
140
- {
141
- label: 'aiife',
142
- kind: monaco.languages.CompletionItemKind.Snippet,
143
- insertText: '(async () => {\n ${1:// async code}\n return ${2:result};\n})()',
144
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
145
- documentation: 'Async IIFE (for await/Promise)',
146
- range,
147
- },
148
- {
149
- label: 'qsa',
150
- kind: monaco.languages.CompletionItemKind.Snippet,
151
- insertText: "[...document.querySelectorAll('${1:selector}')].map(el => ({\n tag: el.tagName,\n text: el.textContent?.trim().substring(0, 100),\n visible: el.offsetWidth > 0,\n}))",
152
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
153
- documentation: 'QuerySelectorAll with element mapping',
154
- range,
155
- },
156
- {
157
- label: 'readchat',
158
- kind: monaco.languages.CompletionItemKind.Snippet,
159
- insertText: "(() => {\n const msgs = [];\n document.querySelectorAll('${1:.message}').forEach((el, i) => {\n msgs.push({\n role: el.classList.contains('${2:user}') ? 'user' : 'assistant',\n content: el.textContent.trim().substring(0, 6000),\n index: i,\n });\n });\n return JSON.stringify({ messages: msgs, status: 'idle' });\n})()",
160
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
161
- documentation: 'readChat template',
162
- range,
163
- },
164
- {
165
- label: 'probe',
166
- kind: monaco.languages.CompletionItemKind.Snippet,
167
- insertText: "(() => {\n const el = document.querySelector('${1:selector}');\n if (!el) return JSON.stringify({ error: 'not found' });\n const r = el.getBoundingClientRect();\n return JSON.stringify({\n tag: el.tagName, id: el.id,\n classes: [...el.classList],\n text: el.textContent?.trim().substring(0, 200),\n bounds: { top: r.top, left: r.left, width: r.width, height: r.height },\n styles: { color: getComputedStyle(el).color, bg: getComputedStyle(el).background },\n attrs: Object.fromEntries([...el.attributes].map(a => [a.name, a.value])),\n });\n})()",
168
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
169
- documentation: 'Probe element details (bounds, styles, attrs)',
170
- range,
171
- },
172
- ],
173
- };
174
- },
175
- });
176
- });
@@ -1,326 +0,0 @@
1
- @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600&display=swap');
2
-
3
- :root {
4
- --bg: #0d1117;
5
- --bg-panel: #161b22;
6
- --bg-input: #0d1117;
7
- --border: #30363d;
8
- --text: #c9d1d9;
9
- --text-dim: #8b949e;
10
- --accent: #58a6ff;
11
- --accent-green: #3fb950;
12
- --accent-red: #f85149;
13
- --accent-yellow: #d29922;
14
- --accent-purple: #bc8cff;
15
- }
16
-
17
- * { margin: 0; padding: 0; box-sizing: border-box; }
18
- body {
19
- font-family: 'Inter', sans-serif;
20
- background: var(--bg);
21
- color: var(--text);
22
- height: 100vh;
23
- display: flex;
24
- flex-direction: column;
25
- overflow: hidden;
26
- }
27
-
28
- /* ─── Toolbar ─── */
29
- .toolbar {
30
- display: flex;
31
- align-items: center;
32
- gap: 8px;
33
- padding: 8px 16px;
34
- background: var(--bg-panel);
35
- border-bottom: 1px solid var(--border);
36
- flex-shrink: 0;
37
- }
38
- .toolbar .logo {
39
- font-weight: 600;
40
- font-size: 14px;
41
- color: var(--accent);
42
- margin-right: 12px;
43
- white-space: nowrap;
44
- }
45
- .toolbar select, .toolbar button {
46
- font-family: 'Inter', sans-serif;
47
- font-size: 12px;
48
- border: 1px solid var(--border);
49
- border-radius: 6px;
50
- padding: 6px 12px;
51
- background: var(--bg-input);
52
- color: var(--text);
53
- cursor: pointer;
54
- transition: all 0.15s;
55
- }
56
- .toolbar button:hover { border-color: var(--accent); background: rgba(88,166,255,0.1); }
57
- .toolbar button.primary {
58
- background: var(--accent);
59
- color: #000;
60
- border-color: var(--accent);
61
- font-weight: 600;
62
- }
63
- .toolbar button.primary:hover { background: #79c0ff; }
64
- .toolbar button.danger { border-color: var(--accent-red); color: var(--accent-red); }
65
- .toolbar button.danger:hover { background: rgba(248,81,73,0.1); }
66
- .toolbar .spacer { flex: 1; }
67
- .toolbar .status {
68
- font-size: 11px;
69
- color: var(--text-dim);
70
- display: flex;
71
- align-items: center;
72
- gap: 4px;
73
- }
74
- .toolbar .status .dot {
75
- width: 6px; height: 6px; border-radius: 50%;
76
- display: inline-block;
77
- }
78
- .toolbar .status .dot.on { background: var(--accent-green); }
79
- .toolbar .status .dot.off { background: var(--accent-red); }
80
-
81
- /* ─── Main Layout ─── */
82
- .main {
83
- flex: 1;
84
- display: flex;
85
- overflow: hidden;
86
- }
87
-
88
- /* Left: Editor */
89
- .editor-panel {
90
- width: 50%;
91
- display: flex;
92
- flex-direction: column;
93
- border-right: 1px solid var(--border);
94
- }
95
- .editor-header {
96
- display: flex;
97
- align-items: center;
98
- gap: 6px;
99
- padding: 6px 12px;
100
- background: var(--bg-panel);
101
- border-bottom: 1px solid var(--border);
102
- font-size: 12px;
103
- color: var(--text-dim);
104
- }
105
- .editor-header .tab {
106
- padding: 4px 10px;
107
- border-radius: 4px;
108
- cursor: pointer;
109
- font-size: 11px;
110
- }
111
- .editor-header .tab.active {
112
- background: rgba(88,166,255,0.15);
113
- color: var(--accent);
114
- }
115
- .editor-header .tab:hover { background: rgba(255,255,255,0.05); }
116
- #editor-container {
117
- flex: 1;
118
- overflow: hidden;
119
- background: var(--bg);
120
- }
121
- /* Hidden textarea for backward compat */
122
- #editor { display: none; }
123
-
124
- /* Right: Preview + Output */
125
- .right-panel {
126
- width: 50%;
127
- display: flex;
128
- flex-direction: column;
129
- }
130
-
131
- /* Screenshot */
132
- .screenshot-panel {
133
- flex: 0 0 50%;
134
- position: relative;
135
- overflow: hidden;
136
- border-bottom: 1px solid var(--border);
137
- background: #000;
138
- }
139
- .screenshot-panel img {
140
- width: 100%;
141
- height: 100%;
142
- object-fit: contain;
143
- }
144
- .screenshot-panel .placeholder {
145
- display: flex;
146
- align-items: center;
147
- justify-content: center;
148
- height: 100%;
149
- color: var(--text-dim);
150
- font-size: 13px;
151
- }
152
- .screenshot-panel .overlay {
153
- position: absolute;
154
- border: 2px solid var(--accent);
155
- background: rgba(88,166,255,0.08);
156
- pointer-events: none;
157
- transition: all 0.2s;
158
- }
159
- .screenshot-panel .overlay .label {
160
- position: absolute;
161
- top: -18px;
162
- left: 0;
163
- font-size: 10px;
164
- background: var(--accent);
165
- color: #000;
166
- padding: 1px 4px;
167
- border-radius: 2px;
168
- white-space: nowrap;
169
- font-family: 'JetBrains Mono', monospace;
170
- }
171
-
172
- /* Output */
173
- .output-panel {
174
- flex: 1;
175
- display: flex;
176
- flex-direction: column;
177
- overflow: hidden;
178
- }
179
- .output-header {
180
- display: flex;
181
- align-items: center;
182
- gap: 8px;
183
- padding: 6px 12px;
184
- background: var(--bg-panel);
185
- border-bottom: 1px solid var(--border);
186
- font-size: 12px;
187
- color: var(--text-dim);
188
- }
189
- .output-header .badge {
190
- font-size: 10px;
191
- padding: 1px 6px;
192
- border-radius: 8px;
193
- font-weight: 600;
194
- }
195
- .output-header .badge.ok { background: rgba(63,185,80,0.2); color: var(--accent-green); }
196
- .output-header .badge.err { background: rgba(248,81,73,0.2); color: var(--accent-red); }
197
- .output-search {
198
- font-family: 'JetBrains Mono', monospace;
199
- font-size: 11px;
200
- border: 1px solid var(--border);
201
- border-radius: 4px;
202
- padding: 2px 8px;
203
- background: var(--bg-input);
204
- color: var(--text);
205
- width: 140px;
206
- outline: none;
207
- }
208
- .output-search:focus { border-color: var(--accent); }
209
- #output {
210
- flex: 1;
211
- overflow-y: auto;
212
- padding: 4px 0;
213
- font-family: 'JetBrains Mono', monospace;
214
- font-size: 12px;
215
- line-height: 1.5;
216
- }
217
- .output-entry {
218
- padding: 4px 12px;
219
- border-bottom: 1px solid rgba(48,54,61,0.3);
220
- display: flex;
221
- gap: 8px;
222
- align-items: flex-start;
223
- transition: background 0.15s;
224
- }
225
- .output-entry:hover { background: rgba(255,255,255,0.02); }
226
- .output-entry .ts {
227
- color: var(--text-dim);
228
- font-size: 10px;
229
- flex-shrink: 0;
230
- min-width: 60px;
231
- padding-top: 1px;
232
- }
233
- .output-entry .icon {
234
- flex-shrink: 0;
235
- width: 16px;
236
- text-align: center;
237
- font-size: 11px;
238
- }
239
- .output-entry .content {
240
- flex: 1;
241
- white-space: pre-wrap;
242
- word-break: break-all;
243
- }
244
- .output-entry.type-log .icon { color: var(--text-dim); }
245
- .output-entry.type-result .icon { color: var(--accent-green); }
246
- .output-entry.type-error .icon { color: var(--accent-red); }
247
- .output-entry.type-error .content { color: var(--accent-red); }
248
- .output-entry.type-warn .icon { color: var(--accent-yellow); }
249
- .output-entry.type-warn .content { color: var(--accent-yellow); }
250
- .output-entry.type-query .icon { color: var(--accent-purple); }
251
- .output-entry.hidden { display: none; }
252
-
253
- /* Watch indicator */
254
- .watch-indicator {
255
- display: none;
256
- align-items: center;
257
- gap: 4px;
258
- font-size: 11px;
259
- color: var(--accent-green);
260
- animation: pulse 2s infinite;
261
- }
262
- .watch-indicator.active { display: flex; }
263
- @keyframes pulse {
264
- 0%, 100% { opacity: 1; }
265
- 50% { opacity: 0.4; }
266
- }
267
-
268
- /* Script list dropdown */
269
- .script-menu {
270
- position: relative;
271
- }
272
- .script-dropdown {
273
- display: none;
274
- position: absolute;
275
- top: 100%;
276
- left: 0;
277
- background: var(--bg-panel);
278
- border: 1px solid var(--border);
279
- border-radius: 6px;
280
- padding: 4px;
281
- min-width: 200px;
282
- z-index: 100;
283
- box-shadow: 0 8px 24px rgba(0,0,0,0.4);
284
- }
285
- .script-dropdown.show { display: block; }
286
- .script-dropdown .item {
287
- padding: 6px 10px;
288
- border-radius: 4px;
289
- cursor: pointer;
290
- font-size: 12px;
291
- display: flex;
292
- justify-content: space-between;
293
- }
294
- .script-dropdown .item:hover { background: rgba(255,255,255,0.05); }
295
- .script-dropdown .item .hint { color: var(--text-dim); font-size: 11px; }
296
-
297
- /* Selector tester */
298
- .selector-bar {
299
- display: flex;
300
- gap: 6px;
301
- padding: 4px 8px;
302
- background: var(--bg-panel);
303
- border-bottom: 1px solid var(--border);
304
- }
305
- .selector-bar input {
306
- flex: 1;
307
- font-family: 'JetBrains Mono', monospace;
308
- font-size: 12px;
309
- border: 1px solid var(--border);
310
- border-radius: 4px;
311
- padding: 4px 8px;
312
- background: var(--bg-input);
313
- color: var(--text);
314
- outline: none;
315
- }
316
- .selector-bar input:focus { border-color: var(--accent); }
317
- .selector-bar button {
318
- font-size: 11px;
319
- padding: 4px 8px;
320
- border: 1px solid var(--border);
321
- border-radius: 4px;
322
- background: var(--bg-input);
323
- color: var(--text);
324
- cursor: pointer;
325
- }
326
- .selector-bar .count { font-size: 11px; color: var(--text-dim); line-height: 28px; }