@in-the-loop-labs/pair-review 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/package.json +1 -1
  2. package/plugin/.claude-plugin/plugin.json +1 -1
  3. package/plugin/skills/review-requests/SKILL.md +54 -0
  4. package/plugin-code-critic/.claude-plugin/plugin.json +1 -1
  5. package/public/css/pr.css +1081 -54
  6. package/public/css/repo-settings.css +452 -140
  7. package/public/js/components/AdvancedConfigTab.js +1364 -0
  8. package/public/js/components/AnalysisConfigModal.js +488 -112
  9. package/public/js/components/CouncilProgressModal.js +1416 -0
  10. package/public/js/components/TextInputDialog.js +231 -0
  11. package/public/js/components/TimeoutSelect.js +367 -0
  12. package/public/js/components/VoiceCentricConfigTab.js +1334 -0
  13. package/public/js/local.js +162 -83
  14. package/public/js/modules/analysis-history.js +185 -11
  15. package/public/js/modules/comment-manager.js +13 -0
  16. package/public/js/modules/file-comment-manager.js +28 -0
  17. package/public/js/pr.js +233 -115
  18. package/public/js/repo-settings.js +575 -106
  19. package/public/local.html +11 -1
  20. package/public/pr.html +6 -1
  21. package/public/repo-settings.html +28 -21
  22. package/public/setup.html +8 -2
  23. package/src/ai/analyzer.js +1262 -111
  24. package/src/ai/claude-cli.js +2 -2
  25. package/src/ai/claude-provider.js +6 -6
  26. package/src/ai/codex-provider.js +6 -6
  27. package/src/ai/copilot-provider.js +3 -3
  28. package/src/ai/cursor-agent-provider.js +6 -6
  29. package/src/ai/gemini-provider.js +6 -6
  30. package/src/ai/opencode-provider.js +6 -6
  31. package/src/ai/pi-provider.js +6 -6
  32. package/src/ai/prompts/baseline/consolidation/balanced.js +208 -0
  33. package/src/ai/prompts/baseline/consolidation/fast.js +175 -0
  34. package/src/ai/prompts/baseline/consolidation/thorough.js +283 -0
  35. package/src/ai/prompts/config.js +1 -1
  36. package/src/ai/prompts/index.js +26 -2
  37. package/src/ai/provider.js +4 -2
  38. package/src/database.js +417 -14
  39. package/src/main.js +1 -1
  40. package/src/routes/analysis.js +495 -10
  41. package/src/routes/config.js +36 -15
  42. package/src/routes/councils.js +351 -0
  43. package/src/routes/local.js +33 -11
  44. package/src/routes/mcp.js +9 -2
  45. package/src/routes/setup.js +12 -2
  46. package/src/routes/shared.js +126 -13
  47. package/src/server.js +34 -4
  48. package/src/utils/stats-calculator.js +2 -0
package/public/css/pr.css CHANGED
@@ -2507,6 +2507,41 @@ tr.newly-expanded .d2h-code-line-ctn {
2507
2507
  justify-content: center;
2508
2508
  }
2509
2509
 
2510
+ /* Dialogs spawned from within other modals need higher z-index */
2511
+ #text-input-dialog,
2512
+ #confirm-dialog {
2513
+ z-index: 10000; /* Must stack above analysis-config-overlay (1100) */
2514
+ }
2515
+
2516
+ .text-input-dialog-field {
2517
+ display: flex;
2518
+ flex-direction: column;
2519
+ gap: 6px;
2520
+ }
2521
+
2522
+ .text-input-dialog-field label {
2523
+ font-size: 13px;
2524
+ font-weight: 600;
2525
+ color: var(--color-fg-default, #1f2328);
2526
+ }
2527
+
2528
+ .text-input-dialog-field input {
2529
+ padding: 8px 12px;
2530
+ font-size: 14px;
2531
+ border: 1px solid var(--color-border-default, #d1d9e0);
2532
+ border-radius: 6px;
2533
+ background: var(--color-bg-primary, #ffffff);
2534
+ color: var(--color-fg-default, #1f2328);
2535
+ outline: none;
2536
+ width: 100%;
2537
+ box-sizing: border-box;
2538
+ }
2539
+
2540
+ .text-input-dialog-field input:focus {
2541
+ border-color: var(--color-accent-fg, #0969da);
2542
+ box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
2543
+ }
2544
+
2510
2545
  /* Status Indicator Styles */
2511
2546
  .status-indicator {
2512
2547
  display: none;
@@ -2606,6 +2641,21 @@ tr.newly-expanded .d2h-code-line-ctn {
2606
2641
  color: var(--color-text-primary); /* Better contrast for dark mode */
2607
2642
  }
2608
2643
 
2644
+ [data-theme="dark"] .text-input-dialog-field label {
2645
+ color: var(--color-fg-default, #f0f6fc);
2646
+ }
2647
+
2648
+ [data-theme="dark"] .text-input-dialog-field input {
2649
+ background: var(--color-bg-tertiary, #161b22);
2650
+ border-color: var(--color-border-default, #30363d);
2651
+ color: var(--color-fg-default, #f0f6fc);
2652
+ }
2653
+
2654
+ [data-theme="dark"] .text-input-dialog-field input:focus {
2655
+ border-color: var(--color-accent-fg, #58a6ff);
2656
+ box-shadow: 0 0 0 3px rgba(56, 139, 253, 0.3);
2657
+ }
2658
+
2609
2659
  [data-theme="dark"] .status-indicator {
2610
2660
  background: var(--color-bg-primary);
2611
2661
  border-color: var(--color-border-primary);
@@ -2675,6 +2725,231 @@ tr.newly-expanded .d2h-code-line-ctn {
2675
2725
  background: var(--color-bg-tertiary);
2676
2726
  }
2677
2727
 
2728
+ /* ============================================================
2729
+ Council Progress Modal — hierarchical tree progress view
2730
+ ============================================================ */
2731
+
2732
+ .council-progress-modal {
2733
+ height: auto;
2734
+ max-height: min(620px, 85vh);
2735
+ }
2736
+
2737
+ .council-progress-body {
2738
+ padding: 20px 24px;
2739
+ flex: 1;
2740
+ overflow-y: auto;
2741
+ }
2742
+
2743
+ .council-progress-tree {
2744
+ display: flex;
2745
+ flex-direction: column;
2746
+ gap: 4px;
2747
+ }
2748
+
2749
+ /* --- Level rows (parents) ------------------------------------------------ */
2750
+
2751
+ .council-level {
2752
+ margin-bottom: 2px;
2753
+ }
2754
+
2755
+ .council-level-header {
2756
+ display: flex;
2757
+ align-items: center;
2758
+ gap: 10px;
2759
+ padding: 6px 0;
2760
+ }
2761
+
2762
+ .council-level-icon {
2763
+ width: 18px;
2764
+ height: 18px;
2765
+ display: flex;
2766
+ align-items: center;
2767
+ justify-content: center;
2768
+ font-size: 14px;
2769
+ flex-shrink: 0;
2770
+ }
2771
+
2772
+ .council-level-icon.pending { color: var(--color-text-tertiary); }
2773
+ .council-level-icon.running { color: var(--ai-primary); }
2774
+ .council-level-icon.completed { color: var(--color-success); }
2775
+ .council-level-icon.failed { color: var(--color-danger); }
2776
+ .council-level-icon.cancelled { color: var(--color-warning); }
2777
+ .council-level-icon.skipped { color: var(--color-text-tertiary); }
2778
+
2779
+ .council-level-title {
2780
+ font-size: 14px;
2781
+ font-weight: 600;
2782
+ color: var(--color-text-primary, #24292f);
2783
+ flex: 1;
2784
+ min-width: 0;
2785
+ }
2786
+
2787
+ .council-level-status {
2788
+ font-size: 12px;
2789
+ font-weight: 500;
2790
+ flex-shrink: 0;
2791
+ }
2792
+
2793
+ .council-level-status.pending { color: var(--color-text-tertiary); }
2794
+ .council-level-status.running { color: var(--ai-primary); }
2795
+ .council-level-status.completed { color: var(--color-success); }
2796
+ .council-level-status.failed { color: var(--color-danger); }
2797
+ .council-level-status.cancelled { color: var(--color-warning); }
2798
+ .council-level-status.skipped { color: var(--color-text-tertiary); }
2799
+
2800
+ /* --- Voice rows (children) with tree connectors -------------------------- */
2801
+
2802
+ .council-level-children {
2803
+ position: relative;
2804
+ margin-left: 8px;
2805
+ padding-left: 0;
2806
+ }
2807
+
2808
+ .council-voice {
2809
+ display: grid;
2810
+ grid-template-columns: 24px 18px 1fr auto;
2811
+ grid-template-rows: auto auto;
2812
+ align-items: center;
2813
+ gap: 0 8px;
2814
+ padding: 4px 0;
2815
+ position: relative;
2816
+ }
2817
+
2818
+ /* Tree connector lines (using CSS borders) */
2819
+ .council-voice-connector {
2820
+ width: 24px;
2821
+ height: 100%;
2822
+ position: relative;
2823
+ grid-row: 1 / -1;
2824
+ grid-column: 1;
2825
+ align-self: stretch;
2826
+ }
2827
+
2828
+ .council-voice-connector::before {
2829
+ content: '';
2830
+ position: absolute;
2831
+ left: 8px;
2832
+ top: 0;
2833
+ bottom: 0;
2834
+ width: 0;
2835
+ border-left: 1px solid var(--color-border-default, #d1d9e0);
2836
+ }
2837
+
2838
+ .council-voice-connector::after {
2839
+ content: '';
2840
+ position: absolute;
2841
+ left: 8px;
2842
+ top: 50%;
2843
+ width: 12px;
2844
+ height: 0;
2845
+ border-top: 1px solid var(--color-border-default, #d1d9e0);
2846
+ }
2847
+
2848
+ /* Last connector — vertical line only goes to midpoint */
2849
+ .council-voice-connector.connector-last::before {
2850
+ bottom: 50%;
2851
+ }
2852
+
2853
+ .council-voice-icon {
2854
+ width: 18px;
2855
+ height: 18px;
2856
+ display: flex;
2857
+ align-items: center;
2858
+ justify-content: center;
2859
+ font-size: 13px;
2860
+ flex-shrink: 0;
2861
+ grid-column: 2;
2862
+ grid-row: 1;
2863
+ }
2864
+
2865
+ .council-voice-icon.pending { color: var(--color-text-tertiary); }
2866
+ .council-voice-icon.running { color: var(--ai-primary); }
2867
+ .council-voice-icon.completed { color: var(--color-success); }
2868
+ .council-voice-icon.failed { color: var(--color-danger); }
2869
+ .council-voice-icon.cancelled { color: var(--color-warning); }
2870
+
2871
+ .council-voice-label {
2872
+ font-size: 13px;
2873
+ color: var(--color-text-primary, #24292f);
2874
+ white-space: nowrap;
2875
+ overflow: hidden;
2876
+ text-overflow: ellipsis;
2877
+ grid-column: 3;
2878
+ grid-row: 1;
2879
+ }
2880
+
2881
+ .council-voice-status {
2882
+ font-size: 12px;
2883
+ font-weight: 500;
2884
+ flex-shrink: 0;
2885
+ grid-column: 4;
2886
+ grid-row: 1;
2887
+ }
2888
+
2889
+ .council-voice-status.pending { color: var(--color-text-tertiary); }
2890
+ .council-voice-status.running { color: var(--ai-primary); }
2891
+ .council-voice-status.completed { color: var(--color-success); }
2892
+ .council-voice-status.failed { color: var(--color-danger); }
2893
+ .council-voice-status.cancelled { color: var(--color-warning); }
2894
+
2895
+ /* Detail row (progress bar + snippet) sits below label, spanning columns 2-4 */
2896
+ .council-voice-detail {
2897
+ grid-column: 3 / 5;
2898
+ grid-row: 2;
2899
+ min-width: 0;
2900
+ }
2901
+
2902
+ .council-voice-snippet {
2903
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
2904
+ font-size: 11px;
2905
+ color: var(--color-text-tertiary, #8b949e);
2906
+ background: var(--color-bg-subtle, #f6f8fa);
2907
+ border-radius: 3px;
2908
+ padding: 2px 6px;
2909
+ margin-top: 2px;
2910
+ max-width: 100%;
2911
+ white-space: nowrap;
2912
+ overflow: hidden;
2913
+ text-overflow: ellipsis;
2914
+ }
2915
+
2916
+ /* Snippet for single-model level rows (mirrors .council-voice-snippet) */
2917
+ .council-level-snippet {
2918
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
2919
+ font-size: 11px;
2920
+ color: var(--color-text-tertiary, #8b949e);
2921
+ background: var(--color-bg-subtle, #f6f8fa);
2922
+ border-radius: 3px;
2923
+ padding: 2px 6px;
2924
+ margin-left: 28px; /* align with title text: 18px icon + 10px gap */
2925
+ margin-top: 0;
2926
+ margin-bottom: 2px;
2927
+ max-width: calc(100% - 28px);
2928
+ white-space: nowrap;
2929
+ overflow: hidden;
2930
+ text-overflow: ellipsis;
2931
+ }
2932
+
2933
+ /* --- Consolidation section ----------------------------------------------- */
2934
+
2935
+ .council-consolidation {
2936
+ border-top: 1px solid var(--color-border-default, #d1d9e0);
2937
+ margin-top: 4px;
2938
+ padding-top: 8px;
2939
+ }
2940
+
2941
+ /* --- Spinner animation --------------------------------------------------- */
2942
+
2943
+ .council-spinner {
2944
+ display: inline-block;
2945
+ width: 14px;
2946
+ height: 14px;
2947
+ border: 2px solid var(--ai-primary, #d97706);
2948
+ border-top-color: transparent;
2949
+ border-radius: 50%;
2950
+ animation: spin 0.8s linear infinite;
2951
+ }
2952
+
2678
2953
  /* Old AI Suggestion Navigator - hidden, replaced by new AI Panel */
2679
2954
  .suggestion-navigator {
2680
2955
  display: none !important;
@@ -6374,39 +6649,56 @@ body.resizing * {
6374
6649
  color: var(--color-text-muted);
6375
6650
  }
6376
6651
 
6377
- /* NEW badge for new analysis runs */
6378
- .analysis-history-new-badge {
6652
+ /* Config type badges */
6653
+ .analysis-history-config-badge {
6379
6654
  display: inline-flex;
6380
6655
  align-items: center;
6381
6656
  padding: 1px 5px;
6382
6657
  font-size: 9px;
6383
- font-weight: 700;
6658
+ font-weight: 600;
6384
6659
  text-transform: uppercase;
6385
- letter-spacing: 0.5px;
6386
- color: var(--color-text-on-emphasis);
6387
- background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
6660
+ letter-spacing: 0.3px;
6388
6661
  border-radius: 3px;
6389
- margin-left: auto;
6390
6662
  flex-shrink: 0;
6391
- animation: badge-glow 2s ease-in-out infinite;
6392
6663
  }
6393
6664
 
6394
- @keyframes badge-glow {
6395
- 0%, 100% {
6396
- box-shadow: 0 0 2px rgba(245, 158, 11, 0.4);
6397
- }
6398
- 50% {
6399
- box-shadow: 0 0 6px rgba(245, 158, 11, 0.6);
6400
- }
6665
+ .analysis-history-config-council {
6666
+ color: #7c3aed;
6667
+ background: rgba(124, 58, 237, 0.1);
6668
+ border: 1px solid rgba(124, 58, 237, 0.2);
6401
6669
  }
6402
6670
 
6403
- /* Highlight new run item in list */
6404
- .analysis-run-list .analysis-history-item.is-new {
6405
- background: rgba(245, 158, 11, 0.08);
6671
+ .analysis-history-config-council-voice {
6672
+ color: #6366f1;
6673
+ background: rgba(99, 102, 241, 0.1);
6674
+ border: 1px solid rgba(99, 102, 241, 0.2);
6406
6675
  }
6407
6676
 
6408
- .analysis-run-list .analysis-history-item.is-new:hover {
6409
- background: rgba(245, 158, 11, 0.12);
6677
+ .analysis-history-config-advanced {
6678
+ color: #059669;
6679
+ background: rgba(5, 150, 105, 0.1);
6680
+ border: 1px solid rgba(5, 150, 105, 0.2);
6681
+ }
6682
+
6683
+ /* Level indicators */
6684
+ .analysis-history-levels {
6685
+ display: inline-flex;
6686
+ gap: 2px;
6687
+ font-size: 10px;
6688
+ font-family: var(--font-mono, monospace);
6689
+ }
6690
+
6691
+ .analysis-history-level {
6692
+ padding: 0 2px;
6693
+ }
6694
+
6695
+ .analysis-history-level.level-on {
6696
+ color: var(--color-success, #22c55e);
6697
+ }
6698
+
6699
+ .analysis-history-level.level-off {
6700
+ color: var(--color-text-muted);
6701
+ opacity: 0.5;
6410
6702
  }
6411
6703
 
6412
6704
  /* Right panel: Preview */
@@ -6788,21 +7080,26 @@ body.resizing * {
6788
7080
  box-shadow: 0 0 10px 3px rgba(251, 191, 36, 0.6);
6789
7081
  }
6790
7082
 
6791
- /* Dark theme: NEW badge */
6792
- [data-theme="dark"] .analysis-history-new-badge {
6793
- background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
6794
- color: #1f2937;
7083
+ /* Dark theme: config type badges */
7084
+ [data-theme="dark"] .analysis-history-config-council {
7085
+ color: #a78bfa;
7086
+ background: rgba(167, 139, 250, 0.12);
7087
+ border-color: rgba(167, 139, 250, 0.25);
6795
7088
  }
6796
7089
 
6797
- /* Dark theme: highlight new run item */
6798
- [data-theme="dark"] .analysis-run-list .analysis-history-item.is-new {
6799
- background: rgba(251, 191, 36, 0.12);
7090
+ [data-theme="dark"] .analysis-history-config-council-voice {
7091
+ color: #818cf8;
7092
+ background: rgba(129, 140, 248, 0.12);
7093
+ border-color: rgba(129, 140, 248, 0.25);
6800
7094
  }
6801
7095
 
6802
- [data-theme="dark"] .analysis-run-list .analysis-history-item.is-new:hover {
6803
- background: rgba(251, 191, 36, 0.18);
7096
+ [data-theme="dark"] .analysis-history-config-advanced {
7097
+ color: #34d399;
7098
+ background: rgba(52, 211, 153, 0.12);
7099
+ border-color: rgba(52, 211, 153, 0.25);
6804
7100
  }
6805
7101
 
7102
+
6806
7103
  /* Tier-specific colors */
6807
7104
  .analysis-tier-fast {
6808
7105
  background: rgba(56, 189, 248, 0.15);
@@ -7732,10 +8029,10 @@ body.resizing * {
7732
8029
  }
7733
8030
 
7734
8031
  .analysis-config-container {
7735
- width: 580px;
7736
- max-width: calc(100vw - 32px);
8032
+ width: 90vw;
8033
+ max-width: min(900px, calc(100vw - 32px));
7737
8034
  height: auto; /* Override fixed height from .modal-container */
7738
- max-height: min(720px, calc(100vh - 32px));
8035
+ max-height: min(90vh, calc(100vh - 32px));
7739
8036
  display: flex;
7740
8037
  flex-direction: column;
7741
8038
  transform: translateY(8px) scale(0.98);
@@ -7813,6 +8110,31 @@ body.resizing * {
7813
8110
  overflow-y: auto;
7814
8111
  padding: 20px;
7815
8112
  background: var(--color-bg-primary);
8113
+ position: relative;
8114
+ }
8115
+
8116
+ /* Loading overlay shown while providers are being fetched */
8117
+ .config-loading-overlay {
8118
+ position: absolute;
8119
+ inset: 0;
8120
+ display: flex;
8121
+ flex-direction: column;
8122
+ align-items: center;
8123
+ justify-content: center;
8124
+ gap: 12px;
8125
+ background: var(--color-bg-primary);
8126
+ z-index: 10;
8127
+ color: var(--color-text-secondary);
8128
+ font-size: 13px;
8129
+ }
8130
+
8131
+ .config-loading-spinner {
8132
+ width: 24px;
8133
+ height: 24px;
8134
+ border: 2.5px solid var(--color-border-primary);
8135
+ border-top-color: var(--color-text-link, #2f81f7);
8136
+ border-radius: 50%;
8137
+ animation: spin 0.8s linear infinite;
7816
8138
  }
7817
8139
 
7818
8140
  /* Section styling */
@@ -7848,10 +8170,8 @@ body.resizing * {
7848
8170
  .provider-toggle {
7849
8171
  display: flex;
7850
8172
  flex-wrap: wrap;
8173
+ justify-content: center;
7851
8174
  gap: 8px;
7852
- padding: 4px;
7853
- background: var(--color-bg-tertiary);
7854
- border-radius: 8px;
7855
8175
  width: 100%;
7856
8176
  max-width: 100%;
7857
8177
  }
@@ -7860,33 +8180,42 @@ body.resizing * {
7860
8180
  display: inline-flex;
7861
8181
  align-items: center;
7862
8182
  gap: 6px;
7863
- padding: 8px 16px;
7864
- border: none;
7865
- background: transparent;
8183
+ padding: 10px 18px;
8184
+ border: 2px solid var(--color-border-primary);
8185
+ background: var(--color-bg-secondary);
7866
8186
  color: var(--color-text-secondary);
7867
8187
  font-size: 14px;
7868
8188
  font-weight: 500;
7869
- border-radius: 6px;
8189
+ border-radius: 10px;
7870
8190
  cursor: pointer;
7871
- transition: all 0.2s ease;
8191
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
7872
8192
  white-space: nowrap;
7873
8193
  }
7874
8194
 
7875
8195
  .provider-btn:hover {
7876
- background: var(--color-bg-secondary);
8196
+ border-color: var(--color-border-secondary);
8197
+ background: var(--color-bg-tertiary);
7877
8198
  color: var(--color-text-primary);
8199
+ transform: translateY(-2px);
8200
+ box-shadow: 0 4px 12px var(--color-shadow);
7878
8201
  }
7879
8202
 
7880
8203
  .provider-btn.selected {
7881
- background: rgba(245, 158, 11, 0.15);
8204
+ border-color: var(--color-accent-ai-dark);
8205
+ background: rgba(245, 158, 11, 0.08);
7882
8206
  color: var(--color-text-primary);
7883
- box-shadow: inset 0 0 0 1px rgba(245, 158, 11, 0.4);
8207
+ box-shadow:
8208
+ 0 0 0 3px rgba(245, 158, 11, 0.15),
8209
+ 0 4px 12px rgba(245, 158, 11, 0.1);
7884
8210
  }
7885
8211
 
7886
8212
  [data-theme="dark"] .provider-btn.selected {
7887
- background: rgba(251, 191, 36, 0.12);
8213
+ background: rgba(251, 191, 36, 0.1);
8214
+ border-color: var(--color-accent-ai);
7888
8215
  color: #fbbf24;
7889
- box-shadow: inset 0 0 0 1px rgba(251, 191, 36, 0.3);
8216
+ box-shadow:
8217
+ 0 0 0 3px rgba(251, 191, 36, 0.15),
8218
+ 0 4px 12px rgba(251, 191, 36, 0.08);
7890
8219
  }
7891
8220
 
7892
8221
  /* No providers available message */
@@ -7940,8 +8269,9 @@ body.resizing * {
7940
8269
  /* Model Cards */
7941
8270
  .model-cards {
7942
8271
  display: grid;
7943
- grid-template-columns: repeat(3, 1fr);
8272
+ grid-template-columns: repeat(3, minmax(0, 220px));
7944
8273
  gap: 12px;
8274
+ justify-content: center;
7945
8275
  }
7946
8276
 
7947
8277
  .model-card {
@@ -7949,13 +8279,16 @@ body.resizing * {
7949
8279
  display: flex;
7950
8280
  flex-direction: column;
7951
8281
  align-items: center;
7952
- padding: 16px 12px;
8282
+ padding: 14px 10px;
7953
8283
  background: var(--color-bg-secondary);
7954
8284
  border: 2px solid var(--color-border-primary);
7955
8285
  border-radius: 10px;
7956
8286
  cursor: pointer;
7957
8287
  transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
7958
8288
  text-align: center;
8289
+ aspect-ratio: 1.618 / 1;
8290
+ overflow: hidden;
8291
+ justify-content: center;
7959
8292
  }
7960
8293
 
7961
8294
  .model-card:hover {
@@ -7983,8 +8316,8 @@ body.resizing * {
7983
8316
 
7984
8317
  .model-badge {
7985
8318
  position: absolute;
7986
- top: -8px;
7987
- right: -4px;
8319
+ top: 8px;
8320
+ right: 8px;
7988
8321
  padding: 2px 8px;
7989
8322
  font-size: 9px;
7990
8323
  font-weight: 700;
@@ -8019,14 +8352,20 @@ body.resizing * {
8019
8352
  color: white;
8020
8353
  }
8021
8354
 
8355
+ .model-icon {
8356
+ font-size: 28px;
8357
+ line-height: 1;
8358
+ margin-bottom: 2px;
8359
+ }
8360
+
8022
8361
  .model-info {
8023
8362
  display: flex;
8024
8363
  flex-direction: column;
8025
- gap: 2px;
8364
+ gap: 1px;
8026
8365
  }
8027
8366
 
8028
8367
  .model-name {
8029
- font-size: 14px;
8368
+ font-size: 13px;
8030
8369
  font-weight: 600;
8031
8370
  color: var(--color-text-primary);
8032
8371
  }
@@ -8037,10 +8376,10 @@ body.resizing * {
8037
8376
  }
8038
8377
 
8039
8378
  .model-description {
8040
- margin: 8px 0 0;
8041
- font-size: 11px;
8379
+ margin: 4px 0 0;
8380
+ font-size: 10px;
8042
8381
  color: var(--color-text-tertiary);
8043
- line-height: 1.4;
8382
+ line-height: 1.3;
8044
8383
  }
8045
8384
 
8046
8385
  .model-selected-indicator {
@@ -8395,12 +8734,31 @@ body.resizing * {
8395
8734
  .analysis-config-footer {
8396
8735
  display: flex;
8397
8736
  justify-content: flex-end;
8737
+ align-items: center;
8398
8738
  gap: 10px;
8399
8739
  padding: 16px 20px;
8400
8740
  background: var(--color-bg-secondary);
8401
8741
  border-top: 1px solid var(--color-border-primary);
8402
8742
  }
8403
8743
 
8744
+ /* Unsaved council changes hint + footer save button container */
8745
+ .council-footer-left {
8746
+ display: flex;
8747
+ align-items: center;
8748
+ gap: 10px;
8749
+ margin-right: auto;
8750
+ }
8751
+
8752
+ .council-dirty-hint {
8753
+ font-size: 12px;
8754
+ color: var(--color-accent-primary, #0969da);
8755
+ font-style: italic;
8756
+ }
8757
+
8758
+ [data-theme="dark"] .council-dirty-hint {
8759
+ color: var(--color-accent-primary, #58a6ff);
8760
+ }
8761
+
8404
8762
  .btn-analyze {
8405
8763
  display: inline-flex;
8406
8764
  align-items: center;
@@ -8455,6 +8813,9 @@ body.resizing * {
8455
8813
  text-align: left;
8456
8814
  padding: 12px 16px;
8457
8815
  gap: 12px;
8816
+ aspect-ratio: auto;
8817
+ overflow: visible;
8818
+ justify-content: flex-start;
8458
8819
  }
8459
8820
 
8460
8821
  .model-icon {
@@ -8491,6 +8852,672 @@ body.resizing * {
8491
8852
  }
8492
8853
  }
8493
8854
 
8855
+ /* ==========================================================================
8856
+ Review Council Tab
8857
+ Multi-voice, multi-provider analysis configuration
8858
+ ========================================================================== */
8859
+
8860
+ .analysis-tab-bar {
8861
+ display: flex;
8862
+ gap: 0;
8863
+ border-bottom: 1px solid var(--border-color, #d0d7de);
8864
+ margin-bottom: 16px;
8865
+ }
8866
+
8867
+ .analysis-tab {
8868
+ padding: 8px 16px;
8869
+ border: none;
8870
+ background: none;
8871
+ cursor: pointer;
8872
+ font-size: 13px;
8873
+ font-weight: 500;
8874
+ color: var(--fg-muted, #656d76);
8875
+ border-bottom: 2px solid transparent;
8876
+ transition: color 0.15s, border-color 0.15s;
8877
+ }
8878
+
8879
+ .analysis-tab:hover {
8880
+ color: var(--fg-default, #1f2328);
8881
+ }
8882
+
8883
+ .analysis-tab.active {
8884
+ color: var(--fg-default, #1f2328);
8885
+ border-bottom-color: var(--accent-emphasis, #0969da);
8886
+ }
8887
+
8888
+ [data-theme="dark"] .analysis-tab {
8889
+ color: #8b949e;
8890
+ }
8891
+
8892
+ [data-theme="dark"] .analysis-tab:hover {
8893
+ color: #c9d1d9;
8894
+ }
8895
+
8896
+ [data-theme="dark"] .analysis-tab.active {
8897
+ color: #c9d1d9;
8898
+ border-bottom-color: #58a6ff;
8899
+ }
8900
+
8901
+ .beta-badge {
8902
+ display: inline-block;
8903
+ font-size: 10px;
8904
+ font-weight: 600;
8905
+ text-transform: uppercase;
8906
+ letter-spacing: 0.5px;
8907
+ padding: 1px 5px;
8908
+ border-radius: 3px;
8909
+ background-color: var(--accent-subtle, #ddf4ff);
8910
+ color: var(--accent-fg, #0969da);
8911
+ margin-left: 4px;
8912
+ vertical-align: middle;
8913
+ }
8914
+
8915
+ [data-theme="dark"] .beta-badge {
8916
+ background-color: transparent;
8917
+ color: #8b949e;
8918
+ border: 1px solid #30363d;
8919
+ }
8920
+
8921
+ .council-selector-row {
8922
+ display: flex;
8923
+ gap: 8px;
8924
+ align-items: center;
8925
+ }
8926
+
8927
+ .council-select {
8928
+ flex: 1;
8929
+ padding: 6px 10px;
8930
+ border: 1px solid var(--border-color, #d0d7de);
8931
+ border-radius: 6px;
8932
+ background: var(--bg-default, #fff);
8933
+ color: var(--fg-default, #1f2328);
8934
+ font-size: 13px;
8935
+ }
8936
+
8937
+ [data-theme="dark"] .council-select {
8938
+ background: var(--bg-subtle, #161b22);
8939
+ color: var(--fg-default, #e6edf3);
8940
+ border-color: var(--border-color, #30363d);
8941
+ }
8942
+
8943
+ /* "New Council" option in council selector */
8944
+ .council-option-new {
8945
+ font-style: italic;
8946
+ color: var(--fg-muted, #656d76);
8947
+ }
8948
+
8949
+ /* Style the select itself when "New Council" is the active selection */
8950
+ .council-select.new-council-selected {
8951
+ font-style: italic;
8952
+ color: var(--fg-muted, #656d76);
8953
+ }
8954
+
8955
+ /* Council review divider - separates council config from per-review settings */
8956
+ .council-review-divider {
8957
+ margin: 24px 0 16px;
8958
+ padding-top: 20px;
8959
+ border-top: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
8960
+ }
8961
+
8962
+ [data-theme="dark"] .council-review-divider {
8963
+ border-top-color: var(--color-border-subtle, rgba(255, 255, 255, 0.06));
8964
+ }
8965
+
8966
+ .divider-label {
8967
+ font-size: 12px;
8968
+ font-weight: 500;
8969
+ color: var(--color-text-tertiary, #656d76);
8970
+ text-transform: uppercase;
8971
+ letter-spacing: 0.5px;
8972
+ }
8973
+
8974
+ [data-theme="dark"] .divider-label {
8975
+ color: var(--color-text-tertiary, #6e7681);
8976
+ }
8977
+
8978
+ .council-level-section .section-title {
8979
+ margin-bottom: 8px;
8980
+ }
8981
+
8982
+ .level-toggle {
8983
+ font-weight: 600;
8984
+ }
8985
+
8986
+ .level-toggle .toggle-label {
8987
+ font-weight: 600;
8988
+ }
8989
+
8990
+ .level-voices {
8991
+ margin-left: 24px;
8992
+ margin-top: 8px;
8993
+ }
8994
+
8995
+ .voice-list {
8996
+ display: flex;
8997
+ flex-direction: column;
8998
+ gap: 6px;
8999
+ }
9000
+
9001
+ .voice-row {
9002
+ display: flex;
9003
+ gap: 8px;
9004
+ align-items: center;
9005
+ }
9006
+
9007
+ .voice-provider,
9008
+ .voice-model,
9009
+ .voice-tier {
9010
+ padding: 5px 8px;
9011
+ border: 1px solid var(--border-color, #d0d7de);
9012
+ border-radius: 6px;
9013
+ background: var(--bg-default, #fff);
9014
+ color: var(--fg-default, #1f2328);
9015
+ font-size: 12px;
9016
+ }
9017
+
9018
+ [data-theme="dark"] .voice-provider,
9019
+ [data-theme="dark"] .voice-model,
9020
+ [data-theme="dark"] .voice-tier {
9021
+ background: var(--bg-subtle, #161b22);
9022
+ color: var(--fg-default, #e6edf3);
9023
+ border-color: var(--border-color, #30363d);
9024
+ }
9025
+
9026
+ .voice-provider {
9027
+ min-width: 100px;
9028
+ }
9029
+
9030
+ .voice-model {
9031
+ min-width: 140px;
9032
+ flex: 1;
9033
+ }
9034
+
9035
+ .voice-tier {
9036
+ min-width: 90px;
9037
+ }
9038
+
9039
+ .btn-icon {
9040
+ box-sizing: border-box;
9041
+ width: 28px;
9042
+ height: 28px;
9043
+ padding: 0;
9044
+ display: inline-flex;
9045
+ align-items: center;
9046
+ justify-content: center;
9047
+ font-size: 16px;
9048
+ line-height: 1;
9049
+ border-radius: 6px;
9050
+ border: 1px solid var(--border-color, #d0d7de);
9051
+ background: var(--bg-default, #fff);
9052
+ color: var(--fg-muted, #656d76);
9053
+ cursor: pointer;
9054
+ }
9055
+
9056
+ .btn-icon:hover {
9057
+ color: var(--danger-fg, #cf222e);
9058
+ border-color: var(--danger-fg, #cf222e);
9059
+ }
9060
+
9061
+ .btn-ghost {
9062
+ background: none;
9063
+ border: none;
9064
+ color: var(--accent-fg, #0969da);
9065
+ cursor: pointer;
9066
+ font-size: 12px;
9067
+ padding: 4px 8px;
9068
+ }
9069
+
9070
+ .btn-ghost:hover {
9071
+ text-decoration: underline;
9072
+ }
9073
+
9074
+ .btn-sm {
9075
+ font-size: 12px;
9076
+ padding: 4px 10px;
9077
+ }
9078
+
9079
+ .add-voice-btn {
9080
+ margin-top: 6px;
9081
+ }
9082
+
9083
+ .add-voice-btn:hover {
9084
+ color: var(--color-accent-primary, #0969da);
9085
+ border-color: var(--color-accent-primary, #0969da);
9086
+ }
9087
+
9088
+ .section-hint-text {
9089
+ font-size: 12px;
9090
+ color: var(--fg-muted, #656d76);
9091
+ margin-bottom: 8px;
9092
+ margin-top: -4px;
9093
+ }
9094
+
9095
+ .voice-instructions-area {
9096
+ margin-left: 0;
9097
+ margin-bottom: 4px;
9098
+ }
9099
+
9100
+ .voice-instructions-input {
9101
+ width: 100%;
9102
+ padding: 6px 8px;
9103
+ border: 1px solid var(--border-color, #d0d7de);
9104
+ border-radius: 6px;
9105
+ background: var(--bg-default, #fff);
9106
+ color: var(--fg-default, #1f2328);
9107
+ font-size: 12px;
9108
+ font-family: inherit;
9109
+ resize: vertical;
9110
+ }
9111
+
9112
+ [data-theme="dark"] .voice-instructions-input {
9113
+ background: var(--bg-subtle, #161b22);
9114
+ color: var(--fg-default, #e6edf3);
9115
+ border-color: var(--border-color, #30363d);
9116
+ }
9117
+
9118
+ /* Icon-only toggle for per-participant instructions */
9119
+ .toggle-instructions-icon {
9120
+ width: 24px;
9121
+ height: 24px;
9122
+ padding: 0;
9123
+ display: inline-flex;
9124
+ align-items: center;
9125
+ justify-content: center;
9126
+ background: none;
9127
+ border: 1px solid transparent;
9128
+ border-radius: 4px;
9129
+ color: var(--color-text-tertiary, #6e7681);
9130
+ cursor: pointer;
9131
+ flex-shrink: 0;
9132
+ transition: color 0.15s ease, border-color 0.15s ease;
9133
+ }
9134
+
9135
+ .toggle-instructions-icon:hover {
9136
+ color: var(--color-accent-primary, #0969da);
9137
+ border-color: var(--color-border-secondary, #d0d7de);
9138
+ }
9139
+
9140
+ .toggle-instructions-icon.has-instructions {
9141
+ color: var(--color-accent-primary, #0969da);
9142
+ }
9143
+
9144
+ [data-theme="dark"] .toggle-instructions-icon {
9145
+ color: var(--color-text-tertiary, #484f58);
9146
+ }
9147
+
9148
+ [data-theme="dark"] .toggle-instructions-icon:hover {
9149
+ color: var(--color-accent-primary, #58a6ff);
9150
+ border-color: var(--color-border-primary, #30363d);
9151
+ }
9152
+
9153
+ [data-theme="dark"] .toggle-instructions-icon.has-instructions {
9154
+ color: var(--color-accent-primary, #58a6ff);
9155
+ }
9156
+
9157
+ /* Icon-only toggle for per-voice timeout (clock icon) */
9158
+ .toggle-timeout-icon {
9159
+ width: 24px;
9160
+ height: 24px;
9161
+ padding: 0;
9162
+ display: inline-flex;
9163
+ align-items: center;
9164
+ justify-content: center;
9165
+ background: none;
9166
+ border: 1px solid transparent;
9167
+ border-radius: 4px;
9168
+ color: var(--color-text-tertiary, #6e7681);
9169
+ cursor: pointer;
9170
+ flex-shrink: 0;
9171
+ transition: color 0.15s ease, border-color 0.15s ease;
9172
+ }
9173
+
9174
+ .toggle-timeout-icon:hover {
9175
+ color: var(--color-accent-primary, #0969da);
9176
+ border-color: var(--color-border-secondary, #d0d7de);
9177
+ }
9178
+
9179
+ .toggle-timeout-icon.has-custom-timeout {
9180
+ color: var(--color-attention-fg, #9a6700);
9181
+ }
9182
+
9183
+ [data-theme="dark"] .toggle-timeout-icon {
9184
+ color: var(--color-text-tertiary, #484f58);
9185
+ }
9186
+
9187
+ [data-theme="dark"] .toggle-timeout-icon:hover {
9188
+ color: var(--color-accent-primary, #58a6ff);
9189
+ border-color: var(--color-border-primary, #30363d);
9190
+ }
9191
+
9192
+ [data-theme="dark"] .toggle-timeout-icon.has-custom-timeout {
9193
+ color: var(--color-attention-fg, #d29922);
9194
+ }
9195
+
9196
+ /* Custom timeout dropdown selector (replaces native <select> for timeouts) */
9197
+ .timeout-select {
9198
+ position: relative;
9199
+ display: inline-flex;
9200
+ flex-shrink: 0;
9201
+ }
9202
+
9203
+ .timeout-select-trigger {
9204
+ display: inline-flex;
9205
+ align-items: center;
9206
+ gap: 4px;
9207
+ padding: 4px 8px;
9208
+ border: 1px solid var(--border-color, #d0d7de);
9209
+ border-radius: 6px;
9210
+ background: var(--bg-default, #fff);
9211
+ color: var(--fg-default, #1f2328);
9212
+ font-size: 12px;
9213
+ font-family: inherit;
9214
+ font-weight: 500;
9215
+ cursor: pointer;
9216
+ white-space: nowrap;
9217
+ transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
9218
+ min-width: 52px;
9219
+ justify-content: center;
9220
+ line-height: 1.4;
9221
+ }
9222
+
9223
+ .timeout-select-trigger:hover {
9224
+ border-color: var(--color-accent-primary, #0969da);
9225
+ background: var(--bg-subtle, #f6f8fa);
9226
+ }
9227
+
9228
+ .timeout-select.open .timeout-select-trigger {
9229
+ border-color: var(--color-accent-primary, #0969da);
9230
+ box-shadow: 0 0 0 2px rgba(9, 105, 218, 0.15);
9231
+ }
9232
+
9233
+ .timeout-select-label {
9234
+ pointer-events: none;
9235
+ }
9236
+
9237
+ .timeout-select-caret {
9238
+ flex-shrink: 0;
9239
+ transition: transform 0.15s ease;
9240
+ pointer-events: none;
9241
+ }
9242
+
9243
+ .timeout-select.open .timeout-select-caret {
9244
+ transform: rotate(180deg);
9245
+ }
9246
+
9247
+ /* Dropdown menu */
9248
+ .timeout-select-menu {
9249
+ display: none;
9250
+ position: absolute;
9251
+ top: calc(100% + 4px);
9252
+ left: 50%;
9253
+ transform: translateX(-50%);
9254
+ min-width: 64px;
9255
+ background: var(--bg-default, #fff);
9256
+ border: 1px solid var(--border-color, #d0d7de);
9257
+ border-radius: 8px;
9258
+ box-shadow: 0 4px 12px rgba(27, 31, 36, 0.12), 0 1px 3px rgba(27, 31, 36, 0.08);
9259
+ z-index: 1100;
9260
+ padding: 4px;
9261
+ flex-direction: column;
9262
+ }
9263
+
9264
+ .timeout-select.open .timeout-select-menu {
9265
+ display: flex;
9266
+ }
9267
+
9268
+ /* Individual option */
9269
+ .timeout-select-option {
9270
+ display: flex;
9271
+ align-items: center;
9272
+ justify-content: center;
9273
+ padding: 5px 10px;
9274
+ border: none;
9275
+ border-radius: 5px;
9276
+ background: transparent;
9277
+ color: var(--fg-default, #1f2328);
9278
+ font-size: 12px;
9279
+ font-family: inherit;
9280
+ font-weight: 500;
9281
+ cursor: pointer;
9282
+ white-space: nowrap;
9283
+ transition: background 0.1s ease, color 0.1s ease;
9284
+ }
9285
+
9286
+ .timeout-select-option:hover,
9287
+ .timeout-select-option.focused {
9288
+ background: var(--bg-subtle, #f6f8fa);
9289
+ }
9290
+
9291
+ .timeout-select-option.selected {
9292
+ color: var(--color-accent-primary, #0969da);
9293
+ background: rgba(9, 105, 218, 0.08);
9294
+ font-weight: 600;
9295
+ }
9296
+
9297
+ .timeout-select-option.selected:hover,
9298
+ .timeout-select-option.selected.focused {
9299
+ background: rgba(9, 105, 218, 0.14);
9300
+ }
9301
+
9302
+ /* Dark theme overrides */
9303
+ [data-theme="dark"] .timeout-select-trigger {
9304
+ background: var(--bg-subtle, #161b22);
9305
+ color: var(--fg-default, #e6edf3);
9306
+ border-color: var(--border-color, #30363d);
9307
+ }
9308
+
9309
+ [data-theme="dark"] .timeout-select-trigger:hover {
9310
+ border-color: var(--color-accent-primary, #58a6ff);
9311
+ background: var(--color-bg-tertiary, #1c2128);
9312
+ }
9313
+
9314
+ [data-theme="dark"] .timeout-select.open .timeout-select-trigger {
9315
+ border-color: var(--color-accent-primary, #58a6ff);
9316
+ box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.15);
9317
+ }
9318
+
9319
+ [data-theme="dark"] .timeout-select-menu {
9320
+ background: var(--bg-subtle, #161b22);
9321
+ border-color: var(--border-color, #30363d);
9322
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.2);
9323
+ }
9324
+
9325
+ [data-theme="dark"] .timeout-select-option {
9326
+ color: var(--fg-default, #e6edf3);
9327
+ }
9328
+
9329
+ [data-theme="dark"] .timeout-select-option:hover,
9330
+ [data-theme="dark"] .timeout-select-option.focused {
9331
+ background: rgba(255, 255, 255, 0.06);
9332
+ }
9333
+
9334
+ [data-theme="dark"] .timeout-select-option.selected {
9335
+ color: var(--color-accent-primary, #58a6ff);
9336
+ background: rgba(88, 166, 255, 0.1);
9337
+ }
9338
+
9339
+ [data-theme="dark"] .timeout-select-option.selected:hover,
9340
+ [data-theme="dark"] .timeout-select-option.selected.focused {
9341
+ background: rgba(88, 166, 255, 0.16);
9342
+ }
9343
+
9344
+ /* Participant card layout (item 4) */
9345
+ .participant-wrapper {
9346
+ display: flex;
9347
+ flex-direction: row;
9348
+ gap: 8px;
9349
+ align-items: flex-start;
9350
+ }
9351
+
9352
+ .participant-card {
9353
+ flex: 1;
9354
+ border: 1px solid var(--border-color, #d0d7de);
9355
+ border-radius: 8px;
9356
+ padding: 10px;
9357
+ display: flex;
9358
+ flex-direction: column;
9359
+ gap: 6px;
9360
+ background: var(--bg-default, #fff);
9361
+ }
9362
+
9363
+ [data-theme="dark"] .participant-card {
9364
+ border-color: var(--border-color, #30363d);
9365
+ background: var(--bg-subtle, #161b22);
9366
+ }
9367
+
9368
+ .participant-card .voice-row {
9369
+ margin: 0;
9370
+ }
9371
+
9372
+ .participant-card .voice-instructions-area {
9373
+ margin: 0;
9374
+ }
9375
+
9376
+ /* Orchestration/consolidation card — same styling as participant-card */
9377
+ .orchestration-card {
9378
+ border: 1px solid var(--border-color, #d0d7de);
9379
+ border-radius: 8px;
9380
+ padding: 10px;
9381
+ display: flex;
9382
+ flex-direction: column;
9383
+ gap: 6px;
9384
+ background: var(--bg-default, #fff);
9385
+ }
9386
+
9387
+ [data-theme="dark"] .orchestration-card {
9388
+ border-color: var(--border-color, #30363d);
9389
+ background: var(--bg-subtle, #161b22);
9390
+ }
9391
+
9392
+ .orchestration-card .voice-row {
9393
+ margin: 0;
9394
+ }
9395
+
9396
+ .orchestration-card .voice-instructions-area {
9397
+ margin: 0;
9398
+ }
9399
+
9400
+ .participant-wrapper > .remove-voice-btn {
9401
+ flex-shrink: 0;
9402
+ margin-top: 10px;
9403
+ }
9404
+
9405
+ /* Spacer to align consolidation row with level voice rows that have a remove button */
9406
+ .participant-wrapper > .remove-voice-btn-spacer {
9407
+ flex-shrink: 0;
9408
+ width: 28px; /* matches .btn-icon width */
9409
+ }
9410
+
9411
+ /* Dark mode overrides for council +/- icon buttons */
9412
+ [data-theme="dark"] .btn-icon {
9413
+ background: var(--color-bg-tertiary, #1c2128);
9414
+ border-color: var(--color-border-primary, #30363d);
9415
+ color: var(--color-text-secondary, #8b949e);
9416
+ }
9417
+
9418
+ [data-theme="dark"] .btn-icon:hover {
9419
+ background: var(--color-bg-elevated, #1e2329);
9420
+ color: var(--color-danger, #f85149);
9421
+ border-color: var(--color-danger, #f85149);
9422
+ }
9423
+
9424
+ [data-theme="dark"] .add-voice-btn {
9425
+ color: var(--color-text-secondary, #8b949e);
9426
+ }
9427
+
9428
+ [data-theme="dark"] .add-voice-btn:hover {
9429
+ color: var(--color-accent-primary, #58a6ff);
9430
+ border-color: var(--color-accent-primary, #58a6ff);
9431
+ }
9432
+
9433
+ /* Disabled button styles for council selector row (item 6) */
9434
+ .council-selector-row .btn:disabled {
9435
+ opacity: 0.5;
9436
+ cursor: not-allowed;
9437
+ }
9438
+
9439
+ /* Icon-only danger button (e.g. delete council) */
9440
+ .btn-icon-danger {
9441
+ background: none;
9442
+ border: 1px solid transparent;
9443
+ color: var(--fg-muted, #656d76);
9444
+ padding: 4px 6px;
9445
+ border-radius: 6px;
9446
+ cursor: pointer;
9447
+ display: inline-flex;
9448
+ align-items: center;
9449
+ justify-content: center;
9450
+ transition: color 0.15s, background 0.15s;
9451
+ }
9452
+
9453
+ .btn-icon-danger:hover:not(:disabled) {
9454
+ color: var(--danger-fg, #d1242f);
9455
+ background: var(--color-danger-subtle, rgba(255, 129, 130, 0.1));
9456
+ }
9457
+
9458
+ .btn-icon-danger:disabled {
9459
+ opacity: 0.4;
9460
+ cursor: not-allowed;
9461
+ }
9462
+
9463
+ [data-theme="dark"] .btn-icon-danger {
9464
+ color: var(--color-text-secondary, #8b949e);
9465
+ }
9466
+
9467
+ [data-theme="dark"] .btn-icon-danger:hover:not(:disabled) {
9468
+ color: var(--color-danger, #f85149);
9469
+ background: rgba(248, 81, 73, 0.1);
9470
+ }
9471
+
9472
+ /* Info-tip toggle buttons (circled "i" icons next to section headers) */
9473
+ .info-tip-toggle {
9474
+ display: inline-flex;
9475
+ align-items: center;
9476
+ justify-content: center;
9477
+ width: 18px;
9478
+ height: 18px;
9479
+ padding: 0;
9480
+ border: none;
9481
+ border-radius: 50%;
9482
+ background: none;
9483
+ color: var(--color-text-tertiary, #656d76);
9484
+ cursor: pointer;
9485
+ flex-shrink: 0;
9486
+ transition: color 0.15s ease;
9487
+ }
9488
+
9489
+ .info-tip-toggle:hover {
9490
+ color: var(--color-info, #0969da);
9491
+ }
9492
+
9493
+ .info-tip-toggle.active {
9494
+ color: var(--color-info, #0969da);
9495
+ }
9496
+
9497
+ .info-tip-content {
9498
+ background: var(--color-info-subtle, #ddf4ff);
9499
+ border-radius: 6px;
9500
+ padding: 8px 10px;
9501
+ margin: 0 0 8px;
9502
+ font-size: 12px;
9503
+ line-height: 1.45;
9504
+ color: var(--color-text-secondary, #424a53);
9505
+ }
9506
+
9507
+ [data-theme="dark"] .info-tip-toggle {
9508
+ color: var(--color-text-tertiary, #484f58);
9509
+ }
9510
+
9511
+ [data-theme="dark"] .info-tip-toggle:hover,
9512
+ [data-theme="dark"] .info-tip-toggle.active {
9513
+ color: var(--color-info, #58a6ff);
9514
+ }
9515
+
9516
+ [data-theme="dark"] .info-tip-content {
9517
+ background: rgba(56, 139, 253, 0.1);
9518
+ color: var(--color-text-secondary, #8b949e);
9519
+ }
9520
+
8494
9521
  /* ==========================================================================
8495
9522
  File-Level Comments Zone
8496
9523
  Collapsible section between file header and diff content