reviewflow 3.4.0 → 3.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 (205) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli/parseCliArgs.d.ts +6 -1
  3. package/dist/cli/parseCliArgs.d.ts.map +1 -1
  4. package/dist/cli/parseCliArgs.js +11 -1
  5. package/dist/cli/parseCliArgs.js.map +1 -1
  6. package/dist/config/projectConfig.d.ts +6 -0
  7. package/dist/config/projectConfig.d.ts.map +1 -1
  8. package/dist/config/projectConfig.js +13 -0
  9. package/dist/config/projectConfig.js.map +1 -1
  10. package/dist/entities/language/language.schema.d.ts +7 -0
  11. package/dist/entities/language/language.schema.d.ts.map +1 -0
  12. package/dist/entities/language/language.schema.js +3 -0
  13. package/dist/entities/language/language.schema.js.map +1 -0
  14. package/dist/frameworks/claude/claudeInvoker.d.ts +1 -1
  15. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  16. package/dist/frameworks/claude/claudeInvoker.js +6 -3
  17. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  18. package/dist/frameworks/claude/languageDirective.d.ts +3 -0
  19. package/dist/frameworks/claude/languageDirective.d.ts.map +1 -0
  20. package/dist/frameworks/claude/languageDirective.js +9 -0
  21. package/dist/frameworks/claude/languageDirective.js.map +1 -0
  22. package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
  23. package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
  24. package/dist/frameworks/queue/pQueueAdapter.js +1 -1
  25. package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
  26. package/dist/frameworks/settings/runtimeSettings.d.ts +4 -0
  27. package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
  28. package/dist/frameworks/settings/runtimeSettings.js +8 -1
  29. package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
  30. package/dist/interface-adapters/controllers/http/settings.routes.d.ts.map +1 -1
  31. package/dist/interface-adapters/controllers/http/settings.routes.js +12 -1
  32. package/dist/interface-adapters/controllers/http/settings.routes.js.map +1 -1
  33. package/dist/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  34. package/dist/interface-adapters/controllers/webhook/github.controller.js +2 -1
  35. package/dist/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  36. package/dist/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  37. package/dist/interface-adapters/controllers/webhook/gitlab.controller.js +2 -1
  38. package/dist/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  39. package/dist/interface-adapters/views/dashboard/index.html +974 -393
  40. package/dist/interface-adapters/views/dashboard/modules/assignee.d.ts +7 -0
  41. package/dist/interface-adapters/views/dashboard/modules/assignee.d.ts.map +1 -0
  42. package/dist/interface-adapters/views/dashboard/modules/assignee.js +47 -0
  43. package/dist/interface-adapters/views/dashboard/modules/assignee.js.map +1 -0
  44. package/dist/interface-adapters/views/dashboard/modules/constants.d.ts +7 -0
  45. package/dist/interface-adapters/views/dashboard/modules/constants.d.ts.map +1 -0
  46. package/dist/interface-adapters/views/dashboard/modules/constants.js +6 -0
  47. package/dist/interface-adapters/views/dashboard/modules/constants.js.map +1 -0
  48. package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.d.ts +23 -0
  49. package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.d.ts.map +1 -0
  50. package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.js +37 -0
  51. package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.js.map +1 -0
  52. package/dist/interface-adapters/views/dashboard/modules/formatting.d.ts +23 -0
  53. package/dist/interface-adapters/views/dashboard/modules/formatting.d.ts.map +1 -0
  54. package/dist/interface-adapters/views/dashboard/modules/formatting.js +57 -0
  55. package/dist/interface-adapters/views/dashboard/modules/formatting.js.map +1 -0
  56. package/dist/interface-adapters/views/dashboard/modules/html.d.ts +16 -0
  57. package/dist/interface-adapters/views/dashboard/modules/html.d.ts.map +1 -0
  58. package/dist/interface-adapters/views/dashboard/modules/html.js +68 -0
  59. package/dist/interface-adapters/views/dashboard/modules/html.js.map +1 -0
  60. package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts +11 -0
  61. package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts.map +1 -0
  62. package/dist/interface-adapters/views/dashboard/modules/i18n.js +500 -0
  63. package/dist/interface-adapters/views/dashboard/modules/i18n.js.map +1 -0
  64. package/dist/interface-adapters/views/dashboard/modules/icons.d.ts +13 -0
  65. package/dist/interface-adapters/views/dashboard/modules/icons.d.ts.map +1 -0
  66. package/dist/interface-adapters/views/dashboard/modules/icons.js +29 -0
  67. package/dist/interface-adapters/views/dashboard/modules/icons.js.map +1 -0
  68. package/dist/interface-adapters/views/dashboard/modules/loading.d.ts +30 -0
  69. package/dist/interface-adapters/views/dashboard/modules/loading.d.ts.map +1 -0
  70. package/dist/interface-adapters/views/dashboard/modules/loading.js +48 -0
  71. package/dist/interface-adapters/views/dashboard/modules/loading.js.map +1 -0
  72. package/dist/interface-adapters/views/dashboard/modules/notifications.d.ts +39 -0
  73. package/dist/interface-adapters/views/dashboard/modules/notifications.d.ts.map +1 -0
  74. package/dist/interface-adapters/views/dashboard/modules/notifications.js +131 -0
  75. package/dist/interface-adapters/views/dashboard/modules/notifications.js.map +1 -0
  76. package/dist/interface-adapters/views/dashboard/modules/priority.d.ts +10 -0
  77. package/dist/interface-adapters/views/dashboard/modules/priority.d.ts.map +1 -0
  78. package/dist/interface-adapters/views/dashboard/modules/priority.js +86 -0
  79. package/dist/interface-adapters/views/dashboard/modules/priority.js.map +1 -0
  80. package/dist/interface-adapters/views/dashboard/modules/quality.d.ts +30 -0
  81. package/dist/interface-adapters/views/dashboard/modules/quality.d.ts.map +1 -0
  82. package/dist/interface-adapters/views/dashboard/modules/quality.js +83 -0
  83. package/dist/interface-adapters/views/dashboard/modules/quality.js.map +1 -0
  84. package/dist/interface-adapters/views/dashboard/modules/queueLanes.d.ts +22 -0
  85. package/dist/interface-adapters/views/dashboard/modules/queueLanes.d.ts.map +1 -0
  86. package/dist/interface-adapters/views/dashboard/modules/queueLanes.js +27 -0
  87. package/dist/interface-adapters/views/dashboard/modules/queueLanes.js.map +1 -0
  88. package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.d.ts +54 -0
  89. package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.d.ts.map +1 -0
  90. package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.js +120 -0
  91. package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.js.map +1 -0
  92. package/dist/interface-adapters/views/dashboard/styles.css +1031 -93
  93. package/dist/main/cli.d.ts +41 -1
  94. package/dist/main/cli.d.ts.map +1 -1
  95. package/dist/main/cli.js +228 -88
  96. package/dist/main/cli.js.map +1 -1
  97. package/dist/tests/factories/reviewJob.factory.d.ts.map +1 -1
  98. package/dist/tests/factories/reviewJob.factory.js +1 -0
  99. package/dist/tests/factories/reviewJob.factory.js.map +1 -1
  100. package/dist/tests/units/cli/parseCliArgs.test.js +14 -0
  101. package/dist/tests/units/cli/parseCliArgs.test.js.map +1 -1
  102. package/dist/tests/units/config/projectConfig.test.d.ts +2 -0
  103. package/dist/tests/units/config/projectConfig.test.d.ts.map +1 -0
  104. package/dist/tests/units/config/projectConfig.test.js +69 -0
  105. package/dist/tests/units/config/projectConfig.test.js.map +1 -0
  106. package/dist/tests/units/entities/language/language.schema.test.d.ts +2 -0
  107. package/dist/tests/units/entities/language/language.schema.test.d.ts.map +1 -0
  108. package/dist/tests/units/entities/language/language.schema.test.js +17 -0
  109. package/dist/tests/units/entities/language/language.schema.test.js.map +1 -0
  110. package/dist/tests/units/frameworks/claude/languageDirective.test.d.ts +2 -0
  111. package/dist/tests/units/frameworks/claude/languageDirective.test.d.ts.map +1 -0
  112. package/dist/tests/units/frameworks/claude/languageDirective.test.js +13 -0
  113. package/dist/tests/units/frameworks/claude/languageDirective.test.js.map +1 -0
  114. package/dist/tests/units/frameworks/settings/runtimeSettings.test.d.ts +2 -0
  115. package/dist/tests/units/frameworks/settings/runtimeSettings.test.d.ts.map +1 -0
  116. package/dist/tests/units/frameworks/settings/runtimeSettings.test.js +20 -0
  117. package/dist/tests/units/frameworks/settings/runtimeSettings.test.js.map +1 -0
  118. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +1 -0
  119. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  120. package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.d.ts +2 -0
  121. package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.d.ts.map +1 -0
  122. package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.js +35 -0
  123. package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.js.map +1 -0
  124. package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.d.ts +2 -0
  125. package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.d.ts.map +1 -0
  126. package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.js +17 -0
  127. package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.js.map +1 -0
  128. package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.d.ts +2 -0
  129. package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.d.ts.map +1 -0
  130. package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.js +54 -0
  131. package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.js.map +1 -0
  132. package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.d.ts +2 -0
  133. package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.d.ts.map +1 -0
  134. package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.js +95 -0
  135. package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.js.map +1 -0
  136. package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.d.ts +2 -0
  137. package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.d.ts.map +1 -0
  138. package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.js +55 -0
  139. package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.js.map +1 -0
  140. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.d.ts +2 -0
  141. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.d.ts.map +1 -0
  142. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js +98 -0
  143. package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js.map +1 -0
  144. package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.d.ts +2 -0
  145. package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.d.ts.map +1 -0
  146. package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.js +28 -0
  147. package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.js.map +1 -0
  148. package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.d.ts +2 -0
  149. package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.d.ts.map +1 -0
  150. package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.js +51 -0
  151. package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.js.map +1 -0
  152. package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.d.ts +2 -0
  153. package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.d.ts.map +1 -0
  154. package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.js +43 -0
  155. package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.js.map +1 -0
  156. package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.d.ts +2 -0
  157. package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.d.ts.map +1 -0
  158. package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.js +78 -0
  159. package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.js.map +1 -0
  160. package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.d.ts +2 -0
  161. package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.d.ts.map +1 -0
  162. package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.js +87 -0
  163. package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.js.map +1 -0
  164. package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.d.ts +2 -0
  165. package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.d.ts.map +1 -0
  166. package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.js +29 -0
  167. package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.js.map +1 -0
  168. package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.d.ts +2 -0
  169. package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.d.ts.map +1 -0
  170. package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.js +60 -0
  171. package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.js.map +1 -0
  172. package/dist/tests/units/main/executeDiscover.test.d.ts +2 -0
  173. package/dist/tests/units/main/executeDiscover.test.d.ts.map +1 -0
  174. package/dist/tests/units/main/executeDiscover.test.js +106 -0
  175. package/dist/tests/units/main/executeDiscover.test.js.map +1 -0
  176. package/dist/tests/units/main/executeInit.test.d.ts +2 -0
  177. package/dist/tests/units/main/executeInit.test.d.ts.map +1 -0
  178. package/dist/tests/units/main/executeInit.test.js +290 -0
  179. package/dist/tests/units/main/executeInit.test.js.map +1 -0
  180. package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.d.ts +2 -0
  181. package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.d.ts.map +1 -0
  182. package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.js +127 -0
  183. package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.js.map +1 -0
  184. package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.d.ts +2 -0
  185. package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.d.ts.map +1 -0
  186. package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.js +57 -0
  187. package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.js.map +1 -0
  188. package/dist/usecases/cli/addRepositoriesToConfig.usecase.d.ts +27 -0
  189. package/dist/usecases/cli/addRepositoriesToConfig.usecase.d.ts.map +1 -0
  190. package/dist/usecases/cli/addRepositoriesToConfig.usecase.js +34 -0
  191. package/dist/usecases/cli/addRepositoriesToConfig.usecase.js.map +1 -0
  192. package/dist/usecases/cli/checkInitPrerequisites.d.ts +16 -0
  193. package/dist/usecases/cli/checkInitPrerequisites.d.ts.map +1 -0
  194. package/dist/usecases/cli/checkInitPrerequisites.js +23 -0
  195. package/dist/usecases/cli/checkInitPrerequisites.js.map +1 -0
  196. package/dist/usecases/cli/configureMcp.usecase.d.ts +1 -1
  197. package/dist/usecases/cli/configureMcp.usecase.d.ts.map +1 -1
  198. package/dist/usecases/cli/validateConfig.usecase.d.ts +1 -1
  199. package/dist/usecases/cli/validateConfig.usecase.d.ts.map +1 -1
  200. package/dist/usecases/triggerReview.usecase.d.ts +2 -0
  201. package/dist/usecases/triggerReview.usecase.d.ts.map +1 -1
  202. package/dist/usecases/triggerReview.usecase.js +1 -0
  203. package/dist/usecases/triggerReview.usecase.js.map +1 -1
  204. package/package.json +1 -1
  205. package/templates/SETUP.md +23 -8
@@ -1,5 +1,22 @@
1
1
  * { margin: 0; padding: 0; box-sizing: border-box; }
2
2
 
3
+ :root {
4
+ --nsc-bg-base: #0b1220;
5
+ --nsc-bg-elevated: #111a2b;
6
+ --nsc-bg-surface: #162235;
7
+ --nsc-bg-surface-strong: #1c2a40;
8
+ --nsc-border-soft: rgba(163, 192, 224, 0.16);
9
+ --nsc-border-strong: rgba(163, 192, 224, 0.28);
10
+ --nsc-text-primary: #e8efff;
11
+ --nsc-text-secondary: #b2c1dd;
12
+ --nsc-text-muted: #8393b0;
13
+ --nsc-focus: #7ad8ff;
14
+ --nsc-action: #60c7ff;
15
+ --nsc-warning: #f4bc71;
16
+ --nsc-success: #62d3a8;
17
+ --nsc-danger: #f07f88;
18
+ }
19
+
3
20
  /* Lucide icons base styling */
4
21
  [data-lucide] {
5
22
  width: 1em;
@@ -78,10 +95,21 @@
78
95
  to { transform: rotate(360deg); }
79
96
  }
80
97
 
98
+ @keyframes quiet-pulse {
99
+ 0% {
100
+ box-shadow: 0 0 0 0 rgba(96, 199, 255, 0.5);
101
+ }
102
+ 100% {
103
+ box-shadow: 0 0 0 8px rgba(96, 199, 255, 0);
104
+ }
105
+ }
106
+
81
107
  body {
82
108
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
83
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
84
- color: #e4e4e7;
109
+ background:
110
+ radial-gradient(1100px 700px at 12% -10%, #1a2a4a 0%, rgba(26, 42, 74, 0) 58%),
111
+ linear-gradient(145deg, var(--nsc-bg-base) 0%, #0e1728 100%);
112
+ color: var(--nsc-text-primary);
85
113
  min-height: 100vh;
86
114
  padding: 2rem;
87
115
  }
@@ -98,7 +126,7 @@ header {
98
126
 
99
127
  .logo {
100
128
  width: 48px; height: 48px;
101
- background: linear-gradient(135deg, #d97706 0%, #f59e0b 100%);
129
+ background: linear-gradient(145deg, #58c4ff 0%, #3c8cc4 100%);
102
130
  border-radius: 12px;
103
131
  display: flex; align-items: center; justify-content: center;
104
132
  font-size: 24px;
@@ -127,18 +155,27 @@ h1 { font-size: 1.75rem; font-weight: 600; }
127
155
  }
128
156
 
129
157
  .btn-primary {
130
- background: rgba(245, 158, 11, 0.2);
131
- color: #f59e0b;
132
- border: 1px solid rgba(245, 158, 11, 0.3);
158
+ background: rgba(96, 199, 255, 0.16);
159
+ color: #9ce1ff;
160
+ border: 1px solid rgba(96, 199, 255, 0.34);
133
161
  }
134
- .btn-primary:hover { background: rgba(245, 158, 11, 0.3); }
162
+ .btn-primary:hover { background: rgba(96, 199, 255, 0.25); }
135
163
 
136
164
  .btn-secondary {
137
- background: rgba(255, 255, 255, 0.05);
138
- color: #a1a1aa;
139
- border: 1px solid rgba(255, 255, 255, 0.1);
165
+ background: rgba(255, 255, 255, 0.03);
166
+ color: var(--nsc-text-secondary);
167
+ border: 1px solid var(--nsc-border-soft);
168
+ }
169
+ .btn-secondary:hover { background: rgba(255, 255, 255, 0.08); }
170
+
171
+ button:focus-visible,
172
+ a:focus-visible,
173
+ select:focus-visible,
174
+ input:focus-visible,
175
+ [role='button']:focus-visible {
176
+ outline: 2px solid var(--nsc-focus);
177
+ outline-offset: 2px;
140
178
  }
141
- .btn-secondary:hover { background: rgba(255, 255, 255, 0.1); }
142
179
 
143
180
  .status-indicator {
144
181
  display: inline-flex;
@@ -151,8 +188,8 @@ h1 { font-size: 1.75rem; font-weight: 600; }
151
188
  }
152
189
 
153
190
  .status-indicator.online { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
154
- .status-indicator.offline { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
155
- .status-indicator.connecting { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
191
+ .status-indicator.offline { background: rgba(240, 127, 136, 0.2); color: var(--nsc-danger); }
192
+ .status-indicator.connecting { background: rgba(122, 216, 255, 0.2); color: var(--nsc-focus); }
156
193
 
157
194
  .status-dot {
158
195
  width: 8px; height: 8px;
@@ -171,16 +208,125 @@ h1 { font-size: 1.75rem; font-weight: 600; }
171
208
  }
172
209
 
173
210
  .card {
174
- background: rgba(255, 255, 255, 0.05);
175
- border: 1px solid rgba(255, 255, 255, 0.1);
211
+ background: linear-gradient(170deg, var(--nsc-bg-surface) 0%, #142034 100%);
212
+ border: 1px solid var(--nsc-border-soft);
176
213
  border-radius: 12px;
177
214
  padding: 1.25rem;
215
+ position: relative;
216
+ overflow: hidden;
178
217
  }
179
218
 
180
- .card-label { font-size: 0.75rem; color: #a1a1aa; margin-bottom: 0.5rem; }
219
+ .card::before {
220
+ content: '';
221
+ position: absolute;
222
+ left: 0;
223
+ top: 0;
224
+ bottom: 0;
225
+ width: 2px;
226
+ background: transparent;
227
+ }
228
+
229
+ .card-priority::before {
230
+ background: linear-gradient(180deg, #7ad8ff 0%, rgba(122, 216, 255, 0.2) 100%);
231
+ }
232
+
233
+ .card-label { font-size: 0.75rem; color: var(--nsc-text-secondary); margin-bottom: 0.5rem; }
181
234
  .card-value { font-size: 1.75rem; font-weight: 700; }
182
- .card-value.running { color: #f59e0b; }
183
- .card-value.queued { color: #3b82f6; }
235
+ .card-value.running { color: var(--nsc-focus); }
236
+ .card-value.queued { color: #8ab7ff; }
237
+
238
+ .focus-strip {
239
+ display: grid;
240
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
241
+ gap: 0.75rem;
242
+ margin-top: -0.75rem;
243
+ margin-bottom: 1.5rem;
244
+ }
245
+
246
+ .focus-strip.compact .focus-meta {
247
+ display: none;
248
+ }
249
+
250
+ .focus-strip.compact .focus-chip {
251
+ padding-top: 0.55rem;
252
+ padding-bottom: 0.55rem;
253
+ }
254
+
255
+ .focus-chip {
256
+ background: linear-gradient(160deg, var(--nsc-bg-surface) 0%, var(--nsc-bg-surface-strong) 100%);
257
+ border: 1px solid var(--nsc-border-soft);
258
+ border-radius: 10px;
259
+ padding: 0.65rem 0.75rem;
260
+ display: flex;
261
+ justify-content: space-between;
262
+ align-items: center;
263
+ gap: 0.5rem;
264
+ }
265
+
266
+ .focus-copy {
267
+ display: flex;
268
+ flex-direction: column;
269
+ gap: 0.15rem;
270
+ }
271
+
272
+ .focus-label {
273
+ font-size: 0.72rem;
274
+ color: var(--nsc-text-secondary);
275
+ text-transform: uppercase;
276
+ letter-spacing: 0.05em;
277
+ }
278
+
279
+ .focus-meta {
280
+ font-size: 0.68rem;
281
+ color: var(--nsc-text-muted);
282
+ }
283
+
284
+ .focus-value {
285
+ font-size: 1.05rem;
286
+ font-weight: 700;
287
+ color: var(--nsc-text-primary);
288
+ }
289
+
290
+ .focus-now .focus-value { color: var(--nsc-focus); }
291
+ .focus-next .focus-value { color: var(--nsc-warning); }
292
+ .focus-blocked .focus-value { color: var(--nsc-danger); }
293
+
294
+ .focus-toggle-btn {
295
+ background: rgba(255, 255, 255, 0.03);
296
+ color: var(--nsc-text-secondary);
297
+ border: 1px solid var(--nsc-border-soft);
298
+ border-radius: 10px;
299
+ padding: 0.6rem 0.75rem;
300
+ font-size: 0.72rem;
301
+ font-weight: 600;
302
+ cursor: pointer;
303
+ transition: all 0.2s;
304
+ }
305
+
306
+ .focus-toggle-btn:hover {
307
+ background: rgba(255, 255, 255, 0.08);
308
+ border-color: var(--nsc-border-strong);
309
+ }
310
+
311
+ .data-loading {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ gap: 0.45rem;
315
+ padding: 0.35rem 0.6rem;
316
+ margin-bottom: 1rem;
317
+ border-radius: 999px;
318
+ border: 1px solid var(--nsc-border-soft);
319
+ background: rgba(255, 255, 255, 0.04);
320
+ color: var(--nsc-text-secondary);
321
+ font-size: 0.72rem;
322
+ font-weight: 600;
323
+ }
324
+
325
+ .data-loading [data-lucide] {
326
+ width: 14px;
327
+ height: 14px;
328
+ animation: spin 1s linear infinite;
329
+ }
184
330
 
185
331
  .card-claude {
186
332
  display: flex;
@@ -194,8 +340,8 @@ h1 { font-size: 1.75rem; font-weight: 600; }
194
340
  .card-claude.checking .status { color: #f59e0b; }
195
341
 
196
342
  .section {
197
- background: rgba(255, 255, 255, 0.05);
198
- border: 1px solid rgba(255, 255, 255, 0.1);
343
+ background: linear-gradient(175deg, var(--nsc-bg-elevated) 0%, #101b2d 100%);
344
+ border: 1px solid var(--nsc-border-soft);
199
345
  border-radius: 12px;
200
346
  margin-bottom: 1.5rem;
201
347
  overflow: hidden;
@@ -203,16 +349,27 @@ h1 { font-size: 1.75rem; font-weight: 600; }
203
349
 
204
350
  .section-header {
205
351
  padding: 1rem 1.5rem;
206
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
352
+ border-bottom: 1px solid var(--nsc-border-soft);
207
353
  font-weight: 600;
208
354
  display: flex;
209
355
  align-items: center;
210
356
  gap: 0.5rem;
211
357
  }
212
358
 
359
+ .section.is-refreshing .section-header::after {
360
+ content: '';
361
+ width: 7px;
362
+ height: 7px;
363
+ border-radius: 999px;
364
+ margin-left: auto;
365
+ background: var(--nsc-focus);
366
+ box-shadow: 0 0 0 0 rgba(96, 199, 255, 0.55);
367
+ animation: quiet-pulse 1.2s ease-out infinite;
368
+ }
369
+
213
370
  .section-header .badge-count {
214
- background: rgba(239, 68, 68, 0.2);
215
- color: #ef4444;
371
+ background: rgba(240, 127, 136, 0.16);
372
+ color: #ff9ea5;
216
373
  padding: 0.125rem 0.5rem;
217
374
  border-radius: 9999px;
218
375
  }
@@ -372,6 +529,12 @@ h1 { font-size: 1.75rem; font-weight: 600; }
372
529
  font-weight: 500;
373
530
  text-transform: uppercase;
374
531
  }
532
+ .badge [data-lucide] {
533
+ width: 12px;
534
+ height: 12px;
535
+ margin-right: 0.2rem;
536
+ vertical-align: -0.08em;
537
+ }
375
538
  .badge.running { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
376
539
  .badge.queued { background: rgba(59, 130, 246, 0.2); color: #3b82f6; }
377
540
  .badge.completed { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
@@ -433,7 +596,32 @@ h1 { font-size: 1.75rem; font-weight: 600; }
433
596
  .log-message { flex: 1; word-break: break-word; }
434
597
  .log-data { color: #71717a; font-size: 0.7rem; margin-top: 0.25rem; }
435
598
 
436
- .refresh-info { text-align: center; font-size: 0.875rem; color: #71717a; margin-top: 1rem; }
599
+ .refresh-info {
600
+ text-align: center;
601
+ font-size: 0.875rem;
602
+ color: #8d9bb8;
603
+ margin-top: 1rem;
604
+ display: flex;
605
+ flex-wrap: wrap;
606
+ justify-content: center;
607
+ gap: 0.3rem;
608
+ }
609
+
610
+ body.is-quiet-refresh .refresh-info::after {
611
+ content: '';
612
+ display: inline-block;
613
+ width: 7px;
614
+ height: 7px;
615
+ border-radius: 999px;
616
+ margin-left: 0.45rem;
617
+ background: var(--nsc-focus);
618
+ box-shadow: 0 0 0 0 rgba(96, 199, 255, 0.65);
619
+ animation: quiet-pulse 1.2s ease-out infinite;
620
+ }
621
+
622
+ .refresh-separator {
623
+ color: #5f6e8d;
624
+ }
437
625
 
438
626
  .hidden { display: none !important; }
439
627
 
@@ -679,37 +867,140 @@ h1 { font-size: 1.75rem; font-weight: 600; }
679
867
  /* Stats grid */
680
868
  .stats-grid {
681
869
  display: grid;
682
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
683
- gap: 1rem;
870
+ grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
871
+ gap: 0.75rem;
684
872
  }
685
873
  .stat-card {
686
- background: rgba(255, 255, 255, 0.03);
687
- border: 1px solid rgba(255, 255, 255, 0.08);
688
- border-radius: 8px;
689
- padding: 1rem;
874
+ background: linear-gradient(165deg, rgba(255, 255, 255, 0.035) 0%, rgba(255, 255, 255, 0.02) 100%);
875
+ border: 1px solid rgba(255, 255, 255, 0.1);
876
+ border-radius: 9px;
877
+ padding: 0.75rem 0.7rem;
690
878
  text-align: center;
691
- transition: all 0.2s;
879
+ transition: all 0.2s ease;
880
+ position: relative;
881
+ overflow: hidden;
882
+ min-height: 106px;
883
+ display: flex;
884
+ flex-direction: column;
885
+ align-items: center;
886
+ justify-content: space-between;
887
+ gap: 0.35rem;
888
+ }
889
+
890
+ .stat-card::before {
891
+ content: '';
892
+ position: absolute;
893
+ top: 0;
894
+ left: 0;
895
+ right: 0;
896
+ height: 2px;
897
+ background: rgba(158, 176, 211, 0.45);
692
898
  }
693
899
  .stat-card:hover {
694
- background: rgba(255, 255, 255, 0.05);
695
- border-color: rgba(255, 255, 255, 0.15);
900
+ background: linear-gradient(165deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.03) 100%);
901
+ border-color: rgba(255, 255, 255, 0.2);
902
+ transform: translateY(-1px);
696
903
  }
697
904
  .stat-card.warning {
698
- border-color: rgba(239, 68, 68, 0.3);
905
+ border-color: rgba(239, 68, 68, 0.45);
906
+ background: linear-gradient(165deg, rgba(239, 68, 68, 0.12) 0%, rgba(239, 68, 68, 0.03) 100%);
699
907
  }
700
908
  .stat-value {
701
- font-size: 1.5rem;
702
- font-weight: 700;
703
- color: #f59e0b;
704
- line-height: 1.2;
909
+ min-height: 2rem;
910
+ display: inline-flex;
911
+ align-items: baseline;
912
+ justify-content: center;
913
+ gap: 0.2rem;
914
+ line-height: 1.1;
705
915
  }
706
916
  .stat-card.warning .stat-value {
707
- color: #ef4444;
917
+ color: #ff8488;
918
+ }
919
+
920
+ .stat-main {
921
+ font-size: 1.55rem;
922
+ font-weight: 700;
923
+ color: #ffca63;
924
+ }
925
+
926
+ .stat-denominator {
927
+ font-size: 0.76rem;
928
+ font-weight: 600;
929
+ color: #9eb0d3;
930
+ }
931
+
932
+ .stat-trend {
933
+ display: inline-flex;
934
+ align-items: center;
935
+ justify-content: center;
936
+ }
937
+
938
+ .stat-trend [data-lucide] {
939
+ width: 12px;
940
+ height: 12px;
941
+ }
942
+
943
+ .stat-trend.up {
944
+ color: #6ee7a4;
945
+ }
946
+
947
+ .stat-trend.down {
948
+ color: #ff8488;
949
+ }
950
+
951
+ .stat-trend.flat {
952
+ color: #8ea5cc;
953
+ }
954
+
955
+ .metric-reviews .stat-main,
956
+ .metric-time .stat-main,
957
+ .metric-average-time .stat-main,
958
+ .metric-warnings .stat-main {
959
+ color: #ffca63;
960
+ }
961
+
962
+ .metric-reviews::before {
963
+ background: rgba(124, 211, 255, 0.75);
964
+ }
965
+
966
+ .metric-score::before {
967
+ background: rgba(255, 208, 112, 0.78);
968
+ }
969
+
970
+ .metric-time::before,
971
+ .metric-average-time::before {
972
+ background: rgba(180, 165, 255, 0.75);
973
+ }
974
+
975
+ .metric-warnings::before {
976
+ background: rgba(255, 196, 105, 0.75);
977
+ }
978
+
979
+ .metric-score .stat-main {
980
+ color: #ffd070;
981
+ }
982
+
983
+ .metric-blocking .stat-main {
984
+ color: #ff6269;
985
+ }
986
+
987
+ .metric-blocking::before {
988
+ background: rgba(255, 98, 105, 0.82);
708
989
  }
709
990
  .stat-label {
710
- font-size: 0.75rem;
711
- color: #71717a;
712
- margin-top: 0.25rem;
991
+ font-size: 0.72rem;
992
+ color: #8fa1c2;
993
+ margin-top: 0;
994
+ display: inline-flex;
995
+ align-items: center;
996
+ justify-content: center;
997
+ gap: 0.2rem;
998
+ min-height: 1.1rem;
999
+ }
1000
+
1001
+ .stat-label [data-lucide] {
1002
+ width: 11px;
1003
+ height: 11px;
713
1004
  }
714
1005
 
715
1006
  /* Collapsible section header */
@@ -721,6 +1012,11 @@ h1 { font-size: 1.75rem; font-weight: 600; }
721
1012
  .section-header.clickable:hover {
722
1013
  background: rgba(255, 255, 255, 0.03);
723
1014
  }
1015
+
1016
+ .section-header.clickable:focus-visible {
1017
+ background: rgba(255, 255, 255, 0.07);
1018
+ border-bottom-color: var(--nsc-border-strong);
1019
+ }
724
1020
  .toggle-icon {
725
1021
  margin-left: auto;
726
1022
  transition: transform 0.2s;
@@ -730,6 +1026,21 @@ h1 { font-size: 1.75rem; font-weight: 600; }
730
1026
  transform: rotate(-90deg);
731
1027
  }
732
1028
 
1029
+ .section-toggle {
1030
+ margin-left: auto;
1031
+ color: #7d8aa4;
1032
+ }
1033
+
1034
+ .section-toggle [data-lucide] {
1035
+ width: 15px;
1036
+ height: 15px;
1037
+ transition: transform 0.2s;
1038
+ }
1039
+
1040
+ .section-toggle.collapsed [data-lucide] {
1041
+ transform: rotate(-90deg);
1042
+ }
1043
+
733
1044
  /* MR tracking items */
734
1045
  .mr-item {
735
1046
  display: flex;
@@ -803,49 +1114,58 @@ h1 { font-size: 1.75rem; font-weight: 600; }
803
1114
  .stat-badge {
804
1115
  display: inline-flex;
805
1116
  align-items: center;
806
- gap: 0.125rem;
807
- padding: 0.125rem 0.375rem;
808
- border-radius: 4px;
809
- font-size: 0.7rem;
810
- font-weight: 500;
1117
+ gap: 0.2rem;
1118
+ padding: 0.16rem 0.44rem;
1119
+ border-radius: 999px;
1120
+ font-size: 0.68rem;
1121
+ font-weight: 600;
1122
+ border: 1px solid transparent;
811
1123
  }
812
1124
  .stat-badge.blocking {
813
- background: rgba(239, 68, 68, 0.15);
814
- color: #ef4444;
1125
+ background: rgba(239, 68, 68, 0.16);
1126
+ border-color: rgba(239, 68, 68, 0.26);
1127
+ color: #ff8d90;
815
1128
  }
816
1129
  .stat-badge.warning {
817
- background: rgba(245, 158, 11, 0.15);
818
- color: #f59e0b;
1130
+ background: rgba(245, 158, 11, 0.16);
1131
+ border-color: rgba(245, 158, 11, 0.26);
1132
+ color: #ffc669;
819
1133
  }
820
1134
  .stat-badge.followup {
821
- background: rgba(59, 130, 246, 0.15);
822
- color: #3b82f6;
1135
+ background: rgba(59, 130, 246, 0.16);
1136
+ border-color: rgba(59, 130, 246, 0.26);
1137
+ color: #8ec1ff;
823
1138
  }
824
1139
  .stat-badge.score {
825
- background: rgba(34, 197, 94, 0.15);
826
- color: #22c55e;
1140
+ background: rgba(34, 197, 94, 0.16);
1141
+ border-color: rgba(34, 197, 94, 0.26);
1142
+ color: #77e2a4;
827
1143
  }
828
1144
 
829
1145
  /* MR Item Accordion */
830
1146
  .mr-item-accordion {
831
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1147
+ border: 1px solid rgba(255, 255, 255, 0.09);
1148
+ border-radius: 10px;
1149
+ margin-bottom: 0.55rem;
1150
+ background: linear-gradient(180deg, rgba(13, 23, 42, 0.82) 0%, rgba(10, 19, 36, 0.92) 100%);
1151
+ overflow: hidden;
832
1152
  }
833
- .mr-item-accordion:last-child { border-bottom: none; }
1153
+ .mr-item-accordion:last-child { margin-bottom: 0; }
834
1154
 
835
1155
  .mr-item-header {
836
1156
  display: flex;
837
1157
  align-items: center;
838
- gap: 1rem;
839
- padding: 0.75rem 0;
1158
+ gap: 0.85rem;
1159
+ padding: 0.72rem 0.8rem;
840
1160
  cursor: pointer;
841
- transition: background 0.2s;
1161
+ transition: background 0.2s, border-color 0.2s;
842
1162
  }
843
1163
  .mr-item-header:hover {
844
- background: rgba(255, 255, 255, 0.02);
1164
+ background: rgba(255, 255, 255, 0.04);
845
1165
  }
846
1166
 
847
1167
  .mr-toggle {
848
- color: #71717a;
1168
+ color: #8d9bb8;
849
1169
  transition: transform 0.2s;
850
1170
  }
851
1171
  .mr-toggle [data-lucide] {
@@ -872,13 +1192,13 @@ h1 { font-size: 1.75rem; font-weight: 600; }
872
1192
  text-align: right;
873
1193
  }
874
1194
  .mr-assigner-name {
875
- font-size: 0.75rem;
876
- color: #a1a1aa;
1195
+ font-size: 0.74rem;
1196
+ color: #b8c7e4;
877
1197
  font-weight: 500;
878
1198
  }
879
1199
  .mr-assigner-time {
880
1200
  font-size: 0.65rem;
881
- color: #71717a;
1201
+ color: #7f90b2;
882
1202
  }
883
1203
  .mr-avatar {
884
1204
  width: 32px;
@@ -897,40 +1217,48 @@ h1 { font-size: 1.75rem; font-weight: 600; }
897
1217
  /* MR Item expanded content */
898
1218
  .mr-item-content {
899
1219
  display: none;
900
- padding: 0 0 1rem 1.5rem;
901
- margin-left: 1.5rem;
902
- border-left: 2px solid rgba(255, 255, 255, 0.1);
1220
+ padding: 0 0.8rem 0.8rem 0.8rem;
1221
+ margin-left: 0;
1222
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
1223
+ border-left: none;
903
1224
  }
904
1225
  .mr-item-accordion.open .mr-item-content {
905
1226
  display: block;
906
1227
  }
907
1228
 
908
1229
  .mr-details {
909
- display: flex;
910
- flex-direction: column;
911
- gap: 0.5rem;
912
- padding: 0.75rem 0;
1230
+ display: grid;
1231
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1232
+ gap: 0.42rem;
1233
+ padding: 0.6rem 0 0.45rem;
913
1234
  }
914
1235
  .mr-detail-row {
915
1236
  display: flex;
916
- gap: 0.5rem;
917
- font-size: 0.8rem;
1237
+ gap: 0.45rem;
1238
+ font-size: 0.77rem;
1239
+ align-items: center;
1240
+ background: rgba(255, 255, 255, 0.02);
1241
+ border: 1px solid rgba(255, 255, 255, 0.06);
1242
+ border-radius: 8px;
1243
+ padding: 0.36rem 0.5rem;
918
1244
  }
919
1245
  .mr-detail-label {
920
- color: #71717a;
1246
+ color: #8fa0c2;
921
1247
  display: flex;
922
1248
  align-items: center;
923
1249
  gap: 0.25rem;
924
- min-width: 110px;
1250
+ min-width: 82px;
925
1251
  }
926
1252
  .mr-detail-label [data-lucide] {
927
1253
  width: 12px;
928
1254
  height: 12px;
929
1255
  }
930
1256
  .mr-detail-value {
931
- color: #a1a1aa;
1257
+ color: #d2dcf2;
932
1258
  font-family: monospace;
933
- font-size: 0.75rem;
1259
+ font-size: 0.73rem;
1260
+ min-width: 0;
1261
+ word-break: break-word;
934
1262
  }
935
1263
 
936
1264
  /* Reviews history in expanded content */
@@ -940,17 +1268,20 @@ h1 { font-size: 1.75rem; font-weight: 600; }
940
1268
  .mr-reviews-list {
941
1269
  display: flex;
942
1270
  flex-direction: column;
943
- gap: 0.375rem;
1271
+ gap: 0.32rem;
944
1272
  margin-top: 0.25rem;
945
- padding-left: 1rem;
1273
+ padding-left: 0;
946
1274
  }
947
1275
  .mr-review-event {
948
- display: flex;
949
- gap: 0.75rem;
950
- font-size: 0.7rem;
951
- padding: 0.25rem 0.5rem;
952
- background: rgba(255, 255, 255, 0.02);
953
- border-radius: 4px;
1276
+ display: grid;
1277
+ grid-template-columns: minmax(58px, auto) minmax(86px, auto) auto auto;
1278
+ align-items: center;
1279
+ gap: 0.35rem 0.6rem;
1280
+ font-size: 0.68rem;
1281
+ padding: 0.32rem 0.46rem;
1282
+ background: rgba(255, 255, 255, 0.03);
1283
+ border-radius: 6px;
1284
+ border: 1px solid rgba(255, 255, 255, 0.05);
954
1285
  }
955
1286
  .mr-review-event.review {
956
1287
  border-left: 2px solid #f59e0b;
@@ -960,25 +1291,424 @@ h1 { font-size: 1.75rem; font-weight: 600; }
960
1291
  }
961
1292
  .review-event-type {
962
1293
  font-weight: 500;
963
- color: #a1a1aa;
964
- min-width: 50px;
1294
+ color: #b8c7e4;
1295
+ min-width: 48px;
965
1296
  }
966
1297
  .review-event-time {
967
- color: #71717a;
1298
+ color: #8a9ab8;
968
1299
  }
969
1300
  .review-event-score {
970
- color: #22c55e;
1301
+ color: #77e2a4;
971
1302
  font-weight: 500;
972
1303
  }
973
1304
  .review-event-blocking {
974
- color: #ef4444;
1305
+ color: #ff8d90;
975
1306
  font-weight: 500;
976
1307
  }
977
1308
 
978
1309
  .mr-item-actions {
979
- padding-top: 0.75rem;
1310
+ padding-top: 0.65rem;
980
1311
  border-top: 1px solid rgba(255, 255, 255, 0.05);
981
- margin-top: 0.5rem;
1312
+ margin-top: 0.45rem;
1313
+ display: flex;
1314
+ flex-wrap: wrap;
1315
+ align-items: center;
1316
+ gap: 0.42rem 0.5rem;
1317
+ }
1318
+
1319
+ .auto-followup-toggle {
1320
+ display: inline-flex;
1321
+ align-items: center;
1322
+ gap: 0.32rem;
1323
+ font-size: 0.72rem;
1324
+ color: #c2d0ea;
1325
+ padding: 0.18rem 0.4rem;
1326
+ border: 1px solid rgba(255, 255, 255, 0.13);
1327
+ border-radius: 7px;
1328
+ background: rgba(255, 255, 255, 0.03);
1329
+ }
1330
+
1331
+ .auto-followup-toggle input[type='checkbox'] {
1332
+ accent-color: var(--nsc-focus);
1333
+ }
1334
+
1335
+ /* Compact mode for high-focus sessions */
1336
+ body.compact-density .section-header {
1337
+ padding: 0.75rem 1rem;
1338
+ }
1339
+
1340
+ body.compact-density .section-content {
1341
+ padding: 0.75rem 1rem;
1342
+ }
1343
+
1344
+ body.compact-density .review-item {
1345
+ gap: 0.45rem;
1346
+ padding: 0.7rem 0;
1347
+ }
1348
+
1349
+ body.compact-density .review-header {
1350
+ gap: 0.65rem;
1351
+ }
1352
+
1353
+ body.compact-density .review-title {
1354
+ font-size: 0.9rem;
1355
+ }
1356
+
1357
+ body.compact-density .review-meta {
1358
+ font-size: 0.78rem;
1359
+ margin-top: 0.15rem;
1360
+ }
1361
+
1362
+ body.compact-density .review-assigner-name {
1363
+ font-size: 0.68rem;
1364
+ }
1365
+
1366
+ body.compact-density .review-assigner-time {
1367
+ font-size: 0.6rem;
1368
+ }
1369
+
1370
+ body.compact-density .review-avatar {
1371
+ width: 26px;
1372
+ height: 26px;
1373
+ font-size: 0.74rem;
1374
+ }
1375
+
1376
+ body.compact-density .review-description-text {
1377
+ font-size: 0.75rem;
1378
+ max-height: 110px;
1379
+ }
1380
+
1381
+ body.compact-density .mr-item-header {
1382
+ gap: 0.55rem;
1383
+ padding: 0.48rem 0.56rem;
1384
+ }
1385
+
1386
+ body.compact-density .mr-title {
1387
+ font-size: 0.88rem;
1388
+ }
1389
+
1390
+ body.compact-density .mr-meta {
1391
+ font-size: 0.66rem;
1392
+ margin-top: 0.15rem;
1393
+ gap: 0.34rem;
1394
+ }
1395
+
1396
+ body.compact-density .mr-avatar {
1397
+ width: 26px;
1398
+ height: 26px;
1399
+ font-size: 0.74rem;
1400
+ }
1401
+
1402
+ body.compact-density .mr-item-content {
1403
+ padding: 0 0.56rem 0.56rem 0.56rem;
1404
+ margin-left: 0;
1405
+ }
1406
+
1407
+ body.compact-density .mr-details {
1408
+ gap: 0.28rem;
1409
+ padding: 0.44rem 0 0.3rem;
1410
+ }
1411
+
1412
+ body.compact-density .mr-detail-row {
1413
+ font-size: 0.74rem;
1414
+ }
1415
+
1416
+ body.compact-density .mr-item-actions {
1417
+ padding-top: 0.42rem;
1418
+ margin-top: 0.3rem;
1419
+ gap: 0.3rem 0.35rem;
1420
+ }
1421
+
1422
+ body.compact-density .btn-action {
1423
+ font-size: 0.68rem;
1424
+ padding: 0.2rem 0.45rem;
1425
+ }
1426
+
1427
+ body.compact-density .log-entry {
1428
+ font-size: 0.7rem;
1429
+ padding: 0.4rem;
1430
+ }
1431
+
1432
+ .now-lane {
1433
+ background: linear-gradient(165deg, rgba(96, 199, 255, 0.12) 0%, rgba(122, 216, 255, 0.06) 100%);
1434
+ border: 1px solid rgba(96, 199, 255, 0.28);
1435
+ border-radius: 10px;
1436
+ padding: 0.7rem 0.85rem;
1437
+ margin-bottom: 0.65rem;
1438
+ display: flex;
1439
+ justify-content: space-between;
1440
+ gap: 0.8rem;
1441
+ align-items: center;
1442
+ }
1443
+
1444
+ .queue-lanes-grid {
1445
+ display: grid;
1446
+ gap: 0.7rem;
1447
+ }
1448
+
1449
+ .queue-lane {
1450
+ border: 1px solid var(--nsc-border-soft);
1451
+ border-radius: 10px;
1452
+ background: rgba(255, 255, 255, 0.02);
1453
+ overflow: hidden;
1454
+ }
1455
+
1456
+ .queue-lane-header {
1457
+ display: flex;
1458
+ align-items: center;
1459
+ justify-content: space-between;
1460
+ gap: 0.5rem;
1461
+ padding: 0.55rem 0.75rem;
1462
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
1463
+ }
1464
+
1465
+ .queue-lane-title {
1466
+ font-size: 0.73rem;
1467
+ font-weight: 700;
1468
+ letter-spacing: 0.02em;
1469
+ text-transform: uppercase;
1470
+ color: var(--nsc-text-primary);
1471
+ }
1472
+
1473
+ .queue-lane-count {
1474
+ min-width: 1.5rem;
1475
+ text-align: center;
1476
+ border-radius: 999px;
1477
+ font-size: 0.67rem;
1478
+ font-weight: 700;
1479
+ padding: 0.08rem 0.4rem;
1480
+ border: 1px solid var(--nsc-border-soft);
1481
+ color: var(--nsc-text-primary);
1482
+ background: rgba(255, 255, 255, 0.04);
1483
+ }
1484
+
1485
+ .queue-lane-body {
1486
+ padding: 0.55rem 0.65rem 0.2rem;
1487
+ }
1488
+
1489
+ .now-lane-copy {
1490
+ flex: 1;
1491
+ min-width: 0;
1492
+ }
1493
+
1494
+ .now-lane-kicker {
1495
+ font-size: 0.68rem;
1496
+ text-transform: uppercase;
1497
+ letter-spacing: 0.04em;
1498
+ color: #90ddff;
1499
+ font-weight: 700;
1500
+ }
1501
+
1502
+ .now-lane-title {
1503
+ font-size: 0.9rem;
1504
+ color: var(--nsc-text-primary);
1505
+ font-weight: 600;
1506
+ margin-top: 0.2rem;
1507
+ }
1508
+
1509
+ .now-lane-meta {
1510
+ font-size: 0.72rem;
1511
+ color: var(--nsc-text-secondary);
1512
+ margin-top: 0.2rem;
1513
+ }
1514
+
1515
+ .now-lane-owner {
1516
+ font-size: 0.72rem;
1517
+ color: var(--nsc-text-secondary);
1518
+ margin-top: 0.2rem;
1519
+ }
1520
+
1521
+ .now-lane-quality {
1522
+ min-width: 120px;
1523
+ border: 1px solid rgba(255, 255, 255, 0.12);
1524
+ border-radius: 8px;
1525
+ padding: 0.4rem 0.5rem;
1526
+ background: rgba(255, 255, 255, 0.03);
1527
+ }
1528
+
1529
+ .quality-kicker {
1530
+ display: block;
1531
+ font-size: 0.62rem;
1532
+ text-transform: uppercase;
1533
+ letter-spacing: 0.05em;
1534
+ color: var(--nsc-text-muted);
1535
+ }
1536
+
1537
+ .quality-main {
1538
+ display: flex;
1539
+ align-items: baseline;
1540
+ gap: 0.15rem;
1541
+ margin-top: 0.15rem;
1542
+ }
1543
+
1544
+ .quality-score {
1545
+ font-size: 1.05rem;
1546
+ font-weight: 800;
1547
+ line-height: 1;
1548
+ }
1549
+
1550
+ .quality-over {
1551
+ font-size: 0.65rem;
1552
+ color: var(--nsc-text-muted);
1553
+ }
1554
+
1555
+ .quality-target {
1556
+ font-size: 0.65rem;
1557
+ color: var(--nsc-text-secondary);
1558
+ margin-top: 0.1rem;
1559
+ }
1560
+
1561
+ .quality-progress {
1562
+ display: flex;
1563
+ align-items: center;
1564
+ gap: 0.35rem;
1565
+ margin-top: 0.2rem;
1566
+ }
1567
+
1568
+ .quality-progress-track {
1569
+ flex: 1;
1570
+ height: 6px;
1571
+ border-radius: 999px;
1572
+ background: rgba(255, 255, 255, 0.12);
1573
+ overflow: hidden;
1574
+ }
1575
+
1576
+ .quality-progress-fill {
1577
+ height: 100%;
1578
+ transition: width 180ms ease;
1579
+ }
1580
+
1581
+ .quality-progress-fill.excellent {
1582
+ background: var(--nsc-success);
1583
+ }
1584
+
1585
+ .quality-progress-fill.warning {
1586
+ background: var(--nsc-warning);
1587
+ }
1588
+
1589
+ .quality-progress-fill.critical {
1590
+ background: var(--nsc-danger);
1591
+ }
1592
+
1593
+ .quality-progress-fill.unknown {
1594
+ background: var(--nsc-text-muted);
1595
+ }
1596
+
1597
+ .quality-progress-value {
1598
+ font-size: 0.62rem;
1599
+ color: var(--nsc-text-muted);
1600
+ min-width: 2rem;
1601
+ text-align: right;
1602
+ }
1603
+
1604
+ .quality-label {
1605
+ font-size: 0.67rem;
1606
+ margin-top: 0.15rem;
1607
+ font-weight: 600;
1608
+ }
1609
+
1610
+ .quality-trend {
1611
+ display: flex;
1612
+ align-items: center;
1613
+ gap: 0.2rem;
1614
+ font-size: 0.62rem;
1615
+ margin-top: 0.15rem;
1616
+ color: var(--nsc-text-secondary);
1617
+ }
1618
+
1619
+ .quality-trend [data-lucide] {
1620
+ width: 11px;
1621
+ height: 11px;
1622
+ }
1623
+
1624
+ .quality-trend.up {
1625
+ color: var(--nsc-success);
1626
+ }
1627
+
1628
+ .quality-trend.down {
1629
+ color: var(--nsc-danger);
1630
+ }
1631
+
1632
+ .quality-trend.flat {
1633
+ color: var(--nsc-warning);
1634
+ }
1635
+
1636
+ .quality-trend.unknown {
1637
+ color: var(--nsc-text-muted);
1638
+ }
1639
+
1640
+ .now-lane-quality.excellent .quality-score,
1641
+ .now-lane-quality.excellent .quality-label {
1642
+ color: var(--nsc-success);
1643
+ }
1644
+
1645
+ .now-lane-quality.warning .quality-score,
1646
+ .now-lane-quality.warning .quality-label {
1647
+ color: var(--nsc-warning);
1648
+ }
1649
+
1650
+ .now-lane-quality.critical .quality-score,
1651
+ .now-lane-quality.critical .quality-label {
1652
+ color: var(--nsc-danger);
1653
+ }
1654
+
1655
+ .now-lane-quality.unknown .quality-score,
1656
+ .now-lane-quality.unknown .quality-label {
1657
+ color: var(--nsc-text-muted);
1658
+ }
1659
+
1660
+ .now-lane-actions {
1661
+ display: flex;
1662
+ gap: 0.45rem;
1663
+ align-items: center;
1664
+ margin-top: 0.35rem;
1665
+ flex-wrap: wrap;
1666
+ }
1667
+
1668
+ body.compact-density .now-lane {
1669
+ padding: 0.55rem 0.65rem;
1670
+ }
1671
+
1672
+ body.compact-density .queue-lane-header {
1673
+ padding: 0.42rem 0.55rem;
1674
+ }
1675
+
1676
+ body.compact-density .queue-lane-title {
1677
+ font-size: 0.66rem;
1678
+ }
1679
+
1680
+ body.compact-density .queue-lane-body {
1681
+ padding: 0.4rem 0.5rem 0.1rem;
1682
+ }
1683
+
1684
+ body.compact-density .now-lane-title {
1685
+ font-size: 0.82rem;
1686
+ }
1687
+
1688
+ body.compact-density .now-lane-meta {
1689
+ font-size: 0.66rem;
1690
+ }
1691
+
1692
+ body.compact-density .now-lane-owner {
1693
+ font-size: 0.64rem;
1694
+ }
1695
+
1696
+ body.compact-density .now-lane-quality {
1697
+ min-width: 106px;
1698
+ padding: 0.3rem 0.4rem;
1699
+ }
1700
+
1701
+ body.compact-density .quality-score {
1702
+ font-size: 0.95rem;
1703
+ }
1704
+
1705
+ body.compact-density .quality-progress-track {
1706
+ height: 5px;
1707
+ }
1708
+
1709
+ body.compact-density .quality-progress-value,
1710
+ body.compact-density .quality-trend {
1711
+ font-size: 0.58rem;
982
1712
  }
983
1713
 
984
1714
  /* Cancel button for active reviews */
@@ -1127,3 +1857,211 @@ h1 { font-size: 1.75rem; font-weight: 600; }
1127
1857
  width: 16px;
1128
1858
  height: 16px;
1129
1859
  }
1860
+
1861
+ @media (max-width: 980px) {
1862
+ body {
1863
+ padding: 1rem;
1864
+ }
1865
+
1866
+ .container {
1867
+ max-width: 100%;
1868
+ }
1869
+
1870
+ .cards {
1871
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1872
+ gap: 0.7rem;
1873
+ margin-bottom: 1.25rem;
1874
+ }
1875
+
1876
+ .focus-strip {
1877
+ grid-template-columns: 1fr;
1878
+ }
1879
+
1880
+ .project-loader {
1881
+ flex-direction: column;
1882
+ align-items: stretch;
1883
+ }
1884
+
1885
+ .project-loader .project-input {
1886
+ min-width: 100% !important;
1887
+ }
1888
+
1889
+ .project-loader .btn {
1890
+ width: 100%;
1891
+ justify-content: center;
1892
+ }
1893
+
1894
+ .now-lane {
1895
+ flex-direction: column;
1896
+ align-items: stretch;
1897
+ gap: 0.55rem;
1898
+ }
1899
+
1900
+ .now-lane-quality {
1901
+ width: 100%;
1902
+ min-width: 0;
1903
+ }
1904
+
1905
+ .mr-item-header {
1906
+ gap: 0.65rem;
1907
+ align-items: flex-start;
1908
+ }
1909
+
1910
+ .mr-title {
1911
+ white-space: normal;
1912
+ overflow: visible;
1913
+ text-overflow: clip;
1914
+ line-height: 1.3;
1915
+ }
1916
+
1917
+ .mr-meta {
1918
+ flex-wrap: wrap;
1919
+ gap: 0.35rem 0.5rem;
1920
+ }
1921
+
1922
+ .mr-assigner {
1923
+ margin-left: 0;
1924
+ justify-content: flex-start;
1925
+ width: 100%;
1926
+ padding-left: 1.15rem;
1927
+ }
1928
+
1929
+ .mr-assigner-info {
1930
+ align-items: flex-start;
1931
+ text-align: left;
1932
+ }
1933
+
1934
+ .mr-details {
1935
+ grid-template-columns: 1fr;
1936
+ }
1937
+ }
1938
+
1939
+ @media (max-width: 640px) {
1940
+ .stats-grid {
1941
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1942
+ gap: 0.5rem;
1943
+ }
1944
+
1945
+ .stat-card {
1946
+ padding: 0.62rem 0.5rem;
1947
+ min-height: 89px;
1948
+ gap: 0.2rem;
1949
+ }
1950
+
1951
+ .stat-main {
1952
+ font-size: 1.28rem;
1953
+ }
1954
+
1955
+ .stat-label {
1956
+ font-size: 0.66rem;
1957
+ }
1958
+
1959
+ .cards {
1960
+ grid-template-columns: 1fr;
1961
+ }
1962
+
1963
+ .header-actions {
1964
+ width: 100%;
1965
+ margin-left: 0;
1966
+ }
1967
+
1968
+ .header-actions .btn {
1969
+ flex: 1;
1970
+ justify-content: center;
1971
+ }
1972
+
1973
+ .section-header {
1974
+ padding: 0.8rem 0.9rem;
1975
+ }
1976
+
1977
+ .section-content {
1978
+ padding: 0.55rem 0.75rem;
1979
+ }
1980
+
1981
+ .queue-lane-body {
1982
+ padding: 0.45rem 0.35rem 0.15rem;
1983
+ }
1984
+
1985
+ .mr-item-header {
1986
+ display: grid;
1987
+ grid-template-columns: auto minmax(0, 1fr) auto;
1988
+ grid-template-areas:
1989
+ 'status info toggle'
1990
+ '. assigner .';
1991
+ gap: 0.4rem 0.55rem;
1992
+ padding: 0.6rem 0;
1993
+ }
1994
+
1995
+ .mr-item-header .review-status {
1996
+ grid-area: status;
1997
+ margin-top: 0.2rem;
1998
+ }
1999
+
2000
+ .mr-item-header .mr-info {
2001
+ grid-area: info;
2002
+ }
2003
+
2004
+ .mr-item-header .mr-toggle {
2005
+ grid-area: toggle;
2006
+ align-self: start;
2007
+ }
2008
+
2009
+ .mr-item-header .mr-assigner {
2010
+ grid-area: assigner;
2011
+ width: auto;
2012
+ padding-left: 0;
2013
+ margin-top: 0.15rem;
2014
+ }
2015
+
2016
+ .mr-title {
2017
+ font-size: 0.92rem;
2018
+ }
2019
+
2020
+ .mr-meta {
2021
+ font-size: 0.69rem;
2022
+ gap: 0.28rem 0.38rem;
2023
+ }
2024
+
2025
+ .stat-badge {
2026
+ font-size: 0.63rem;
2027
+ padding: 0.1rem 0.3rem;
2028
+ }
2029
+
2030
+ .mr-item-content {
2031
+ margin-left: 0;
2032
+ padding: 0 0.46rem 0.46rem 0.46rem;
2033
+ }
2034
+
2035
+ .mr-item-actions {
2036
+ display: flex;
2037
+ flex-wrap: wrap;
2038
+ gap: 0.38rem;
2039
+ }
2040
+
2041
+ .mr-item-actions .btn-action {
2042
+ font-size: 0.66rem;
2043
+ padding: 0.18rem 0.42rem;
2044
+ }
2045
+
2046
+ .mr-review-event {
2047
+ grid-template-columns: 1fr;
2048
+ gap: 0.18rem;
2049
+ font-size: 0.66rem;
2050
+ }
2051
+
2052
+ .review-event-type,
2053
+ .review-event-time,
2054
+ .review-event-score,
2055
+ .review-event-blocking {
2056
+ min-width: 0;
2057
+ }
2058
+
2059
+ .toast-container {
2060
+ right: 0.75rem;
2061
+ left: 0.75rem;
2062
+ }
2063
+
2064
+ .toast {
2065
+ width: 100%;
2066
+ }
2067
+ }