@in-the-loop-labs/pair-review 3.6.0 → 3.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +4 -0
  2. package/package.json +20 -15
  3. package/plugin/.claude-plugin/plugin.json +1 -1
  4. package/plugin-code-critic/.claude-plugin/plugin.json +1 -1
  5. package/plugin-code-critic/skills/analyze/scripts/git-diff-lines +0 -0
  6. package/public/css/analysis-config.css +1807 -0
  7. package/public/css/pr.css +17 -1737
  8. package/public/index.html +11 -0
  9. package/public/js/components/AIPanel.js +89 -44
  10. package/public/js/components/AdvancedConfigTab.js +56 -4
  11. package/public/js/components/AnalysisConfigModal.js +41 -25
  12. package/public/js/components/ChatPanel.js +11 -1
  13. package/public/js/components/ReviewModal.js +135 -13
  14. package/public/js/components/SuggestionNavigator.js +55 -10
  15. package/public/js/components/VoiceCentricConfigTab.js +36 -0
  16. package/public/js/index.js +175 -16
  17. package/public/js/local.js +58 -8
  18. package/public/js/modules/suggestion-manager.js +25 -1
  19. package/public/js/modules/tour-renderer.js +45 -5
  20. package/public/js/pr.js +703 -171
  21. package/public/js/repo-links.js +328 -0
  22. package/public/js/utils/provider-model.js +88 -0
  23. package/public/js/utils/scroll-into-view.js +164 -0
  24. package/public/js/utils/storage-keys.js +50 -0
  25. package/public/local.html +10 -0
  26. package/public/pr.html +10 -0
  27. package/public/repo-settings.html +1 -0
  28. package/public/setup.html +2 -0
  29. package/src/ai/analyzer.js +125 -18
  30. package/src/ai/claude-provider.js +31 -3
  31. package/src/config.js +664 -10
  32. package/src/external/github-adapter.js +114 -25
  33. package/src/git/base-branch.js +11 -4
  34. package/src/github/client.js +482 -588
  35. package/src/github/errors.js +55 -0
  36. package/src/github/impl/graphql/pending-review-comments.js +230 -0
  37. package/src/github/impl/graphql/pending-review.js +153 -0
  38. package/src/github/impl/graphql/review-lifecycle.js +161 -0
  39. package/src/github/impl/graphql/stack-walker.js +210 -0
  40. package/src/github/impl/host/pending-review-comments.js +338 -0
  41. package/src/github/impl/rest/pending-review.js +251 -0
  42. package/src/github/impl/rest/review-lifecycle.js +226 -0
  43. package/src/github/impl/rest/stack-walker.js +309 -0
  44. package/src/github/operations/pending-review-comments.js +79 -0
  45. package/src/github/operations/pending-review.js +89 -0
  46. package/src/github/operations/review-lifecycle.js +126 -0
  47. package/src/github/operations/stack-walker.js +87 -0
  48. package/src/github/parser.js +230 -4
  49. package/src/github/stack-walker.js +14 -189
  50. package/src/links/repo-links.js +230 -0
  51. package/src/local-review.js +13 -4
  52. package/src/main.js +136 -32
  53. package/src/routes/analyses.js +30 -7
  54. package/src/routes/bulk-analysis-configs.js +295 -0
  55. package/src/routes/config.js +102 -2
  56. package/src/routes/external-comments.js +20 -10
  57. package/src/routes/github-collections.js +3 -1
  58. package/src/routes/local.js +101 -11
  59. package/src/routes/mcp.js +47 -4
  60. package/src/routes/pr.js +298 -68
  61. package/src/routes/setup.js +8 -3
  62. package/src/routes/stack-analysis.js +33 -9
  63. package/src/routes/worktrees.js +3 -2
  64. package/src/server.js +2 -0
  65. package/src/setup/pr-setup.js +37 -11
  66. package/src/setup/stack-setup.js +13 -3
  67. package/src/single-port.js +6 -3
@@ -1,5 +1,1812 @@
1
1
  /* Copyright 2026 Tim Perkins (tjwp) | SPDX-License-Identifier: Apache-2.0 */
2
2
 
3
+ /* Shared modal shell used by the analysis configuration dialog. */
4
+
5
+ .analysis-config-overlay {
6
+ --color-bg-subtle: var(--color-bg-secondary, #f6f8fa);
7
+ --color-bg-elevated: var(--color-bg-primary, #ffffff);
8
+ --color-text-muted: var(--color-text-tertiary, #8c959f);
9
+ --color-border-default: var(--color-border-primary, #d1d9e0);
10
+ --color-border-subtle: var(--color-border-secondary, rgba(0, 0, 0, 0.06));
11
+ --color-accent-light: var(--color-accent-subtle, rgba(9, 105, 218, 0.1));
12
+ --color-accent-ai: var(--ai-secondary, #fbbf24);
13
+ --color-accent-ai-dark: var(--ai-primary, #f59e0b);
14
+ --color-info: var(--color-accent-primary, #0969da);
15
+ }
16
+
17
+ /* Modal Styles */
18
+ .modal-overlay {
19
+ position: fixed;
20
+ top: 0;
21
+ left: 0;
22
+ right: 0;
23
+ bottom: 0;
24
+ z-index: 1000;
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ }
29
+
30
+ .modal-backdrop {
31
+ position: absolute;
32
+ top: 0;
33
+ left: 0;
34
+ right: 0;
35
+ bottom: 0;
36
+ background: rgba(0, 0, 0, 0.5);
37
+ cursor: pointer;
38
+ }
39
+
40
+ .modal-container {
41
+ position: relative;
42
+ width: min(960px, 90vw);
43
+ height: 520px; /* Increased from 420px to show all 4 levels without scrolling */
44
+ background: var(--color-bg-primary, #ffffff);
45
+ border-radius: 20px;
46
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
47
+ display: flex;
48
+ flex-direction: column;
49
+ overflow: hidden;
50
+ border: 1px solid var(--color-border-default, #d1d9e0);
51
+ }
52
+
53
+ .modal-header {
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: space-between;
57
+ padding: 24px 24px 16px 24px;
58
+ border-bottom: 1px solid var(--ai-border, rgba(217, 119, 6, 0.3));
59
+ background: linear-gradient(to right, var(--ai-subtle, rgba(217, 119, 6, 0.08)), transparent);
60
+ }
61
+
62
+ .modal-header h3 {
63
+ font-size: 18px;
64
+ font-weight: 600;
65
+ color: var(--ai-primary, #d97706);
66
+ margin: 0;
67
+ }
68
+
69
+ .modal-close-btn {
70
+ background: none;
71
+ border: none;
72
+ padding: 4px;
73
+ cursor: pointer;
74
+ border-radius: 4px;
75
+ color: var(--color-text-secondary, #656d76);
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ }
80
+
81
+ .modal-close-btn:hover {
82
+ background: var(--color-bg-tertiary, #f6f8fa);
83
+ color: var(--color-text-primary, #24292f);
84
+ }
85
+
86
+ .modal-body {
87
+ padding: 16px 24px;
88
+ flex: 1;
89
+ overflow-y: auto;
90
+ }
91
+
92
+ .modal-footer {
93
+ padding: 16px 24px 24px 24px;
94
+ display: flex;
95
+ gap: 8px;
96
+ justify-content: flex-end;
97
+ border-top: 1px solid var(--color-border-default, #d1d9e0);
98
+ }
99
+
100
+ .modal-footer .btn {
101
+ padding: 8px 16px;
102
+ font-size: 14px;
103
+ }
104
+
105
+ /* Confirm dialog buttons should be centered */
106
+ .confirm-dialog-container .modal-footer {
107
+ justify-content: center;
108
+ }
109
+
110
+ /* When a secondary button is visible (3 buttons), widen and stack vertically.
111
+ column-reverse puts Confirm (primary) on top, Cancel on bottom. */
112
+ .confirm-dialog-container.has-secondary {
113
+ min-width: 440px;
114
+ }
115
+
116
+ .confirm-dialog-container.has-secondary .modal-footer {
117
+ flex-direction: column-reverse;
118
+ align-items: stretch;
119
+ }
120
+
121
+ .confirm-dialog-container.has-secondary .modal-footer .btn {
122
+ display: flex;
123
+ flex-direction: column;
124
+ align-items: center;
125
+ }
126
+
127
+ /* Button description subtitles */
128
+ .modal-footer .btn .btn-label {
129
+ display: block;
130
+ }
131
+
132
+ .modal-footer .btn .btn-desc {
133
+ display: block;
134
+ font-size: 12px;
135
+ font-weight: normal;
136
+ opacity: 0.7;
137
+ margin-top: 2px;
138
+ }
139
+
140
+ /* Dialogs spawned from within other modals need higher z-index */
141
+ #text-input-dialog,
142
+ #confirm-dialog {
143
+ z-index: 10000; /* Must stack above analysis-config-overlay (1100) */
144
+ }
145
+
146
+ #text-input-dialog .btn-secondary,
147
+ #confirm-dialog .btn-secondary {
148
+ background-color: #f6f8fa;
149
+ color: #24292f;
150
+ border: 1px solid #d1d9e0;
151
+ }
152
+
153
+ #text-input-dialog .btn-secondary:hover,
154
+ #confirm-dialog .btn-secondary:hover {
155
+ background-color: #eaeef2;
156
+ }
157
+
158
+ #text-input-dialog .btn-primary,
159
+ #confirm-dialog .btn-primary {
160
+ background-color: var(--color-accent-primary, #0969da);
161
+ color: white;
162
+ border: 1px solid var(--color-accent-primary, #0969da);
163
+ }
164
+
165
+ #text-input-dialog .btn-danger,
166
+ #confirm-dialog .btn-danger {
167
+ background-color: var(--color-danger, #d1242f);
168
+ color: white;
169
+ border: 1px solid var(--color-danger, #d1242f);
170
+ }
171
+
172
+ #text-input-dialog .btn-warning,
173
+ #confirm-dialog .btn-warning {
174
+ background-color: #d97706;
175
+ color: white;
176
+ border: 1px solid #d97706;
177
+ }
178
+
179
+ [data-theme="dark"] #text-input-dialog .btn-secondary,
180
+ [data-theme="dark"] #confirm-dialog .btn-secondary {
181
+ background-color: var(--color-bg-secondary, #161b22);
182
+ color: var(--color-text-primary, #c9d1d9);
183
+ border-color: var(--color-border-primary, #30363d);
184
+ }
185
+
186
+ [data-theme="dark"] #text-input-dialog .btn-secondary:hover,
187
+ [data-theme="dark"] #confirm-dialog .btn-secondary:hover {
188
+ background-color: var(--color-bg-tertiary, #1c2128);
189
+ }
190
+
191
+ .text-input-dialog-field {
192
+ display: flex;
193
+ flex-direction: column;
194
+ gap: 6px;
195
+ }
196
+
197
+ .text-input-dialog-field label {
198
+ font-size: 13px;
199
+ font-weight: 600;
200
+ color: var(--color-fg-default, #1f2328);
201
+ }
202
+
203
+ .text-input-dialog-field input {
204
+ padding: 8px 12px;
205
+ font-size: 14px;
206
+ border: 1px solid var(--color-border-default, #d1d9e0);
207
+ border-radius: 6px;
208
+ background: var(--color-bg-primary, #ffffff);
209
+ color: var(--color-fg-default, #1f2328);
210
+ outline: none;
211
+ width: 100%;
212
+ box-sizing: border-box;
213
+ }
214
+
215
+ .text-input-dialog-field input:focus {
216
+ border-color: var(--color-accent-fg, #0969da);
217
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
218
+ }
219
+
220
+ /* Dark theme adjustments for modal */
221
+ [data-theme="dark"] .modal-container {
222
+ background: var(--color-bg-primary);
223
+ border-color: var(--color-border-default);
224
+ }
225
+
226
+ [data-theme="dark"] .modal-header {
227
+ border-color: var(--color-border-default);
228
+ }
229
+
230
+ [data-theme="dark"] .modal-footer {
231
+ border-color: var(--color-border-default);
232
+ }
233
+
234
+ [data-theme="dark"] .modal-close-btn:hover {
235
+ background: var(--color-bg-secondary);
236
+ }
237
+
238
+ [data-theme="dark"] .modal-body {
239
+ color: var(--color-text-primary); /* Better contrast for dark mode */
240
+ }
241
+
242
+ [data-theme="dark"] .text-input-dialog-field label {
243
+ color: var(--color-fg-default, #f0f6fc);
244
+ }
245
+
246
+ [data-theme="dark"] .text-input-dialog-field input {
247
+ background: var(--color-bg-tertiary, #161b22);
248
+ border-color: var(--color-border-default, #30363d);
249
+ color: var(--color-fg-default, #f0f6fc);
250
+ }
251
+
252
+ [data-theme="dark"] .text-input-dialog-field input:focus {
253
+ border-color: var(--color-accent-fg, #58a6ff);
254
+ box-shadow: 0 0 0 3px rgba(56, 139, 253, 0.3);
255
+ }
256
+
257
+ .analysis-config-footer .btn-secondary {
258
+ color: var(--color-text-primary);
259
+ background-color: var(--color-bg-secondary);
260
+ border: 1px solid var(--color-border-primary);
261
+ }
262
+
263
+ .analysis-config-footer .btn-secondary:hover {
264
+ background-color: var(--color-bg-tertiary);
265
+ border-color: var(--color-border-primary);
266
+ }
267
+
268
+ /* ============================================
269
+ AI Analysis Configuration Modal
270
+ ============================================ */
271
+
272
+ .analysis-config-overlay {
273
+ z-index: 1100;
274
+ }
275
+
276
+ .analysis-config-overlay.visible {
277
+ opacity: 1;
278
+ }
279
+
280
+ .analysis-config-overlay.visible .analysis-config-container {
281
+ transform: translateY(0) scale(1);
282
+ opacity: 1;
283
+ }
284
+
285
+ .analysis-config-container {
286
+ width: 90vw;
287
+ max-width: min(900px, calc(100vw - 32px));
288
+ height: auto; /* Override fixed height from .modal-container */
289
+ max-height: min(90vh, calc(100vh - 32px));
290
+ display: flex;
291
+ flex-direction: column;
292
+ transform: translateY(8px) scale(0.98);
293
+ opacity: 0;
294
+ transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1),
295
+ opacity 0.2s ease-out;
296
+ border-radius: 12px;
297
+ overflow: hidden;
298
+ box-shadow:
299
+ 0 0 0 1px var(--color-border-primary),
300
+ 0 16px 70px -12px rgba(0, 0, 0, 0.35),
301
+ 0 4px 16px rgba(0, 0, 0, 0.1);
302
+ /* Ensure the dialog content is visible from the top */
303
+ margin: auto;
304
+ }
305
+
306
+ [data-theme="dark"] .analysis-config-container {
307
+ box-shadow:
308
+ 0 0 0 1px var(--color-border-primary),
309
+ 0 16px 70px -12px rgba(0, 0, 0, 0.6),
310
+ 0 4px 16px rgba(0, 0, 0, 0.25);
311
+ }
312
+
313
+ /* Header */
314
+ .analysis-config-header {
315
+ display: flex;
316
+ align-items: center;
317
+ justify-content: space-between;
318
+ padding: 16px 20px;
319
+ background: linear-gradient(135deg,
320
+ var(--color-bg-secondary) 0%,
321
+ var(--color-bg-tertiary) 100%);
322
+ border-bottom: 1px solid var(--color-border-primary);
323
+ }
324
+
325
+ .header-title-section {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 12px;
329
+ }
330
+
331
+ .header-icon {
332
+ display: flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ width: 40px;
336
+ height: 40px;
337
+ border-radius: 10px;
338
+ background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
339
+ color: white;
340
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
341
+ }
342
+
343
+ [data-theme="dark"] .header-icon {
344
+ background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
345
+ box-shadow: 0 2px 12px rgba(251, 191, 36, 0.25);
346
+ }
347
+
348
+ .analysis-config-header h3 {
349
+ margin: 0;
350
+ font-size: 16px;
351
+ font-weight: 600;
352
+ color: var(--color-text-primary);
353
+ }
354
+
355
+ .header-subtitle {
356
+ margin: 2px 0 0;
357
+ font-size: 12px;
358
+ color: var(--color-text-secondary);
359
+ }
360
+
361
+ /* Body */
362
+ .analysis-config-body {
363
+ flex: 1;
364
+ overflow-y: auto;
365
+ padding: 20px;
366
+ background: var(--color-bg-primary);
367
+ position: relative;
368
+ }
369
+
370
+ /* Loading overlay shown while providers are being fetched */
371
+ .config-loading-overlay {
372
+ position: absolute;
373
+ inset: 0;
374
+ display: flex;
375
+ flex-direction: column;
376
+ align-items: center;
377
+ justify-content: center;
378
+ gap: 12px;
379
+ background: var(--color-bg-primary);
380
+ z-index: 10;
381
+ color: var(--color-text-secondary);
382
+ font-size: 13px;
383
+ }
384
+
385
+ .config-loading-spinner {
386
+ width: 24px;
387
+ height: 24px;
388
+ border: 2.5px solid var(--color-border-primary);
389
+ border-top-color: var(--color-text-link, #2f81f7);
390
+ border-radius: 50%;
391
+ animation: spin 0.8s linear infinite;
392
+ }
393
+
394
+ /* Section styling */
395
+ .config-section {
396
+ margin-bottom: 20px;
397
+ }
398
+
399
+ .config-section:last-child {
400
+ margin-bottom: 0;
401
+ }
402
+
403
+ .section-title {
404
+ display: flex;
405
+ align-items: center;
406
+ gap: 8px;
407
+ margin: 0 0 10px;
408
+ font-size: 13px;
409
+ font-weight: 600;
410
+ color: var(--color-text-primary);
411
+ text-transform: uppercase;
412
+ letter-spacing: 0.03em;
413
+ }
414
+
415
+ .section-hint {
416
+ font-weight: 400;
417
+ font-size: 11px;
418
+ color: var(--color-text-tertiary);
419
+ text-transform: none;
420
+ letter-spacing: 0;
421
+ }
422
+
423
+ /* Provider Toggle */
424
+ .provider-toggle {
425
+ display: flex;
426
+ flex-wrap: wrap;
427
+ justify-content: center;
428
+ gap: 8px;
429
+ width: 100%;
430
+ max-width: 100%;
431
+ }
432
+
433
+ .provider-btn {
434
+ display: inline-flex;
435
+ align-items: center;
436
+ gap: 6px;
437
+ padding: 10px 18px;
438
+ border: 2px solid var(--color-border-primary);
439
+ background: var(--color-bg-secondary);
440
+ color: var(--color-text-secondary);
441
+ font-size: 14px;
442
+ font-weight: 500;
443
+ border-radius: 10px;
444
+ cursor: pointer;
445
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
446
+ white-space: nowrap;
447
+ }
448
+
449
+ .provider-btn:hover {
450
+ border-color: var(--color-border-secondary);
451
+ background: var(--color-bg-tertiary);
452
+ color: var(--color-text-primary);
453
+ transform: translateY(-2px);
454
+ box-shadow: 0 4px 12px var(--color-shadow);
455
+ }
456
+
457
+ .provider-btn.selected {
458
+ border-color: var(--color-accent-ai-dark);
459
+ background: rgba(245, 158, 11, 0.08);
460
+ color: var(--color-text-primary);
461
+ box-shadow:
462
+ 0 0 0 3px rgba(245, 158, 11, 0.15),
463
+ 0 4px 12px rgba(245, 158, 11, 0.1);
464
+ }
465
+
466
+ [data-theme="dark"] .provider-btn.selected {
467
+ background: rgba(251, 191, 36, 0.1);
468
+ border-color: var(--color-accent-ai);
469
+ color: #fbbf24;
470
+ box-shadow:
471
+ 0 0 0 3px rgba(251, 191, 36, 0.15),
472
+ 0 4px 12px rgba(251, 191, 36, 0.08);
473
+ }
474
+
475
+ /* No providers available message */
476
+ .no-providers-message {
477
+ font-size: 13px;
478
+ font-style: italic;
479
+ color: var(--color-text-muted);
480
+ padding: 8px 12px;
481
+ }
482
+
483
+ /* Provider refresh button */
484
+ .provider-refresh-btn {
485
+ display: inline-flex;
486
+ align-items: center;
487
+ justify-content: center;
488
+ width: 22px;
489
+ height: 22px;
490
+ padding: 0;
491
+ margin-left: 4px;
492
+ border: none;
493
+ background: transparent;
494
+ color: var(--color-text-tertiary);
495
+ border-radius: 4px;
496
+ cursor: pointer;
497
+ transition: all 0.2s ease;
498
+ }
499
+
500
+ .provider-refresh-btn:hover {
501
+ background: var(--color-bg-tertiary);
502
+ color: var(--color-text-secondary);
503
+ }
504
+
505
+ .provider-refresh-btn:disabled {
506
+ cursor: not-allowed;
507
+ opacity: 0.5;
508
+ }
509
+
510
+ .provider-refresh-btn.refreshing svg {
511
+ animation: spin 1s linear infinite;
512
+ }
513
+
514
+ @keyframes spin {
515
+ from {
516
+ transform: rotate(0deg);
517
+ }
518
+ to {
519
+ transform: rotate(360deg);
520
+ }
521
+ }
522
+
523
+ /* Model Cards */
524
+ .model-cards {
525
+ display: grid;
526
+ grid-template-columns: repeat(3, minmax(0, 220px));
527
+ gap: 12px;
528
+ justify-content: center;
529
+ }
530
+
531
+ .model-card {
532
+ position: relative;
533
+ display: flex;
534
+ flex-direction: column;
535
+ align-items: center;
536
+ padding: 14px 10px;
537
+ background: var(--color-bg-secondary);
538
+ border: 2px solid var(--color-border-primary);
539
+ border-radius: 10px;
540
+ cursor: pointer;
541
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
542
+ text-align: center;
543
+ aspect-ratio: 1.618 / 1;
544
+ overflow: hidden;
545
+ justify-content: center;
546
+ }
547
+
548
+ .model-card:hover {
549
+ border-color: var(--color-border-secondary);
550
+ background: var(--color-bg-tertiary);
551
+ transform: translateY(-2px);
552
+ box-shadow: 0 4px 12px var(--color-shadow);
553
+ }
554
+
555
+ .model-card.selected {
556
+ border-color: var(--color-accent-ai-dark);
557
+ background: rgba(245, 158, 11, 0.08);
558
+ box-shadow:
559
+ 0 0 0 3px rgba(245, 158, 11, 0.15),
560
+ 0 4px 12px rgba(245, 158, 11, 0.1);
561
+ }
562
+
563
+ [data-theme="dark"] .model-card.selected {
564
+ background: rgba(251, 191, 36, 0.1);
565
+ border-color: var(--color-accent-ai);
566
+ box-shadow:
567
+ 0 0 0 3px rgba(251, 191, 36, 0.15),
568
+ 0 4px 12px rgba(251, 191, 36, 0.08);
569
+ }
570
+
571
+ .model-badge {
572
+ position: absolute;
573
+ top: 8px;
574
+ right: 8px;
575
+ padding: 2px 8px;
576
+ font-size: 9px;
577
+ font-weight: 700;
578
+ text-transform: uppercase;
579
+ letter-spacing: 0.05em;
580
+ border-radius: 10px;
581
+ white-space: nowrap;
582
+ }
583
+
584
+ .badge-speed {
585
+ background: linear-gradient(135deg, #06b6d4 0%, #0891b2 100%);
586
+ color: white;
587
+ }
588
+
589
+ .badge-recommended {
590
+ background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
591
+ color: white;
592
+ }
593
+
594
+ .badge-power {
595
+ background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
596
+ color: white;
597
+ }
598
+
599
+ .badge-premium {
600
+ background: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
601
+ color: white;
602
+ }
603
+
604
+ .badge-balanced {
605
+ background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
606
+ color: white;
607
+ }
608
+
609
+ .model-icon {
610
+ font-size: 28px;
611
+ line-height: 1;
612
+ margin-bottom: 2px;
613
+ }
614
+
615
+ .model-info {
616
+ display: flex;
617
+ flex-direction: column;
618
+ gap: 1px;
619
+ }
620
+
621
+ .model-name {
622
+ font-size: 13px;
623
+ font-weight: 600;
624
+ color: var(--color-text-primary);
625
+ }
626
+
627
+ .model-tagline {
628
+ font-size: 11px;
629
+ color: var(--color-text-secondary);
630
+ }
631
+
632
+ .model-description {
633
+ margin: 4px 0 0;
634
+ font-size: 10px;
635
+ color: var(--color-text-tertiary);
636
+ line-height: 1.3;
637
+ }
638
+
639
+ .model-selected-indicator {
640
+ position: absolute;
641
+ bottom: 8px;
642
+ right: 8px;
643
+ width: 20px;
644
+ height: 20px;
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ background: var(--color-accent-ai-dark);
649
+ border-radius: 50%;
650
+ color: white;
651
+ opacity: 0;
652
+ transform: scale(0.5);
653
+ transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
654
+ }
655
+
656
+ [data-theme="dark"] .model-selected-indicator {
657
+ background: var(--color-accent-ai);
658
+ color: #1a1a1a;
659
+ }
660
+
661
+ .model-card.selected .model-selected-indicator {
662
+ opacity: 1;
663
+ transform: scale(1);
664
+ }
665
+
666
+ /* Remember toggle */
667
+ .remember-toggle {
668
+ display: flex;
669
+ align-items: center;
670
+ gap: 10px;
671
+ margin-top: 12px;
672
+ cursor: pointer;
673
+ font-size: 12px;
674
+ color: var(--color-text-secondary);
675
+ user-select: none;
676
+ }
677
+
678
+ .remember-toggle input {
679
+ display: none;
680
+ }
681
+
682
+ .toggle-switch {
683
+ position: relative;
684
+ width: 36px;
685
+ height: 20px;
686
+ background: var(--color-border-primary);
687
+ border-radius: 10px;
688
+ transition: background 0.2s ease;
689
+ flex-shrink: 0;
690
+ }
691
+
692
+ .toggle-switch::after {
693
+ content: '';
694
+ position: absolute;
695
+ top: 2px;
696
+ left: 2px;
697
+ width: 16px;
698
+ height: 16px;
699
+ background: white;
700
+ border-radius: 50%;
701
+ transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
702
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
703
+ }
704
+
705
+ .remember-toggle input:checked + .toggle-switch {
706
+ background: var(--color-accent-ai-dark);
707
+ }
708
+
709
+ [data-theme="dark"] .remember-toggle input:checked + .toggle-switch {
710
+ background: var(--color-accent-ai);
711
+ }
712
+
713
+ .remember-toggle input:checked + .toggle-switch::after {
714
+ transform: translateX(16px);
715
+ }
716
+
717
+ .toggle-label {
718
+ line-height: 1.4;
719
+ }
720
+
721
+ /* Skip Level 3 Info */
722
+ .skip-level3-info {
723
+ display: flex;
724
+ align-items: flex-start;
725
+ gap: 8px;
726
+ margin-bottom: 12px;
727
+ padding: 8px 12px;
728
+ background: var(--color-accent-light);
729
+ border-radius: 6px;
730
+ font-size: 12px;
731
+ color: var(--color-info);
732
+ line-height: 1.4;
733
+ }
734
+
735
+ .skip-level3-info svg {
736
+ flex-shrink: 0;
737
+ margin-top: 1px;
738
+ color: var(--color-info);
739
+ }
740
+
741
+ /* Preset Chips */
742
+ .preset-chips {
743
+ display: flex;
744
+ flex-wrap: wrap;
745
+ gap: 8px;
746
+ }
747
+
748
+ .preset-chip {
749
+ display: inline-flex;
750
+ align-items: center;
751
+ gap: 6px;
752
+ padding: 8px 14px;
753
+ background: var(--color-bg-secondary);
754
+ border: 1px solid var(--color-border-primary);
755
+ border-radius: 20px;
756
+ font-size: 13px;
757
+ color: var(--color-text-secondary);
758
+ cursor: pointer;
759
+ transition: all var(--transition-fast);
760
+ user-select: none;
761
+ }
762
+
763
+ .preset-chip:hover {
764
+ background: var(--color-bg-tertiary);
765
+ border-color: var(--color-border-secondary);
766
+ color: var(--color-text-primary);
767
+ }
768
+
769
+ .preset-chip.active {
770
+ background: rgba(245, 158, 11, 0.12);
771
+ border-color: var(--color-accent-ai-dark);
772
+ color: #b45309;
773
+ }
774
+
775
+ [data-theme="dark"] .preset-chip.active {
776
+ background: rgba(251, 191, 36, 0.12);
777
+ border-color: var(--color-accent-ai);
778
+ color: #fcd34d;
779
+ }
780
+
781
+ .preset-label {
782
+ font-weight: 500;
783
+ }
784
+
785
+ /* Instructions Container */
786
+ .instructions-container {
787
+ display: flex;
788
+ flex-direction: column;
789
+ gap: 4px;
790
+ }
791
+
792
+ .repo-instructions-banner {
793
+ display: flex;
794
+ align-items: center;
795
+ gap: 10px;
796
+ padding: 10px 12px;
797
+ background: var(--color-bg-tertiary);
798
+ border: 1px solid var(--color-border-primary);
799
+ border-radius: 8px;
800
+ }
801
+
802
+ .banner-icon {
803
+ display: flex;
804
+ align-items: center;
805
+ justify-content: center;
806
+ width: 24px;
807
+ height: 24px;
808
+ background: var(--color-accent-light);
809
+ border-radius: 6px;
810
+ color: var(--color-accent-primary);
811
+ flex-shrink: 0;
812
+ }
813
+
814
+ .banner-content {
815
+ flex: 1;
816
+ display: flex;
817
+ align-items: center;
818
+ justify-content: space-between;
819
+ gap: 12px;
820
+ }
821
+
822
+ .banner-label {
823
+ font-size: 12px;
824
+ color: var(--color-text-secondary);
825
+ }
826
+
827
+ .banner-toggle {
828
+ display: inline-flex;
829
+ align-items: center;
830
+ gap: 4px;
831
+ padding: 4px 10px;
832
+ background: transparent;
833
+ border: 1px solid var(--color-border-primary);
834
+ border-radius: 6px;
835
+ font-size: 11px;
836
+ font-weight: 500;
837
+ color: var(--color-text-secondary);
838
+ cursor: pointer;
839
+ transition: all var(--transition-fast);
840
+ }
841
+
842
+ .banner-toggle:hover {
843
+ background: var(--color-bg-secondary);
844
+ border-color: var(--color-border-secondary);
845
+ color: var(--color-text-primary);
846
+ }
847
+
848
+ .repo-instructions-expanded {
849
+ background: var(--color-bg-tertiary);
850
+ border: 1px solid var(--color-border-primary);
851
+ border-radius: 8px;
852
+ overflow: hidden;
853
+ }
854
+
855
+ .expanded-header {
856
+ display: flex;
857
+ align-items: center;
858
+ justify-content: space-between;
859
+ padding: 8px 12px;
860
+ background: var(--color-bg-secondary);
861
+ border-bottom: 1px solid var(--color-border-primary);
862
+ font-size: 11px;
863
+ font-weight: 600;
864
+ color: var(--color-text-secondary);
865
+ text-transform: uppercase;
866
+ letter-spacing: 0.03em;
867
+ }
868
+
869
+ .collapse-btn {
870
+ display: flex;
871
+ align-items: center;
872
+ justify-content: center;
873
+ width: 24px;
874
+ height: 24px;
875
+ background: transparent;
876
+ border: none;
877
+ border-radius: 4px;
878
+ color: var(--color-text-tertiary);
879
+ cursor: pointer;
880
+ transition: all var(--transition-fast);
881
+ }
882
+
883
+ .collapse-btn:hover {
884
+ background: var(--color-bg-tertiary);
885
+ color: var(--color-text-secondary);
886
+ }
887
+
888
+ .expanded-content {
889
+ padding: 12px;
890
+ font-size: 13px;
891
+ color: var(--color-text-secondary);
892
+ line-height: 1.5;
893
+ white-space: pre-wrap;
894
+ }
895
+
896
+ .instructions-textarea {
897
+ width: 100%;
898
+ padding: 12px;
899
+ background: var(--color-bg-secondary);
900
+ border: 1px solid var(--color-border-primary);
901
+ border-radius: 8px;
902
+ font-family: inherit;
903
+ font-size: 13px;
904
+ color: var(--color-text-primary);
905
+ resize: vertical;
906
+ min-height: 100px;
907
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
908
+ }
909
+
910
+ .instructions-textarea::placeholder {
911
+ color: var(--color-text-tertiary);
912
+ opacity: 0.8;
913
+ }
914
+
915
+ .instructions-textarea:focus {
916
+ outline: none;
917
+ border-color: var(--color-accent-ai-dark);
918
+ box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.15);
919
+ }
920
+
921
+ [data-theme="dark"] .instructions-textarea:focus {
922
+ border-color: var(--color-accent-ai);
923
+ box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.15);
924
+ }
925
+
926
+ .instructions-footer {
927
+ display: flex;
928
+ justify-content: flex-end;
929
+ }
930
+
931
+ .char-count {
932
+ font-size: 11px;
933
+ color: var(--color-text-muted);
934
+ transition: color 0.2s ease;
935
+ }
936
+
937
+ .char-count-warning {
938
+ color: #d97706;
939
+ font-weight: 500;
940
+ }
941
+
942
+ [data-theme="dark"] .char-count-warning {
943
+ color: var(--color-accent-ai);
944
+ }
945
+
946
+ .char-count-error {
947
+ color: #dc2626;
948
+ font-weight: 600;
949
+ }
950
+
951
+ [data-theme="dark"] .char-count-error {
952
+ color: #f87171;
953
+ }
954
+
955
+ /* Textarea validation states */
956
+ .instructions-textarea.textarea-warning {
957
+ border-color: #d97706;
958
+ }
959
+
960
+ [data-theme="dark"] .instructions-textarea.textarea-warning {
961
+ border-color: var(--color-accent-ai);
962
+ }
963
+
964
+ .instructions-textarea.textarea-error {
965
+ border-color: #dc2626;
966
+ box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);
967
+ }
968
+
969
+ [data-theme="dark"] .instructions-textarea.textarea-error {
970
+ border-color: #f87171;
971
+ box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15);
972
+ }
973
+
974
+ /* Disabled submit button state */
975
+ .btn-analyze:disabled {
976
+ background: linear-gradient(135deg, #9ca3af 0%, #6b7280 100%);
977
+ cursor: not-allowed;
978
+ box-shadow: none;
979
+ opacity: 0.7;
980
+ }
981
+
982
+ .btn-analyze:disabled:hover {
983
+ background: linear-gradient(135deg, #9ca3af 0%, #6b7280 100%);
984
+ transform: none;
985
+ }
986
+
987
+ /* Footer */
988
+ .analysis-config-footer {
989
+ display: flex;
990
+ justify-content: flex-end;
991
+ align-items: center;
992
+ gap: 10px;
993
+ padding: 16px 20px;
994
+ background: var(--color-bg-secondary);
995
+ border-top: 1px solid var(--color-border-primary);
996
+ }
997
+
998
+ /* Unsaved council changes hint + footer save button container */
999
+ .council-footer-left {
1000
+ display: flex;
1001
+ align-items: center;
1002
+ gap: 10px;
1003
+ margin-right: auto;
1004
+ }
1005
+
1006
+ .council-dirty-hint {
1007
+ font-size: 12px;
1008
+ color: var(--color-accent-primary, #0969da);
1009
+ font-style: italic;
1010
+ }
1011
+
1012
+ [data-theme="dark"] .council-dirty-hint {
1013
+ color: var(--color-accent-primary, #58a6ff);
1014
+ }
1015
+
1016
+ /* Blue save button for council footer */
1017
+ .btn-save-council {
1018
+ background-color: var(--color-accent-primary, #0969da);
1019
+ color: #ffffff;
1020
+ border-color: var(--color-accent-primary, #0969da);
1021
+ }
1022
+
1023
+ .btn-save-council:hover {
1024
+ background-color: #0860ca;
1025
+ border-color: #0860ca;
1026
+ }
1027
+
1028
+ [data-theme="dark"] .btn-save-council {
1029
+ background-color: var(--color-accent-primary, #58a6ff);
1030
+ border-color: var(--color-accent-primary, #58a6ff);
1031
+ color: #ffffff;
1032
+ }
1033
+
1034
+ [data-theme="dark"] .btn-save-council:hover {
1035
+ background-color: #79b8ff;
1036
+ border-color: #79b8ff;
1037
+ }
1038
+
1039
+ .btn-analyze {
1040
+ display: inline-flex;
1041
+ align-items: center;
1042
+ gap: 8px;
1043
+ padding: 10px 20px;
1044
+ background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
1045
+ border: none;
1046
+ border-radius: 8px;
1047
+ font-size: 14px;
1048
+ font-weight: 600;
1049
+ color: white;
1050
+ cursor: pointer;
1051
+ transition: all 0.2s ease;
1052
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
1053
+ }
1054
+
1055
+ .btn-analyze:hover {
1056
+ background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
1057
+ transform: translateY(-1px);
1058
+ box-shadow: 0 4px 12px rgba(245, 158, 11, 0.35);
1059
+ }
1060
+
1061
+ .btn-analyze:active {
1062
+ transform: translateY(0);
1063
+ }
1064
+
1065
+ [data-theme="dark"] .btn-analyze {
1066
+ background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
1067
+ color: #1a1a1a;
1068
+ box-shadow: 0 2px 12px rgba(251, 191, 36, 0.25);
1069
+ }
1070
+
1071
+ [data-theme="dark"] .btn-analyze:hover {
1072
+ box-shadow: 0 4px 16px rgba(251, 191, 36, 0.3);
1073
+ }
1074
+
1075
+ /* Responsive */
1076
+ @media (max-width: 600px) {
1077
+ .analysis-config-container {
1078
+ width: 100%;
1079
+ max-width: none;
1080
+ max-height: 100vh;
1081
+ border-radius: 0;
1082
+ }
1083
+
1084
+ .model-cards {
1085
+ grid-template-columns: 1fr;
1086
+ }
1087
+
1088
+ .model-card {
1089
+ flex-direction: row;
1090
+ text-align: left;
1091
+ padding: 12px 16px;
1092
+ gap: 12px;
1093
+ aspect-ratio: auto;
1094
+ overflow: visible;
1095
+ justify-content: flex-start;
1096
+ }
1097
+
1098
+ .model-icon {
1099
+ font-size: 24px;
1100
+ margin-bottom: 0;
1101
+ }
1102
+
1103
+ .model-info {
1104
+ flex: 1;
1105
+ }
1106
+
1107
+ .model-description {
1108
+ margin-top: 4px;
1109
+ }
1110
+
1111
+ .model-badge {
1112
+ position: static;
1113
+ align-self: flex-start;
1114
+ margin-left: auto;
1115
+ }
1116
+
1117
+ .model-selected-indicator {
1118
+ position: static;
1119
+ margin-left: 8px;
1120
+ }
1121
+
1122
+ .preset-chips {
1123
+ gap: 6px;
1124
+ }
1125
+
1126
+ .preset-chip {
1127
+ padding: 6px 12px;
1128
+ font-size: 12px;
1129
+ }
1130
+ }
1131
+
1132
+ /* ==========================================================================
1133
+ Review Council Tab
1134
+ Multi-voice, multi-provider analysis configuration
1135
+ ========================================================================== */
1136
+
1137
+ .analysis-tab-bar {
1138
+ display: flex;
1139
+ gap: 0;
1140
+ border-bottom: 1px solid var(--border-color, #d0d7de);
1141
+ margin-bottom: 16px;
1142
+ }
1143
+
1144
+ .analysis-tab {
1145
+ padding: 8px 16px;
1146
+ border: none;
1147
+ background: none;
1148
+ cursor: pointer;
1149
+ font-size: 13px;
1150
+ font-weight: 500;
1151
+ color: var(--fg-muted, #656d76);
1152
+ border-bottom: 2px solid transparent;
1153
+ transition: color 0.15s, border-color 0.15s;
1154
+ }
1155
+
1156
+ .analysis-tab:hover {
1157
+ color: var(--fg-default, #1f2328);
1158
+ }
1159
+
1160
+ .analysis-tab.active {
1161
+ color: var(--fg-default, #1f2328);
1162
+ border-bottom-color: var(--accent-emphasis, #0969da);
1163
+ }
1164
+
1165
+ [data-theme="dark"] .analysis-tab {
1166
+ color: #8b949e;
1167
+ }
1168
+
1169
+ [data-theme="dark"] .analysis-tab:hover {
1170
+ color: #c9d1d9;
1171
+ }
1172
+
1173
+ [data-theme="dark"] .analysis-tab.active {
1174
+ color: #c9d1d9;
1175
+ border-bottom-color: #58a6ff;
1176
+ }
1177
+
1178
+ .beta-badge {
1179
+ display: inline-block;
1180
+ font-size: 10px;
1181
+ font-weight: 600;
1182
+ text-transform: uppercase;
1183
+ letter-spacing: 0.5px;
1184
+ padding: 1px 5px;
1185
+ border-radius: 3px;
1186
+ background-color: var(--accent-subtle, #ddf4ff);
1187
+ color: var(--accent-fg, #0969da);
1188
+ margin-left: 4px;
1189
+ vertical-align: middle;
1190
+ }
1191
+
1192
+ [data-theme="dark"] .beta-badge {
1193
+ background-color: transparent;
1194
+ color: #8b949e;
1195
+ border: 1px solid #30363d;
1196
+ }
1197
+
1198
+ .council-selector-row {
1199
+ display: flex;
1200
+ gap: 8px;
1201
+ align-items: center;
1202
+ }
1203
+
1204
+ .council-select {
1205
+ flex: 1;
1206
+ padding: 6px 10px;
1207
+ border: 1px solid var(--border-color, #d0d7de);
1208
+ border-radius: 6px;
1209
+ background: var(--bg-default, #fff);
1210
+ color: var(--fg-default, #1f2328);
1211
+ font-size: 13px;
1212
+ }
1213
+
1214
+ [data-theme="dark"] .council-select {
1215
+ background: var(--bg-subtle, #161b22);
1216
+ color: var(--fg-default, #e6edf3);
1217
+ border-color: var(--border-color, #30363d);
1218
+ }
1219
+
1220
+ /* "New Council" option in council selector */
1221
+ .council-option-new {
1222
+ font-style: italic;
1223
+ color: var(--fg-muted, #656d76);
1224
+ }
1225
+
1226
+ /* Style the select itself when "New Council" is the active selection */
1227
+ .council-select.new-council-selected {
1228
+ font-style: italic;
1229
+ color: var(--fg-muted, #656d76);
1230
+ }
1231
+
1232
+ /* Council review divider - separates council config from per-review settings */
1233
+ .council-review-divider {
1234
+ margin: 24px 0 16px;
1235
+ padding-top: 20px;
1236
+ border-top: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
1237
+ }
1238
+
1239
+ [data-theme="dark"] .council-review-divider {
1240
+ border-top-color: var(--color-border-subtle, rgba(255, 255, 255, 0.06));
1241
+ }
1242
+
1243
+ .divider-label {
1244
+ font-size: 12px;
1245
+ font-weight: 500;
1246
+ color: var(--color-text-tertiary, #656d76);
1247
+ text-transform: uppercase;
1248
+ letter-spacing: 0.5px;
1249
+ }
1250
+
1251
+ [data-theme="dark"] .divider-label {
1252
+ color: var(--color-text-tertiary, #6e7681);
1253
+ }
1254
+
1255
+ .council-level-section .section-title {
1256
+ margin-bottom: 8px;
1257
+ }
1258
+
1259
+ .level-toggle {
1260
+ font-weight: 600;
1261
+ }
1262
+
1263
+ .level-toggle .toggle-label {
1264
+ font-weight: 600;
1265
+ }
1266
+
1267
+ .level-voices {
1268
+ margin-left: 24px;
1269
+ margin-top: 8px;
1270
+ }
1271
+
1272
+ .voice-list {
1273
+ display: flex;
1274
+ flex-direction: column;
1275
+ gap: 6px;
1276
+ }
1277
+
1278
+ .voice-row {
1279
+ display: flex;
1280
+ gap: 8px;
1281
+ align-items: center;
1282
+ }
1283
+
1284
+ .voice-provider,
1285
+ .voice-model,
1286
+ .voice-tier {
1287
+ padding: 5px 8px;
1288
+ border: 1px solid var(--border-color, #d0d7de);
1289
+ border-radius: 6px;
1290
+ background: var(--bg-default, #fff);
1291
+ color: var(--fg-default, #1f2328);
1292
+ font-size: 12px;
1293
+ }
1294
+
1295
+ [data-theme="dark"] .voice-provider,
1296
+ [data-theme="dark"] .voice-model,
1297
+ [data-theme="dark"] .voice-tier {
1298
+ background: var(--bg-subtle, #161b22);
1299
+ color: var(--fg-default, #e6edf3);
1300
+ border-color: var(--border-color, #30363d);
1301
+ }
1302
+
1303
+ .voice-provider {
1304
+ min-width: 100px;
1305
+ }
1306
+
1307
+ .voice-model {
1308
+ min-width: 140px;
1309
+ flex: 1;
1310
+ }
1311
+
1312
+ .voice-tier {
1313
+ min-width: 90px;
1314
+ }
1315
+
1316
+ .executable-note {
1317
+ font-size: 11px;
1318
+ color: var(--fg-muted, #656d76);
1319
+ font-style: italic;
1320
+ white-space: nowrap;
1321
+ }
1322
+
1323
+ .vc-levels-disabled-note {
1324
+ margin-top: 12px;
1325
+ margin-bottom: 0;
1326
+ }
1327
+
1328
+ .btn-icon {
1329
+ box-sizing: border-box;
1330
+ width: 28px;
1331
+ height: 28px;
1332
+ padding: 0;
1333
+ display: inline-flex;
1334
+ align-items: center;
1335
+ justify-content: center;
1336
+ font-size: 16px;
1337
+ line-height: 1;
1338
+ border-radius: 6px;
1339
+ border: 1px solid var(--border-color, #d0d7de);
1340
+ background: var(--bg-default, #fff);
1341
+ color: var(--fg-muted, #656d76);
1342
+ cursor: pointer;
1343
+ }
1344
+
1345
+ .btn-icon:hover {
1346
+ color: var(--color-text-primary);
1347
+ border-color: var(--color-border-secondary);
1348
+ }
1349
+
1350
+ .btn-ghost {
1351
+ background: none;
1352
+ border: none;
1353
+ color: var(--accent-fg, #0969da);
1354
+ cursor: pointer;
1355
+ font-size: 12px;
1356
+ padding: 4px 8px;
1357
+ }
1358
+
1359
+ .btn-ghost:hover {
1360
+ text-decoration: underline;
1361
+ }
1362
+
1363
+ .btn-sm {
1364
+ font-size: 12px;
1365
+ padding: 4px 10px;
1366
+ }
1367
+
1368
+ .add-voice-btn {
1369
+ margin-top: 6px;
1370
+ }
1371
+
1372
+ .add-voice-btn:hover {
1373
+ color: var(--color-accent-primary, #0969da);
1374
+ border-color: var(--color-accent-primary, #0969da);
1375
+ }
1376
+
1377
+ .section-hint-text {
1378
+ font-size: 12px;
1379
+ color: var(--fg-muted, #656d76);
1380
+ margin-bottom: 8px;
1381
+ margin-top: -4px;
1382
+ }
1383
+
1384
+ .voice-instructions-area {
1385
+ margin-left: 0;
1386
+ margin-bottom: 4px;
1387
+ }
1388
+
1389
+ .voice-instructions-input {
1390
+ width: 100%;
1391
+ padding: 6px 8px;
1392
+ border: 1px solid var(--border-color, #d0d7de);
1393
+ border-radius: 6px;
1394
+ background: var(--bg-default, #fff);
1395
+ color: var(--fg-default, #1f2328);
1396
+ font-size: 12px;
1397
+ font-family: inherit;
1398
+ resize: vertical;
1399
+ }
1400
+
1401
+ [data-theme="dark"] .voice-instructions-input {
1402
+ background: var(--bg-subtle, #161b22);
1403
+ color: var(--fg-default, #e6edf3);
1404
+ border-color: var(--border-color, #30363d);
1405
+ }
1406
+
1407
+ /* Icon-only toggle for per-participant instructions */
1408
+ .toggle-instructions-icon {
1409
+ width: 24px;
1410
+ height: 24px;
1411
+ padding: 0;
1412
+ display: inline-flex;
1413
+ align-items: center;
1414
+ justify-content: center;
1415
+ background: none;
1416
+ border: 1px solid transparent;
1417
+ border-radius: 4px;
1418
+ color: var(--color-text-tertiary, #6e7681);
1419
+ cursor: pointer;
1420
+ flex-shrink: 0;
1421
+ transition: color 0.15s ease, border-color 0.15s ease;
1422
+ }
1423
+
1424
+ .toggle-instructions-icon:hover {
1425
+ color: var(--color-accent-primary, #0969da);
1426
+ border-color: var(--color-border-secondary, #d0d7de);
1427
+ }
1428
+
1429
+ .toggle-instructions-icon.has-instructions {
1430
+ color: var(--color-accent-primary, #0969da);
1431
+ }
1432
+
1433
+ [data-theme="dark"] .toggle-instructions-icon {
1434
+ color: var(--color-text-tertiary, #484f58);
1435
+ }
1436
+
1437
+ [data-theme="dark"] .toggle-instructions-icon:hover {
1438
+ color: var(--color-accent-primary, #58a6ff);
1439
+ border-color: var(--color-border-primary, #30363d);
1440
+ }
1441
+
1442
+ [data-theme="dark"] .toggle-instructions-icon.has-instructions {
1443
+ color: var(--color-accent-primary, #58a6ff);
1444
+ }
1445
+
1446
+ /* Icon-only toggle for per-voice timeout (clock icon) */
1447
+ .toggle-timeout-icon {
1448
+ width: 24px;
1449
+ height: 24px;
1450
+ padding: 0;
1451
+ display: inline-flex;
1452
+ align-items: center;
1453
+ justify-content: center;
1454
+ background: none;
1455
+ border: 1px solid transparent;
1456
+ border-radius: 4px;
1457
+ color: var(--color-text-tertiary, #6e7681);
1458
+ cursor: pointer;
1459
+ flex-shrink: 0;
1460
+ transition: color 0.15s ease, border-color 0.15s ease;
1461
+ }
1462
+
1463
+ .toggle-timeout-icon:hover {
1464
+ color: var(--color-accent-primary, #0969da);
1465
+ border-color: var(--color-border-secondary, #d0d7de);
1466
+ }
1467
+
1468
+ .toggle-timeout-icon.has-custom-timeout {
1469
+ color: var(--color-attention-fg, #9a6700);
1470
+ }
1471
+
1472
+ [data-theme="dark"] .toggle-timeout-icon {
1473
+ color: var(--color-text-tertiary, #484f58);
1474
+ }
1475
+
1476
+ [data-theme="dark"] .toggle-timeout-icon:hover {
1477
+ color: var(--color-accent-primary, #58a6ff);
1478
+ border-color: var(--color-border-primary, #30363d);
1479
+ }
1480
+
1481
+ [data-theme="dark"] .toggle-timeout-icon.has-custom-timeout {
1482
+ color: var(--color-attention-fg, #d29922);
1483
+ }
1484
+
1485
+ /* Custom timeout dropdown selector (replaces native <select> for timeouts) */
1486
+ .timeout-select {
1487
+ position: relative;
1488
+ display: inline-flex;
1489
+ flex-shrink: 0;
1490
+ }
1491
+
1492
+ .timeout-select-trigger {
1493
+ display: inline-flex;
1494
+ align-items: center;
1495
+ gap: 4px;
1496
+ padding: 4px 8px;
1497
+ border: 1px solid var(--border-color, #d0d7de);
1498
+ border-radius: 6px;
1499
+ background: var(--bg-default, #fff);
1500
+ color: var(--fg-default, #1f2328);
1501
+ font-size: 12px;
1502
+ font-family: inherit;
1503
+ font-weight: 500;
1504
+ cursor: pointer;
1505
+ white-space: nowrap;
1506
+ transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
1507
+ min-width: 52px;
1508
+ justify-content: center;
1509
+ line-height: 1.4;
1510
+ }
1511
+
1512
+ .timeout-select-trigger:hover {
1513
+ border-color: var(--color-accent-primary, #0969da);
1514
+ background: var(--bg-subtle, #f6f8fa);
1515
+ }
1516
+
1517
+ .timeout-select.open .timeout-select-trigger {
1518
+ border-color: var(--color-accent-primary, #0969da);
1519
+ box-shadow: 0 0 0 2px rgba(9, 105, 218, 0.15);
1520
+ }
1521
+
1522
+ .timeout-select-label {
1523
+ pointer-events: none;
1524
+ }
1525
+
1526
+ .timeout-select-caret {
1527
+ flex-shrink: 0;
1528
+ transition: transform 0.15s ease;
1529
+ pointer-events: none;
1530
+ }
1531
+
1532
+ .timeout-select.open .timeout-select-caret {
1533
+ transform: rotate(180deg);
1534
+ }
1535
+
1536
+ /* Dropdown menu */
1537
+ .timeout-select-menu {
1538
+ display: none;
1539
+ position: absolute;
1540
+ top: calc(100% + 4px);
1541
+ left: 50%;
1542
+ transform: translateX(-50%);
1543
+ min-width: 64px;
1544
+ background: var(--bg-default, #fff);
1545
+ border: 1px solid var(--border-color, #d0d7de);
1546
+ border-radius: 8px;
1547
+ box-shadow: 0 4px 12px rgba(27, 31, 36, 0.12), 0 1px 3px rgba(27, 31, 36, 0.08);
1548
+ z-index: 1100;
1549
+ padding: 4px;
1550
+ flex-direction: column;
1551
+ }
1552
+
1553
+ .timeout-select.open .timeout-select-menu {
1554
+ display: flex;
1555
+ }
1556
+
1557
+ /* Individual option */
1558
+ .timeout-select-option {
1559
+ display: flex;
1560
+ align-items: center;
1561
+ justify-content: center;
1562
+ padding: 5px 10px;
1563
+ border: none;
1564
+ border-radius: 5px;
1565
+ background: transparent;
1566
+ color: var(--fg-default, #1f2328);
1567
+ font-size: 12px;
1568
+ font-family: inherit;
1569
+ font-weight: 500;
1570
+ cursor: pointer;
1571
+ white-space: nowrap;
1572
+ transition: background 0.1s ease, color 0.1s ease;
1573
+ }
1574
+
1575
+ .timeout-select-option:hover,
1576
+ .timeout-select-option.focused {
1577
+ background: var(--bg-subtle, #f6f8fa);
1578
+ }
1579
+
1580
+ .timeout-select-option.selected {
1581
+ color: var(--color-accent-primary, #0969da);
1582
+ background: rgba(9, 105, 218, 0.08);
1583
+ font-weight: 600;
1584
+ }
1585
+
1586
+ .timeout-select-option.selected:hover,
1587
+ .timeout-select-option.selected.focused {
1588
+ background: rgba(9, 105, 218, 0.14);
1589
+ }
1590
+
1591
+ /* Dark theme overrides */
1592
+ [data-theme="dark"] .timeout-select-trigger {
1593
+ background: var(--bg-subtle, #161b22);
1594
+ color: var(--fg-default, #e6edf3);
1595
+ border-color: var(--border-color, #30363d);
1596
+ }
1597
+
1598
+ [data-theme="dark"] .timeout-select-trigger:hover {
1599
+ border-color: var(--color-accent-primary, #58a6ff);
1600
+ background: var(--color-bg-tertiary, #1c2128);
1601
+ }
1602
+
1603
+ [data-theme="dark"] .timeout-select.open .timeout-select-trigger {
1604
+ border-color: var(--color-accent-primary, #58a6ff);
1605
+ box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.15);
1606
+ }
1607
+
1608
+ [data-theme="dark"] .timeout-select-menu {
1609
+ background: var(--bg-subtle, #161b22);
1610
+ border-color: var(--border-color, #30363d);
1611
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.2);
1612
+ }
1613
+
1614
+ [data-theme="dark"] .timeout-select-option {
1615
+ color: var(--fg-default, #e6edf3);
1616
+ }
1617
+
1618
+ [data-theme="dark"] .timeout-select-option:hover,
1619
+ [data-theme="dark"] .timeout-select-option.focused {
1620
+ background: rgba(255, 255, 255, 0.06);
1621
+ }
1622
+
1623
+ [data-theme="dark"] .timeout-select-option.selected {
1624
+ color: var(--color-accent-primary, #58a6ff);
1625
+ background: rgba(88, 166, 255, 0.1);
1626
+ }
1627
+
1628
+ [data-theme="dark"] .timeout-select-option.selected:hover,
1629
+ [data-theme="dark"] .timeout-select-option.selected.focused {
1630
+ background: rgba(88, 166, 255, 0.16);
1631
+ }
1632
+
1633
+ /* Participant card layout (item 4) */
1634
+ .participant-wrapper {
1635
+ display: flex;
1636
+ flex-direction: row;
1637
+ gap: 8px;
1638
+ align-items: flex-start;
1639
+ }
1640
+
1641
+ .participant-card {
1642
+ flex: 1;
1643
+ border: 1px solid var(--border-color, #d0d7de);
1644
+ border-radius: 8px;
1645
+ padding: 10px;
1646
+ display: flex;
1647
+ flex-direction: column;
1648
+ gap: 6px;
1649
+ background: var(--bg-default, #fff);
1650
+ }
1651
+
1652
+ [data-theme="dark"] .participant-card {
1653
+ border-color: var(--border-color, #30363d);
1654
+ background: var(--bg-subtle, #161b22);
1655
+ }
1656
+
1657
+ .participant-card .voice-row {
1658
+ margin: 0;
1659
+ }
1660
+
1661
+ .participant-card .voice-instructions-area {
1662
+ margin: 0;
1663
+ }
1664
+
1665
+ /* Orchestration/consolidation card — same styling as participant-card */
1666
+ .orchestration-card {
1667
+ border: 1px solid var(--border-color, #d0d7de);
1668
+ border-radius: 8px;
1669
+ padding: 10px;
1670
+ display: flex;
1671
+ flex-direction: column;
1672
+ gap: 6px;
1673
+ background: var(--bg-default, #fff);
1674
+ }
1675
+
1676
+ [data-theme="dark"] .orchestration-card {
1677
+ border-color: var(--border-color, #30363d);
1678
+ background: var(--bg-subtle, #161b22);
1679
+ }
1680
+
1681
+ .orchestration-card .voice-row {
1682
+ margin: 0;
1683
+ }
1684
+
1685
+ .orchestration-card .voice-instructions-area {
1686
+ margin: 0;
1687
+ }
1688
+
1689
+ .participant-wrapper > .remove-voice-btn {
1690
+ flex-shrink: 0;
1691
+ margin-top: 10px;
1692
+ }
1693
+
1694
+ /* Spacer to align consolidation row with level voice rows that have a remove button */
1695
+ .participant-wrapper > .remove-voice-btn-spacer {
1696
+ flex-shrink: 0;
1697
+ width: 28px; /* matches .btn-icon width */
1698
+ }
1699
+
1700
+ /* Dark mode overrides for council +/- icon buttons */
1701
+ [data-theme="dark"] .btn-icon {
1702
+ background: var(--color-bg-tertiary, #1c2128);
1703
+ border-color: var(--color-border-primary, #30363d);
1704
+ color: var(--color-text-secondary, #8b949e);
1705
+ }
1706
+
1707
+ [data-theme="dark"] .btn-icon:hover {
1708
+ background: var(--color-bg-elevated, #1e2329);
1709
+ color: var(--color-text-primary, #e6edf3);
1710
+ border-color: var(--color-border-secondary, #484f58);
1711
+ }
1712
+
1713
+ [data-theme="dark"] .add-voice-btn {
1714
+ color: var(--color-text-secondary, #8b949e);
1715
+ }
1716
+
1717
+ [data-theme="dark"] .add-voice-btn:hover {
1718
+ color: var(--color-accent-primary, #58a6ff);
1719
+ border-color: var(--color-accent-primary, #58a6ff);
1720
+ }
1721
+
1722
+ /* Disabled button styles for council selector row (item 6) */
1723
+ .council-selector-row .btn:disabled {
1724
+ opacity: 0.5;
1725
+ cursor: not-allowed;
1726
+ }
1727
+
1728
+ /* Icon-only danger button (e.g. delete council) */
1729
+ .btn-icon-danger {
1730
+ background: none;
1731
+ border: 1px solid transparent;
1732
+ color: var(--fg-muted, #656d76);
1733
+ padding: 4px 6px;
1734
+ border-radius: 6px;
1735
+ cursor: pointer;
1736
+ display: inline-flex;
1737
+ align-items: center;
1738
+ justify-content: center;
1739
+ transition: color 0.15s, background 0.15s;
1740
+ }
1741
+
1742
+ .btn-icon-danger:hover:not(:disabled) {
1743
+ color: var(--danger-fg, #d1242f);
1744
+ background: var(--color-danger-subtle, rgba(255, 129, 130, 0.1));
1745
+ }
1746
+
1747
+ .btn-icon-danger:disabled {
1748
+ opacity: 0.4;
1749
+ cursor: not-allowed;
1750
+ }
1751
+
1752
+ [data-theme="dark"] .btn-icon-danger {
1753
+ color: var(--color-text-secondary, #8b949e);
1754
+ }
1755
+
1756
+ [data-theme="dark"] .btn-icon-danger:hover:not(:disabled) {
1757
+ color: var(--color-danger, #f85149);
1758
+ background: rgba(248, 81, 73, 0.1);
1759
+ }
1760
+
1761
+ /* Info-tip toggle buttons (circled "i" icons next to section headers) */
1762
+ .info-tip-toggle {
1763
+ display: inline-flex;
1764
+ align-items: center;
1765
+ justify-content: center;
1766
+ width: 18px;
1767
+ height: 18px;
1768
+ padding: 0;
1769
+ border: none;
1770
+ border-radius: 50%;
1771
+ background: none;
1772
+ color: var(--color-text-tertiary, #656d76);
1773
+ cursor: pointer;
1774
+ flex-shrink: 0;
1775
+ transition: color 0.15s ease;
1776
+ }
1777
+
1778
+ .info-tip-toggle:hover {
1779
+ color: var(--color-info, #0969da);
1780
+ }
1781
+
1782
+ .info-tip-toggle.active {
1783
+ color: var(--color-info, #0969da);
1784
+ }
1785
+
1786
+ .info-tip-content {
1787
+ background: var(--color-info-subtle, #ddf4ff);
1788
+ border-radius: 6px;
1789
+ padding: 8px 10px;
1790
+ margin: 0 0 8px;
1791
+ font-size: 12px;
1792
+ line-height: 1.45;
1793
+ color: var(--color-text-secondary, #424a53);
1794
+ }
1795
+
1796
+ [data-theme="dark"] .info-tip-toggle {
1797
+ color: var(--color-text-tertiary, #484f58);
1798
+ }
1799
+
1800
+ [data-theme="dark"] .info-tip-toggle:hover,
1801
+ [data-theme="dark"] .info-tip-toggle.active {
1802
+ color: var(--color-info, #58a6ff);
1803
+ }
1804
+
1805
+ [data-theme="dark"] .info-tip-content {
1806
+ background: rgba(56, 139, 253, 0.1);
1807
+ color: var(--color-text-secondary, #8b949e);
1808
+ }
1809
+
3
1810
  /* Exclude Previous Findings — collapsible <details> section */
4
1811
 
5
1812
  .exclude-previous-section {