@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
package/public/css/pr.css CHANGED
@@ -1661,6 +1661,23 @@
1661
1661
  scroll-margin-top: var(--toolbar-height, 0px);
1662
1662
  }
1663
1663
 
1664
+ /* Suggestion / finding / comment / chat-line navigation lands the target at
1665
+ the TOP of the diff panel (scrollIntoView block:'start'). Offset it below
1666
+ the sticky toolbar AND the sticky file header so it isn't hidden behind
1667
+ them. `--diff-file-header-height` is measured in JS (_measureFileHeaderHeight)
1668
+ with a sane fallback. Suppressed during a tour, which scrolls to center and
1669
+ manages its own sticky offsets. */
1670
+ :root {
1671
+ --diff-scroll-offset: calc(var(--toolbar-height, 0px) + var(--diff-file-header-height, 38px));
1672
+ }
1673
+ body:not(.tour-active) .d2h-file-wrapper tr,
1674
+ body:not(.tour-active) .ai-suggestion,
1675
+ body:not(.tour-active) .file-comment-card,
1676
+ body:not(.tour-active) .user-comment-row,
1677
+ body:not(.tour-active) .external-comment-row {
1678
+ scroll-margin-top: var(--diff-scroll-offset);
1679
+ }
1680
+
1664
1681
  /* Hide diff content when collapsed */
1665
1682
  .d2h-file-wrapper.collapsed .d2h-file-body,
1666
1683
  .d2h-file-wrapper.collapsed .d2h-diff-table {
@@ -2686,164 +2703,6 @@ tr.newly-expanded .d2h-code-line-ctn {
2686
2703
  background-color: var(--color-bg-secondary);
2687
2704
  }
2688
2705
 
2689
- /* Modal Styles */
2690
- .modal-overlay {
2691
- position: fixed;
2692
- top: 0;
2693
- left: 0;
2694
- right: 0;
2695
- bottom: 0;
2696
- z-index: 1000;
2697
- display: flex;
2698
- align-items: center;
2699
- justify-content: center;
2700
- }
2701
-
2702
- .modal-backdrop {
2703
- position: absolute;
2704
- top: 0;
2705
- left: 0;
2706
- right: 0;
2707
- bottom: 0;
2708
- background: rgba(0, 0, 0, 0.5);
2709
- cursor: pointer;
2710
- }
2711
-
2712
- .modal-container {
2713
- position: relative;
2714
- width: min(960px, 90vw);
2715
- height: 520px; /* Increased from 420px to show all 4 levels without scrolling */
2716
- background: var(--color-bg-primary, #ffffff);
2717
- border-radius: 20px;
2718
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
2719
- display: flex;
2720
- flex-direction: column;
2721
- overflow: hidden;
2722
- border: 1px solid var(--color-border-default, #d1d9e0);
2723
- }
2724
-
2725
- .modal-header {
2726
- display: flex;
2727
- align-items: center;
2728
- justify-content: space-between;
2729
- padding: 24px 24px 16px 24px;
2730
- border-bottom: 1px solid var(--ai-border, rgba(217, 119, 6, 0.3));
2731
- background: linear-gradient(to right, var(--ai-subtle, rgba(217, 119, 6, 0.08)), transparent);
2732
- }
2733
-
2734
- .modal-header h3 {
2735
- font-size: 18px;
2736
- font-weight: 600;
2737
- color: var(--ai-primary, #d97706);
2738
- margin: 0;
2739
- }
2740
-
2741
- .modal-close-btn {
2742
- background: none;
2743
- border: none;
2744
- padding: 4px;
2745
- cursor: pointer;
2746
- border-radius: 4px;
2747
- color: var(--color-text-secondary, #656d76);
2748
- display: flex;
2749
- align-items: center;
2750
- justify-content: center;
2751
- }
2752
-
2753
- .modal-close-btn:hover {
2754
- background: var(--color-bg-tertiary, #f6f8fa);
2755
- color: var(--color-text-primary, #24292f);
2756
- }
2757
-
2758
- .modal-body {
2759
- padding: 16px 24px;
2760
- flex: 1;
2761
- overflow-y: auto;
2762
- }
2763
-
2764
- .modal-footer {
2765
- padding: 16px 24px 24px 24px;
2766
- display: flex;
2767
- gap: 8px;
2768
- justify-content: flex-end;
2769
- border-top: 1px solid var(--color-border-default, #d1d9e0);
2770
- }
2771
-
2772
- .modal-footer .btn {
2773
- padding: 8px 16px;
2774
- font-size: 14px;
2775
- }
2776
-
2777
- /* Confirm dialog buttons should be centered */
2778
- .confirm-dialog-container .modal-footer {
2779
- justify-content: center;
2780
- }
2781
-
2782
- /* When a secondary button is visible (3 buttons), widen and stack vertically.
2783
- column-reverse puts Confirm (primary) on top, Cancel on bottom. */
2784
- .confirm-dialog-container.has-secondary {
2785
- min-width: 440px;
2786
- }
2787
-
2788
- .confirm-dialog-container.has-secondary .modal-footer {
2789
- flex-direction: column-reverse;
2790
- align-items: stretch;
2791
- }
2792
-
2793
- .confirm-dialog-container.has-secondary .modal-footer .btn {
2794
- display: flex;
2795
- flex-direction: column;
2796
- align-items: center;
2797
- }
2798
-
2799
- /* Button description subtitles */
2800
- .modal-footer .btn .btn-label {
2801
- display: block;
2802
- }
2803
-
2804
- .modal-footer .btn .btn-desc {
2805
- display: block;
2806
- font-size: 12px;
2807
- font-weight: normal;
2808
- opacity: 0.7;
2809
- margin-top: 2px;
2810
- }
2811
-
2812
- /* Dialogs spawned from within other modals need higher z-index */
2813
- #text-input-dialog,
2814
- #confirm-dialog {
2815
- z-index: 10000; /* Must stack above analysis-config-overlay (1100) */
2816
- }
2817
-
2818
- .text-input-dialog-field {
2819
- display: flex;
2820
- flex-direction: column;
2821
- gap: 6px;
2822
- }
2823
-
2824
- .text-input-dialog-field label {
2825
- font-size: 13px;
2826
- font-weight: 600;
2827
- color: var(--color-fg-default, #1f2328);
2828
- }
2829
-
2830
- .text-input-dialog-field input {
2831
- padding: 8px 12px;
2832
- font-size: 14px;
2833
- border: 1px solid var(--color-border-default, #d1d9e0);
2834
- border-radius: 6px;
2835
- background: var(--color-bg-primary, #ffffff);
2836
- color: var(--color-fg-default, #1f2328);
2837
- outline: none;
2838
- width: 100%;
2839
- box-sizing: border-box;
2840
- }
2841
-
2842
- .text-input-dialog-field input:focus {
2843
- border-color: var(--color-accent-fg, #0969da);
2844
- box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
2845
- }
2846
-
2847
2706
  /* Status Indicator Styles */
2848
2707
  .status-indicator {
2849
2708
  display: none;
@@ -2921,43 +2780,6 @@ tr.newly-expanded .d2h-code-line-ctn {
2921
2780
  color: var(--color-text-secondary, #656d76);
2922
2781
  }
2923
2782
 
2924
- /* Dark theme adjustments for modal */
2925
- [data-theme="dark"] .modal-container {
2926
- background: var(--color-bg-primary);
2927
- border-color: var(--color-border-default);
2928
- }
2929
-
2930
- [data-theme="dark"] .modal-header {
2931
- border-color: var(--color-border-default);
2932
- }
2933
-
2934
- [data-theme="dark"] .modal-footer {
2935
- border-color: var(--color-border-default);
2936
- }
2937
-
2938
- [data-theme="dark"] .modal-close-btn:hover {
2939
- background: var(--color-bg-secondary);
2940
- }
2941
-
2942
- [data-theme="dark"] .modal-body {
2943
- color: var(--color-text-primary); /* Better contrast for dark mode */
2944
- }
2945
-
2946
- [data-theme="dark"] .text-input-dialog-field label {
2947
- color: var(--color-fg-default, #f0f6fc);
2948
- }
2949
-
2950
- [data-theme="dark"] .text-input-dialog-field input {
2951
- background: var(--color-bg-tertiary, #161b22);
2952
- border-color: var(--color-border-default, #30363d);
2953
- color: var(--color-fg-default, #f0f6fc);
2954
- }
2955
-
2956
- [data-theme="dark"] .text-input-dialog-field input:focus {
2957
- border-color: var(--color-accent-fg, #58a6ff);
2958
- box-shadow: 0 0 0 3px rgba(56, 139, 253, 0.3);
2959
- }
2960
-
2961
2783
  [data-theme="dark"] .status-indicator {
2962
2784
  background: var(--color-bg-primary);
2963
2785
  border-color: var(--color-border-primary);
@@ -9945,1548 +9767,6 @@ body.resizing * {
9945
9767
  background: var(--color-text-tertiary);
9946
9768
  }
9947
9769
 
9948
- /* ============================================
9949
- AI Analysis Configuration Modal
9950
- ============================================ */
9951
-
9952
- .analysis-config-overlay {
9953
- z-index: 1100;
9954
- }
9955
-
9956
- .analysis-config-overlay.visible {
9957
- opacity: 1;
9958
- }
9959
-
9960
- .analysis-config-overlay.visible .analysis-config-container {
9961
- transform: translateY(0) scale(1);
9962
- opacity: 1;
9963
- }
9964
-
9965
- .analysis-config-container {
9966
- width: 90vw;
9967
- max-width: min(900px, calc(100vw - 32px));
9968
- height: auto; /* Override fixed height from .modal-container */
9969
- max-height: min(90vh, calc(100vh - 32px));
9970
- display: flex;
9971
- flex-direction: column;
9972
- transform: translateY(8px) scale(0.98);
9973
- opacity: 0;
9974
- transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1),
9975
- opacity 0.2s ease-out;
9976
- border-radius: 12px;
9977
- overflow: hidden;
9978
- box-shadow:
9979
- 0 0 0 1px var(--color-border-primary),
9980
- 0 16px 70px -12px rgba(0, 0, 0, 0.35),
9981
- 0 4px 16px rgba(0, 0, 0, 0.1);
9982
- /* Ensure the dialog content is visible from the top */
9983
- margin: auto;
9984
- }
9985
-
9986
- [data-theme="dark"] .analysis-config-container {
9987
- box-shadow:
9988
- 0 0 0 1px var(--color-border-primary),
9989
- 0 16px 70px -12px rgba(0, 0, 0, 0.6),
9990
- 0 4px 16px rgba(0, 0, 0, 0.25);
9991
- }
9992
-
9993
- /* Header */
9994
- .analysis-config-header {
9995
- display: flex;
9996
- align-items: center;
9997
- justify-content: space-between;
9998
- padding: 16px 20px;
9999
- background: linear-gradient(135deg,
10000
- var(--color-bg-secondary) 0%,
10001
- var(--color-bg-tertiary) 100%);
10002
- border-bottom: 1px solid var(--color-border-primary);
10003
- }
10004
-
10005
- .header-title-section {
10006
- display: flex;
10007
- align-items: center;
10008
- gap: 12px;
10009
- }
10010
-
10011
- .header-icon {
10012
- display: flex;
10013
- align-items: center;
10014
- justify-content: center;
10015
- width: 40px;
10016
- height: 40px;
10017
- border-radius: 10px;
10018
- background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
10019
- color: white;
10020
- box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
10021
- }
10022
-
10023
- [data-theme="dark"] .header-icon {
10024
- background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
10025
- box-shadow: 0 2px 12px rgba(251, 191, 36, 0.25);
10026
- }
10027
-
10028
- .analysis-config-header h3 {
10029
- margin: 0;
10030
- font-size: 16px;
10031
- font-weight: 600;
10032
- color: var(--color-text-primary);
10033
- }
10034
-
10035
- .header-subtitle {
10036
- margin: 2px 0 0;
10037
- font-size: 12px;
10038
- color: var(--color-text-secondary);
10039
- }
10040
-
10041
- /* Body */
10042
- .analysis-config-body {
10043
- flex: 1;
10044
- overflow-y: auto;
10045
- padding: 20px;
10046
- background: var(--color-bg-primary);
10047
- position: relative;
10048
- }
10049
-
10050
- /* Loading overlay shown while providers are being fetched */
10051
- .config-loading-overlay {
10052
- position: absolute;
10053
- inset: 0;
10054
- display: flex;
10055
- flex-direction: column;
10056
- align-items: center;
10057
- justify-content: center;
10058
- gap: 12px;
10059
- background: var(--color-bg-primary);
10060
- z-index: 10;
10061
- color: var(--color-text-secondary);
10062
- font-size: 13px;
10063
- }
10064
-
10065
- .config-loading-spinner {
10066
- width: 24px;
10067
- height: 24px;
10068
- border: 2.5px solid var(--color-border-primary);
10069
- border-top-color: var(--color-text-link, #2f81f7);
10070
- border-radius: 50%;
10071
- animation: spin 0.8s linear infinite;
10072
- }
10073
-
10074
- /* Section styling */
10075
- .config-section {
10076
- margin-bottom: 20px;
10077
- }
10078
-
10079
- .config-section:last-child {
10080
- margin-bottom: 0;
10081
- }
10082
-
10083
- .section-title {
10084
- display: flex;
10085
- align-items: center;
10086
- gap: 8px;
10087
- margin: 0 0 10px;
10088
- font-size: 13px;
10089
- font-weight: 600;
10090
- color: var(--color-text-primary);
10091
- text-transform: uppercase;
10092
- letter-spacing: 0.03em;
10093
- }
10094
-
10095
- .section-hint {
10096
- font-weight: 400;
10097
- font-size: 11px;
10098
- color: var(--color-text-tertiary);
10099
- text-transform: none;
10100
- letter-spacing: 0;
10101
- }
10102
-
10103
- /* Provider Toggle */
10104
- .provider-toggle {
10105
- display: flex;
10106
- flex-wrap: wrap;
10107
- justify-content: center;
10108
- gap: 8px;
10109
- width: 100%;
10110
- max-width: 100%;
10111
- }
10112
-
10113
- .provider-btn {
10114
- display: inline-flex;
10115
- align-items: center;
10116
- gap: 6px;
10117
- padding: 10px 18px;
10118
- border: 2px solid var(--color-border-primary);
10119
- background: var(--color-bg-secondary);
10120
- color: var(--color-text-secondary);
10121
- font-size: 14px;
10122
- font-weight: 500;
10123
- border-radius: 10px;
10124
- cursor: pointer;
10125
- transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
10126
- white-space: nowrap;
10127
- }
10128
-
10129
- .provider-btn:hover {
10130
- border-color: var(--color-border-secondary);
10131
- background: var(--color-bg-tertiary);
10132
- color: var(--color-text-primary);
10133
- transform: translateY(-2px);
10134
- box-shadow: 0 4px 12px var(--color-shadow);
10135
- }
10136
-
10137
- .provider-btn.selected {
10138
- border-color: var(--color-accent-ai-dark);
10139
- background: rgba(245, 158, 11, 0.08);
10140
- color: var(--color-text-primary);
10141
- box-shadow:
10142
- 0 0 0 3px rgba(245, 158, 11, 0.15),
10143
- 0 4px 12px rgba(245, 158, 11, 0.1);
10144
- }
10145
-
10146
- [data-theme="dark"] .provider-btn.selected {
10147
- background: rgba(251, 191, 36, 0.1);
10148
- border-color: var(--color-accent-ai);
10149
- color: #fbbf24;
10150
- box-shadow:
10151
- 0 0 0 3px rgba(251, 191, 36, 0.15),
10152
- 0 4px 12px rgba(251, 191, 36, 0.08);
10153
- }
10154
-
10155
- /* No providers available message */
10156
- .no-providers-message {
10157
- font-size: 13px;
10158
- font-style: italic;
10159
- color: var(--color-text-muted);
10160
- padding: 8px 12px;
10161
- }
10162
-
10163
- /* Provider refresh button */
10164
- .provider-refresh-btn {
10165
- display: inline-flex;
10166
- align-items: center;
10167
- justify-content: center;
10168
- width: 22px;
10169
- height: 22px;
10170
- padding: 0;
10171
- margin-left: 4px;
10172
- border: none;
10173
- background: transparent;
10174
- color: var(--color-text-tertiary);
10175
- border-radius: 4px;
10176
- cursor: pointer;
10177
- transition: all 0.2s ease;
10178
- }
10179
-
10180
- .provider-refresh-btn:hover {
10181
- background: var(--color-bg-tertiary);
10182
- color: var(--color-text-secondary);
10183
- }
10184
-
10185
- .provider-refresh-btn:disabled {
10186
- cursor: not-allowed;
10187
- opacity: 0.5;
10188
- }
10189
-
10190
- .provider-refresh-btn.refreshing svg {
10191
- animation: spin 1s linear infinite;
10192
- }
10193
-
10194
- @keyframes spin {
10195
- from {
10196
- transform: rotate(0deg);
10197
- }
10198
- to {
10199
- transform: rotate(360deg);
10200
- }
10201
- }
10202
-
10203
- /* Model Cards */
10204
- .model-cards {
10205
- display: grid;
10206
- grid-template-columns: repeat(3, minmax(0, 220px));
10207
- gap: 12px;
10208
- justify-content: center;
10209
- }
10210
-
10211
- .model-card {
10212
- position: relative;
10213
- display: flex;
10214
- flex-direction: column;
10215
- align-items: center;
10216
- padding: 14px 10px;
10217
- background: var(--color-bg-secondary);
10218
- border: 2px solid var(--color-border-primary);
10219
- border-radius: 10px;
10220
- cursor: pointer;
10221
- transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
10222
- text-align: center;
10223
- aspect-ratio: 1.618 / 1;
10224
- overflow: hidden;
10225
- justify-content: center;
10226
- }
10227
-
10228
- .model-card:hover {
10229
- border-color: var(--color-border-secondary);
10230
- background: var(--color-bg-tertiary);
10231
- transform: translateY(-2px);
10232
- box-shadow: 0 4px 12px var(--color-shadow);
10233
- }
10234
-
10235
- .model-card.selected {
10236
- border-color: var(--color-accent-ai-dark);
10237
- background: rgba(245, 158, 11, 0.08);
10238
- box-shadow:
10239
- 0 0 0 3px rgba(245, 158, 11, 0.15),
10240
- 0 4px 12px rgba(245, 158, 11, 0.1);
10241
- }
10242
-
10243
- [data-theme="dark"] .model-card.selected {
10244
- background: rgba(251, 191, 36, 0.1);
10245
- border-color: var(--color-accent-ai);
10246
- box-shadow:
10247
- 0 0 0 3px rgba(251, 191, 36, 0.15),
10248
- 0 4px 12px rgba(251, 191, 36, 0.08);
10249
- }
10250
-
10251
- .model-badge {
10252
- position: absolute;
10253
- top: 8px;
10254
- right: 8px;
10255
- padding: 2px 8px;
10256
- font-size: 9px;
10257
- font-weight: 700;
10258
- text-transform: uppercase;
10259
- letter-spacing: 0.05em;
10260
- border-radius: 10px;
10261
- white-space: nowrap;
10262
- }
10263
-
10264
- .badge-speed {
10265
- background: linear-gradient(135deg, #06b6d4 0%, #0891b2 100%);
10266
- color: white;
10267
- }
10268
-
10269
- .badge-recommended {
10270
- background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
10271
- color: white;
10272
- }
10273
-
10274
- .badge-power {
10275
- background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
10276
- color: white;
10277
- }
10278
-
10279
- .badge-premium {
10280
- background: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
10281
- color: white;
10282
- }
10283
-
10284
- .badge-balanced {
10285
- background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
10286
- color: white;
10287
- }
10288
-
10289
- .model-icon {
10290
- font-size: 28px;
10291
- line-height: 1;
10292
- margin-bottom: 2px;
10293
- }
10294
-
10295
- .model-info {
10296
- display: flex;
10297
- flex-direction: column;
10298
- gap: 1px;
10299
- }
10300
-
10301
- .model-name {
10302
- font-size: 13px;
10303
- font-weight: 600;
10304
- color: var(--color-text-primary);
10305
- }
10306
-
10307
- .model-tagline {
10308
- font-size: 11px;
10309
- color: var(--color-text-secondary);
10310
- }
10311
-
10312
- .model-description {
10313
- margin: 4px 0 0;
10314
- font-size: 10px;
10315
- color: var(--color-text-tertiary);
10316
- line-height: 1.3;
10317
- }
10318
-
10319
- .model-selected-indicator {
10320
- position: absolute;
10321
- bottom: 8px;
10322
- right: 8px;
10323
- width: 20px;
10324
- height: 20px;
10325
- display: flex;
10326
- align-items: center;
10327
- justify-content: center;
10328
- background: var(--color-accent-ai-dark);
10329
- border-radius: 50%;
10330
- color: white;
10331
- opacity: 0;
10332
- transform: scale(0.5);
10333
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
10334
- }
10335
-
10336
- [data-theme="dark"] .model-selected-indicator {
10337
- background: var(--color-accent-ai);
10338
- color: #1a1a1a;
10339
- }
10340
-
10341
- .model-card.selected .model-selected-indicator {
10342
- opacity: 1;
10343
- transform: scale(1);
10344
- }
10345
-
10346
- /* Remember toggle */
10347
- .remember-toggle {
10348
- display: flex;
10349
- align-items: center;
10350
- gap: 10px;
10351
- margin-top: 12px;
10352
- cursor: pointer;
10353
- font-size: 12px;
10354
- color: var(--color-text-secondary);
10355
- user-select: none;
10356
- }
10357
-
10358
- .remember-toggle input {
10359
- display: none;
10360
- }
10361
-
10362
- .toggle-switch {
10363
- position: relative;
10364
- width: 36px;
10365
- height: 20px;
10366
- background: var(--color-border-primary);
10367
- border-radius: 10px;
10368
- transition: background 0.2s ease;
10369
- flex-shrink: 0;
10370
- }
10371
-
10372
- .toggle-switch::after {
10373
- content: '';
10374
- position: absolute;
10375
- top: 2px;
10376
- left: 2px;
10377
- width: 16px;
10378
- height: 16px;
10379
- background: white;
10380
- border-radius: 50%;
10381
- transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
10382
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
10383
- }
10384
-
10385
- .remember-toggle input:checked + .toggle-switch {
10386
- background: var(--color-accent-ai-dark);
10387
- }
10388
-
10389
- [data-theme="dark"] .remember-toggle input:checked + .toggle-switch {
10390
- background: var(--color-accent-ai);
10391
- }
10392
-
10393
- .remember-toggle input:checked + .toggle-switch::after {
10394
- transform: translateX(16px);
10395
- }
10396
-
10397
- .toggle-label {
10398
- line-height: 1.4;
10399
- }
10400
-
10401
- /* Skip Level 3 Info */
10402
- .skip-level3-info {
10403
- display: flex;
10404
- align-items: flex-start;
10405
- gap: 8px;
10406
- margin-bottom: 12px;
10407
- padding: 8px 12px;
10408
- background: var(--color-accent-light);
10409
- border-radius: 6px;
10410
- font-size: 12px;
10411
- color: var(--color-info);
10412
- line-height: 1.4;
10413
- }
10414
-
10415
- .skip-level3-info svg {
10416
- flex-shrink: 0;
10417
- margin-top: 1px;
10418
- color: var(--color-info);
10419
- }
10420
-
10421
- /* Preset Chips */
10422
- .preset-chips {
10423
- display: flex;
10424
- flex-wrap: wrap;
10425
- gap: 8px;
10426
- }
10427
-
10428
- .preset-chip {
10429
- display: inline-flex;
10430
- align-items: center;
10431
- gap: 6px;
10432
- padding: 8px 14px;
10433
- background: var(--color-bg-secondary);
10434
- border: 1px solid var(--color-border-primary);
10435
- border-radius: 20px;
10436
- font-size: 13px;
10437
- color: var(--color-text-secondary);
10438
- cursor: pointer;
10439
- transition: all var(--transition-fast);
10440
- user-select: none;
10441
- }
10442
-
10443
- .preset-chip:hover {
10444
- background: var(--color-bg-tertiary);
10445
- border-color: var(--color-border-secondary);
10446
- color: var(--color-text-primary);
10447
- }
10448
-
10449
- .preset-chip.active {
10450
- background: rgba(245, 158, 11, 0.12);
10451
- border-color: var(--color-accent-ai-dark);
10452
- color: #b45309;
10453
- }
10454
-
10455
- [data-theme="dark"] .preset-chip.active {
10456
- background: rgba(251, 191, 36, 0.12);
10457
- border-color: var(--color-accent-ai);
10458
- color: #fcd34d;
10459
- }
10460
-
10461
- .preset-label {
10462
- font-weight: 500;
10463
- }
10464
-
10465
- /* Instructions Container */
10466
- .instructions-container {
10467
- display: flex;
10468
- flex-direction: column;
10469
- gap: 4px;
10470
- }
10471
-
10472
- .repo-instructions-banner {
10473
- display: flex;
10474
- align-items: center;
10475
- gap: 10px;
10476
- padding: 10px 12px;
10477
- background: var(--color-bg-tertiary);
10478
- border: 1px solid var(--color-border-primary);
10479
- border-radius: 8px;
10480
- }
10481
-
10482
- .banner-icon {
10483
- display: flex;
10484
- align-items: center;
10485
- justify-content: center;
10486
- width: 24px;
10487
- height: 24px;
10488
- background: var(--color-accent-light);
10489
- border-radius: 6px;
10490
- color: var(--color-accent-primary);
10491
- flex-shrink: 0;
10492
- }
10493
-
10494
- .banner-content {
10495
- flex: 1;
10496
- display: flex;
10497
- align-items: center;
10498
- justify-content: space-between;
10499
- gap: 12px;
10500
- }
10501
-
10502
- .banner-label {
10503
- font-size: 12px;
10504
- color: var(--color-text-secondary);
10505
- }
10506
-
10507
- .banner-toggle {
10508
- display: inline-flex;
10509
- align-items: center;
10510
- gap: 4px;
10511
- padding: 4px 10px;
10512
- background: transparent;
10513
- border: 1px solid var(--color-border-primary);
10514
- border-radius: 6px;
10515
- font-size: 11px;
10516
- font-weight: 500;
10517
- color: var(--color-text-secondary);
10518
- cursor: pointer;
10519
- transition: all var(--transition-fast);
10520
- }
10521
-
10522
- .banner-toggle:hover {
10523
- background: var(--color-bg-secondary);
10524
- border-color: var(--color-border-secondary);
10525
- color: var(--color-text-primary);
10526
- }
10527
-
10528
- .repo-instructions-expanded {
10529
- background: var(--color-bg-tertiary);
10530
- border: 1px solid var(--color-border-primary);
10531
- border-radius: 8px;
10532
- overflow: hidden;
10533
- }
10534
-
10535
- .expanded-header {
10536
- display: flex;
10537
- align-items: center;
10538
- justify-content: space-between;
10539
- padding: 8px 12px;
10540
- background: var(--color-bg-secondary);
10541
- border-bottom: 1px solid var(--color-border-primary);
10542
- font-size: 11px;
10543
- font-weight: 600;
10544
- color: var(--color-text-secondary);
10545
- text-transform: uppercase;
10546
- letter-spacing: 0.03em;
10547
- }
10548
-
10549
- .collapse-btn {
10550
- display: flex;
10551
- align-items: center;
10552
- justify-content: center;
10553
- width: 24px;
10554
- height: 24px;
10555
- background: transparent;
10556
- border: none;
10557
- border-radius: 4px;
10558
- color: var(--color-text-tertiary);
10559
- cursor: pointer;
10560
- transition: all var(--transition-fast);
10561
- }
10562
-
10563
- .collapse-btn:hover {
10564
- background: var(--color-bg-tertiary);
10565
- color: var(--color-text-secondary);
10566
- }
10567
-
10568
- .expanded-content {
10569
- padding: 12px;
10570
- font-size: 13px;
10571
- color: var(--color-text-secondary);
10572
- line-height: 1.5;
10573
- white-space: pre-wrap;
10574
- }
10575
-
10576
- .instructions-textarea {
10577
- width: 100%;
10578
- padding: 12px;
10579
- background: var(--color-bg-secondary);
10580
- border: 1px solid var(--color-border-primary);
10581
- border-radius: 8px;
10582
- font-family: inherit;
10583
- font-size: 13px;
10584
- color: var(--color-text-primary);
10585
- resize: vertical;
10586
- min-height: 100px;
10587
- transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
10588
- }
10589
-
10590
- .instructions-textarea::placeholder {
10591
- color: var(--color-text-tertiary);
10592
- opacity: 0.8;
10593
- }
10594
-
10595
- .instructions-textarea:focus {
10596
- outline: none;
10597
- border-color: var(--color-accent-ai-dark);
10598
- box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.15);
10599
- }
10600
-
10601
- [data-theme="dark"] .instructions-textarea:focus {
10602
- border-color: var(--color-accent-ai);
10603
- box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.15);
10604
- }
10605
-
10606
- .instructions-footer {
10607
- display: flex;
10608
- justify-content: flex-end;
10609
- }
10610
-
10611
- .char-count {
10612
- font-size: 11px;
10613
- color: var(--color-text-muted);
10614
- transition: color 0.2s ease;
10615
- }
10616
-
10617
- .char-count-warning {
10618
- color: #d97706;
10619
- font-weight: 500;
10620
- }
10621
-
10622
- [data-theme="dark"] .char-count-warning {
10623
- color: var(--color-accent-ai);
10624
- }
10625
-
10626
- .char-count-error {
10627
- color: #dc2626;
10628
- font-weight: 600;
10629
- }
10630
-
10631
- [data-theme="dark"] .char-count-error {
10632
- color: #f87171;
10633
- }
10634
-
10635
- /* Textarea validation states */
10636
- .instructions-textarea.textarea-warning {
10637
- border-color: #d97706;
10638
- }
10639
-
10640
- [data-theme="dark"] .instructions-textarea.textarea-warning {
10641
- border-color: var(--color-accent-ai);
10642
- }
10643
-
10644
- .instructions-textarea.textarea-error {
10645
- border-color: #dc2626;
10646
- box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);
10647
- }
10648
-
10649
- [data-theme="dark"] .instructions-textarea.textarea-error {
10650
- border-color: #f87171;
10651
- box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15);
10652
- }
10653
-
10654
- /* Disabled submit button state */
10655
- .btn-analyze:disabled {
10656
- background: linear-gradient(135deg, #9ca3af 0%, #6b7280 100%);
10657
- cursor: not-allowed;
10658
- box-shadow: none;
10659
- opacity: 0.7;
10660
- }
10661
-
10662
- .btn-analyze:disabled:hover {
10663
- background: linear-gradient(135deg, #9ca3af 0%, #6b7280 100%);
10664
- transform: none;
10665
- }
10666
-
10667
- /* Footer */
10668
- .analysis-config-footer {
10669
- display: flex;
10670
- justify-content: flex-end;
10671
- align-items: center;
10672
- gap: 10px;
10673
- padding: 16px 20px;
10674
- background: var(--color-bg-secondary);
10675
- border-top: 1px solid var(--color-border-primary);
10676
- }
10677
-
10678
- /* Unsaved council changes hint + footer save button container */
10679
- .council-footer-left {
10680
- display: flex;
10681
- align-items: center;
10682
- gap: 10px;
10683
- margin-right: auto;
10684
- }
10685
-
10686
- .council-dirty-hint {
10687
- font-size: 12px;
10688
- color: var(--color-accent-primary, #0969da);
10689
- font-style: italic;
10690
- }
10691
-
10692
- [data-theme="dark"] .council-dirty-hint {
10693
- color: var(--color-accent-primary, #58a6ff);
10694
- }
10695
-
10696
- /* Blue save button for council footer */
10697
- .btn-save-council {
10698
- background-color: var(--color-accent-primary, #0969da);
10699
- color: #ffffff;
10700
- border-color: var(--color-accent-primary, #0969da);
10701
- }
10702
-
10703
- .btn-save-council:hover {
10704
- background-color: #0860ca;
10705
- border-color: #0860ca;
10706
- }
10707
-
10708
- [data-theme="dark"] .btn-save-council {
10709
- background-color: var(--color-accent-primary, #58a6ff);
10710
- border-color: var(--color-accent-primary, #58a6ff);
10711
- color: #ffffff;
10712
- }
10713
-
10714
- [data-theme="dark"] .btn-save-council:hover {
10715
- background-color: #79b8ff;
10716
- border-color: #79b8ff;
10717
- }
10718
-
10719
- .btn-analyze {
10720
- display: inline-flex;
10721
- align-items: center;
10722
- gap: 8px;
10723
- padding: 10px 20px;
10724
- background: linear-gradient(135deg, var(--color-accent-ai-dark) 0%, #d97706 100%);
10725
- border: none;
10726
- border-radius: 8px;
10727
- font-size: 14px;
10728
- font-weight: 600;
10729
- color: white;
10730
- cursor: pointer;
10731
- transition: all 0.2s ease;
10732
- box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
10733
- }
10734
-
10735
- .btn-analyze:hover {
10736
- background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
10737
- transform: translateY(-1px);
10738
- box-shadow: 0 4px 12px rgba(245, 158, 11, 0.35);
10739
- }
10740
-
10741
- .btn-analyze:active {
10742
- transform: translateY(0);
10743
- }
10744
-
10745
- [data-theme="dark"] .btn-analyze {
10746
- background: linear-gradient(135deg, var(--color-accent-ai) 0%, var(--color-accent-ai-dark) 100%);
10747
- color: #1a1a1a;
10748
- box-shadow: 0 2px 12px rgba(251, 191, 36, 0.25);
10749
- }
10750
-
10751
- [data-theme="dark"] .btn-analyze:hover {
10752
- box-shadow: 0 4px 16px rgba(251, 191, 36, 0.3);
10753
- }
10754
-
10755
- /* Responsive */
10756
- @media (max-width: 600px) {
10757
- .analysis-config-container {
10758
- width: 100%;
10759
- max-width: none;
10760
- max-height: 100vh;
10761
- border-radius: 0;
10762
- }
10763
-
10764
- .model-cards {
10765
- grid-template-columns: 1fr;
10766
- }
10767
-
10768
- .model-card {
10769
- flex-direction: row;
10770
- text-align: left;
10771
- padding: 12px 16px;
10772
- gap: 12px;
10773
- aspect-ratio: auto;
10774
- overflow: visible;
10775
- justify-content: flex-start;
10776
- }
10777
-
10778
- .model-icon {
10779
- font-size: 24px;
10780
- margin-bottom: 0;
10781
- }
10782
-
10783
- .model-info {
10784
- flex: 1;
10785
- }
10786
-
10787
- .model-description {
10788
- margin-top: 4px;
10789
- }
10790
-
10791
- .model-badge {
10792
- position: static;
10793
- align-self: flex-start;
10794
- margin-left: auto;
10795
- }
10796
-
10797
- .model-selected-indicator {
10798
- position: static;
10799
- margin-left: 8px;
10800
- }
10801
-
10802
- .preset-chips {
10803
- gap: 6px;
10804
- }
10805
-
10806
- .preset-chip {
10807
- padding: 6px 12px;
10808
- font-size: 12px;
10809
- }
10810
- }
10811
-
10812
- /* ==========================================================================
10813
- Review Council Tab
10814
- Multi-voice, multi-provider analysis configuration
10815
- ========================================================================== */
10816
-
10817
- .analysis-tab-bar {
10818
- display: flex;
10819
- gap: 0;
10820
- border-bottom: 1px solid var(--border-color, #d0d7de);
10821
- margin-bottom: 16px;
10822
- }
10823
-
10824
- .analysis-tab {
10825
- padding: 8px 16px;
10826
- border: none;
10827
- background: none;
10828
- cursor: pointer;
10829
- font-size: 13px;
10830
- font-weight: 500;
10831
- color: var(--fg-muted, #656d76);
10832
- border-bottom: 2px solid transparent;
10833
- transition: color 0.15s, border-color 0.15s;
10834
- }
10835
-
10836
- .analysis-tab:hover {
10837
- color: var(--fg-default, #1f2328);
10838
- }
10839
-
10840
- .analysis-tab.active {
10841
- color: var(--fg-default, #1f2328);
10842
- border-bottom-color: var(--accent-emphasis, #0969da);
10843
- }
10844
-
10845
- [data-theme="dark"] .analysis-tab {
10846
- color: #8b949e;
10847
- }
10848
-
10849
- [data-theme="dark"] .analysis-tab:hover {
10850
- color: #c9d1d9;
10851
- }
10852
-
10853
- [data-theme="dark"] .analysis-tab.active {
10854
- color: #c9d1d9;
10855
- border-bottom-color: #58a6ff;
10856
- }
10857
-
10858
- .beta-badge {
10859
- display: inline-block;
10860
- font-size: 10px;
10861
- font-weight: 600;
10862
- text-transform: uppercase;
10863
- letter-spacing: 0.5px;
10864
- padding: 1px 5px;
10865
- border-radius: 3px;
10866
- background-color: var(--accent-subtle, #ddf4ff);
10867
- color: var(--accent-fg, #0969da);
10868
- margin-left: 4px;
10869
- vertical-align: middle;
10870
- }
10871
-
10872
- [data-theme="dark"] .beta-badge {
10873
- background-color: transparent;
10874
- color: #8b949e;
10875
- border: 1px solid #30363d;
10876
- }
10877
-
10878
- .council-selector-row {
10879
- display: flex;
10880
- gap: 8px;
10881
- align-items: center;
10882
- }
10883
-
10884
- .council-select {
10885
- flex: 1;
10886
- padding: 6px 10px;
10887
- border: 1px solid var(--border-color, #d0d7de);
10888
- border-radius: 6px;
10889
- background: var(--bg-default, #fff);
10890
- color: var(--fg-default, #1f2328);
10891
- font-size: 13px;
10892
- }
10893
-
10894
- [data-theme="dark"] .council-select {
10895
- background: var(--bg-subtle, #161b22);
10896
- color: var(--fg-default, #e6edf3);
10897
- border-color: var(--border-color, #30363d);
10898
- }
10899
-
10900
- /* "New Council" option in council selector */
10901
- .council-option-new {
10902
- font-style: italic;
10903
- color: var(--fg-muted, #656d76);
10904
- }
10905
-
10906
- /* Style the select itself when "New Council" is the active selection */
10907
- .council-select.new-council-selected {
10908
- font-style: italic;
10909
- color: var(--fg-muted, #656d76);
10910
- }
10911
-
10912
- /* Council review divider - separates council config from per-review settings */
10913
- .council-review-divider {
10914
- margin: 24px 0 16px;
10915
- padding-top: 20px;
10916
- border-top: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
10917
- }
10918
-
10919
- [data-theme="dark"] .council-review-divider {
10920
- border-top-color: var(--color-border-subtle, rgba(255, 255, 255, 0.06));
10921
- }
10922
-
10923
- .divider-label {
10924
- font-size: 12px;
10925
- font-weight: 500;
10926
- color: var(--color-text-tertiary, #656d76);
10927
- text-transform: uppercase;
10928
- letter-spacing: 0.5px;
10929
- }
10930
-
10931
- [data-theme="dark"] .divider-label {
10932
- color: var(--color-text-tertiary, #6e7681);
10933
- }
10934
-
10935
- .council-level-section .section-title {
10936
- margin-bottom: 8px;
10937
- }
10938
-
10939
- .level-toggle {
10940
- font-weight: 600;
10941
- }
10942
-
10943
- .level-toggle .toggle-label {
10944
- font-weight: 600;
10945
- }
10946
-
10947
- .level-voices {
10948
- margin-left: 24px;
10949
- margin-top: 8px;
10950
- }
10951
-
10952
- .voice-list {
10953
- display: flex;
10954
- flex-direction: column;
10955
- gap: 6px;
10956
- }
10957
-
10958
- .voice-row {
10959
- display: flex;
10960
- gap: 8px;
10961
- align-items: center;
10962
- }
10963
-
10964
- .voice-provider,
10965
- .voice-model,
10966
- .voice-tier {
10967
- padding: 5px 8px;
10968
- border: 1px solid var(--border-color, #d0d7de);
10969
- border-radius: 6px;
10970
- background: var(--bg-default, #fff);
10971
- color: var(--fg-default, #1f2328);
10972
- font-size: 12px;
10973
- }
10974
-
10975
- [data-theme="dark"] .voice-provider,
10976
- [data-theme="dark"] .voice-model,
10977
- [data-theme="dark"] .voice-tier {
10978
- background: var(--bg-subtle, #161b22);
10979
- color: var(--fg-default, #e6edf3);
10980
- border-color: var(--border-color, #30363d);
10981
- }
10982
-
10983
- .voice-provider {
10984
- min-width: 100px;
10985
- }
10986
-
10987
- .voice-model {
10988
- min-width: 140px;
10989
- flex: 1;
10990
- }
10991
-
10992
- .voice-tier {
10993
- min-width: 90px;
10994
- }
10995
-
10996
- .executable-note {
10997
- font-size: 11px;
10998
- color: var(--fg-muted, #656d76);
10999
- font-style: italic;
11000
- white-space: nowrap;
11001
- }
11002
-
11003
- .vc-levels-disabled-note {
11004
- margin-top: 12px;
11005
- margin-bottom: 0;
11006
- }
11007
-
11008
- .btn-icon {
11009
- box-sizing: border-box;
11010
- width: 28px;
11011
- height: 28px;
11012
- padding: 0;
11013
- display: inline-flex;
11014
- align-items: center;
11015
- justify-content: center;
11016
- font-size: 16px;
11017
- line-height: 1;
11018
- border-radius: 6px;
11019
- border: 1px solid var(--border-color, #d0d7de);
11020
- background: var(--bg-default, #fff);
11021
- color: var(--fg-muted, #656d76);
11022
- cursor: pointer;
11023
- }
11024
-
11025
- .btn-icon:hover {
11026
- color: var(--color-text-primary);
11027
- border-color: var(--color-border-secondary);
11028
- }
11029
-
11030
- .btn-ghost {
11031
- background: none;
11032
- border: none;
11033
- color: var(--accent-fg, #0969da);
11034
- cursor: pointer;
11035
- font-size: 12px;
11036
- padding: 4px 8px;
11037
- }
11038
-
11039
- .btn-ghost:hover {
11040
- text-decoration: underline;
11041
- }
11042
-
11043
- .btn-sm {
11044
- font-size: 12px;
11045
- padding: 4px 10px;
11046
- }
11047
-
11048
- .add-voice-btn {
11049
- margin-top: 6px;
11050
- }
11051
-
11052
- .add-voice-btn:hover {
11053
- color: var(--color-accent-primary, #0969da);
11054
- border-color: var(--color-accent-primary, #0969da);
11055
- }
11056
-
11057
- .section-hint-text {
11058
- font-size: 12px;
11059
- color: var(--fg-muted, #656d76);
11060
- margin-bottom: 8px;
11061
- margin-top: -4px;
11062
- }
11063
-
11064
- .voice-instructions-area {
11065
- margin-left: 0;
11066
- margin-bottom: 4px;
11067
- }
11068
-
11069
- .voice-instructions-input {
11070
- width: 100%;
11071
- padding: 6px 8px;
11072
- border: 1px solid var(--border-color, #d0d7de);
11073
- border-radius: 6px;
11074
- background: var(--bg-default, #fff);
11075
- color: var(--fg-default, #1f2328);
11076
- font-size: 12px;
11077
- font-family: inherit;
11078
- resize: vertical;
11079
- }
11080
-
11081
- [data-theme="dark"] .voice-instructions-input {
11082
- background: var(--bg-subtle, #161b22);
11083
- color: var(--fg-default, #e6edf3);
11084
- border-color: var(--border-color, #30363d);
11085
- }
11086
-
11087
- /* Icon-only toggle for per-participant instructions */
11088
- .toggle-instructions-icon {
11089
- width: 24px;
11090
- height: 24px;
11091
- padding: 0;
11092
- display: inline-flex;
11093
- align-items: center;
11094
- justify-content: center;
11095
- background: none;
11096
- border: 1px solid transparent;
11097
- border-radius: 4px;
11098
- color: var(--color-text-tertiary, #6e7681);
11099
- cursor: pointer;
11100
- flex-shrink: 0;
11101
- transition: color 0.15s ease, border-color 0.15s ease;
11102
- }
11103
-
11104
- .toggle-instructions-icon:hover {
11105
- color: var(--color-accent-primary, #0969da);
11106
- border-color: var(--color-border-secondary, #d0d7de);
11107
- }
11108
-
11109
- .toggle-instructions-icon.has-instructions {
11110
- color: var(--color-accent-primary, #0969da);
11111
- }
11112
-
11113
- [data-theme="dark"] .toggle-instructions-icon {
11114
- color: var(--color-text-tertiary, #484f58);
11115
- }
11116
-
11117
- [data-theme="dark"] .toggle-instructions-icon:hover {
11118
- color: var(--color-accent-primary, #58a6ff);
11119
- border-color: var(--color-border-primary, #30363d);
11120
- }
11121
-
11122
- [data-theme="dark"] .toggle-instructions-icon.has-instructions {
11123
- color: var(--color-accent-primary, #58a6ff);
11124
- }
11125
-
11126
- /* Icon-only toggle for per-voice timeout (clock icon) */
11127
- .toggle-timeout-icon {
11128
- width: 24px;
11129
- height: 24px;
11130
- padding: 0;
11131
- display: inline-flex;
11132
- align-items: center;
11133
- justify-content: center;
11134
- background: none;
11135
- border: 1px solid transparent;
11136
- border-radius: 4px;
11137
- color: var(--color-text-tertiary, #6e7681);
11138
- cursor: pointer;
11139
- flex-shrink: 0;
11140
- transition: color 0.15s ease, border-color 0.15s ease;
11141
- }
11142
-
11143
- .toggle-timeout-icon:hover {
11144
- color: var(--color-accent-primary, #0969da);
11145
- border-color: var(--color-border-secondary, #d0d7de);
11146
- }
11147
-
11148
- .toggle-timeout-icon.has-custom-timeout {
11149
- color: var(--color-attention-fg, #9a6700);
11150
- }
11151
-
11152
- [data-theme="dark"] .toggle-timeout-icon {
11153
- color: var(--color-text-tertiary, #484f58);
11154
- }
11155
-
11156
- [data-theme="dark"] .toggle-timeout-icon:hover {
11157
- color: var(--color-accent-primary, #58a6ff);
11158
- border-color: var(--color-border-primary, #30363d);
11159
- }
11160
-
11161
- [data-theme="dark"] .toggle-timeout-icon.has-custom-timeout {
11162
- color: var(--color-attention-fg, #d29922);
11163
- }
11164
-
11165
- /* Custom timeout dropdown selector (replaces native <select> for timeouts) */
11166
- .timeout-select {
11167
- position: relative;
11168
- display: inline-flex;
11169
- flex-shrink: 0;
11170
- }
11171
-
11172
- .timeout-select-trigger {
11173
- display: inline-flex;
11174
- align-items: center;
11175
- gap: 4px;
11176
- padding: 4px 8px;
11177
- border: 1px solid var(--border-color, #d0d7de);
11178
- border-radius: 6px;
11179
- background: var(--bg-default, #fff);
11180
- color: var(--fg-default, #1f2328);
11181
- font-size: 12px;
11182
- font-family: inherit;
11183
- font-weight: 500;
11184
- cursor: pointer;
11185
- white-space: nowrap;
11186
- transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
11187
- min-width: 52px;
11188
- justify-content: center;
11189
- line-height: 1.4;
11190
- }
11191
-
11192
- .timeout-select-trigger:hover {
11193
- border-color: var(--color-accent-primary, #0969da);
11194
- background: var(--bg-subtle, #f6f8fa);
11195
- }
11196
-
11197
- .timeout-select.open .timeout-select-trigger {
11198
- border-color: var(--color-accent-primary, #0969da);
11199
- box-shadow: 0 0 0 2px rgba(9, 105, 218, 0.15);
11200
- }
11201
-
11202
- .timeout-select-label {
11203
- pointer-events: none;
11204
- }
11205
-
11206
- .timeout-select-caret {
11207
- flex-shrink: 0;
11208
- transition: transform 0.15s ease;
11209
- pointer-events: none;
11210
- }
11211
-
11212
- .timeout-select.open .timeout-select-caret {
11213
- transform: rotate(180deg);
11214
- }
11215
-
11216
- /* Dropdown menu */
11217
- .timeout-select-menu {
11218
- display: none;
11219
- position: absolute;
11220
- top: calc(100% + 4px);
11221
- left: 50%;
11222
- transform: translateX(-50%);
11223
- min-width: 64px;
11224
- background: var(--bg-default, #fff);
11225
- border: 1px solid var(--border-color, #d0d7de);
11226
- border-radius: 8px;
11227
- box-shadow: 0 4px 12px rgba(27, 31, 36, 0.12), 0 1px 3px rgba(27, 31, 36, 0.08);
11228
- z-index: 1100;
11229
- padding: 4px;
11230
- flex-direction: column;
11231
- }
11232
-
11233
- .timeout-select.open .timeout-select-menu {
11234
- display: flex;
11235
- }
11236
-
11237
- /* Individual option */
11238
- .timeout-select-option {
11239
- display: flex;
11240
- align-items: center;
11241
- justify-content: center;
11242
- padding: 5px 10px;
11243
- border: none;
11244
- border-radius: 5px;
11245
- background: transparent;
11246
- color: var(--fg-default, #1f2328);
11247
- font-size: 12px;
11248
- font-family: inherit;
11249
- font-weight: 500;
11250
- cursor: pointer;
11251
- white-space: nowrap;
11252
- transition: background 0.1s ease, color 0.1s ease;
11253
- }
11254
-
11255
- .timeout-select-option:hover,
11256
- .timeout-select-option.focused {
11257
- background: var(--bg-subtle, #f6f8fa);
11258
- }
11259
-
11260
- .timeout-select-option.selected {
11261
- color: var(--color-accent-primary, #0969da);
11262
- background: rgba(9, 105, 218, 0.08);
11263
- font-weight: 600;
11264
- }
11265
-
11266
- .timeout-select-option.selected:hover,
11267
- .timeout-select-option.selected.focused {
11268
- background: rgba(9, 105, 218, 0.14);
11269
- }
11270
-
11271
- /* Dark theme overrides */
11272
- [data-theme="dark"] .timeout-select-trigger {
11273
- background: var(--bg-subtle, #161b22);
11274
- color: var(--fg-default, #e6edf3);
11275
- border-color: var(--border-color, #30363d);
11276
- }
11277
-
11278
- [data-theme="dark"] .timeout-select-trigger:hover {
11279
- border-color: var(--color-accent-primary, #58a6ff);
11280
- background: var(--color-bg-tertiary, #1c2128);
11281
- }
11282
-
11283
- [data-theme="dark"] .timeout-select.open .timeout-select-trigger {
11284
- border-color: var(--color-accent-primary, #58a6ff);
11285
- box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.15);
11286
- }
11287
-
11288
- [data-theme="dark"] .timeout-select-menu {
11289
- background: var(--bg-subtle, #161b22);
11290
- border-color: var(--border-color, #30363d);
11291
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.2);
11292
- }
11293
-
11294
- [data-theme="dark"] .timeout-select-option {
11295
- color: var(--fg-default, #e6edf3);
11296
- }
11297
-
11298
- [data-theme="dark"] .timeout-select-option:hover,
11299
- [data-theme="dark"] .timeout-select-option.focused {
11300
- background: rgba(255, 255, 255, 0.06);
11301
- }
11302
-
11303
- [data-theme="dark"] .timeout-select-option.selected {
11304
- color: var(--color-accent-primary, #58a6ff);
11305
- background: rgba(88, 166, 255, 0.1);
11306
- }
11307
-
11308
- [data-theme="dark"] .timeout-select-option.selected:hover,
11309
- [data-theme="dark"] .timeout-select-option.selected.focused {
11310
- background: rgba(88, 166, 255, 0.16);
11311
- }
11312
-
11313
- /* Participant card layout (item 4) */
11314
- .participant-wrapper {
11315
- display: flex;
11316
- flex-direction: row;
11317
- gap: 8px;
11318
- align-items: flex-start;
11319
- }
11320
-
11321
- .participant-card {
11322
- flex: 1;
11323
- border: 1px solid var(--border-color, #d0d7de);
11324
- border-radius: 8px;
11325
- padding: 10px;
11326
- display: flex;
11327
- flex-direction: column;
11328
- gap: 6px;
11329
- background: var(--bg-default, #fff);
11330
- }
11331
-
11332
- [data-theme="dark"] .participant-card {
11333
- border-color: var(--border-color, #30363d);
11334
- background: var(--bg-subtle, #161b22);
11335
- }
11336
-
11337
- .participant-card .voice-row {
11338
- margin: 0;
11339
- }
11340
-
11341
- .participant-card .voice-instructions-area {
11342
- margin: 0;
11343
- }
11344
-
11345
- /* Orchestration/consolidation card — same styling as participant-card */
11346
- .orchestration-card {
11347
- border: 1px solid var(--border-color, #d0d7de);
11348
- border-radius: 8px;
11349
- padding: 10px;
11350
- display: flex;
11351
- flex-direction: column;
11352
- gap: 6px;
11353
- background: var(--bg-default, #fff);
11354
- }
11355
-
11356
- [data-theme="dark"] .orchestration-card {
11357
- border-color: var(--border-color, #30363d);
11358
- background: var(--bg-subtle, #161b22);
11359
- }
11360
-
11361
- .orchestration-card .voice-row {
11362
- margin: 0;
11363
- }
11364
-
11365
- .orchestration-card .voice-instructions-area {
11366
- margin: 0;
11367
- }
11368
-
11369
- .participant-wrapper > .remove-voice-btn {
11370
- flex-shrink: 0;
11371
- margin-top: 10px;
11372
- }
11373
-
11374
- /* Spacer to align consolidation row with level voice rows that have a remove button */
11375
- .participant-wrapper > .remove-voice-btn-spacer {
11376
- flex-shrink: 0;
11377
- width: 28px; /* matches .btn-icon width */
11378
- }
11379
-
11380
- /* Dark mode overrides for council +/- icon buttons */
11381
- [data-theme="dark"] .btn-icon {
11382
- background: var(--color-bg-tertiary, #1c2128);
11383
- border-color: var(--color-border-primary, #30363d);
11384
- color: var(--color-text-secondary, #8b949e);
11385
- }
11386
-
11387
- [data-theme="dark"] .btn-icon:hover {
11388
- background: var(--color-bg-elevated, #1e2329);
11389
- color: var(--color-text-primary, #e6edf3);
11390
- border-color: var(--color-border-secondary, #484f58);
11391
- }
11392
-
11393
- [data-theme="dark"] .add-voice-btn {
11394
- color: var(--color-text-secondary, #8b949e);
11395
- }
11396
-
11397
- [data-theme="dark"] .add-voice-btn:hover {
11398
- color: var(--color-accent-primary, #58a6ff);
11399
- border-color: var(--color-accent-primary, #58a6ff);
11400
- }
11401
-
11402
- /* Disabled button styles for council selector row (item 6) */
11403
- .council-selector-row .btn:disabled {
11404
- opacity: 0.5;
11405
- cursor: not-allowed;
11406
- }
11407
-
11408
- /* Icon-only danger button (e.g. delete council) */
11409
- .btn-icon-danger {
11410
- background: none;
11411
- border: 1px solid transparent;
11412
- color: var(--fg-muted, #656d76);
11413
- padding: 4px 6px;
11414
- border-radius: 6px;
11415
- cursor: pointer;
11416
- display: inline-flex;
11417
- align-items: center;
11418
- justify-content: center;
11419
- transition: color 0.15s, background 0.15s;
11420
- }
11421
-
11422
- .btn-icon-danger:hover:not(:disabled) {
11423
- color: var(--danger-fg, #d1242f);
11424
- background: var(--color-danger-subtle, rgba(255, 129, 130, 0.1));
11425
- }
11426
-
11427
- .btn-icon-danger:disabled {
11428
- opacity: 0.4;
11429
- cursor: not-allowed;
11430
- }
11431
-
11432
- [data-theme="dark"] .btn-icon-danger {
11433
- color: var(--color-text-secondary, #8b949e);
11434
- }
11435
-
11436
- [data-theme="dark"] .btn-icon-danger:hover:not(:disabled) {
11437
- color: var(--color-danger, #f85149);
11438
- background: rgba(248, 81, 73, 0.1);
11439
- }
11440
-
11441
- /* Info-tip toggle buttons (circled "i" icons next to section headers) */
11442
- .info-tip-toggle {
11443
- display: inline-flex;
11444
- align-items: center;
11445
- justify-content: center;
11446
- width: 18px;
11447
- height: 18px;
11448
- padding: 0;
11449
- border: none;
11450
- border-radius: 50%;
11451
- background: none;
11452
- color: var(--color-text-tertiary, #656d76);
11453
- cursor: pointer;
11454
- flex-shrink: 0;
11455
- transition: color 0.15s ease;
11456
- }
11457
-
11458
- .info-tip-toggle:hover {
11459
- color: var(--color-info, #0969da);
11460
- }
11461
-
11462
- .info-tip-toggle.active {
11463
- color: var(--color-info, #0969da);
11464
- }
11465
-
11466
- .info-tip-content {
11467
- background: var(--color-info-subtle, #ddf4ff);
11468
- border-radius: 6px;
11469
- padding: 8px 10px;
11470
- margin: 0 0 8px;
11471
- font-size: 12px;
11472
- line-height: 1.45;
11473
- color: var(--color-text-secondary, #424a53);
11474
- }
11475
-
11476
- [data-theme="dark"] .info-tip-toggle {
11477
- color: var(--color-text-tertiary, #484f58);
11478
- }
11479
-
11480
- [data-theme="dark"] .info-tip-toggle:hover,
11481
- [data-theme="dark"] .info-tip-toggle.active {
11482
- color: var(--color-info, #58a6ff);
11483
- }
11484
-
11485
- [data-theme="dark"] .info-tip-content {
11486
- background: rgba(56, 139, 253, 0.1);
11487
- color: var(--color-text-secondary, #8b949e);
11488
- }
11489
-
11490
9770
  /* ==========================================================================
11491
9771
  File-Level Comments Zone
11492
9772
  Collapsible section between file header and diff content