cursor-feedback 1.1.1 → 2.0.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.
@@ -1,422 +1,1045 @@
1
+ /* ============================================================
2
+ Cursor Feedback — Sidebar UI
3
+ Built on VS Code theme tokens so it adapts to any theme.
4
+ ============================================================ */
5
+
6
+ :root {
7
+ --sp-1: 4px;
8
+ --sp-2: 8px;
9
+ --sp-3: 12px;
10
+ --sp-4: 16px;
11
+ --sp-5: 20px;
12
+
13
+ --radius-sm: 6px;
14
+ --radius-md: 8px;
15
+ --radius-lg: 12px;
16
+
17
+ --ease: cubic-bezier(0.2, 0, 0, 1);
18
+ --dur: 180ms;
19
+
20
+ --icon-sm: 14px;
21
+ --icon-md: 16px;
22
+ --icon-lg: 18px;
23
+
24
+ /* Layered surfaces derived from theme, with graceful fallbacks */
25
+ --surface: var(--vscode-sideBar-background, var(--vscode-editor-background, #1e1e1e));
26
+ --surface-raised: var(--vscode-editorWidget-background, var(--vscode-input-background, #252526));
27
+ --surface-sunken: var(--vscode-textBlockQuote-background, rgba(127, 127, 127, 0.08));
28
+ --line: var(--vscode-widget-border, var(--vscode-input-border, rgba(127, 127, 127, 0.25)));
29
+ --line-soft: var(--vscode-panel-border, rgba(127, 127, 127, 0.18));
30
+ /* Brand palette (from lujiangc-dreamland): neutral surface + pink accent → 黑粉 / 白粉 */
31
+ --brand-pink: #f3799e;
32
+ --brand-pink-strong: #ec5e8a;
33
+ --brand-pink-soft: #f9c7d9;
34
+ --brand-pink-fg: #ffffff;
35
+ --accent: var(--brand-pink);
36
+ --muted: var(--vscode-descriptionForeground, rgba(127, 127, 127, 0.9));
37
+ }
38
+
39
+ /* Accent mode = follow IDE: redirect the whole pink family to VSCode theme color.
40
+ --accent already references --brand-pink, so every accent surface switches at once. */
41
+ body.accent-ide {
42
+ --brand-pink: var(--vscode-button-background, #0e639c);
43
+ --brand-pink-strong: var(--vscode-button-hoverBackground, var(--vscode-button-background, #0e639c));
44
+ --brand-pink-soft: color-mix(in srgb, var(--vscode-button-background, #0e639c) 35%, transparent);
45
+ --brand-pink-fg: var(--vscode-button-foreground, #ffffff);
46
+ /* --accent 在 :root 已被求值固化为粉色,必须在此处重新声明才会跟随切换,
47
+ 否则所有 var(--accent) 的元素(图标、倒计时条、focus、代码标签)仍是粉色 */
48
+ --accent: var(--vscode-button-background, #0e639c);
49
+ }
50
+
1
51
  * {
2
52
  box-sizing: border-box;
3
53
  margin: 0;
4
54
  padding: 0;
5
55
  }
6
56
 
57
+ html, body {
58
+ height: 100%;
59
+ }
60
+
7
61
  body {
8
62
  font-family: var(--vscode-font-family);
9
- font-size: var(--vscode-font-size);
63
+ font-size: var(--vscode-font-size, 13px);
10
64
  color: var(--vscode-foreground);
11
- background-color: var(--vscode-sideBar-background);
12
- padding: 12px;
13
- min-height: 100vh;
65
+ background: var(--surface);
66
+ line-height: 1.5;
67
+ -webkit-font-smoothing: antialiased;
14
68
  }
15
69
 
16
- .container {
70
+ .app {
17
71
  display: flex;
18
72
  flex-direction: column;
19
- gap: 12px;
73
+ gap: var(--sp-3);
74
+ padding: var(--sp-3);
75
+ height: 100vh;
76
+ overflow: hidden;
20
77
  }
21
78
 
22
- .section {
23
- background: var(--vscode-input-background);
24
- border: 1px solid var(--vscode-input-border);
25
- border-radius: 6px;
26
- padding: 12px;
79
+ /* ---------- Icon primitives ---------- */
80
+ svg {
81
+ display: block;
82
+ width: var(--icon-md);
83
+ height: var(--icon-md);
84
+ flex: none;
27
85
  }
28
86
 
29
- .section-title {
30
- font-weight: 600;
31
- margin-bottom: 8px;
32
- color: var(--vscode-foreground);
33
- display: flex;
87
+ .iconbtn {
88
+ display: inline-flex;
34
89
  align-items: center;
35
- gap: 6px;
90
+ justify-content: center;
91
+ width: 28px;
92
+ height: 28px;
93
+ padding: 0;
94
+ border: 1px solid transparent;
95
+ border-radius: var(--radius-sm);
96
+ background: transparent;
97
+ color: var(--vscode-icon-foreground, var(--vscode-foreground));
98
+ cursor: pointer;
99
+ opacity: 0.78;
100
+ transition: background var(--dur) var(--ease), opacity var(--dur) var(--ease),
101
+ border-color var(--dur) var(--ease), color var(--dur) var(--ease);
36
102
  }
37
-
38
- .summary-content {
39
- word-break: break-word;
40
- max-height: 300px;
41
- overflow-y: auto;
42
- font-size: 13px;
43
- line-height: 1.6;
44
- background: var(--vscode-textBlockQuote-background);
45
- padding: 12px;
46
- border-radius: 4px;
103
+ .iconbtn:hover {
104
+ opacity: 1;
105
+ background: var(--vscode-toolbar-hoverBackground, rgba(127, 127, 127, 0.16));
47
106
  }
48
-
49
- /* Markdown 样式 */
50
- .summary-content h1, .summary-content h2, .summary-content h3 {
51
- margin-top: 12px;
52
- margin-bottom: 8px;
53
- font-weight: 600;
54
- color: var(--vscode-foreground);
107
+ .iconbtn:active {
108
+ background: var(--vscode-toolbar-activeBackground, rgba(127, 127, 127, 0.24));
55
109
  }
56
- .summary-content h1 { font-size: 1.4em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 4px; }
57
- .summary-content h2 { font-size: 1.2em; }
58
- .summary-content h3 { font-size: 1.1em; }
59
- .summary-content h1:first-child, .summary-content h2:first-child, .summary-content h3:first-child { margin-top: 0; }
60
-
61
- .summary-content p { margin: 8px 0; }
62
- .summary-content ul, .summary-content ol { margin: 8px 0; padding-left: 20px; }
63
- .summary-content li { margin: 4px 0; }
64
-
65
- .summary-content code {
66
- background: var(--vscode-textCodeBlock-background);
67
- padding: 2px 6px;
68
- border-radius: 3px;
69
- font-family: var(--vscode-editor-font-family), monospace;
70
- font-size: 0.9em;
110
+ /* Timeout keep-waiting toggle states */
111
+ .iconbtn.is-on {
112
+ color: var(--accent);
113
+ opacity: 1;
114
+ }
115
+ .iconbtn.is-off {
116
+ opacity: 0.5;
71
117
  }
72
118
 
73
- .summary-content pre {
74
- background: var(--vscode-textCodeBlock-background);
75
- padding: 10px;
76
- border-radius: 4px;
77
- overflow-x: auto;
78
- margin: 8px 0;
119
+ /* Visible focus for keyboard users (a11y) */
120
+ :focus-visible {
121
+ outline: 2px solid var(--accent);
122
+ outline-offset: 2px;
123
+ border-radius: var(--radius-sm);
79
124
  }
80
- .summary-content pre code {
81
- background: none;
82
- padding: 0;
125
+ :focus:not(:focus-visible) {
126
+ outline: none;
83
127
  }
84
128
 
85
- .summary-content blockquote {
86
- border-left: 3px solid var(--vscode-textLink-foreground);
87
- margin: 8px 0;
88
- padding: 4px 12px;
89
- color: var(--vscode-descriptionForeground);
129
+ /* ---------- Tooltips (data-tip) ---------- */
130
+ [data-tip] {
131
+ position: relative;
90
132
  }
91
-
92
- .summary-content table {
93
- border-collapse: collapse;
94
- margin: 8px 0;
95
- width: 100%;
133
+ [data-tip]:hover::after {
134
+ content: attr(data-tip);
135
+ position: absolute;
136
+ bottom: calc(100% + 6px);
137
+ right: 0;
138
+ padding: 4px 8px;
139
+ background: var(--vscode-editorWidget-background, #252526);
140
+ color: var(--vscode-editorWidget-foreground, var(--vscode-foreground));
141
+ border: 1px solid var(--vscode-editorWidget-border, var(--line));
142
+ border-radius: var(--radius-sm);
143
+ font-size: 11px;
144
+ white-space: nowrap;
145
+ z-index: 50;
146
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
147
+ pointer-events: none;
96
148
  }
97
- .summary-content th, .summary-content td {
98
- border: 1px solid var(--vscode-panel-border);
99
- padding: 6px 10px;
100
- text-align: left;
149
+ /* 状态栏在窗口顶部,tooltip 改为向下展开,避免被窗口顶部裁切 */
150
+ .statusbar [data-tip]:hover::after {
151
+ bottom: auto;
152
+ top: calc(100% + 6px);
101
153
  }
102
- .summary-content th {
103
- background: var(--vscode-textCodeBlock-background);
154
+ /* 弹窗头部(关闭按钮)在面板顶部,且面板 overflow-y:auto 会裁掉朝上的 tooltip,改为向下展开 */
155
+ .feishu-modal__head [data-tip]:hover::after {
156
+ bottom: auto;
157
+ top: calc(100% + 6px);
104
158
  }
105
159
 
106
- .summary-content strong { font-weight: 600; }
107
- .summary-content em { font-style: italic; }
108
- .summary-content a { color: var(--vscode-textLink-foreground); }
109
- .summary-content hr { border: none; border-top: 1px solid var(--vscode-panel-border); margin: 12px 0; }
110
-
111
- .feedback-input {
112
- width: 100%;
113
- min-height: 120px;
114
- resize: vertical;
115
- background: var(--vscode-input-background);
116
- color: var(--vscode-input-foreground);
117
- border: 1px solid var(--vscode-input-border);
118
- border-radius: 4px;
119
- padding: 10px;
120
- font-family: inherit;
121
- font-size: 13px;
122
- line-height: 1.5;
160
+ /* ---------- Status bar ---------- */
161
+ .statusbar {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: var(--sp-2);
165
+ padding: var(--sp-2) var(--sp-3);
166
+ background: var(--surface-sunken);
167
+ border: 1px solid var(--line-soft);
168
+ border-radius: var(--radius-md);
123
169
  }
124
-
125
- .feedback-input:focus {
126
- outline: none;
127
- border-color: var(--vscode-focusBorder);
170
+ .statusbar__dot {
171
+ width: 8px;
172
+ height: 8px;
173
+ border-radius: 50%;
174
+ flex: none;
175
+ background: var(--vscode-errorForeground, #e51400);
176
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--vscode-errorForeground, #e51400) 22%, transparent);
177
+ transition: background var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
178
+ }
179
+ .statusbar.connected .statusbar__dot {
180
+ background: var(--brand-pink);
181
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--brand-pink) 22%, transparent);
182
+ }
183
+ .statusbar__text {
184
+ font-size: 11px;
185
+ color: var(--muted);
186
+ white-space: nowrap;
187
+ overflow: hidden;
188
+ text-overflow: ellipsis;
189
+ }
190
+ .statusbar__actions {
191
+ margin-left: auto;
192
+ display: flex;
193
+ align-items: center;
194
+ gap: 2px;
195
+ }
196
+ .statusbar__actions svg {
197
+ width: var(--icon-sm);
198
+ height: var(--icon-sm);
128
199
  }
129
200
 
201
+ /* Debug icon + hover tooltip panel */
202
+ .debug {
203
+ position: relative;
204
+ }
205
+ .debug__tooltip {
206
+ display: none;
207
+ position: absolute;
208
+ top: calc(100% + 8px);
209
+ right: 0;
210
+ width: max-content;
211
+ max-width: 260px;
212
+ padding: var(--sp-2) var(--sp-3);
213
+ background: var(--vscode-editorWidget-background, #252526);
214
+ border: 1px solid var(--vscode-editorWidget-border, var(--line));
215
+ border-radius: var(--radius-md);
216
+ font-size: 11px;
217
+ line-height: 1.6;
218
+ white-space: pre-wrap;
219
+ color: var(--vscode-editorWidget-foreground, var(--vscode-foreground));
220
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
221
+ z-index: 60;
222
+ }
223
+ .debug:hover .debug__tooltip,
224
+ .debug:focus-within .debug__tooltip {
225
+ display: block;
226
+ }
130
227
 
131
- .submit-group {
228
+ /* ---------- Empty / waiting state ---------- */
229
+ .empty {
230
+ flex: 1;
132
231
  display: flex;
133
- gap: 8px;
232
+ flex-direction: column;
233
+ align-items: center;
234
+ justify-content: center;
235
+ text-align: center;
236
+ gap: var(--sp-2);
237
+ padding: 48px var(--sp-4);
238
+ color: var(--muted);
239
+ }
240
+ .empty__icon {
241
+ display: grid;
242
+ place-items: center;
243
+ width: 56px;
244
+ height: 56px;
245
+ border-radius: 50%;
246
+ background: var(--surface-sunken);
247
+ border: 1px solid var(--line-soft);
248
+ color: var(--vscode-foreground);
249
+ opacity: 0.85;
250
+ animation: breathe 2.6s var(--ease) infinite;
251
+ }
252
+ .empty__icon svg {
253
+ width: 26px;
254
+ height: 26px;
255
+ }
256
+ .empty__title {
257
+ font-size: 13px;
258
+ font-weight: 600;
259
+ color: var(--vscode-foreground);
260
+ }
261
+ .empty__hint {
262
+ font-size: 11px;
263
+ max-width: 220px;
264
+ opacity: 0.8;
265
+ }
266
+ @keyframes breathe {
267
+ 0%, 100% { transform: translateY(0); opacity: 0.85; }
268
+ 50% { transform: translateY(-3px); opacity: 1; }
134
269
  }
135
270
 
136
- .submit-btn {
271
+ /* ---------- Form ---------- */
272
+ .form {
137
273
  flex: 1;
138
- padding: 10px 12px;
139
- background: var(--vscode-button-background);
140
- color: var(--vscode-button-foreground);
141
- border: none;
142
- border-radius: 6px;
143
- cursor: pointer;
144
- font-weight: 500;
145
- font-size: 12px;
146
- transition: background 0.15s;
274
+ min-height: 0;
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: var(--sp-3);
278
+ animation: fade-in 220ms var(--ease);
147
279
  }
148
-
149
- .submit-btn:hover {
150
- background: var(--vscode-button-hoverBackground);
280
+ @keyframes fade-in {
281
+ from { opacity: 0; transform: translateY(4px); }
282
+ to { opacity: 1; transform: translateY(0); }
151
283
  }
152
284
 
153
- .submit-btn:disabled {
154
- opacity: 0.5;
155
- cursor: not-allowed;
285
+ /* ---------- Card ---------- */
286
+ .card {
287
+ background: var(--surface-raised);
288
+ border: 1px solid var(--line);
289
+ border-radius: var(--radius-lg);
290
+ padding: var(--sp-3);
291
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
156
292
  }
157
-
158
- .toggle-key-mode-btn {
159
- width: 44px;
160
- padding: 12px 8px;
161
- background: var(--vscode-button-secondaryBackground);
162
- color: var(--vscode-button-secondaryForeground);
163
- border: none;
164
- border-radius: 6px;
165
- cursor: pointer;
166
- font-size: 16px;
167
- transition: background 0.15s;
168
- position: relative;
293
+ .card__head {
294
+ display: flex;
295
+ align-items: center;
296
+ gap: var(--sp-2);
297
+ margin-bottom: var(--sp-2);
169
298
  }
170
-
171
- .toggle-key-mode-btn:hover {
172
- background: var(--vscode-button-secondaryHoverBackground);
299
+ .card__icon {
300
+ display: grid;
301
+ place-items: center;
302
+ width: 22px;
303
+ height: 22px;
304
+ border-radius: var(--radius-sm);
305
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
306
+ color: var(--accent);
173
307
  }
174
-
175
- .toggle-key-mode-btn.enter-mode {
176
- background: var(--vscode-button-background);
177
- color: var(--vscode-button-foreground);
308
+ .card__icon svg {
309
+ width: var(--icon-sm);
310
+ height: var(--icon-sm);
178
311
  }
179
-
180
- .toggle-key-mode-btn.enter-mode:hover {
181
- background: var(--vscode-button-hoverBackground);
312
+ .card__title {
313
+ font-size: 12px;
314
+ font-weight: 600;
315
+ letter-spacing: 0.01em;
316
+ color: var(--vscode-foreground);
182
317
  }
183
318
 
184
- .status {
185
- text-align: center;
186
- padding: 30px 20px;
187
- color: var(--vscode-descriptionForeground);
319
+ /* ---------- Resizable panels ---------- */
320
+ /* Summary keeps a user-adjustable height; input flexes to fill the rest,
321
+ so the panel always fills the viewport and the submit button hugs bottom. */
322
+ .card--summary {
323
+ flex: 0 1 auto;
324
+ height: 42vh;
325
+ min-height: 48px;
326
+ display: flex;
327
+ flex-direction: column;
328
+ overflow: hidden;
188
329
  }
189
-
190
- .status-icon {
191
- font-size: 32px;
192
- margin-bottom: 12px;
330
+ .card--input {
331
+ flex: 1 1 0;
332
+ min-height: 72px;
333
+ display: flex;
334
+ flex-direction: column;
193
335
  }
194
336
 
195
- .status.waiting .status-icon {
196
- animation: pulse 2s ease-in-out infinite;
337
+ /* Drag handle between summary & input */
338
+ .splitter {
339
+ flex: none;
340
+ display: grid;
341
+ place-items: center;
342
+ height: 14px;
343
+ margin: calc(var(--sp-2) * -1) 0;
344
+ cursor: row-resize;
345
+ touch-action: none;
197
346
  }
198
-
199
- @keyframes pulse {
200
- 0%, 100% { opacity: 1; }
201
- 50% { opacity: 0.5; }
347
+ .splitter::before {
348
+ content: "";
349
+ width: 40px;
350
+ height: 4px;
351
+ border-radius: 999px;
352
+ background: var(--line);
353
+ transition: background var(--dur) var(--ease), width var(--dur) var(--ease);
354
+ }
355
+ .splitter:hover::before,
356
+ .splitter.is-dragging::before {
357
+ background: var(--accent);
358
+ width: 56px;
202
359
  }
203
360
 
204
- .server-status {
205
- display: flex;
361
+ /* ---------- AI summary ---------- */
362
+ .summary {
363
+ flex: 1;
364
+ min-height: 0;
365
+ overflow-y: auto;
366
+ font-size: 13px;
367
+ line-height: 1.65;
368
+ padding: var(--sp-3);
369
+ background: var(--surface-sunken);
370
+ border: 1px solid var(--line-soft);
371
+ border-radius: var(--radius-md);
372
+ word-break: break-word;
373
+ overscroll-behavior: contain;
374
+ }
375
+ .project-chip {
376
+ display: inline-flex;
206
377
  align-items: center;
207
- gap: 6px;
378
+ max-width: 100%;
379
+ margin-top: var(--sp-2);
380
+ padding: 3px 8px;
208
381
  font-size: 11px;
209
- padding: 6px 10px;
210
- position: relative;
211
- background: var(--vscode-textBlockQuote-background);
212
- border-radius: 4px;
213
- margin-bottom: 12px;
382
+ color: var(--muted);
383
+ background: var(--surface-sunken);
384
+ border: 1px solid var(--line-soft);
385
+ border-radius: 999px;
386
+ word-break: break-all;
214
387
  }
215
388
 
216
- .server-status .dot {
217
- width: 8px;
218
- height: 8px;
219
- border-radius: 50%;
220
- background: var(--vscode-errorForeground);
389
+ /* Markdown rendering inside summary */
390
+ .markdown-body h1,
391
+ .markdown-body h2,
392
+ .markdown-body h3 {
393
+ margin: 12px 0 8px;
394
+ font-weight: 600;
395
+ line-height: 1.3;
396
+ color: var(--vscode-foreground);
221
397
  }
222
-
223
- .server-status.connected .dot {
224
- background: var(--vscode-notificationsInfoIcon-foreground);
398
+ .markdown-body h1 { font-size: 1.35em; border-bottom: 1px solid var(--line-soft); padding-bottom: 4px; }
399
+ .markdown-body h2 { font-size: 1.18em; }
400
+ .markdown-body h3 { font-size: 1.06em; }
401
+ .markdown-body h1:first-child,
402
+ .markdown-body h2:first-child,
403
+ .markdown-body h3:first-child { margin-top: 0; }
404
+ .markdown-body p { margin: 8px 0; }
405
+ .markdown-body ul,
406
+ .markdown-body ol { margin: 8px 0; padding-left: 20px; }
407
+ .markdown-body li { margin: 4px 0; }
408
+ .markdown-body code {
409
+ font-family: var(--vscode-editor-font-family, monospace);
410
+ font-size: 0.9em;
411
+ padding: 1px 6px;
412
+ border-radius: 4px;
413
+ background: var(--vscode-textCodeBlock-background, rgba(127, 127, 127, 0.18));
414
+ }
415
+ .markdown-body pre {
416
+ margin: 8px 0;
417
+ padding: 10px 12px;
418
+ overflow-x: auto;
419
+ border-radius: var(--radius-sm);
420
+ background: var(--vscode-textCodeBlock-background, rgba(127, 127, 127, 0.18));
421
+ border: 1px solid var(--line-soft);
225
422
  }
423
+ .markdown-body pre code { padding: 0; background: none; }
424
+ .markdown-body blockquote {
425
+ margin: 8px 0;
426
+ padding: 4px 12px;
427
+ border-left: 3px solid var(--accent);
428
+ color: var(--muted);
429
+ }
430
+ .markdown-body a { color: var(--vscode-textLink-foreground); }
431
+ .markdown-body strong { font-weight: 600; }
432
+ .markdown-body hr { border: none; border-top: 1px solid var(--line-soft); margin: 12px 0; }
433
+ .markdown-body table { border-collapse: collapse; width: 100%; margin: 8px 0; }
434
+ .markdown-body th,
435
+ .markdown-body td { border: 1px solid var(--line-soft); padding: 6px 10px; text-align: left; }
436
+ .markdown-body th { background: var(--surface-sunken); font-weight: 600; }
226
437
 
227
- .lang-switch-btn {
228
- margin-left: auto;
229
- padding: 2px 6px;
438
+ /* ---------- Code syntax highlighting (highlight.js · VS Code 配色) ---------- */
439
+ /* 默认 / 深色主题(Dark+) */
440
+ .hljs-comment, .hljs-quote { color: #6a9955; font-style: italic; }
441
+ .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-section, .hljs-link, .hljs-name, .hljs-tag, .hljs-meta { color: #569cd6; }
442
+ .hljs-built_in, .hljs-type, .hljs-title.class_ { color: #4ec9b0; }
443
+ .hljs-string, .hljs-attribute, .hljs-symbol, .hljs-bullet, .hljs-addition { color: #ce9178; }
444
+ .hljs-number { color: #b5cea8; }
445
+ .hljs-title, .hljs-title.function_ { color: #dcdcaa; }
446
+ .hljs-variable, .hljs-template-variable, .hljs-params, .hljs-property, .hljs-attr { color: #9cdcfe; }
447
+ .hljs-regexp { color: #d16969; }
448
+ .hljs-deletion { color: #ce9178; }
449
+ .hljs-emphasis { font-style: italic; }
450
+ .hljs-strong { font-weight: 600; }
451
+
452
+ /* 浅色主题(Light+)覆盖 */
453
+ body.vscode-light .hljs-comment, body.vscode-light .hljs-quote { color: #008000; }
454
+ body.vscode-light .hljs-keyword, body.vscode-light .hljs-selector-tag, body.vscode-light .hljs-literal, body.vscode-light .hljs-section, body.vscode-light .hljs-link, body.vscode-light .hljs-name, body.vscode-light .hljs-tag, body.vscode-light .hljs-meta { color: #0000ff; }
455
+ body.vscode-light .hljs-built_in, body.vscode-light .hljs-type, body.vscode-light .hljs-title.class_ { color: #267f99; }
456
+ body.vscode-light .hljs-string, body.vscode-light .hljs-attribute, body.vscode-light .hljs-symbol, body.vscode-light .hljs-bullet, body.vscode-light .hljs-addition { color: #a31515; }
457
+ body.vscode-light .hljs-number { color: #098658; }
458
+ body.vscode-light .hljs-title, body.vscode-light .hljs-title.function_ { color: #795e26; }
459
+ body.vscode-light .hljs-variable, body.vscode-light .hljs-template-variable, body.vscode-light .hljs-params, body.vscode-light .hljs-property, body.vscode-light .hljs-attr { color: #001080; }
460
+ body.vscode-light .hljs-regexp { color: #811f3f; }
461
+
462
+ /* ---------- Composer ---------- */
463
+ .composer {
464
+ flex: 1;
465
+ min-height: 0;
466
+ display: flex;
467
+ flex-direction: column;
468
+ overflow: hidden;
469
+ border: 1px solid var(--vscode-input-border, var(--line));
470
+ border-radius: var(--radius-md);
471
+ background: var(--vscode-input-background, var(--surface-sunken));
472
+ transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
473
+ }
474
+ .composer:focus-within {
475
+ border-color: color-mix(in srgb, var(--brand-pink) 55%, transparent);
476
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand-pink) 10%, transparent);
477
+ }
478
+ .composer__input {
479
+ display: block;
480
+ width: 100%;
481
+ flex: 1;
482
+ min-height: 0;
483
+ resize: none;
484
+ border: none;
230
485
  background: transparent;
231
- border: 1px solid var(--vscode-input-border);
486
+ color: var(--vscode-input-foreground, var(--vscode-foreground));
487
+ font-family: inherit;
488
+ font-size: 13px;
489
+ line-height: 1.6;
490
+ padding: var(--sp-3);
491
+ }
492
+ .composer__input:focus { outline: none; }
493
+ .composer__input::placeholder { color: var(--vscode-input-placeholderForeground, var(--muted)); opacity: 0.8; }
494
+ .composer__footer {
495
+ flex: none;
496
+ display: flex;
497
+ align-items: center;
498
+ gap: var(--sp-2);
499
+ padding: var(--sp-1) var(--sp-2);
500
+ border-top: 1px solid var(--line-soft);
501
+ }
502
+ .composer__tools {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 2px;
506
+ }
507
+ .composer__tools svg {
508
+ width: var(--icon-sm);
509
+ height: var(--icon-sm);
510
+ }
511
+ .composer__hint {
512
+ flex: 0 1 auto;
513
+ min-width: 0;
514
+ font-size: 10.5px;
515
+ color: var(--muted);
516
+ opacity: 0.7;
517
+ white-space: nowrap;
518
+ overflow: hidden;
519
+ text-overflow: ellipsis;
520
+ }
521
+ .composer__hint .hint-kbd {
522
+ display: inline-block;
523
+ padding: 0 4px;
524
+ margin: 0 1px;
525
+ font-family: var(--vscode-editor-font-family, ui-monospace, "SF Mono", monospace);
526
+ font-size: 10px;
527
+ border: 1px solid color-mix(in srgb, currentColor 45%, transparent);
232
528
  border-radius: 3px;
529
+ opacity: 0.95;
530
+ }
531
+ .composer__count {
532
+ margin-left: auto;
533
+ font-size: 11px;
534
+ font-variant-numeric: tabular-nums;
535
+ color: var(--muted);
536
+ opacity: 0.75;
537
+ }
538
+
539
+ /* ---------- @ mention file picker ---------- */
540
+ .mention-popup {
541
+ position: fixed;
542
+ z-index: 80;
543
+ max-height: 240px;
544
+ overflow-y: auto;
545
+ background: var(--vscode-editorWidget-background, var(--surface-raised));
546
+ border: 1px solid var(--vscode-editorWidget-border, var(--line));
547
+ border-radius: var(--radius-md);
548
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.4);
549
+ padding: 4px;
550
+ }
551
+ .mention-popup.hidden { display: none; }
552
+ .mention-item {
553
+ display: flex;
554
+ align-items: baseline;
555
+ gap: 8px;
556
+ padding: 6px 8px;
557
+ border-radius: var(--radius-sm);
233
558
  cursor: pointer;
234
559
  font-size: 12px;
560
+ }
561
+ .mention-item.active,
562
+ .mention-item:hover {
563
+ background: color-mix(in srgb, var(--brand-pink) 16%, transparent);
564
+ }
565
+ .mention-item__icon { flex: none; align-self: center; display: flex; color: var(--muted); }
566
+ .mention-item__icon svg { width: 14px; height: 14px; }
567
+ .mention-item__name { color: var(--vscode-foreground); font-weight: 500; flex: none; }
568
+ .mention-item__path {
569
+ color: var(--muted);
235
570
  opacity: 0.7;
236
- transition: opacity 0.15s, background 0.15s;
571
+ font-size: 11px;
572
+ overflow: hidden;
573
+ text-overflow: ellipsis;
574
+ white-space: nowrap;
237
575
  }
576
+ .mention-empty { padding: 8px 10px; font-size: 12px; color: var(--muted); }
238
577
 
239
- .lang-switch-btn:hover {
240
- opacity: 1;
241
- background: var(--vscode-button-secondaryBackground);
578
+ /* ---------- Image previews ---------- */
579
+ .previews {
580
+ flex: none;
581
+ display: flex;
582
+ flex-wrap: wrap;
583
+ gap: var(--sp-1);
584
+ max-height: 120px;
585
+ overflow-y: auto;
242
586
  }
243
-
244
- .debug-icon {
587
+ .previews:not(:empty) { margin-top: var(--sp-1); }
588
+ .preview {
589
+ position: relative;
590
+ width: 44px;
591
+ height: 44px;
592
+ border-radius: var(--radius-sm);
593
+ overflow: hidden;
594
+ border: 1px solid var(--line);
595
+ background: var(--surface-sunken);
596
+ }
597
+ .preview img {
598
+ width: 100%;
599
+ height: 100%;
600
+ object-fit: cover;
601
+ cursor: zoom-in;
602
+ }
603
+ .chip-remove {
604
+ position: absolute;
605
+ top: 2px;
606
+ right: 2px;
607
+ display: grid;
608
+ place-items: center;
609
+ width: 16px;
610
+ height: 16px;
611
+ border: none;
612
+ border-radius: 50%;
613
+ background: rgba(0, 0, 0, 0.6);
614
+ color: #fff;
245
615
  cursor: pointer;
246
- opacity: 0.6;
247
- font-size: 12px;
616
+ opacity: 0;
617
+ transition: opacity var(--dur) var(--ease), background var(--dur) var(--ease);
248
618
  }
619
+ .chip-remove svg { width: 10px; height: 10px; }
620
+ .preview:hover .chip-remove { opacity: 1; }
621
+ .chip-remove:hover { background: var(--vscode-errorForeground, #e51400); }
249
622
 
250
- .debug-icon:hover {
251
- opacity: 1;
623
+ /* ---------- Reference chips (files + code, above input, Cursor-style) ---------- */
624
+ .ref-chips {
625
+ flex: none;
626
+ display: flex;
627
+ flex-wrap: wrap;
628
+ gap: 4px;
629
+ max-height: 88px;
630
+ overflow-y: auto;
252
631
  }
253
-
254
- .debug-tooltip {
255
- display: none;
256
- position: fixed;
257
- top: 50px;
258
- right: 10px;
259
- padding: 8px 10px;
260
- background: var(--vscode-editorWidget-background);
261
- border: 1px solid var(--vscode-editorWidget-border);
262
- border-radius: 4px;
632
+ .ref-chips:not(:empty) { margin-bottom: 6px; }
633
+ .ref-chip {
634
+ display: inline-flex;
635
+ align-items: center;
636
+ gap: 4px;
637
+ max-width: 100%;
638
+ padding: 2px 4px 2px 6px;
263
639
  font-size: 11px;
264
- white-space: pre-wrap;
265
- z-index: 1000;
266
- min-width: 180px;
267
- max-width: 280px;
268
- box-shadow: 0 2px 8px rgba(0,0,0,0.3);
640
+ line-height: 1.5;
641
+ border-radius: 5px;
642
+ background: color-mix(in srgb, var(--accent) 10%, var(--surface-sunken));
643
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--line-soft));
644
+ color: var(--vscode-foreground);
645
+ cursor: default;
269
646
  }
270
-
271
- .debug-icon:hover + .debug-tooltip,
272
- .debug-tooltip:hover {
273
- display: block;
647
+ .ref-chip__icon { flex: none; display: flex; color: var(--accent); }
648
+ .ref-chip__icon svg { width: 12px; height: 12px; }
649
+ .ref-chip__name {
650
+ overflow: hidden;
651
+ text-overflow: ellipsis;
652
+ white-space: nowrap;
653
+ font-weight: 500;
654
+ max-width: 160px;
274
655
  }
656
+ .ref-chip__meta { flex: none; color: var(--muted); opacity: 0.9; }
657
+ .ref-chip .chip-remove {
658
+ position: static;
659
+ width: 14px;
660
+ height: 14px;
661
+ opacity: 0.5;
662
+ background: transparent;
663
+ color: var(--muted);
664
+ }
665
+ .ref-chip .chip-remove:hover { opacity: 1; background: transparent; color: var(--vscode-errorForeground, #e51400); }
275
666
 
276
- .attachments-area {
277
- margin-top: 10px;
667
+ /* ---------- Countdown ---------- */
668
+ .countdown {
669
+ display: flex;
670
+ align-items: center;
671
+ gap: var(--sp-2);
672
+ }
673
+ .countdown[hidden] { display: none; }
674
+ .countdown__track {
675
+ flex: 1;
676
+ height: 4px;
677
+ border-radius: 999px;
678
+ overflow: hidden;
679
+ background: var(--surface-sunken);
680
+ }
681
+ .countdown__bar {
682
+ height: 100%;
683
+ width: 100%;
684
+ border-radius: 999px;
685
+ background: var(--accent);
686
+ transform-origin: left center;
687
+ transition: width 1s linear, background var(--dur) var(--ease);
278
688
  }
689
+ .countdown.is-warning .countdown__bar { background: var(--vscode-charts-yellow, #d9a400); }
690
+ .countdown.is-danger .countdown__bar { background: var(--vscode-errorForeground, #e51400); }
691
+ .countdown__text {
692
+ font-size: 11px;
693
+ font-variant-numeric: tabular-nums;
694
+ color: var(--muted);
695
+ white-space: nowrap;
696
+ }
697
+ .countdown.is-danger .countdown__text { color: var(--vscode-errorForeground, #e51400); }
279
698
 
280
- .attachment-buttons {
699
+ /* ---------- Submit bar (pinned outside form, always visible) ---------- */
700
+ .submitbar {
701
+ flex: none;
281
702
  display: flex;
282
- justify-content: flex-end;
283
- gap: 4px;
703
+ flex-direction: column;
704
+ gap: var(--sp-2);
284
705
  }
285
706
 
286
- .attachment-btn {
707
+ /* ---------- Actions / buttons ---------- */
708
+ .actions {
709
+ display: flex;
710
+ gap: var(--sp-2);
711
+ }
712
+ .btn {
287
713
  display: inline-flex;
288
714
  align-items: center;
289
715
  justify-content: center;
290
- width: 28px;
291
- height: 28px;
292
- padding: 0;
293
- background: var(--vscode-button-secondaryBackground);
294
- color: var(--vscode-button-secondaryForeground);
295
- border: none;
296
- border-radius: 4px;
716
+ gap: var(--sp-2);
717
+ padding: 10px 16px;
718
+ border: 1px solid transparent;
719
+ border-radius: var(--radius-md);
720
+ font-family: inherit;
721
+ font-size: 12px;
722
+ font-weight: 600;
723
+ letter-spacing: 0.01em;
297
724
  cursor: pointer;
298
- font-size: 14px;
725
+ transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease),
726
+ color var(--dur) var(--ease), opacity var(--dur) var(--ease),
727
+ transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
299
728
  }
300
-
301
- .attachment-btn:hover {
302
- background: var(--vscode-button-secondaryHoverBackground);
729
+ .btn svg { width: var(--icon-sm); height: var(--icon-sm); }
730
+ .btn--primary {
731
+ flex: 1;
732
+ background: linear-gradient(180deg, var(--brand-pink) 0%, var(--brand-pink-strong) 100%);
733
+ color: var(--brand-pink-fg);
734
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--brand-pink-strong) 22%, transparent);
303
735
  }
304
-
305
- .attachment-btn[data-tooltip] {
306
- position: relative;
736
+ .btn--primary:hover {
737
+ background: linear-gradient(180deg,
738
+ color-mix(in srgb, var(--brand-pink) 92%, #fff 8%) 0%,
739
+ var(--brand-pink) 100%);
740
+ transform: translateY(-1px);
741
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--brand-pink) 26%, transparent);
307
742
  }
308
-
309
- .attachment-btn[data-tooltip]:hover::after {
310
- content: attr(data-tooltip);
311
- position: absolute;
312
- bottom: 100%;
313
- right: 0;
314
- padding: 4px 8px;
315
- background: var(--vscode-editorWidget-background);
316
- color: var(--vscode-editorWidget-foreground);
317
- border: 1px solid var(--vscode-editorWidget-border);
318
- border-radius: 4px;
743
+ .btn--primary:active { transform: translateY(0); box-shadow: 0 1px 2px color-mix(in srgb, var(--brand-pink-strong) 25%, transparent); }
744
+ .btn--ghost {
745
+ width: 42px;
746
+ padding: 9px;
747
+ background: var(--vscode-button-secondaryBackground, var(--surface-sunken));
748
+ color: var(--vscode-button-secondaryForeground, var(--vscode-foreground));
749
+ border-color: var(--line);
750
+ }
751
+ .btn--ghost svg { width: var(--icon-md); height: var(--icon-md); }
752
+ .btn--ghost:hover {
753
+ background: var(--vscode-button-secondaryHoverBackground, var(--surface-raised));
754
+ border-color: var(--accent);
755
+ transform: translateY(-1px);
756
+ }
757
+ .btn--ghost:active { transform: translateY(0); }
758
+ .btn--ghost.enter-mode {
759
+ background: var(--brand-pink);
760
+ color: var(--brand-pink-fg);
761
+ border-color: transparent;
762
+ }
763
+ .btn__kbd {
319
764
  font-size: 11px;
765
+ font-weight: 500;
766
+ color: inherit;
767
+ opacity: 0.6;
768
+ letter-spacing: 0.2px;
320
769
  white-space: nowrap;
321
- margin-bottom: 4px;
322
- z-index: 100;
323
770
  }
771
+ .btn.is-success .btn__kbd { display: none; }
324
772
 
325
- .file-list {
326
- margin-top: 8px;
773
+ /* Submit button states: idle / loading / success */
774
+ .btn__spinner {
775
+ display: none;
776
+ width: var(--icon-sm);
777
+ height: var(--icon-sm);
778
+ border-radius: 50%;
779
+ border: 2px solid color-mix(in srgb, currentColor 35%, transparent);
780
+ border-top-color: currentColor;
781
+ animation: spin 0.7s linear infinite;
327
782
  }
783
+ .btn.is-loading { cursor: progress; opacity: 0.85; }
784
+ .btn.is-loading .btn__icon { display: none; }
785
+ .btn.is-loading .btn__spinner { display: block; }
786
+ .btn.is-success { background: var(--vscode-charts-green, #3fb950); color: #fff; }
787
+ @keyframes spin { to { transform: rotate(360deg); } }
328
788
 
329
- .file-item {
789
+ /* ---------- Dropzone overlay ---------- */
790
+ .dropzone {
791
+ position: fixed;
792
+ inset: var(--sp-2);
793
+ z-index: 100;
794
+ display: grid;
795
+ place-items: center;
796
+ border-radius: var(--radius-lg);
797
+ border: 2px dashed var(--accent);
798
+ background: color-mix(in srgb, var(--surface) 86%, var(--accent) 14%);
799
+ backdrop-filter: blur(2px);
800
+ }
801
+ .dropzone__inner {
330
802
  display: flex;
803
+ flex-direction: column;
331
804
  align-items: center;
332
- gap: 6px;
333
- padding: 4px 8px;
334
- background: var(--vscode-textBlockQuote-background);
335
- border-radius: 4px;
336
- margin-bottom: 4px;
337
- font-size: 11px;
805
+ gap: var(--sp-2);
806
+ color: var(--accent);
807
+ font-size: 12px;
808
+ font-weight: 600;
338
809
  }
810
+ .dropzone__inner svg { width: 32px; height: 32px; }
339
811
 
340
- .file-item .file-icon {
341
- flex-shrink: 0;
812
+ /* ---------- Lightbox (image zoom) ---------- */
813
+ .lightbox {
814
+ position: fixed;
815
+ inset: 0;
816
+ z-index: 200;
817
+ display: grid;
818
+ place-items: center;
819
+ padding: var(--sp-4);
820
+ background: rgba(0, 0, 0, 0.78);
821
+ backdrop-filter: blur(3px);
822
+ cursor: zoom-out;
823
+ animation: fade-in 160ms var(--ease);
342
824
  }
343
-
344
- .file-item .file-path {
345
- flex: 1;
346
- overflow: hidden;
347
- text-overflow: ellipsis;
348
- white-space: nowrap;
349
- color: var(--vscode-descriptionForeground);
825
+ .lightbox__img {
826
+ width: auto;
827
+ height: auto;
828
+ max-width: 94%;
829
+ max-height: 94%;
830
+ border-radius: var(--radius-md);
831
+ box-shadow: 0 12px 48px rgba(0, 0, 0, 0.6);
350
832
  }
351
833
 
352
- .file-item .file-remove {
353
- flex-shrink: 0;
354
- width: 16px;
355
- height: 16px;
356
- border-radius: 50%;
357
- background: var(--vscode-errorForeground);
358
- color: white;
359
- border: none;
360
- cursor: pointer;
361
- font-size: 10px;
834
+ /* ---------- Feishu notification modal ---------- */
835
+ .feishu-modal {
836
+ position: fixed;
837
+ inset: 0;
838
+ z-index: 210;
362
839
  display: flex;
363
840
  align-items: center;
364
841
  justify-content: center;
842
+ padding: 16px;
843
+ background: rgba(0, 0, 0, 0.55);
844
+ backdrop-filter: blur(2px);
845
+ animation: fade-in 160ms var(--ease);
365
846
  }
366
-
367
- .image-preview {
847
+ .feishu-modal__panel {
848
+ width: 100%;
849
+ max-width: 360px;
850
+ max-height: calc(100vh - 32px);
851
+ overflow-y: auto;
368
852
  display: flex;
369
- flex-wrap: wrap;
853
+ flex-direction: column;
854
+ gap: 12px;
855
+ padding: 16px;
856
+ border: 1px solid var(--line);
857
+ border-radius: var(--radius-lg);
858
+ background: var(--surface-raised);
859
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.4);
860
+ }
861
+ .feishu-modal__head {
862
+ display: flex;
863
+ align-items: center;
864
+ justify-content: space-between;
370
865
  gap: 8px;
371
- margin-top: 10px;
372
866
  }
373
-
374
- .image-preview-item {
375
- position: relative;
867
+ .feishu-modal__title {
868
+ margin: 0;
869
+ font-size: 13px;
870
+ font-weight: 600;
871
+ color: var(--vscode-foreground);
376
872
  }
377
-
378
- .image-preview img {
379
- max-width: 80px;
380
- max-height: 80px;
381
- border-radius: 4px;
382
- object-fit: cover;
383
- border: 1px solid var(--vscode-input-border);
873
+ .feishu-modal__desc {
874
+ margin: 0;
875
+ font-size: 12px;
876
+ line-height: 1.55;
877
+ color: var(--muted);
384
878
  }
385
-
386
- .image-remove {
387
- position: absolute;
388
- top: -6px;
389
- right: -6px;
390
- width: 18px;
391
- height: 18px;
879
+ .feishu-field { display: flex; flex-direction: column; gap: 5px; }
880
+ .feishu-field__label {
881
+ font-size: 11px;
882
+ font-weight: 600;
883
+ letter-spacing: 0.02em;
884
+ color: var(--muted);
885
+ }
886
+ .feishu-input {
887
+ width: 100%;
888
+ box-sizing: border-box;
889
+ padding: 8px 10px;
890
+ font-family: inherit;
891
+ font-size: 12px;
892
+ color: var(--vscode-input-foreground, var(--vscode-foreground));
893
+ background: var(--vscode-input-background, var(--surface-sunken));
894
+ border: 1px solid var(--line);
895
+ border-radius: var(--radius-md);
896
+ transition: border-color var(--dur) var(--ease);
897
+ }
898
+ .feishu-input:focus { outline: none; border-color: var(--accent); }
899
+ .feishu-input::placeholder { color: var(--vscode-input-placeholderForeground, var(--muted)); opacity: 0.8; }
900
+ .feishu-status { display: flex; align-items: center; gap: 7px; font-size: 12px; color: var(--muted); }
901
+ .feishu-status__dot {
902
+ flex: none;
903
+ width: 8px;
904
+ height: 8px;
392
905
  border-radius: 50%;
393
- background: var(--vscode-errorForeground);
394
- color: white;
906
+ background: var(--muted);
907
+ opacity: 0.5;
908
+ }
909
+ .feishu-status.is-configured .feishu-status__dot { background: var(--vscode-charts-yellow, #d9a400); opacity: 1; }
910
+ .feishu-status.is-bound .feishu-status__dot { background: var(--vscode-charts-green, #3fb950); opacity: 1; }
911
+ .feishu-modal__actions {
912
+ display: flex;
913
+ align-items: center;
914
+ justify-content: space-between;
915
+ gap: 10px;
916
+ margin-top: 2px;
917
+ }
918
+ .feishu-link {
919
+ padding: 0;
395
920
  border: none;
396
- cursor: pointer;
921
+ background: none;
922
+ font-family: inherit;
397
923
  font-size: 12px;
924
+ color: var(--accent);
925
+ cursor: pointer;
926
+ }
927
+ .feishu-link:hover { text-decoration: underline; }
928
+ .feishu-modal__hint {
929
+ margin: 0;
930
+ font-size: 11px;
931
+ line-height: 1.5;
932
+ color: var(--muted);
933
+ opacity: 0.85;
934
+ }
935
+ .feishu-section {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 8px;
939
+ padding: 10px 12px;
940
+ border: 1px solid var(--line);
941
+ border-radius: var(--radius-md);
942
+ background: var(--surface-sunken);
943
+ }
944
+ .feishu-section__title {
945
+ font-size: 11px;
946
+ font-weight: 600;
947
+ letter-spacing: 0.02em;
948
+ color: var(--muted);
949
+ }
950
+ .feishu-switch {
951
+ display: flex;
952
+ align-items: center;
953
+ justify-content: space-between;
954
+ gap: 10px;
955
+ cursor: pointer;
956
+ }
957
+ .feishu-switch__label { font-size: 12px; color: var(--vscode-foreground); }
958
+ .feishu-switch__label--strong { font-size: 13px; font-weight: 600; color: var(--vscode-foreground); }
959
+ .feishu-switch__input { position: absolute; opacity: 0; width: 0; height: 0; }
960
+ .feishu-switch__track {
961
+ position: relative;
962
+ flex: none;
963
+ width: 34px;
964
+ height: 18px;
965
+ border-radius: 999px;
966
+ background: color-mix(in srgb, var(--muted) 40%, transparent);
967
+ transition: background var(--dur) var(--ease);
968
+ }
969
+ .feishu-switch__thumb {
970
+ position: absolute;
971
+ top: 2px;
972
+ left: 2px;
973
+ width: 14px;
974
+ height: 14px;
975
+ border-radius: 50%;
976
+ background: #fff;
977
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
978
+ transition: transform var(--dur) var(--ease);
979
+ }
980
+ .feishu-switch__input:checked + .feishu-switch__track { background: var(--accent); }
981
+ .feishu-switch__input:checked + .feishu-switch__track .feishu-switch__thumb { transform: translateX(16px); }
982
+ .feishu-switch__input:focus-visible + .feishu-switch__track { outline: 2px solid var(--accent); outline-offset: 1px; }
983
+ .feishu-subitem {
984
+ display: flex;
985
+ flex-direction: column;
986
+ gap: 6px;
987
+ margin-top: 2px;
988
+ padding-left: 12px;
989
+ border-left: 2px solid var(--line);
990
+ }
991
+ .feishu-subitem.is-disabled { opacity: 0.45; pointer-events: none; }
992
+ .feishu-modal__desc--sub { font-size: 11px; opacity: 0.9; }
993
+ .feishu-input-wrap { position: relative; display: flex; align-items: center; }
994
+ .feishu-input-wrap .feishu-input { width: 100%; padding-right: 34px; box-sizing: border-box; }
995
+ .feishu-eye {
996
+ position: absolute;
997
+ right: 4px;
398
998
  display: flex;
399
999
  align-items: center;
400
1000
  justify-content: center;
1001
+ width: 26px;
1002
+ height: 26px;
1003
+ padding: 0;
1004
+ border: none;
1005
+ background: none;
1006
+ color: var(--muted);
1007
+ cursor: pointer;
1008
+ border-radius: var(--radius-sm);
401
1009
  }
1010
+ .feishu-eye:hover { color: var(--vscode-foreground); }
1011
+ .feishu-eye__icon { width: 15px; height: 15px; }
1012
+ .feishu-eye__hide { display: none; }
1013
+ .feishu-eye.is-visible .feishu-eye__show { display: none; }
1014
+ .feishu-eye.is-visible .feishu-eye__hide { display: block; }
1015
+
1016
+ /* ---------- Utilities ---------- */
1017
+ .hidden { display: none !important; }
402
1018
 
403
- .hidden {
404
- display: none !important;
1019
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
1020
+ ::-webkit-scrollbar-thumb {
1021
+ background: var(--vscode-scrollbarSlider-background, rgba(127, 127, 127, 0.35));
1022
+ border-radius: 999px;
1023
+ border: 2px solid transparent;
1024
+ background-clip: padding-box;
1025
+ }
1026
+ ::-webkit-scrollbar-thumb:hover {
1027
+ background: var(--vscode-scrollbarSlider-hoverBackground, rgba(127, 127, 127, 0.5));
1028
+ background-clip: padding-box;
405
1029
  }
406
1030
 
407
- .project-info {
408
- font-size: 11px;
409
- color: var(--vscode-descriptionForeground);
410
- margin-top: 6px;
411
- padding: 6px 8px;
412
- background: var(--vscode-textBlockQuote-background);
413
- border-radius: 4px;
414
- word-break: break-all;
1031
+ /* ---------- Responsive (narrow sidebars) ---------- */
1032
+ @media (max-width: 260px) {
1033
+ .app { padding: var(--sp-2); gap: var(--sp-2); }
1034
+ .card { padding: var(--sp-2); }
1035
+ .btn__label { font-size: 11px; }
415
1036
  }
416
1037
 
417
- .timeout-info {
418
- font-size: 11px;
419
- color: var(--vscode-descriptionForeground);
420
- text-align: right;
421
- margin-top: 6px;
1038
+ /* ---------- Reduced motion ---------- */
1039
+ @media (prefers-reduced-motion: reduce) {
1040
+ *, *::before, *::after {
1041
+ animation-duration: 0.001ms !important;
1042
+ animation-iteration-count: 1 !important;
1043
+ transition-duration: 0.001ms !important;
1044
+ }
422
1045
  }